[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