Есть ли способ узнать адрес стека локальной выделенной переменной стека, созданной с помощью инструкции alloca в LLVM - PullRequest
0 голосов
/ 11 ноября 2018

У меня есть простая программа добавления.

int main() {

    int x=10,y=10,result=0;
    result=x+y;
    return 0;
}

Я создал проход модуля внешнего интерфейса LLVM, который может проходить через весь модуль.

Итак, мой проход проходит через основной блок и извлекает мне инструкции.

FORE(iter, (*bb)) {
    if(isa<AllocaInst>(iter)) {
        errs()<<"The address of allocated variable is "<<&(*iter);
    }
} 

Результатом этого будет адрес инструкции alloca, но не реальный адрес стека локальной переменной.

Есть ли способ получить адрес стека локальной переменной, используя pass?

1 Ответ

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

Вы не можете.

Даже не гарантируется, что адрес переменных будет одинаковым при многократном запуске программы (см. Рандомизация макета адресного пространства ), поэтому нет способа предсказать адрес статически.

Даже если мы знали, что стек всегда начинался с фиксированного адреса, вполне нормально, чтобы одна и та же переменная имела разный адрес во время разных вызовов функции. Возьмем для примера:

#include <stdio.h>

void f() {
  int x;
  printf("The address of x is: %p\n", &x);
}

void g() {
  int y;
  f();
}

int main() {
  f();
  g();
  return 0;
}

Если вы скомпилируете это без оптимизаций (что приведет к удалению определения y), вы получите два разных адреса для x. Поэтому, глядя на определение f, мы не можем предсказать адрес его переменных, потому что он даже не будет одинаковым при одном и том же запуске программы.

Кроме того, ваша фаза не будет знать, какие оптимизации будут выполняться после нее, какие переменные будут храниться в регистрах или какой регистр будет помещен в стековую память - все это повлияет на адреса.

...