20200828-Kaleidoscope(第四期)-孙少策.pdf
《LLVM新手入门教程——构建万花筒语言》 在编程世界中,LLVM是一个强大的编译器基础设施,它提供了一套工具集用于构建编译器、分析工具以及优化中间代码。Kaleidoscope是LLVM官方教程中设计的一个简单的编程语言,用于演示如何一步步构建一个编译器前端。这个教程通过实现万花筒语言(Kaleidoscope)的语法和功能,深入浅出地介绍了LLVM的基础知识。 万花筒语言的定义包括函数声明、外部函数调用和条件语句。例如,`extern printd(x);` 是对外部函数 `printd` 的声明,它接受一个双精度浮点数作为参数。`Read extern: declare double @printd(double)` 表示这个声明在LLVM IR(Intermediate Representation)中是如何表示的。 接着,`smaller` 函数展示了如何使用LLVM IR来实现条件分支。在LLVM IR中,`fcmp ult` 是浮点数的无符号小于比较操作,`fcmp` 指令用于比较浮点数,`ult` 是"unsigned less than"的缩写。`fcmp ult double %x, %y` 比较 `%x` 和 `%y` 是否满足 `%x` 小于 `%y` 的条件,返回一个布尔值 `i1`。如果 `%x` 小于 `%y`,则执行 `%then` 标签的代码,否则执行 `%else` 标签的代码。`br i1 %cmptmp, label %then, label %else` 是LLVM IR中的分支指令,根据 `%cmptmp` 的布尔值决定跳转到哪个标签。 在 `smaller` 函数的主体中,`%cmptmp = fcmp ult double %x, %y` 进行了比较,然后根据结果执行相应的分支。`then:` 和 `else:` 分别是两个可能的分支,它们通过 `br` 指令连接,并在每个分支末尾使用 `br label %ifcont` 回到相同的合并点 `%ifcont`。在这里,我们看到了LLVM IR中的 Phi节点(%iftmp = phi double [ %calltmp, %then ], [ %calltmp1, %else ]),它是LLVM IR中处理控制流合并的一种方式,它将不同路径上的值融合在一起。 LLVM IR提供了丰富的运算符和指令,如浮点数比较的`fcmp`指令,以及控制流程的`br`指令,使得我们能够构建复杂的控制结构。此外,`fcmp`指令还支持多种比较模式,如`oeq`(等于),`olt`(小于),`one`(不等于)等,可以满足各种比较需求。对于涉及浮点数的比较,还需要考虑NaN(Not a Number)的情况,`ordered`和`unordered`标志就是用来处理这种特殊情况的。 通过Kaleidoscope语言的学习,我们可以理解LLVM IR的基本构造和控制流的表示,这对于进一步学习和使用LLVM进行编译器开发或代码优化是非常有价值的。通过实践这个教程,开发者能够掌握LLVM IR的基础,并为构建自己的编译器或分析工具打下坚实的基础。
剩余17页未读,继续阅读
- 粉丝: 38
- 资源: 730
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助