bhavani krishnan
2008-Nov-17 07:21 UTC
[LLVMdev] Assertion `InReg && "Value not in map!"' failed
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 > >>> > >>> > >>> > >>> > > > > > > > > > > > >
Seemingly Similar Threads
- [LLVMdev] Assertion `InReg && "Value not in map!"' failed
- [LLVMdev] Assertion `InReg && "Value not in map!"' failed
- [LLVMdev] Assertion `castIsValid(getOpcode(), S, Ty) && "Illegal BitCast"' failed.
- [LLVMdev] How do I get the result of an instruction?
- [LLVMdev] How do I get the result of an instruction?