[LLVMdev] How do I get the result of an instruction?
Eli Friedman
eli.friedman at gmail.com
Sun Nov 16 13:22:26 PST 2008
On Sun, Nov 16, 2008 at 7:54 AM, bhavani krishnan <bhavi63 at yahoo.com> wrote:
> Hi,
>
> I am writing an optimization pass where I need to instrument the code such that I need to store the results of some instructions in file. Using llc -march=cpp option I figured out how to add a function(say writeToFile) which takes char* parameter and writes to file. Now, I need put in a CallInst which calls writeToFile passing the Instruction result as parameter. How do I do this?
>
> So, in my optimization pass...
> Func *myprint = makewriteToFile() //creates a function which writes to file
> for (Function::iterator i = func->begin(), e = func->end(); i != e; ++i)
> {
> blk=i;
> for (BasicBlock::iterator j = blk->begin(), k = blk->end(); j != k; ++j){
> Instruction *inst = j;
> //if inst satisfies my condition, write reults to file
> CallInst *CallPrint = CallInst::Create(myprint, ???, "", j);
> CallPrint->setTailCall(true);
> }
> }
> What do I put in the ???. How do I cast Instruction *inst into char * which can be passed into the function?
Well, you can do something like the following:
define i32 @f() nounwind {
entry:
%x = alloca i32
%resulttoprint = call i32 (...)* @a() nounwind
;start instrumentation
store i32 %resulttoprint, i32* %x, align 4
%x1 = bitcast i32* %x to i8*
call void @print(i8* %x1) nounwind
;end instrumentation
ret i32 %resulttoprint
}
That said, you might need to do something that's aware of the type of
the result; printing a value in human-readable form requires calling
something like printf.
-Eli
More information about the llvm-dev
mailing list