我有一个简单的添加程序。
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/