作为标题,为什么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
型
1条答案
按热度按时间fdbelqdn1#
未使用
retval
的原因描述为here。Clang创建这个变量来保存任何给定的非空函数的返回值,除了特殊情况。其中一种特殊情况发生在函数有一个返回llvm Constant的return语句时。
我想main函数仍然保留这个变量的原因是因为根据C标准,main函数默认返回0。