从现有AST构建IR时,我的AST有一些字符串值(在编译时它们是从std::string
构建的)并且我想将它们安全地设置为llvm::Value
以用作表达的一部分。
在这种情况下,我不需要在运行时绑定字符串,因为字符串值仅用于在编译时将内容解析为变量,函数或类(该语言不支持本机字符串)类型)。
最好的方法是将我的字符串内容保持为llvm::Value
,仍然能够在编译的后期阶段(构建嵌套表达式时)检索它吗?
更具体地说,如果我将llvm::Value
设置为:
llvm::Value* v = llvm::ConstantArray::get(llvmContext, myString.c_str());
如何安全地检索字符串值? llvm::ConstantArray
是否适合包装字符串?
答案 0 :(得分:5)
是的,ConstantArray是你应该在这里使用的。为了以后检索值,只需使用ConstantArray :: getAsCString()。如果你打开了断言,它会断言是否会出错(例如你会尝试从没有终止符的数组中获取字符串)。
答案 1 :(得分:3)
在C代码char *x = "asdf";
上运行http://llvm.org/demo/会给出:
@.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调用。