Как создать битовый код LLVM и дизассемблированный код с похожими именами переменных исходного кода - PullRequest
1 голос
/ 27 сентября 2019

Я пытаюсь сгенерировать битовый код 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

1 Ответ

0 голосов
/ 27 сентября 2019

То, что вы хотите назвать, это не Инструкция, это Аргумент. Конструктор аргумента принимает аргумент Name, который, вероятно, и предназначен для этого.Я понятия не имею, почему Clang не делает этого в вашем случае.Вы также можете вызвать setName () позже.

Создание инструкций с именами происходит по той же схеме, при условии, что они не имеют типа void.В вашем примере, alloca и inc оба имеют имена.Создание load имени обычно выполняется с помощью передачи аргумента NameStr . setName () работает и с инструкциями (и инструкция, и аргумент наследуют значение).

...