26 | 生成IR:实现静态编译的语言
该思维导图由 AI 生成,仅供参考
LLVM IR 的对象模型
- 深入了解
- 翻译
- 解释
- 总结
本文详细介绍了如何使用LLVM API生成IR,并验证生成的IR的正确性。文章首先介绍了LLVM IR的对象模型,包括Module、Function、BasicBlock、Instruction和Value等类,以及LLVMContext类。通过示例代码演示了如何为一个包含if语句的函数生成IR,包括创建基本块、条件跳转指令和phi指令等步骤。另外,文章还展示了如何支持本地变量,并说明了LLVM IR对寄存器和内存中变量的赋值规则。通过这些示例,读者可以学习如何生成基本的IR,包括支持本地变量、加法运算和if语句等。最后,文章提到了通过优化算法可以将使用内存保存临时变量的版本优化成使用寄存器的版本。文章内容清晰,逻辑严谨,对于想要深入了解LLVM IR的读者来说,是一份有价值的技术指南。
《编译原理之美》,新⼈⾸单¥59
全部留言(13)
- 最新
- 精选
- ZYS宫老师考虑把课程整理成一本书出版那,很好的内容
作者回复: 嗯,已经在准备中~~~ 我们的教程,限于篇幅,很多细节还是不会延伸太多。写成书的话,就可以讲得更充分。
2020-01-289 - 渔子长请教一个问题宫老师,LLVM的Module,设计是什么粒度的?比如一堆脚本可能拆分了几百个文件,把这些文件编译成IR,是每个文件对应一个Module?还是整体只构建一个Module?
作者回复: 如果对应于C或C++语言,一个Module就相当于一个目标文件,里面有一些函数式对外公开的,另一些是私有的,然后多个Module可以链接到一起。 所以,基本上是一个文件对应一个Module。
2019-12-1126 - xiaobang请教一下老师,为什么if语句要生成merge块,明明then和else里已经return了?难道llvm只允许一个函数一个return
作者回复: 不是的,可以有多个return。 不过,一般CFG会要求有两个特殊的块:入口块(Entry Block)和退出块(Exit Block)。这样的话,CFG就是一个有根的图(Rooted Directed Graph),便于执行某些分析和优化算法。如果要深入研究,可以去看看图的算法。 在LLVM中,有一个优化算法可以把多个return语句合并,这样就只有一个Exit Block了。
2019-11-125 - 沉淀的梦想老师用的什么版本的llvm,我使用llvm 7.0编译老师lab-26的代码,发现LegacyRTDyldObjectLinkingLayer和AcknowledgeORCv1Deprecation都已经不存在了,但是网上搜了一下,也没找到什么可以替代的东西
作者回复: 用llvm 9.0吧。 并且最好下载源代码,自己编译。这样会按照debug模式编译,用opt等工具的时候,可以输出更多信息,有利于你做实验。
2019-10-2323 - Geek_6c84aa使用默认选项编译安装llvm9时默认是没有开启rtti的。在编译本节代码时遇到undefined reference 'typeinfo'问题,需要在cmakelist中添加add_compile_options(-fno-rtti) 或者重新编译llvm(-DLLVM-ENABLE-RTTI)。希望对大家有帮助。
作者回复: 感谢分享经验:-)
2021-01-161 - coconutPython版本基于llvmlite库的实现。 https://github.com/leveryd/PlayWithCompiler/blob/master/llvm/1.%E5%88%9D%E8%AF%86llvm/test.py
作者回复: Great! python + llvm。 感谢你分享了更丰富使用编译技术的场景!
2021-01-041 - lion_fly如果是在linux下使用LLVM的JIT,在编译的时候需要注意如下问题: If you are compiling this on Linux, make sure to add the “-rdynamic” option as well. This makes sure that the external functions are resolved properly at runtime.
作者回复: 感谢分享!
2020-12-22 - lion_flydeclare void @foo(i32) Failure value returned from cantFail wrapped call Symbols not found: [ foo ] UNREACHABLE executed at /usr/lib/llvm-11/include/llvm/Support/Error.h:749!
作者回复: llvm工具要用熟练,会遇到很多小坑。不过代价是值得的。
2020-12-16 - lion_fly在新版中llvm_map_components_to_libnames(llvm_libs all)已经过时,新版需要写成:set(llvm_libs LLVM-11)
作者回复: 感谢分享!
2020-12-14 - overmind如何通过优化算法,把上述代码从使用内存的版本,优化成使用寄存器的版本。谢谢
作者回复: 第29讲有介绍分配寄存器的算法。尽量多使用寄存器,实在寄存器放不下的,才“溢出”到内存。
2019-12-21