JAVA-API 的 LLVM IR

LLVM IR with JAVA-API

我正在使用 ANTLR4 作为前端,并希望使用 LLVM 创建我的 IR。我正在为 JavaCPP 的 LLVM 使用 JAVA-Api。

因为我讨厌文档...我怎样才能用这个 Api 添加一个变量?因此,我需要一个局部变量和全局变量的解决方案。如果谁有相应的文档或者好的例子,将不胜感激

非常感谢

好吧,就文档而言,LLVM C API 接近 none。另一方面,C++ API 为其大多数方法提供了一些文档,这就是为什么使用 LLVM 的“文档”或“学习路径”通常只是阅读其源代码的相关位。我相信您以前看过它,但我也会在这里 link 官方 C Doxygen 索引。 https://llvm.org/doxygen/group__LLVMC.html

官方语言参考手册也擅长描述某些主题,如元数据、属性等。 https://llvm.org/docs/LangRef.html

正如用户 arnt 提到的,对于全局变量,我们使用 C++ API 中的内容,称为 GlobalVariable。在 C API 中,我们有 LLVMModuleRef 类型的函数,它执行 C++ API 所做的事情。在大多数情况下,这只是将一个新名称(变量名称)附加到具有类型和可选值的模块。

使用 JavaCPP 预设 Java,我们可以使用以下代码片段在名为“my_global”的模块中声明一个全局变量,它是一个 8 位整数初始化值为 42.

LLVMContextRef ctx = LLVM.LLVMContextCreate();
LLVMTypeRef i8 = LLVM.LLVMInt8TypeInContext(ctx);
LLVMValueRef value = LLVM.LLVMConstInt(i8, 42L, /* signExtend */ 1);
LLVMModuleRef module = LLVM.LLVMModuleCreateWithNameInContext("my_module", ctx);
LLVMValueRef global = LLVM.LLVMAddGlobal(module, i8, "my_global");

LLVM.LLVMSetInitializer(global, value);

// Always remember to clean up your resources from the native APIs
LLVM.LLVMDisposeModule(module);
LLVM.LLVMContextDispose(ctx);

局部变量通常不通过名称引用(尽管您可以命名块局部 IR 变量),并且它们是使用 SSA 形式构建的。这意味着您需要将您用来表示的任何结构转换为可以转换为 SSA 形式的结构。

查看 Instruction Builder APIs (https://llvm.org/doxygen/group__LLVMCCoreInstructionBuilder.html) 我们有您要用来创建 LLVM IR 的函数。

表达式“2 + 2”应转换为具有适当操作数的 LLVMBuildAdd 调用。再一次,仔细看看如何将你的 AST 扁平化为 3 地址代码或类似的扁平化结构。一旦你记下了这个,你就可以轻松地将你自己的三地址代码映射到 LLVM IR 中。