如何在使用clang生成llvm ir时保存变量名称?

10

我通过使用“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;
}

这是它:

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?


你可能需要调试信息 (-g 标志)。 - Banex
2个回答

17
实际上,变量名称的丢弃是一个功能,并需要使用-discard-value-names激活。Clang在发布构建中自行执行此操作(但不适用于调试模式下的自编译Clang)。
您可以通过以下方式规避此问题:
clang <your-command-line> -###

然后复制输出并删除 -discard-value-names

更新的clang版本(自7以后)将该标志暴露于常规命令行:

clang -fno-discard-value-names <your-command-line>

来源


-1

没有这样的方法。LLVM IR中的变量名称仅用于调试,当代码转换为完整的SSA形式时也肯定无法保留它们。

如果您需要保留源代码信息,请考虑使用调试信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接