2011-12-04 68 views
10

当从现有的AST构建IR时,我的AST有一些字符串值(在编译时它们是从std::string构建的),我想将它们安全地设置为llvm::Value以用作表达式的一部分。LLVM字符串值对象:如何从值中检索字符串?

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

请告诉我让我的字符串内容llvm::Value最好的办法还是可以在编译的后期阶段(当嵌套表达式建)以获取它?

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

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

如何安全地获取字符串值?是llvm::ConstantArray合适的方式来包装字符串?

回答

5

是的,ConstantArray是你应该在这里使用。为了稍后检索值,只需使用ConstantArray :: getAsCString()。如果你打开了断言,它会断言是否会出错(例如,你将尝试从无终止符的数组中抓取字符串)。

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