LLVM编译器常见知识点梳理

820 阅读2分钟
  1. LLVM编译器框架的理念

相对于GCC会对每个Target做优化。LLVM编译器的理念之一是复用后端优化(Pass)。

框架图

image.png

2008-10-04-ACAT-LLVM-Intro.pdf

LLVM不仅是编译器框架,也是SDK。它的另一个原则是“一切都是库”,十分重视以库的形式进行代码复用。

  1. LLVM的基本库
  • LLVMCore: 包含LLVM IR相关的所有逻辑。IR构造以及IR校验。
  • LLVMAnalysis: 包含IR分析的过程。比如一些别名分析、依赖分析、常量折叠、循环信息、内存依赖分析。
  • LLVMCodeGen: 基于td文件生成目标无关的的代码,也可以生成机器级别的分析和转换代码逻辑。
  • LLVMTarget: 通过通用的抽象,来提供对目标机器信息的访问接口。
  • LLVMSupport: 一些工具的集合。如数据结构,SmallVector;如格式支持,ELF等;错误、整数、浮点数的处理。

基于这些库,有一些工具。

  1. LLVM常见工具
  • llc: 编译器
  • opt: 优化器
  • clang: 前端编译器,依赖了很多LLVM基本库。
    • clang相关的工具:clang-tidy, clang-format
  • lld: 链接器
  • lldb: 调试器
  1. 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管理器。