[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);



More information about the llvm-dev mailing list