Scott Ricketts
2009-Jun-18 17:13 UTC
[LLVMdev] Referring to an argument in another function
I would like to instrument certain function calls with a function call of my own that takes some of the same arguments. For example, I would like to instrument calls to free with some function foo, so the C code would look like: foo(myarg1, myarg2, ptr); free(ptr); The problem occurs when I grab the arg from the free function and try to pass it to foo... if (isCallToFree(&I)) { Value* P; if (Function *F = I.getCalledFunction()) { Function::arg_iterator ait = F->arg_begin(); if (ait) { P = &(*ait); } createCallInst(mem_fcall, &I, 3, getOpcodeValue(I), getInstrIDValue(), P); } } createCallInst is my own wrapper. The error thrown during the pass is: "Referring to an argument in another function!" Any suggestions? Thanks, Scott
Frits van Bommel
2009-Jun-18 19:41 UTC
[LLVMdev] Referring to an argument in another function
Scott Ricketts wrote:> I would like to instrument certain function calls with a function call > of my own that takes some of the same arguments. For example, I would > like to instrument calls to free with some function foo, so the C code > would look like: > > foo(myarg1, myarg2, ptr); > free(ptr); > > The problem occurs when I grab the arg from the free function and try > to pass it to foo... > > if (isCallToFree(&I)) { > Value* P; > if (Function *F = I.getCalledFunction()) { > Function::arg_iterator ait = F->arg_begin();You want to look at the operands of the call/invoke/free instruction, not the arguments of the function being called. So if you're sure it's a call or invoke (not a 'free' instruction), try something like this: #include "llvm/Support/CallSite.h" // ... CallSite CS(&I); CallSite::arg_iterator ait = CS.arg_begin(), aend = CS.arg_end();> if (ait) {You want if (ait != aend) { here.> P = &(*ait); > } > createCallInst(mem_fcall, &I, 3, getOpcodeValue(I), > getInstrIDValue(), P); > } > } > > createCallInst is my own wrapper. The error thrown during the pass is: > > "Referring to an argument in another function!" > > Any suggestions?
Scott Ricketts
2009-Jun-19 21:06 UTC
[LLVMdev] Referring to an argument in another function
On Thu, Jun 18, 2009 at 12:41 PM, Frits van Bommel<fvbommel at wxs.nl> wrote:> You want to look at the operands of the call/invoke/free instruction, not the > arguments of the function being called. > So if you're sure it's a call or invoke (not a 'free' instruction), try > something like this: > > #include "llvm/Support/CallSite.h" > // ... > CallSite CS(&I); > CallSite::arg_iterator ait = CS.arg_begin(), aend = CS.arg_end(); > >> if (ait) { > > You want > if (ait != aend) { > here. >Thanks! CallSite is what I needed. I ended up getting P with CS.getArgument(0) instead of an arg_iterator, but only because I first check that it is an externally linked call to free with 1 argument. Scott