10

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

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

保持我的字符串内容不变llvm::Value并且仍然能够在编译的后期阶段(构建嵌套表达式时)检索它的最佳方法是什么?

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

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

如何安全地检索字符串值?llvm::ConstantArray包装字符串的适当方法是什么?

4

2 回答 2

5

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

于 2011-12-05T07:19:29.810 回答
3

在 C 代码上运行http://llvm.org/demo/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 调用。

于 2011-12-05T01:39:37.163 回答