[LLVMdev] mixing static/dynamic code
Paul Martin
srucnoc at gmail.com
Sun May 24 16:21:43 PDT 2009
Nick,
Your solution works well if there is a store instruction in the function but
in the case where there is none (i.e. the argument is passed on directly to
another function), creating a store does not help to get the memory address
of the variable which takes me back to my initial question at
http://lists.cs.uiuc.edu/pipermail/llvmdev/2009-May/022590.html - isn't
there a way to obtain the address of an argument? Because doing a store
seems to copy the variable and expose the address of the copy -
http://www.llvm.org/docs/LangRef.html#i_store is not very clear on what's
going on.
You can imagine that if you try to do something like taint analysis you want
to track each access to a memory location - therefore something like the
above would be needed.
Any ideas?
Thanks,
Paul
On Sun, May 24, 2009 at 10:47 PM, Nick Lewycky <nicholas at mxc.ca> wrote:
> Paul Martin wrote:
> >
> > Nick,
> > Thanks for the quick answer.
> > Dereferencing the pointer does yield the same result in both cases but
> > that's not what I want to do. I want to instrument the program
> > dynamically and keep track of certain memory locations which is a
> > problem if the same variable has different addresses for the
> > static/dynamic code - as far I see this is what it's happening but I
> > have no clue why.
>
> If you look at the LLVM IR you can see two distinct alloca instructions,
> the one your static code had named "%pi_addr" and the one you created
> named "%ptr32".
>
> It sounds like what you want to do is instead of creating your own stack
> spot to store %pi into, you should look at the first user of %pi which
> should be a store of %pi into its stack space, as generated by the
> static compilation, and pull the stack slot out of there. Something like
> this:
>
> (Given Argument *A to look for:)
> Value *StackSlot = 0;
> if (StoreInst *SI = dyn_cast<StoreInst>(*A->use_begin()))
> StackSlot = SI->getPointerOperand();
>
> though I haven't actually tried to compile or run that.
>
> Nick
>
> > Paul
> >
> > On Sun, May 24, 2009 at 10:15 PM, Nick Lewycky <nicholas at mxc.ca
> > <mailto:nicholas at mxc.ca>> wrote:
> >
> > Paul Martin wrote:
> > > Hi,
> > > I have the following code, the lines preceded by `>` being added
> at
> > > runtime (the snipped was also printed at runtime)
> > >
> > > define i32 @myfunc(i32 %pi) {
> > > entry:
> > > %pi_addr = alloca i32 ; <i32*> [#uses=3]
> > > %retval = alloca i32 ; <i32*> [#uses=2]
> > > %tmp = alloca i32 ; <i32*> [#uses=2]
> > > > %ptr32 = alloca i32 ; <i32*> [#uses=2]
> > > %"alloca point" = bitcast i32 0 to i32 ; <i32>
> > [#uses=0]
> > >
> > > > store i32 %pi, i32* %ptr32
> > > > %ptr8 = bitcast i32* %ptr32 to i8* ; <i8*>
> > [#uses=1]
> > > > call void @roc( i8* %ptr8 )
> > >
> > > store i32 %pi, i32* %pi_addr
> > > %pi_addr1 = bitcast i32* %pi_addr to i8* ;
> > <i8*>
> > > [#uses=1]
> > > call void @roc( i8* %pi_addr1 )
> > > ...
> > >
> > > void roc(void*) is a function that only prints its argument as an
> > integer.
> >
> > So it's printing the pointer.
> >
> > > I was expecting for the program to print the same thing twice (the
> > > address of the myfunc argument) because the code added at runtime
> > looks
> > > to me identical with the code that was compiled (3 lines each).
> > > However, that was not the case; what I got was:
> > >
> > > 147156320
> > > 147117168
> > >
> > > What am I missing?
> >
> > Make roc() dereference the pointers it's given and print that
> instead.
> >
> > Nick
> >
> > _______________________________________________
> > LLVM Developers mailing list
> > LLVMdev at cs.uiuc.edu <mailto:LLVMdev at cs.uiuc.edu>
> > http://llvm.cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
> >
> >
> >
> > ------------------------------------------------------------------------
> >
> > _______________________________________________
> > LLVM Developers mailing list
> > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20090525/cd92972d/attachment.html>
More information about the llvm-dev
mailing list