为什么 main() 在 '.ll' 文件 LLVM 中有 '%retval'

why does main() have '%retval' in '.ll' file LLVM

如题,为什么main()有变量'retval'却没有使用? 本地 func test() 没有任何名为 'retval'.

的变量

"hello.c"

#include <stdio.h>

int main()
{
    printf("hello world\n");
    return 0;
}

"hello.ll"

@.str = private unnamed_addr constant [13 x i8] c"hello world[=11=]A[=11=]", align 1

; Function Attrs: noinline nounwind optnone
define dso_local i32 @main() #0 {
entry:
  %retval = alloca i32, align 4              // why does it have this pattern?
  store i32 0, i32* %retval, align 4
  %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str, i32 0, i32 0))
  ret i32 0
}

declare dso_local i32 @printf(i8*, ...) #1

正常功能比较:

"hello_func.c"

#include <stdio.h>

int test()
{
    printf("hello world\n");
    return 0;
}

"hello_func.ll"


@.str = private unnamed_addr constant [13 x i8] c"hello world[=13=]A[=13=]", align 1

; Function Attrs: noinline nounwind optnone
define dso_local i32 @test() #0 {
entry:                               //  there is no pattern named retval
  %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str, i32 0, i32 0))
  ret i32 0
}

declare dso_local i32 @printf(i8*, ...) #1

已回答 retval 未使用的原因

Clang 创建此变量以保存任何给定非空函数的 return 值,特殊情况除外。当函数有一个 return 语句 return 是一个 llvm Constant.

时,就会发生其中一种特殊情况

我猜想 main 函数仍然保留变量的原因与 main 根据 C 标准规范 returns 默认为 0 的事实有关。