- LLVM编译器框架的理念
相对于GCC会对每个Target做优化。LLVM编译器的理念之一是复用后端优化(Pass)。
框架图
LLVM不仅是编译器框架,也是SDK。它的另一个原则是“一切都是库”,十分重视以库的形式进行代码复用。
- LLVM的基本库
- LLVMCore: 包含LLVM IR相关的所有逻辑。IR构造以及IR校验。
- LLVMAnalysis: 包含IR分析的过程。比如一些别名分析、依赖分析、常量折叠、循环信息、内存依赖分析。
- LLVMCodeGen: 基于td文件生成目标无关的的代码,也可以生成机器级别的分析和转换代码逻辑。
- LLVMTarget: 通过通用的抽象,来提供对目标机器信息的访问接口。
- LLVMSupport: 一些工具的集合。如数据结构,SmallVector;如格式支持,ELF等;错误、整数、浮点数的处理。
基于这些库,有一些工具。
- LLVM常见工具
- llc: 编译器
- opt: 优化器
- clang: 前端编译器,依赖了很多LLVM基本库。
- clang相关的工具:clang-tidy, clang-format
- lld: 链接器
- lldb: 调试器
- LLVM 的中间表示 IR
IR 是连接前端和后端的桥梁,执行目标无关优化。
编译原理的框图
4.1 LLVM IR 语法
学习IR语法,参考官方文档: LLVM Language Reference Manual — LLVM 15.0.0git documentation
LLVM IR有三种等价的表达形式:
- 内存表示形式:Instruction类
- 磁盘存储形式:.bc
- 人工可读文本的磁盘表示形式:llvm汇编码格式
LLVM IR 使用静态单赋值(SSA)形式:每个变量不会被重新赋值。
4.2 LLVM IR 内存模型
- Module聚合了整个编译过程中使用的所有数据。
- Function函数会被划分为多个基本块BB。
- BasicBlock基本块,封装了一连串的LLVM指令。
- Instruction表示LLVM IR中的基本单元,即一条指令。
4.3 Pass类
Pass是实现代码优化的途径,包括分析Pass和转化Pass。
有几类Pass:
- ModulePass,作用于整个模块
- FunctionPass,作用于每个函数。
- BasicBlockPass,作用于每个基本块。
相关的新的Pass管理器。