[LLVMdev] Pointer to String Constant

Tom Prince tom.prince at ualberta.net
Thu Mar 4 18:47:59 PST 2010


On Thu, Mar 04, 2010 at 04:50:41PM -0800, Nyx wrote:
> 
> I'm writing a C compiler in OCaml and I've run into a small problem. I wrote
> the following piece of code to generate a pointer to a string constant, so I
> could compile C expressions of the form "const char* p = "test\n";" :
> 
> let strval = const_stringz codecontext v in
> dump_value strval;
> dump_value i32_zero;
> const_gep strval [| i32_zero; i32_zero |]
> 
> The dump statements I put confirm that the string array and the index values
> have the types I would expect:
> 
> [6 x i8] c"test\0A\00"
> i32 0
> 
> However, the code still seems to break an assertion:
> 
> Constants.cpp:1487: static llvm::Constant*
> llvm::ConstantExpr::getGetElementPtr(llvm::Constant*, llvm::Value* const*,
> unsigned int): Assertion `Ty && "GEP indices invalid!"' failed.
> Aborted
> 
> Could someone tell me what I'm doing wrong here?

A getelementptr takes a pointer as the first element. Unlike C, arrays are
first class values, not pointers. To index into an array, you need
extractvalue.

To have a C like array, you would need to allocate one in memory, either as a
global variable or with malloc, or alloca. Any of those would give you a
pointer to an array, which you could index.

Have a look at http://www.llvm.org/docs/GetElementPtr.html for more details on
getelementptr.

  Tom



More information about the llvm-dev mailing list