LLVM字符串值对象:如何从值中检索字符串?

时间:2011-12-04 18:53:29

标签: c++ llvm llvm-3.0

从现有AST构建IR时,我的AST有一些字符串值(在编译时它们是从std::string构建的)并且我想将它们安全地设置为llvm::Value以用作表达的一部分。

在这种情况下,我不需要在运行时绑定字符串,因为字符串值仅用于在编译时将内容解析为变量,函数或类(该语言不支持本机字符串)类型)。

最好的方法是将我的字符串内容保持为llvm::Value仍然能够在编译的后期阶段(构建嵌套表达式时)检索它吗?

更具体地说,如果我将llvm::Value设置为:

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

如何安全地检索字符串值? llvm::ConstantArray是否适合包装字符串?

2 个答案:

答案 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调用。