我通过使用' clang -S -emit-llvm test.c'来生成ir。
int main(int argc, char **argv)
{
int* a=0;
a=(int *)malloc(sizeof(int));
printf("hello world\n");
return 0;
}
这是ir:
define i32 @main(i32, i8**) #0 {
%3 = alloca i32, align 4
%4 = alloca i32, align 4
%5 = alloca i8**, align 8
%6 = alloca i32*, align 8
store i32 0, i32* %3, align 4
store i32 %0, i32* %4, align 4
store i8** %1, i8*** %5, align 8
store i32* null, i32** %6, align 8
%7 = call noalias i8* @malloc(i64 4) #3
%8 = bitcast i8* %7 to i32*
store i32* %8, i32** %6, align 8
%9 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str, i32 0, i32 0))
ret i32 0
}
如何使变量名保持不变,如仍为%a,而不是%3?
答案 0 :(得分:0)
没有这样的方式。 LLVM IR中的变量名仅用于调试,当代码转换为完整的SSA格式时,肯定无法保留它们。
如果您需要保留源代码信息,请考虑使用调试信息。
答案 1 :(得分:0)
实际上,删除变量名是一项功能,需要使用-discard-value-names
进行激活。发布版本中的Clang会自己执行此操作(不是在调试模式下使用自编译的Clang)。
您可以使用
来规避它clang <your-command-line> -###
然后复制输出并删除-discard-value-names
。
较新的clang版本(自7开始)将标志公开给普通命令行:
clang -fno-discard-value-names <your-command-line>