How to save the variable name when use clang to generate llvm ir?

hui*_*123 7 llvm clang llvm-ir

I generate ir by use 'clang -S -emit-llvm test.c'.

int main(int argc, char **argv)
{
    int* a=0;
    a=(int *)malloc(sizeof(int));
    printf("hello world\n");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

and this is the 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
}
Run Code Online (Sandbox Code Playgroud)

how can I make the variable name remain unchanged?like a still %a ?not %3?

ger*_*ion 12

实际上删除变量名称是一项功能,需要使用-discard-value-names. 发布版本中的 Clang 自行完成此操作(调试模式下的自编译 clang 不是)。

你可以绕过它

clang <your-command-line> -###
Run Code Online (Sandbox Code Playgroud)

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

较新的 clang 版本(自 7 起)将标志暴露给普通命令行:

clang -fno-discard-value-names <your-command-line>
Run Code Online (Sandbox Code Playgroud)

来源


Ant*_*kov -2

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

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