[LLVMdev] How do I get the result of an instruction?

bhavani krishnan bhavi63 at yahoo.com
Sun Nov 16 20:25:24 PST 2008


ok. I think I get it now. I need to create the instructions as you have given. For eg: I could pass Instruction*(for storing the result of this instruction) while creating the store instruction. This is what you meant rite??

Thanks,
Bhavani


--- On Mon, 11/17/08, bhavani krishnan <bhavi63 at yahoo.com> wrote:

> From: bhavani krishnan <bhavi63 at yahoo.com>
> Subject: Re: [LLVMdev] How do I get the result of an instruction?
> To: "Eli Friedman" <eli.friedman at gmail.com>
> Cc: "LLVM Developers Mailing List" <llvmdev at cs.uiuc.edu>, "John Criswell" <criswell at uiuc.edu>
> Date: Monday, November 17, 2008, 4:20 AM
> Thanks Eli! 
> But I still have a question. What you have written is in
> IR. When I am writing the pass, I donot have access to the
> result of the instruction    (%resulttoprint in your
> example). All I have is a Instruction* right? So, how do I
> get the result of the instruction? Am I missing something
> here?
> 
> Thanks,
> Bhavani 
> 
> 
> 
> --- On Sun, 11/16/08, Eli Friedman
> <eli.friedman at gmail.com> wrote:
> 
> > From: Eli Friedman <eli.friedman at gmail.com>
> > Subject: Re: [LLVMdev] How do I get the result of an
> instruction?
> > To: bhavi63 at yahoo.com
> > Cc: "LLVM Developers Mailing List"
> <llvmdev at cs.uiuc.edu>, "John Criswell"
> <criswell at uiuc.edu>
> > Date: Sunday, November 16, 2008, 9:22 PM
> > 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