本书以任务驱动的方式,带领读者编写基于LLVM 的编译器前端、优化器、后端。通过丰富的实例,读者能够从中理解LLVM
的架构,以及如何使用LLVM 来编写自己的编译器。相比于传统的介绍编译技术的书籍,此书更偏向于实战,因此适合熟悉编译但对LLVM
比较陌生的人员,也适合正在学习编译技术并且在寻找实战机会的人员。
编辑推荐
本书特色:简洁明了、容易效仿的风格||选择最重要的任务和问题||仔细组织有效解决问题的指令||清晰解释所完成的工作||将解决方案应用于其他场景
本书包括以下内容:
√ 介绍LLVM的模块化设计及LLVM工具
√ 编写一门语言的前端
√ 增加JIT支持,使用不同语言的前端
√ 学习LLVM Pass基础架构及LLVM Pass管理器
√ 创建分析和转换的优化Pass
√ 从头开始构建LLVM TOY语言后端
√ 在SelectionDAG的层面进行代码优化,并实现寄存器分配
作者简介
Mayur Pandey
是一名专业的软件工程师,同时也是一位开源软件的爱好者。他专注于编译器以及编译器工具的开发,是LLVM 开源社区的活跃贡献者,也是Tizen
编译器项目的一员,他对其他编译器也有着亲身实践经验。
Mayur 在印度阿拉哈巴德的Motilal Nehru 国家技术研究所获得学士学位。目前居住在印度班加罗尔。
Suyog
Sarda 是一名专业的软件工程师,同时也是一位开源软件的爱好者。他专注于编译器以及编译器工具的开发,是LLVM
开源社区的活跃贡献者,也是Tizen 编译器项目的一员。除此之外,Suyog 也参与了ARM 和x86
架构的代码改进工作。他对其他的编译器也有着亲身实践经验。他对编译器的主要研究在于代码优化和向量化。除了编译器之外,Suyog 也对Linux
内核的开发很感兴趣。他曾在2012 年于迪拜由Birla技术协会举办的IEEE
国际云计算技术应用大会的议程上发表技术论文,题为“SecureCo-resident Virtualization in Multicore
Systems by VM Pinning and Page
Coloring”。他在印度普纳工程大学获得计算机学士学位。目前居住于印度班加罗尔。
目录
前言
第1章LLVM设计与使用
概述
模块化设计
交叉编译Clang/LLVM
将C源码转换为LLVM汇编码
将LLVM IR转换为bitcode
将LLVM bitcode转换为目标平台汇编码
将LLVM bitcode转回为LLVM汇编码
转换LLVM IR
链接LLVM bitcode
执行LLVM bitcode
使用C语言前端——C1ang
使用GO语言前端
使用DragonEgg
第2章实现编译器前端
概述
定义TOY语言
实现词法分析器
定义抽象语法树
实现语法分析器
解析简单的表达式
解析二元表达式
为解析编写驱动
对TOY语言进行词法分析和语法分析
为每个AST类定义IR代码生成方法
为表达式生成IR代码
为函数生成IR代码
增加IR优化支持
第3章扩展前端并增加JIT支持
概述
处理条件控制结构—if/then/else结构
生成循环结构
处理自定义二元运算符
处理自定义一元运算符
增加JIT支持
第4章准备优化
概述
多级优化
自定义LLVM Pass
使用opt工具运行自定义Pass
在新的Pass中调用其他Pass
使用Pass管理器注册Pass
实现一个分析Pass
实现一个别名分析Pass
使用其他分析Pass
第5章实现优化
概述
编写无用代码消除Pass
编写内联转换Pass
编写内存优化Pass
合并LLVM IR
循环的转换与优化
表达式重组
IR向量化
其他优化Pass
第6章平台无关代码生成器
概述
LLVM IR指令的生命周期
使用GraphViz可视化LLVM IR控制流图
使用TableGen描述目标平台
定义指令集
添加机器码描述
实现MachinelnstrBuilder类
实现MachineBasicBlock类
实现MachineFunction类
编写指令选择器
合法化SelectionDAG
优化SelectionDAG
基于DAG的指令选择
基于SelectionDAG的指令调度
第7章机器码优化
概述
消除机器码公共子表达式
活动周期分析
寄存器分配
插人头尾代码
代码发射
尾调用优化
兄弟调用优化
第8章实现LLVM后端
概述
定义寄存器和寄存器集合
定义调用约定
定义指令集
实现栈帧lowering
打印指令
选择指令
增加指令编码
子平台支持
多指令lowering
平台注册
第9章LLVM项目最佳实践
概述
LLVM中的异常处理
使用sanitizer
使用LLVM编写垃圾回收器
将LLVM IR转换为JavaScript
使用Clang静态分析器
使用bugpoint
使用LLDB
使用LLVM通用Pass