[LLVMdev] Assertion `InReg && "Value not in map!"' failed
Nick Lewycky
nicholas at mxc.ca
Sun Nov 16 22:17:04 PST 2008
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