[LLVMdev] Bogus assert in VMCore/Instructions.cpp CallInst::Create?
Andrew Ruef
awruef at umd.edu
Wed Jul 4 16:00:52 PDT 2012
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?
Thank you,
Andrew
More information about the llvm-dev
mailing list