Is there any way to know the stack address of stack allocated local variable created using alloca instruction in LLVM

Viewed 81

I have a simple add program.

int main() {

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

I created a LLVM frontend module pass which can traverse through the entire module.

So my pass iterates through the basic block and fetches me instructions.

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

The output of this would be the address of alloca instruction but not the real stack address of the local variable.

Is there any way I can get the stack address of local variable using pass?

1 Answers

You can't.

It is not even guaranteed the address of the variables will be the same when you run the program multiple times (see Address Space Layout Randomization), so there's no way one could predict the address statically.

Even if we did know that the stack always started at a fixed address, it is perfectly normal for the same variable to have a different address during different calls of the function. Take this for example:

#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;
}

Assuming you compile this without optimizations (which would remove the definition of y), this will print two different addresses for x. So when looking at the definition of f, we couldn't possibly predict the address of its variables because it isn't even going to be the same within the same run of the program.

Furthermore your phase isn't going to know which optimizations are going to run after it, which variables are going to be stored in registers or which register are going to be spilled to stack memory - all of which would affect the addresses.

Related