[LLVMdev] Help with code
Chris Lattner
sabre at nondot.org
Fri Dec 24 16:43:57 PST 2004
On Tue, 21 Dec 2004, Sriraman Tallam wrote:
> Hi,
>
> I have this call instruction to printf inserted which is causing
> an assertion failure. Any pointers to where I am wrong :
>
> Code Dump :
>
> Function *printFn=M.getNamedFunction(std::string("printf"));
> Constant *str=ConstantArray::get("Value : %d\n");
> std::vector<Value *> Args(2);
> std::vector<Constant *> GEPIndices(2);
> GEPIndices[0]=Constant::getNullValue(Type::LongTy);
> GEPIndices[1]=Constant::getNullValue(Type::LongTy);
> Args[0]=ConstantExpr::getGetElementPtr(strcon,GEPIndices);
The problem here is that you are forming a getelementptr instruction where
the first operand is an array, not a pointer. In particular, given a
pointer to an aggregate, GEP returns a pointer to one of its elements.
To solve this problem, you need to create a new GlobalVariable object,
initializing it with your constant array. Instead of using strcon, you
use the global variable as the address of the string constant.
If you add this line above the ConstantExpr::getGetElementPtr line, things
should work better for you (untested, but it should show the idea):
strcon = new GlobalVariable(strcon->getType(), true,
GlobalVariable::InternalLinkage, strcon, "", &M);
-Chris
--
http://nondot.org/sabre/
http://llvm.cs.uiuc.edu/
More information about the llvm-dev
mailing list