[LLVMdev] code-generating constant strings

12 views
Skip to first unread message

Alexander Popolitov

unread,
Dec 2, 2013, 7:56:11 PM12/2/13
to llv...@cs.uiuc.edu
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,
Alex
_______________________________________________
LLVM Developers mailing list
LLV...@cs.uiuc.edu http://llvm.cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev

Alexander Popolitov

unread,
Dec 3, 2013, 3:23:02 PM12/3/13
to llv...@cs.uiuc.edu

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

Alex L

unread,
Dec 3, 2013, 5:06:09 PM12/3/13
to Alexander Popolitov, LLVM Developers Mailing List
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,
Alex


2013/12/3 Alexander Popolitov <pop...@gmail.com>
Reply all
Reply to author
Forward
0 new messages