How to use LLVMBuildStore API
long i=3;
long *j;
j=&i;
I want to use LLVM C API to transform above code especially last line into llvm code .Now I search correct function in the LLVM C API ,I think should use "LLVMBuildStore",but there is "&" operator,How can I translate it? LLVMBuildStore' second parameter is LLVMValueRef type value which refer to "i" in this case,how to get the address from this value?
c api llvm
add a comment |
long i=3;
long *j;
j=&i;
I want to use LLVM C API to transform above code especially last line into llvm code .Now I search correct function in the LLVM C API ,I think should use "LLVMBuildStore",but there is "&" operator,How can I translate it? LLVMBuildStore' second parameter is LLVMValueRef type value which refer to "i" in this case,how to get the address from this value?
c api llvm
add a comment |
long i=3;
long *j;
j=&i;
I want to use LLVM C API to transform above code especially last line into llvm code .Now I search correct function in the LLVM C API ,I think should use "LLVMBuildStore",but there is "&" operator,How can I translate it? LLVMBuildStore' second parameter is LLVMValueRef type value which refer to "i" in this case,how to get the address from this value?
c api llvm
long i=3;
long *j;
j=&i;
I want to use LLVM C API to transform above code especially last line into llvm code .Now I search correct function in the LLVM C API ,I think should use "LLVMBuildStore",but there is "&" operator,How can I translate it? LLVMBuildStore' second parameter is LLVMValueRef type value which refer to "i" in this case,how to get the address from this value?
c api llvm
c api llvm
asked Nov 21 '18 at 2:44
freyonefreyone
735
735
add a comment |
add a comment |
2 Answers
2
active
oldest
votes
Given that you have provided the address assignment expression to j, I suppose that the variables are not globals, but rather allocated inside a function.
So, to translate this C snippet into LLVM IR, you first need to allocate space in the stack for variable i and pointer j, and then store constant 3 to the address of i and the address of i to the address of pointer j.
In LLVM IR:
%i = alloca i64, align 8 ;allocation for i. %i is a pointer i64* to variable i
%j = alloca i64*, align 8 ;respectively, the type of %j is i64** (pointer to i64*)
store i64 3, i64* %i, align 8 ; i=3
store i64* %i, i64** %j, align 8 ; store %i (the address of var i) to the address of pointer j
I do not know how to generate these instructions using the LLVM C API, because I have never used it. However, hopefully there might be a relevance between the C and C++ API and maybe providing the code that I would write using the C++ API might help you get an idea of the type of arguments you need to use. I hope it helps.
AllocaInst *alloc_i = new AllocaInst(Type::getInt64Ty(M.getContext()), //Type i64
0, //AddressSpace
nullptr, //Arraysize
8, //Alignment
"i", //name of result in IR. Leave "" for default
I); //Add alloca instruction before Instruction I
AllocaInst *alloc_j = new AllocaInst(Type::getInt64PtrTy(M.getContext()), //Type i64*
0, //AddressSpace
nullptr, //Arraysize
8, //Alignment
"i", //name of result in IR. Leave "" for default
I); //Add alloca instruction before Instruction I
StoreInst *store_i = new StoreInst(ConstantInt::get(Type::getInt64Ty(M.getContext()), 3), //get constant 3 of type i64
alloc_i, //store to the result Value* of alloc_i
false,
8, //Alignment
I); //Insert before instr I
StoreInst *store_j = new StoreInst(alloc_i, //i64* pointer to i
alloc_j, //store to the address of pointer j
false,
8, //Alignment
I); //Insert before instr I
Finally, consider using the C++ API instead.
thanks your example.now i knew the allocated value is already the point value,so do nothing for "&" operator,only when get the content ,need to "load" the content from the pointer.
– freyone
Nov 22 '18 at 2:00
add a comment |
Considering the following C function
int main() {
long i=3;
long *j;
j=&i;
return 0;
}
Clang 3.8 will generate:
define i32 @main() {
%1 = alloca i32, align 4
%2 = alloca i64, align 8
%3 = alloca i64*, align 8
store i32 0, i32* %1, align 4
store i64 3, i64* %2, align 8
store i64* %2, i64** %3, align 8
ret i32 0
}
What we can see from the generated code is that clang generates a single basic block.
In this basic block we generate three alloca instructions and three store instructions and one ret instruction which terminates the basic block.
For store instructions, you can use LLVMBuildStore().
LLVMBuildStore takes three arguments, the first being your builder. The second parameter is what you would like to store the third is where to store it.
For the first two store instructions, you can use just use the LLVM value that represents your integers.
For the third parameter use the LLVMBuildStore instruction directly without loading the variable. Where the second parameter is the LLVMValueRef you received from your previous LLVMBuildAlloca() which you got when creating :
%2 = alloca i64*, align 8
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
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%2f53404596%2fhow-to-use-llvmbuildstore-api%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
Given that you have provided the address assignment expression to j, I suppose that the variables are not globals, but rather allocated inside a function.
So, to translate this C snippet into LLVM IR, you first need to allocate space in the stack for variable i and pointer j, and then store constant 3 to the address of i and the address of i to the address of pointer j.
In LLVM IR:
%i = alloca i64, align 8 ;allocation for i. %i is a pointer i64* to variable i
%j = alloca i64*, align 8 ;respectively, the type of %j is i64** (pointer to i64*)
store i64 3, i64* %i, align 8 ; i=3
store i64* %i, i64** %j, align 8 ; store %i (the address of var i) to the address of pointer j
I do not know how to generate these instructions using the LLVM C API, because I have never used it. However, hopefully there might be a relevance between the C and C++ API and maybe providing the code that I would write using the C++ API might help you get an idea of the type of arguments you need to use. I hope it helps.
AllocaInst *alloc_i = new AllocaInst(Type::getInt64Ty(M.getContext()), //Type i64
0, //AddressSpace
nullptr, //Arraysize
8, //Alignment
"i", //name of result in IR. Leave "" for default
I); //Add alloca instruction before Instruction I
AllocaInst *alloc_j = new AllocaInst(Type::getInt64PtrTy(M.getContext()), //Type i64*
0, //AddressSpace
nullptr, //Arraysize
8, //Alignment
"i", //name of result in IR. Leave "" for default
I); //Add alloca instruction before Instruction I
StoreInst *store_i = new StoreInst(ConstantInt::get(Type::getInt64Ty(M.getContext()), 3), //get constant 3 of type i64
alloc_i, //store to the result Value* of alloc_i
false,
8, //Alignment
I); //Insert before instr I
StoreInst *store_j = new StoreInst(alloc_i, //i64* pointer to i
alloc_j, //store to the address of pointer j
false,
8, //Alignment
I); //Insert before instr I
Finally, consider using the C++ API instead.
thanks your example.now i knew the allocated value is already the point value,so do nothing for "&" operator,only when get the content ,need to "load" the content from the pointer.
– freyone
Nov 22 '18 at 2:00
add a comment |
Given that you have provided the address assignment expression to j, I suppose that the variables are not globals, but rather allocated inside a function.
So, to translate this C snippet into LLVM IR, you first need to allocate space in the stack for variable i and pointer j, and then store constant 3 to the address of i and the address of i to the address of pointer j.
In LLVM IR:
%i = alloca i64, align 8 ;allocation for i. %i is a pointer i64* to variable i
%j = alloca i64*, align 8 ;respectively, the type of %j is i64** (pointer to i64*)
store i64 3, i64* %i, align 8 ; i=3
store i64* %i, i64** %j, align 8 ; store %i (the address of var i) to the address of pointer j
I do not know how to generate these instructions using the LLVM C API, because I have never used it. However, hopefully there might be a relevance between the C and C++ API and maybe providing the code that I would write using the C++ API might help you get an idea of the type of arguments you need to use. I hope it helps.
AllocaInst *alloc_i = new AllocaInst(Type::getInt64Ty(M.getContext()), //Type i64
0, //AddressSpace
nullptr, //Arraysize
8, //Alignment
"i", //name of result in IR. Leave "" for default
I); //Add alloca instruction before Instruction I
AllocaInst *alloc_j = new AllocaInst(Type::getInt64PtrTy(M.getContext()), //Type i64*
0, //AddressSpace
nullptr, //Arraysize
8, //Alignment
"i", //name of result in IR. Leave "" for default
I); //Add alloca instruction before Instruction I
StoreInst *store_i = new StoreInst(ConstantInt::get(Type::getInt64Ty(M.getContext()), 3), //get constant 3 of type i64
alloc_i, //store to the result Value* of alloc_i
false,
8, //Alignment
I); //Insert before instr I
StoreInst *store_j = new StoreInst(alloc_i, //i64* pointer to i
alloc_j, //store to the address of pointer j
false,
8, //Alignment
I); //Insert before instr I
Finally, consider using the C++ API instead.
thanks your example.now i knew the allocated value is already the point value,so do nothing for "&" operator,only when get the content ,need to "load" the content from the pointer.
– freyone
Nov 22 '18 at 2:00
add a comment |
Given that you have provided the address assignment expression to j, I suppose that the variables are not globals, but rather allocated inside a function.
So, to translate this C snippet into LLVM IR, you first need to allocate space in the stack for variable i and pointer j, and then store constant 3 to the address of i and the address of i to the address of pointer j.
In LLVM IR:
%i = alloca i64, align 8 ;allocation for i. %i is a pointer i64* to variable i
%j = alloca i64*, align 8 ;respectively, the type of %j is i64** (pointer to i64*)
store i64 3, i64* %i, align 8 ; i=3
store i64* %i, i64** %j, align 8 ; store %i (the address of var i) to the address of pointer j
I do not know how to generate these instructions using the LLVM C API, because I have never used it. However, hopefully there might be a relevance between the C and C++ API and maybe providing the code that I would write using the C++ API might help you get an idea of the type of arguments you need to use. I hope it helps.
AllocaInst *alloc_i = new AllocaInst(Type::getInt64Ty(M.getContext()), //Type i64
0, //AddressSpace
nullptr, //Arraysize
8, //Alignment
"i", //name of result in IR. Leave "" for default
I); //Add alloca instruction before Instruction I
AllocaInst *alloc_j = new AllocaInst(Type::getInt64PtrTy(M.getContext()), //Type i64*
0, //AddressSpace
nullptr, //Arraysize
8, //Alignment
"i", //name of result in IR. Leave "" for default
I); //Add alloca instruction before Instruction I
StoreInst *store_i = new StoreInst(ConstantInt::get(Type::getInt64Ty(M.getContext()), 3), //get constant 3 of type i64
alloc_i, //store to the result Value* of alloc_i
false,
8, //Alignment
I); //Insert before instr I
StoreInst *store_j = new StoreInst(alloc_i, //i64* pointer to i
alloc_j, //store to the address of pointer j
false,
8, //Alignment
I); //Insert before instr I
Finally, consider using the C++ API instead.
Given that you have provided the address assignment expression to j, I suppose that the variables are not globals, but rather allocated inside a function.
So, to translate this C snippet into LLVM IR, you first need to allocate space in the stack for variable i and pointer j, and then store constant 3 to the address of i and the address of i to the address of pointer j.
In LLVM IR:
%i = alloca i64, align 8 ;allocation for i. %i is a pointer i64* to variable i
%j = alloca i64*, align 8 ;respectively, the type of %j is i64** (pointer to i64*)
store i64 3, i64* %i, align 8 ; i=3
store i64* %i, i64** %j, align 8 ; store %i (the address of var i) to the address of pointer j
I do not know how to generate these instructions using the LLVM C API, because I have never used it. However, hopefully there might be a relevance between the C and C++ API and maybe providing the code that I would write using the C++ API might help you get an idea of the type of arguments you need to use. I hope it helps.
AllocaInst *alloc_i = new AllocaInst(Type::getInt64Ty(M.getContext()), //Type i64
0, //AddressSpace
nullptr, //Arraysize
8, //Alignment
"i", //name of result in IR. Leave "" for default
I); //Add alloca instruction before Instruction I
AllocaInst *alloc_j = new AllocaInst(Type::getInt64PtrTy(M.getContext()), //Type i64*
0, //AddressSpace
nullptr, //Arraysize
8, //Alignment
"i", //name of result in IR. Leave "" for default
I); //Add alloca instruction before Instruction I
StoreInst *store_i = new StoreInst(ConstantInt::get(Type::getInt64Ty(M.getContext()), 3), //get constant 3 of type i64
alloc_i, //store to the result Value* of alloc_i
false,
8, //Alignment
I); //Insert before instr I
StoreInst *store_j = new StoreInst(alloc_i, //i64* pointer to i
alloc_j, //store to the address of pointer j
false,
8, //Alignment
I); //Insert before instr I
Finally, consider using the C++ API instead.
edited Nov 22 '18 at 0:05
answered Nov 21 '18 at 23:51
Foivos TsFoivos Ts
112
112
thanks your example.now i knew the allocated value is already the point value,so do nothing for "&" operator,only when get the content ,need to "load" the content from the pointer.
– freyone
Nov 22 '18 at 2:00
add a comment |
thanks your example.now i knew the allocated value is already the point value,so do nothing for "&" operator,only when get the content ,need to "load" the content from the pointer.
– freyone
Nov 22 '18 at 2:00
thanks your example.now i knew the allocated value is already the point value,so do nothing for "&" operator,only when get the content ,need to "load" the content from the pointer.
– freyone
Nov 22 '18 at 2:00
thanks your example.now i knew the allocated value is already the point value,so do nothing for "&" operator,only when get the content ,need to "load" the content from the pointer.
– freyone
Nov 22 '18 at 2:00
add a comment |
Considering the following C function
int main() {
long i=3;
long *j;
j=&i;
return 0;
}
Clang 3.8 will generate:
define i32 @main() {
%1 = alloca i32, align 4
%2 = alloca i64, align 8
%3 = alloca i64*, align 8
store i32 0, i32* %1, align 4
store i64 3, i64* %2, align 8
store i64* %2, i64** %3, align 8
ret i32 0
}
What we can see from the generated code is that clang generates a single basic block.
In this basic block we generate three alloca instructions and three store instructions and one ret instruction which terminates the basic block.
For store instructions, you can use LLVMBuildStore().
LLVMBuildStore takes three arguments, the first being your builder. The second parameter is what you would like to store the third is where to store it.
For the first two store instructions, you can use just use the LLVM value that represents your integers.
For the third parameter use the LLVMBuildStore instruction directly without loading the variable. Where the second parameter is the LLVMValueRef you received from your previous LLVMBuildAlloca() which you got when creating :
%2 = alloca i64*, align 8
add a comment |
Considering the following C function
int main() {
long i=3;
long *j;
j=&i;
return 0;
}
Clang 3.8 will generate:
define i32 @main() {
%1 = alloca i32, align 4
%2 = alloca i64, align 8
%3 = alloca i64*, align 8
store i32 0, i32* %1, align 4
store i64 3, i64* %2, align 8
store i64* %2, i64** %3, align 8
ret i32 0
}
What we can see from the generated code is that clang generates a single basic block.
In this basic block we generate three alloca instructions and three store instructions and one ret instruction which terminates the basic block.
For store instructions, you can use LLVMBuildStore().
LLVMBuildStore takes three arguments, the first being your builder. The second parameter is what you would like to store the third is where to store it.
For the first two store instructions, you can use just use the LLVM value that represents your integers.
For the third parameter use the LLVMBuildStore instruction directly without loading the variable. Where the second parameter is the LLVMValueRef you received from your previous LLVMBuildAlloca() which you got when creating :
%2 = alloca i64*, align 8
add a comment |
Considering the following C function
int main() {
long i=3;
long *j;
j=&i;
return 0;
}
Clang 3.8 will generate:
define i32 @main() {
%1 = alloca i32, align 4
%2 = alloca i64, align 8
%3 = alloca i64*, align 8
store i32 0, i32* %1, align 4
store i64 3, i64* %2, align 8
store i64* %2, i64** %3, align 8
ret i32 0
}
What we can see from the generated code is that clang generates a single basic block.
In this basic block we generate three alloca instructions and three store instructions and one ret instruction which terminates the basic block.
For store instructions, you can use LLVMBuildStore().
LLVMBuildStore takes three arguments, the first being your builder. The second parameter is what you would like to store the third is where to store it.
For the first two store instructions, you can use just use the LLVM value that represents your integers.
For the third parameter use the LLVMBuildStore instruction directly without loading the variable. Where the second parameter is the LLVMValueRef you received from your previous LLVMBuildAlloca() which you got when creating :
%2 = alloca i64*, align 8
Considering the following C function
int main() {
long i=3;
long *j;
j=&i;
return 0;
}
Clang 3.8 will generate:
define i32 @main() {
%1 = alloca i32, align 4
%2 = alloca i64, align 8
%3 = alloca i64*, align 8
store i32 0, i32* %1, align 4
store i64 3, i64* %2, align 8
store i64* %2, i64** %3, align 8
ret i32 0
}
What we can see from the generated code is that clang generates a single basic block.
In this basic block we generate three alloca instructions and three store instructions and one ret instruction which terminates the basic block.
For store instructions, you can use LLVMBuildStore().
LLVMBuildStore takes three arguments, the first being your builder. The second parameter is what you would like to store the third is where to store it.
For the first two store instructions, you can use just use the LLVM value that represents your integers.
For the third parameter use the LLVMBuildStore instruction directly without loading the variable. Where the second parameter is the LLVMValueRef you received from your previous LLVMBuildAlloca() which you got when creating :
%2 = alloca i64*, align 8
answered Nov 22 '18 at 22:08
JKRTJKRT
431517
431517
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.
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%2f53404596%2fhow-to-use-llvmbuildstore-api%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