llvm - 有没有办法知道在LLVM中使用alloca指令创建的堆栈分配局部变量的堆栈地址

标签 llvm llvm-ir

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

int main() {

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

我创建了一个 LLVM 前端模块 pass,它可以遍历整个模块。

所以我的遍遍历基本 block 并获取指令。

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

它的输出将是 alloca 指令的地址,而不是局部变量的实际堆栈地址。

有什么方法可以使用pass获取局部变量的栈地址吗?

最佳答案

你不能。

甚至不能保证多次运行程序时变量的地址相同(请参阅 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 的定义时,我们无法预测其变量的地址,因为它甚至在程序的同一运行中都不会相同。

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

关于llvm - 有没有办法知道在LLVM中使用alloca指令创建的堆栈分配局部变量的堆栈地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53249973/

相关文章:

debugging - 如何使用 %llvm.dbg.value?

c++ - 如何处理 LLVM metadata.h 的变化

llvm - 如何从 LLVM 的 MemoryDe​​pendenceAnalysis 传递中获得更好的结果?

llvm - 解析 LLVM IR 代码

compiler-construction - 如果clang是编译器的前端,那么为什么它可以生成可执行文件?

gcc - 编译 OpenCL 应用程序和使用可用编译器选项的正确方法

llvm - 从函数 LLVM 返回 Void

c++ - 有人可以向我解释为什么在 LLVM 的以下代码中使用相同操作数进行不等式测试吗?

julia - 当C++(LLVM)可以时,为什么Julia不优化此代码?

llvm - 使用 CostModel 获取 LLVM IR 的 CPU 周期