[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