[LLVMdev] Bogus assert in VMCore/Instructions.cpp CallInst::Create?
Andrew Ruef
awruef at umd.edu
Wed Jul 4 16:32:32 PDT 2012
This was the problem! The module had been created under one context
and due to a bug elsewhere in my program, everything else was using a
different context! Once changed, the system works.
Thank you very much.
On Wed, Jul 4, 2012 at 7:30 PM, Nick Lewycky <nicholas at mxc.ca> wrote:
> Andrew Ruef wrote:
>>
>> Evening,
>>
>> I was writing some code that tried to insert calls to the
>> llvm.annotation intrinsic function, which has a signature of (i32,
>> i8*, i8*, i32). The code is below.
>>
>> void addAnnotation( BasicBlock *block, Function *F)
>> {
>> string foo = "foo";
>> string bar = "barr";
>>
>> Type *charTy = Type::getInt8Ty(block->getContext());
>>
>> ArrayType *s1Ty = ArrayType::get(charTy, foo.size()+1);
>> ArrayType *s2Ty = ArrayType::get(charTy, bar.size()+1);
>>
>> Constant *ar1 = ConstantArray::get(block->getContext(), foo);
>> Constant *ar2 = ConstantArray::get(block->getContext(), bar);
>>
>> GlobalVariable *g1 = NULL;
>> GlobalVariable *g2 = NULL;
>>
>> g1 = new GlobalVariable( *F->getParent(),
>> s1Ty,
>> true,
>> GlobalValue::PrivateLinkage,
>> 0,
>> "");
>> g1->setAlignment(1);
>>
>> g2 = new GlobalVariable( *F->getParent(),
>> s2Ty,
>> true,
>> GlobalValue::PrivateLinkage,
>> 0,
>> "");
>> g2->setAlignment(1);
>>
>> vector<Constant*> s1_id;
>> vector<Constant*> s2_id;
>> s1_id.push_back(ConstantInt::get( block->getContext(),
>> APInt(64, StringRef("0"), 10)));
>> s1_id.push_back(ConstantInt::get( block->getContext(),
>> APInt(64, StringRef("0"), 10)));
>>
>> s2_id.push_back(ConstantInt::get( block->getContext(),
>> APInt(64, StringRef("0"), 10)));
>> s2_id.push_back(ConstantInt::get( block->getContext(),
>> APInt(64, StringRef("0"), 10)));
>>
>> g1->setInitializer(ar1);
>> g2->setInitializer(ar2);
>>
>> Type *tys = { Type::getInt32Ty(block->getContext()) };
>> Function *annot = Intrinsic::getDeclaration( F->getParent(),
>>
>> Intrinsic::annotation,
>> tys);
>> Value *v1 =ConstantExpr::getGetElementPtr(g1, s1_id);
>> Value *v2 =ConstantExpr::getGetElementPtr(g2, s2_id);
>> Value *c1 = ConstantInt::get(tys, 1);
>> Value *c2 = ConstantInt::get(tys, 0);
>>
>> vector<Value*> v;
>> v.push_back(c1);
>> v.push_back(v1);
>> v.push_back(v2);
>> v.push_back(c2);
>>
>> Value *callAnnot = CallInst::Create(annot, v, "", block);
>>
>> return;
>> }
>>
>> When I try and create the CallInst, an assert in
>> VMCore/Instructions.cpp fails, saying that the type of second
>> parameter of the function signature (i8*) does not match the type of
>> the first argument (which is also i8*).
>>
>> I can, in the addAnontation function, call dump() on both the second
>> parameter of the llvm.annotate function and the second element of the
>> 'v' array, and they are indeed both i8*. I wasn't able to find an
>> operator== method for Type, and it seems that the pointer values are
>> different between the value populated / created by
>> ConstantExpr::getGetElementPtr and Intrinsic::getDeclaration.
>>
>> For the moment, I commented out the check in VMCore/Instructions.cpp.
>> Could I add an operator== to Type that compares the TypeIDs? or am I
>> suffering from a fundamental misunderstanding?
>
>
> Types are indeed pointer comparable. If you have two Type*'s which print the
> same type but have different addresses then they belong to different
> LLVMContexts.
>
> Over IRC, you mentioned that the block and function have the same context,
> but the module has a different one. Because the intrinsic is being created
> with the module's context, it won't match. Of course, functions must be
> created with the context of the module that owns them, the bug is there.
>
> Nick
More information about the llvm-dev
mailing list