Объекты LLVM String Value: Как я могу получить строку из значения? - PullRequest
10 голосов
/ 04 декабря 2011

При построении IR из существующего AST у моего AST есть некоторые строковые значения (во время компиляции они построены из std::string), и я хочу их безопасно установить как llvm::Value для использования в качестве части выражения,

В этом случае мне не нужно связывать строку во время выполнения, потому что строковые значения предназначены только для разрешения вещи как переменных, функций или классов во время компиляции (язык не поддерживаетсобственный тип строки).

Какой лучший способ сохранить содержимое моей строки как llvm::Value и все еще , чтобы иметь возможность извлечь его на более поздних этапах компиляции (когда построены выражения вложенности)?

Конкретнее, если я установлю llvm::Value с помощью:

 llvm::Value* v = llvm::ConstantArray::get(llvmContext, myString.c_str());

Как безопасно получить строковое значение?Является ли llvm::ConstantArray подходящим способом для переноса строк?

Ответы [ 2 ]

5 голосов
/ 05 декабря 2011

Да, ConstantArray - это то, что вы должны использовать здесь.Чтобы получить значение позже, просто используйте ConstantArray :: getAsCString ().Если у вас есть включенные утверждения, он будет утверждать, что что-то пошло не так (например, вы попытаетесь получить строку из массива без нулевого терминатора).

3 голосов
/ 05 декабря 2011

Запуск http://llvm.org/demo/ по коду C char *x = "asdf"; дает:

@.str = private unnamed_addr constant [5 x i8] c"asdf\00"
@x = global i8* getelementptr inbounds ([5 x i8]* @.str, i64 0, i64 0), align 8

По сути, чтобы получить адрес строки, вы должны создать глобал, содержащий ее. Вы можете переключить http://llvm.org/demo/ для вывода вызовов C ++ API, если у вас возникли проблемы с выяснением, как это сделать.

...