Tim Northover via llvm-dev
2017-Apr-28 21:34 UTC
[llvm-dev] How to get the address of a global variable in LLVM?
On 28 April 2017 at 14:32, Jonathan Roelofs via llvm-dev <llvm-dev at lists.llvm.org> wrote:> You need a load instruction since your function takes an i32, not an > i32*.... A global's value in llvm is its address, not the numeric data it > contains.I suspect he actually wants to make his function take an "i8*" and bitcast his pointer to that type before calling it. [*] Tim. [*] Keeping it as an i32/i64 and using ptrtoint instead of bitcast would also work, but be less portable and elegant.
Dipanjan Das via llvm-dev
2017-Apr-28 21:38 UTC
[llvm-dev] How to get the address of a global variable in LLVM?
I am a little confused. Can anyone explain me in short? The definition of `func` is as below: void func(int var_addr) { printf("[instr]: Global variable at address 0x%x\n", var_addr); } I want to insert a call to `func` just before the store instruction with the address `x` of global variable `g` as parameter. On 28 April 2017 at 14:34, Tim Northover <t.p.northover at gmail.com> wrote:> On 28 April 2017 at 14:32, Jonathan Roelofs via llvm-dev > <llvm-dev at lists.llvm.org> wrote: > > You need a load instruction since your function takes an i32, not an > > i32*.... A global's value in llvm is its address, not the numeric data it > > contains. > > I suspect he actually wants to make his function take an "i8*" and > bitcast his pointer to that type before calling it. [*] > > Tim. > > [*] Keeping it as an i32/i64 and using ptrtoint instead of bitcast > would also work, but be less portable and elegant. >-- Thanks & Regards, Dipanjan -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170428/cd605c04/attachment.html>
Jonathan Roelofs via llvm-dev
2017-Apr-28 21:42 UTC
[llvm-dev] How to get the address of a global variable in LLVM?
On 4/28/17 3:38 PM, Dipanjan Das via llvm-dev wrote:> > I am a little confused. Can anyone explain me in short? The definition > of `func` is as below: > > void func(int var_addr) { > printf("[instr]: Global variable at address 0x%x\n", var_addr); > } > > I want to insert a call to `func` just before the store instruction with > the address `x` of global variable `g` as parameter.Tim is saying that your function should be: void func(void *var_addr) ... and that in llvm you want to refer to it with type `void func(i8*)`. I only suggested the load because I was confused about what you wanted (assumed you wanted the value, because of what you had picked for the function signature). Jon> > > On 28 April 2017 at 14:34, Tim Northover <t.p.northover at gmail.com > <mailto:t.p.northover at gmail.com>> wrote: > > On 28 April 2017 at 14:32, Jonathan Roelofs via llvm-dev > <llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>> wrote: > > You need a load instruction since your function takes an i32, not an > > i32*.... A global's value in llvm is its address, not the numeric > data it > > contains. > > I suspect he actually wants to make his function take an "i8*" and > bitcast his pointer to that type before calling it. [*] > > Tim. > > [*] Keeping it as an i32/i64 and using ptrtoint instead of bitcast > would also work, but be less portable and elegant. > > > > > -- > > Thanks & Regards, > > Dipanjan > > > _______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >-- Jon Roelofs jonathan at codesourcery.com CodeSourcery / Mentor Embedded / Siemens
Tim Northover via llvm-dev
2017-Apr-28 21:49 UTC
[llvm-dev] How to get the address of a global variable in LLVM?
On 28 April 2017 at 14:38, Dipanjan Das via llvm-dev <llvm-dev at lists.llvm.org> wrote:> I want to insert a call to `func` just before the store instruction with the > address `x` of global variable `g` as parameter.Your error is because the function you create is "void @func(i32)" but you're trying to pass it an i32* (the address of the global). This mismatch is spotted by LLVM's verifier and it quits. So you have to make them match up somehow. IMO the best way to do this would be to instead create "void @func(i8*)" (as Joel explained) and then use IRBuilder::CreateBitCast on "po" to convert it from an i32* to an i8*. Then you can pass that result to @func instead of "po". Incidentally, the "i32 call void bitcast (void (i64)* @func to void (i32)*)(i32* @a)" line in the output suggests you're being inconsistent about how you call getOrCreateFunction for @func elsewhere in your code: the first time it's told to expect an i64 so when you getOrCreateFunction a second time LLVM "helpfully" inserts a constant bitcast of its own. This is almost certainly not a good idea. Tim.