[LLVMdev] Assertion `castIsValid(getOpcode(), S, Ty) && "Illegal BitCast"' failed.

bhavani krishnan bhavi63 at yahoo.com
Sun Nov 16 21:34:43 PST 2008


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);
Value *BT = new BitCastInst(ST,VoidPtrTy,"",j);
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



      



More information about the llvm-dev mailing list