Объекты объектов LLVM String: как я могу получить строку из значения?

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

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

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

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

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

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

Ответ 1

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

Ответ 2

Запуск 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/ для вывода вызовов API С++, если у вас возникли проблемы с выяснением того, как это сделать.