如何生成具有类似源代码可变名称的LLVM位代码和反汇编代码

时间:2019-09-27 02:21:16

标签: clang llvm

我正在尝试从c源代码生成LLVM位代码和反汇编(.ll)代码。我希望位代码中的指令具有与源代码相似的变量名。

假设我有一个源代码(sample.c):

  int test(int a){
    return a++;
  }

sample.ll包含:

; Function Attrs: noinline nounwind uwtable
define i32 @test(i32) #0 {
  %2 = alloca i32, align 4
  store i32 %0, i32* %2, align 4
  %3 = load i32, i32* %2, align 4
  %4 = add nsw i32 %3, 1
  store i32 %4, i32* %2, align 4
  ret i32 %3
}

在这里,%0类似于源代码中的变量a。

如何生成这样的sample.ll?

; Function Attrs: noinline nounwind
define i32 @test(i32 %a) #0 {
entry:
  %a.addr = alloca i32, align 4
  store i32 %a, i32* %a.addr, align 4
  %0 = load i32, i32* %a.addr, align 4
  %inc = add nsw i32 %0, 1
  store i32 %inc, i32* %a.addr, align 4
  ret i32 %0
}

%a在源代码中类似于变量a的位置。 注意:我使用的Clang版本是6.0.0-1ubuntu2〜16.04.1

我正在使用以下命令:clang -Xclang -disable-O0-optnone -O0 -emit-llvm -c sample.c -o sample.bc,然后使用llvm-dis sample.bc

1 个答案:

答案 0 :(得分:0)

您要命名的东西不是指令,而是参数。 Argument constructor带有Name参数,这可能是设置该参数的预期方式。我不知道为什么在您的情况下clang不这样做。您也可以稍后再致电setName()

使指令的名称遵循相同的模式,但前提是它们没有空类型。在您的示例中,allocainc都有名称。使load具有名称通常可以通过passing a NameStr argument完成。 setName()也适用于指令(指令和参数都继承值)。