code-generating constant strings

Hi, everyone!

I have maybe very naive question, but nontheless.
I'm experimenting with Kaleidoscope tutorial and I want to morph it into something similar to McCarthy's initial Lisp.
For that, I need to implement symbols, which I thought I should implement as pointers to structures, and those
structures would contain at least one field, which would be symbol's name.
So, here's a question: how do I generate a code, that represents a literal string on LLVM side using LLVM's C++ API
I'm asking, because to simply generate constant floating-point value C++ API uses
an incantation 'ConstantFP::get(getGlobalContext(), APFloat(Val));' so I guess string generation is also not obvious.

In the textual LLVM, what I want to generate is something like '@.foo_sym = private unnamed_addr constant {[13 x i8] c"hello world\0A\00"}'

I just modified the example of a constant string from LLVM reference manual, adding curly braces.
So, what I really want is for any newly encountered symbol to generate code, that declares variable, which is structure, which contains
that symbol name, and a way to access the address of that structure, substituting all occurencies of that symbol in a code I'm generating
by the pointer to that structure.
So, how would I (using C++ API):
   1. generate code that defines constant string
   2. generate code, that defines structure, that contains a string
   3. when generating further code, be able to insert a pointer to this structure?

Yours sincerely,

For some reason the mail didn't got through the first time, so sending it again.

Hi Alex, I’ll try to answer your questions to the best of my knowledge:

  1. You can use the IRBuilder::CreateGlobalStringPtr function, which returns a value with the “i8*” type.

  2. You can define a structure type using llvm::StructType::get or create function. When you want to store a string in the structure, you can add a field which has the “i8*” type, which stores a pointer to a null-terminated i8(character) array, or you can also add a field which has a structure type that stores both the pointer and the length of the string.

  3. I’m not quite sure what exactly do you mean, but I’m guessing that you want to add new fields to this structure based on the run-time behavior of the program. You can do this by storing a dynamic array in your structure, and inserting pointers into this dynamic array.

I hope that was helpful,