Is there any way to know the stack address of stack allocated local variable created using alloca instruction...
up vote
1
down vote
favorite
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?
llvm llvm-ir
add a comment |
up vote
1
down vote
favorite
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?
llvm llvm-ir
add a comment |
up vote
1
down vote
favorite
up vote
1
down vote
favorite
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?
llvm llvm-ir
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?
llvm llvm-ir
llvm llvm-ir
asked Nov 11 at 14:59
Arjun
184
184
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
up vote
2
down vote
accepted
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: %pn", &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.
add a comment |
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
2
down vote
accepted
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: %pn", &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.
add a comment |
up vote
2
down vote
accepted
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: %pn", &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.
add a comment |
up vote
2
down vote
accepted
up vote
2
down vote
accepted
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: %pn", &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.
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: %pn", &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.
answered Nov 11 at 15:28
sepp2k
291k38593605
291k38593605
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53249973%2fis-there-any-way-to-know-the-stack-address-of-stack-allocated-local-variable-cre%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown