我正在尝试从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
答案 0 :(得分:0)
您要命名的东西不是指令,而是参数。 Argument constructor带有Name参数,这可能是设置该参数的预期方式。我不知道为什么在您的情况下clang不这样做。您也可以稍后再致电setName()。
使指令的名称遵循相同的模式,但前提是它们没有空类型。在您的示例中,alloca
和inc
都有名称。使load
具有名称通常可以通过passing a NameStr argument完成。 setName()也适用于指令(指令和参数都继承值)。