首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带JAVA-API的LLVM IR

带JAVA-API的LLVM IR
EN

Stack Overflow用户
提问于 2021-01-09 02:18:25
回答 1查看 195关注 0票数 1

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

因为我讨厌docu...How,所以我可以用这个Api添加一个变量吗?因此,我需要一个局部变量和全局变量的解决方案。如果有人有相应的文档或好的例子,我将非常感激。

非常感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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。

代码语言:javascript
复制
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中。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65634369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档