这是一个带有枚举定义和main
函数的简单C文件:
enum days {MON, TUE, WED, THU};
int main() {
enum days d;
d = WED;
return 0;
}
它会转换为以下LLVM IR:
define dso_local i32 @main() #0 {
%1 = alloca i32, align 4
%2 = alloca i32, align 4
store i32 0, i32* %1, align 4
store i32 2, i32* %2, align 4
ret i32 0
}
%2
显然是d
变量,它被分配了2个值。%1
如果直接返回零,那对应什么?
1
您使用了哪些标志来产生此IR?
—
arrowd
@arrowd,我安装了最新的稳定的LLVM套件并运行
—
macleginn
clang-9 -S -emit-llvm simple.c
我认为这与之前的初始化
—
Pradeep Kumar
main
(godbolt.org/z/kEtS-s)有关。该链接显示了程序集如何映射到源
@PradeepKumar:的确,如果将函数的名称更改为以外的名称
—
Nate Eldredge
main
,神秘的多余变量将消失。有趣的是,如果您return
完全省略该语句(main
在C中合法且等效于return 0;
),它也会消失。
@macleginn:我不太确定。如果声明
—
Nate Eldredge
main
为int main(int argc, char **argv)
你看到argc
和argv
复制到堆栈,但神秘的零变量仍然存在,除了给他们。