[LLVMdev] Assertion `InReg && "Value not in map!"' failed

bhavani krishnan bhavi63 at yahoo.com
Sun Nov 16 23:21:40 PST 2008


ok 1 last question for the day...
I created a function in C.
void writeToFile(char *str)
{
FILE *f;
if((f=fopen("example","a"))==NULL){
        printf("could not open file");
}
else{
fprintf(f,str);
fclose(f);}
}
used this to create .bc then using llc -march=cpp I got the cpp code to create this function.

While instrumenting my code, I place call to this function. Code which is generated by instrumenting is as follows: add is the original instruction. All others are instrumentation code added by my pass.
	%tmp3 = add i32 %b, %a		; <i32> [#uses=1]
	alloca i32		; <i32*>:0 [#uses=2]
	store i32 210, i32* %0, align 4
	bitcast i32* %0 to i8*		; <i8*>:1 [#uses=1]
	tail call void @writeToFile( i8* %1 )
	ret i32 %tmp3

While executing, I get the following error:
void llvm::CallInst::init(llvm::Value*, llvm::Value* const*, unsigned int): Assertion `(i >= FTy->getNumParams() || FTy->getParamType(i) == Params[i]->getType()) && "Calling a function with a bad signature!"' failed.

Why is it a bad signature :(? i8* is being passed to the function? Any ideas as to what could be wrong?

Thanks,
Bhavani
--- On Mon, 11/17/08, Nick Lewycky <nicholas at mxc.ca> wrote:

> From: Nick Lewycky <nicholas at mxc.ca>
> Subject: Re: Assertion `InReg && "Value not in map!"' failed
> To: bhavi63 at yahoo.com
> Cc: "LLVM Developers Mailing List" <llvmdev at cs.uiuc.edu>
> Date: Monday, November 17, 2008, 6:51 AM
> bhavani krishnan wrote:
> > Thanks Nick! ok. I ran through the verifier and this
> is the issue:
> > verifying... Instruction does not dominate all uses!
> > 	%tmp3 = add i32 %b, %a		; <i32> [#uses=2]
> > 	store i32 %tmp3, i32* %0, align 4
> > Broken module found, compilation aborted!
> > add is existing instruction in function. store is the
> instruction I have added to the function. How do I fix this
> now :(?
> 
> Yep, you need all uses of an instruction to be dominated by
> the 
> definition of the instruction.
> 
> Within a single basic block, it means that the instructions
> need to be 
> in order. You can't have 'store %tmp3' before
> the '%tmp3 = ...' has been 
> executed.
> 
> If they're in two different basic blocks, you need to
> make sure that the 
> basic block your store is in is actually dominated by the
> basic block 
> that defines %tmp3.
> 
> Nick
> 
> > Thanks,
> > Bhavani
> > 
> > --- On Mon, 11/17/08, Nick Lewycky
> <nicholas at mxc.ca> wrote:
> > 
> >> From: Nick Lewycky <nicholas at mxc.ca>
> >> Subject: Re: Assertion `InReg &&
> "Value not in map!"' failed
> >> To: bhavi63 at yahoo.com
> >> Cc: "LLVM Developers Mailing List"
> <llvmdev at cs.uiuc.edu>
> >> Date: Monday, November 17, 2008, 6:17 AM
> >> bhavani krishnan wrote:
> >>> Ah! I get it now. Thanks a lot !
> >>> I changed it to
> >> BitCastInst(AI,VoidPtrTy,"",j);
> >>> And now I am getting the following error :(. I
> have
> >> been stuck with this error before also. I know I
> am missing
> >> out something silly. What is the cause of this
> error and
> >> Please let me know how to fix it.
> >>>
> >>
> /home/bhavani/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1130:
> >> llvm::SDOperand
> llvm::SelectionDAGLowering::getValue(const
> >> llvm::Value*): Assertion `InReg &&
> "Value not
> >> in map!"' failed.
> >>> I know I am asking lot of questions but I am
> new to
> >> LLVM and am finding it hard to figure things out.
> Appreciate
> >> any help!
> >>
> >> This assertion is late, in the codegen phase. I
> suspect
> >> you're sending 
> >> the codegen invalid IR. Try running the your code
> through
> >> the verifier.
> >>
> >> Nick
> >>
> >>> Thanks,
> >>> Bhavani
> >>>
> >>>
> >>>
> >>>
> >>> --- On Mon, 11/17/08, Nick Lewycky
> >> <nicholas at mxc.ca> wrote:
> >>>> From: Nick Lewycky <nicholas at mxc.ca>
> >>>> Subject: Re: [LLVMdev] Assertion
> >> `castIsValid(getOpcode(), S, Ty) &&
> "Illegal
> >> BitCast"' failed.
> >>>> To: bhavi63 at yahoo.com, "LLVM
> Developers
> >> Mailing List" <llvmdev at cs.uiuc.edu>
> >>>> Date: Monday, November 17, 2008, 5:54 AM
> >>>> bhavani krishnan wrote:
> >>>>> ok.. So I am trying out what you have
> >> suggested. I
> >>>> have written the below code which
> basically tries
> >> to write
> >>>> the constant 10 to a file. myprint is a
> function
> >> pointer to
> >>>> a function which takes char * parameter
> and writes
> >> it to
> >>>> file.
> >>>>> Value *Ten =
> ConstantInt::get(Type::Int32Ty,
> >> 10);
> >>>>> const Type *VoidPtrTy =
> >>>> PointerType::getUnqual(Type::Int8Ty);
> >>>>> AllocaInst *AI = new
> >> AllocaInst(Type::Int32Ty);
> >>>>> Value *ST = new
> StoreInst(Ten,AI,false,4,j);
> >>>> Realize that StoreInst's don't
> have a
> >> result. A
> >>>> 'store' does not evaluate to a
> particular
> >> value at
> >>>> run time. Its type is Void.
> >>>>
> >>>>> Value *BT = new
> >>>> BitCastInst(ST,VoidPtrTy,"",j);
> >>>>
> >>>> Trying to cast (void) to (void*) is
> invalid.
> >> Instead, you
> >>>> should cast the AllocaInst, ala:
> >>>>
> >>>>   Value *BT = new
> >> BitCastInst(AI,VoidPtrTy,"",j);
> >>>> Nick
> >>>>
> >>>>> CallInst *CallPrint =
> >> CallInst::Create(myprint, BT,
> >>>> "", j);
> >>>>> CallPrint->setTailCall(true);
> >>>>>
> >>>>> I am getting the following error while
> >> executing.
> >>>>>  Assertion `castIsValid(getOpcode(),
> S, Ty)
> >> &&
> >>>> "Illegal BitCast"' failed.
> >>>>> What am I doing wrong :(? I always get
> stuck
> >> badly
> >>>> when these assertions fail :(. Please help
> me out
> >> 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
> >>>>>
> >>>>>      
> >> _______________________________________________
> >>>>> LLVM Developers mailing list
> >>>>> LLVMdev at cs.uiuc.edu        
> >> http://llvm.cs.uiuc.edu
> >> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
> >>>
> >>>
> >>>       
> >>>
> > 
> > 
> > 
> > 
> >       
> >



      



More information about the llvm-dev mailing list