C语言 为什么main()在“.ll”文件LLVM中有“%retval”

iyr7buue  于 2023-11-17  发布在  其他
关注(0)|答案(1)|浏览(110)

作为标题,为什么main()有变量'retval'但没有使用?而本地func test()没有任何名为'retval'的变量。
“hello. c”

#include <stdio.h>

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

字符串
“你好,ll”

@.str = private unnamed_addr constant [13 x i8] c"hello world\0A\00", 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\0A\00", 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

fdbelqdn

fdbelqdn1#

未使用retval的原因描述为here
Clang创建这个变量来保存任何给定的非空函数的返回值,除了特殊情况。其中一种特殊情况发生在函数有一个返回llvm Constant的return语句时。
我想main函数仍然保留这个变量的原因是因为根据C标准,main函数默认返回0。

相关问题