我使用ANTLR4作为前端,并希望使用LLVM创建我的IR。我正在使用来自JavaCPP的JAVA-Api for LLVM。
因为我讨厌docu...How,所以我可以用这个Api添加一个变量吗?因此,我需要一个局部变量和全局变量的解决方案。如果有人有相应的文档或好的例子,我将非常感激。
非常感谢
发布于 2021-01-14 07:21:09
嗯,就文档而言,LLVM C API几乎没有。另一方面,LLVM的大多数方法都有一些文档,这就是为什么使用C++的“文档”或“学习路径”通常只是阅读其源代码的相关部分。我相信你以前见过它,但我也会在这里链接官方的C-DO2索引。https://llvm.org/doxygen/group__LLVMC.html
官方的语言参考手册也擅长描述某些主题,如元数据、属性等。https://llvm.org/docs/LangRef.html
正如用户没有提到的那样,对于全局变量,我们使用C++应用程序接口中的GlobalVariable。在C应用程序接口中,我们有用于LLVMModuleRef类型的函数,它做C++应用程序接口所做的事情。在大多数情况下,这只是将一个新名称(变量名)附加到具有类型和可选值的模块。
使用Java语言的JavaCPP预置,我们可以使用下面的代码片段在我们的模块中声明一个名为"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 (https://llvm.org/doxygen/group__LLVMCCoreInstructionBuilder.html),我们提供了您将用来创建LLVM的函数。
表达式"2 + 2“应转换为具有适当操作数的LLVMBuildAdd调用。同样,仔细看看如何将AST扁平化为3个地址的代码或类似的扁平化结构。一旦你有了它,你就可以很容易地将你自己的3地址代码映射到LLVM IR中。
https://stackoverflow.com/questions/65634369
复制相似问题