Как загрузить адрес, который был выделен в отдельной функции, используя IRBuilder - LLVM 6.0 - PullRequest
0 голосов
/ 17 ноября 2018

Работа над исследовательским проектом, который требует добавления инструкций по загрузке в анализируемый ИК-код LLVM для загрузки в функцию func_A адресов, которые были выделены в отдельной функции func_B с использованием IRBuilder. Пример показан следующим образом.

define void @func_B() {
  %1 = alloca [1 x i32], align 4
}

define void @func_A() {
  // load the address allocated above here using IRBuilder in an analysis pass 
  // to the IR code, something like the following:
  // IRBuilder<> builder(); 
  // builder.CreateLoad(val);
}

Мне удалось найти подлежащий загрузке llvm:value*, то есть val в приведенном выше примере, но проблема в том, что val является локальным идентификатором, объявленным в func_B и может конфликтовать с Идентификаторы func_A (скажем, func_A также объявляет локальный идентификатор с именем %1) при загрузке в func_A.

Как я могу загрузить func_B %1 без конфликтов в func_A? Обратите внимание, что я не могу передать %1 в func_A в качестве параметра функции, поскольку я не хочу ничего менять в ИК-коде, но добавляю некоторые инструкции по загрузке.

Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 17 ноября 2018

Вы, очевидно, не можете этого сделать. Это как если бы вы хотели получить доступ к int a из bar() в следующем примере:

int foo()
{
  int a = 5;
}

int bar()
{
  ...
}

Поскольку %1 выделяется в стеке, его память освобождается после завершения функции func_B, поэтому она может даже не существовать во время выполнения func_A.

Единственное, что вы можете сделать, это сохранить значение %1 в глобальной переменной в func_B и загрузить его в func_A:

@var = [1 x i32] zeroinitializer

define void @func_B() {
  %1 = alloca [1 x i32], align 4
  store %1, @var
}

define void @func_A() {
  // load the address allocated above here using IRBuilder in an analysis pass 
  // to the IR code, something like the following:
  // IRBuilder<> builder(); 
  // builder.CreateLoad(val);
  %1 = load @var
}
...