<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On 28 May 2015 at 16:52, jsrduck <span dir="ltr"><<a href="mailto:jsrduck@gmail.com" target="_blank">jsrduck@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Hi, I'm having a hard time finding an answer to what I assume is a very basic<br>
idea. I'm trying to produce this llvm code using the LLVM api:<br>
<br>
  %myString = alloca [13 x i8], i32 13<br>
  store [13 x i8] c"Hello world.\00", [13 x i8]* %myString<br>
  %tmp1 = getelementptr [13 x i8]* %myString, i32 0, i32 0<br>
  %tmp2 = call i32 (i8*, ...)* @printf( i8* %tmp1 ) nounwind<br>
<br>
A simple Hello World example. But I can't seem to figure out what I'm<br>
supposed to pass to the GetElementPtrInst. For example, this snippet:<br>
<br>
   std::vector<llvm::Value*> args;<br>
   auto strValue =<br>
llvm::ConstantDataArray::getString(llvm::getGlobalContext(),<br>
llvm::StringRef("Hello world."));<br></blockquote><div><br></div><div>Note that this is the actual sequence of bytes, it is not a pointer to a place where that sequence of bytes is stored. %myString is a pointer to 13 bytes, and your store instruction put those 13 bytes in it.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
   std::vector<llvm::Value*> index_vector;<br>
   index_vector.push_back(Builder.getInt32(0));<br>
   index_vector.push_back(Builder.getInt32(0));<br>
   auto valueAsPtr = Builder.CreateGEP(strValue, index_vector, "tmp1");<br></blockquote><div><br></div><div>This is trying to create something like:</div><div><br></div><div>  %tmp1 = getelementptr [13 x i8] c"Hello world.\00", i32 0, i32 0<br></div><div><br></div><div>which is not valid IR (as the error message says, c"Hello world.\00" is not a pointer). You want to create what you wrote in your snippet of IR, where the first argument is the AllocaInst you created.</div><div><br></div><div>Nick</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
   args.push_back(valueAsPtr);<br>
   Builder.CreateCall(TheModule->getFunction("printf"), args, "callprintf");<br>
<br>
Note that this is summarized, I already have the IRBuilder, etc initialized.<br>
I've also tried this with a LoadInstr that loads the ConstantDataArray (I<br>
just inserted strValue into the example code to simplify things, I get the<br>
same error either way).<br>
<br>
If I run this code, LLVM asserts in the CreateGEP call with the error<br>
message "Non-pointer type for constant GetElementPtr expression" since the<br>
type I passed to CreateGEP is an Array type. Callstack:<br>
<br>
> Lexer.exe!llvm::ConstantExpr::getGetElementPtr(llvm::Constant * C,<br>
> llvm::ArrayRef<llvm::Value *> Idxs, bool InBounds, llvm::Type *<br>
> OnlyIfReducedTy) Line 2005 C++<br>
  Lexer.exe!llvm::ConstantFolder::CreateGetElementPtr(llvm::Constant * C,<br>
llvm::ArrayRef<llvm::Value *> IdxList) Line 133 C++<br>
<br>
Lexer.exe!llvm::IRBuilder<1,llvm::ConstantFolder,llvm::IRBuilderDefaultInserter<1><br>
>::CreateGEP(llvm::Value * Ptr, llvm::ArrayRef<llvm::Value *> IdxList, const<br>
llvm::Twine & Name) Line 1021 C++<br>
<br>
<br>
Shockingly, I have been unable to find examples of anyone else doing this.<br>
Everyone else seems to create a global variable to hold the string value,<br>
and then passes that Global variable to CreateGEP. I know the llvm code I'm<br>
trying to create works correctly, I just can't seem to produce it using the<br>
tools, and I'm not sure why.<br>
<br>
Thanks,<br>
Jordan<br>
<br>
<br>
<br>
--<br>
View this message in context: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.1065342.n5.nabble.com_Passing-2DConstantDataArray-2Dto-2DGetElementPtrInst-2Dtp81889.html&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=Mfk2qtn1LTDThVkh6-oGglNfMADXfJdty4_bhmuhMHA&m=IsubIqcrfVuwmiKvwXpc3BNUPINYRvSCmX026OJQnLo&s=IvFjacB9wYGovBKNb8e2WqnrwIk_9-gYdVAO1ri9wsU&e=" target="_blank">http://llvm.1065342.n5.nabble.com/Passing-ConstantDataArray-to-GetElementPtrInst-tp81889.html</a><br>
Sent from the LLVM - Dev mailing list archive at Nabble.com.<br>
_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:LLVMdev@cs.uiuc.edu">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu" target="_blank">http://llvm.cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br>
</blockquote></div><br></div></div>