有什么方法可以知道使用LLVM中的alloca指令创建的堆栈分配的局部变量的堆栈地址

时间:2018-11-11 14:59:49

标签: llvm llvm-ir

我有一个简单的添加程序。

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 :(得分:2)

你不能。

甚至不能保证多次运行程序时变量的地址都相同(请参见Address Space Layout Randomization),因此无法静态预测地址。

即使我们确实知道堆栈总是从固定地址开始,对于相同的变量在函数的不同调用期间具有不同的地址也是完全正常的。以这个为例:

#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的定义时,我们不可能预测其变量的地址,因为在程序的同一运行中它甚至不会相同。

此外,您的阶段将不知道在执行此优化之后将执行哪些优化,哪些变量将存储在寄存器中,或者哪些寄存器将溢出到堆栈存储器中-所有这些都会影响地址。