为什么 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 的事实有关。
如题,为什么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 的事实有关。