我开发了一个玩具编译器,并尝试实现字符串和数组。我注意到 clang 总是为这些类型创建一个全局变量,即使它们是在函数中定义的。我想这是有充分理由的,所以我尝试这样做。
我的问题是我不知道如何通过 C++ API 来做到这一点。 kalidscope 教程不涵盖字符串和数组,因此我找到的唯一来源是文档。
在 Module 类的文档中,有函数getOrInsertGlobal,它看起来相关,但我无法理解如何设置全局的实际值。函数参数仅包括变量的名称和类型。那么价值去哪儿了呢?
所以问题是:如何定义一个全局字符串,例如“hello”或数组,例如llvm c++ API中的[i32 1, i32 2]?任何例子将非常感激。
您想要的称为只读全局变量,并且您需要该变量、初始值设定项,可能还需要常量转换,以便所有字符串都可以具有相同的类型。
\n\n假设您的字符串是 C 类型 \xe2\x80\x94 以 null 结尾的字节序列。在这种情况下,您将希望字符串是零字节的数组,以便所有数组都具有相同的类型。但初始化程序必须是正确字节数的数组,以便每个初始化程序的类型与其值相匹配。因此,您使用类似的方法创建数组(从我编写的代码中剪切并粘贴在一起,甚至不会编译,不是最有效的方法,但确实包含您需要的大部分构建块):
\n\nstd::vector<llvm::Constant *> chars(utf8string.size());\nfor(unsigned int i = 0; i < utf8string.size(); i++)\n chars[i] = ConstantInt::get(i8, utf8string[i]);\nauto init = ConstantArray::get(ArrayType::get(i8, chars.size()),\n entries);\nGlobalVariable * v = \n new GlobalVariable(module, init->getType(), true,\n GlobalVariable::ExternalLinkage, init,\n utf8string);\nreturn ConstantExpr::getBitCast(v, i8->getPointerTo());\nRun Code Online (Sandbox Code Playgroud)\n\n请注意,GlobalVariable 是一个指向它被初始化为的任何内容的指针,因此如果您使用五字节序列“test\\0”初始化它,那么它将是一个指向五个字节的指针。或者,如果进行强制转换,它可以是指向 0 字节的指针(LLVM 允许您索引超过正式结尾),或者如果您定义了抽象类型,则它可以是一个实例。
\n| 归档时间: |
|
| 查看次数: |
2560 次 |
| 最近记录: |