Я пытаюсь сгенерировать битовый код 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 в исходном коде.NB. Используемая версия 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