LLVM 开发指南
LLVM 开发指南
“The LLVM Project is a collection of modular and reusable compiler and toolchain technologies.”
本教程是一份面向中高级开发者的 LLVM 完整开发指南,共计 20 章,从基础概念到生产实践,系统性地覆盖 LLVM 编译器基础设施的方方面面。
适用读者
| 读者类型 | 建议路径 |
|---|
| 编译器初学者 | 第 1-5 章 → 第 7-8 章 → 第 13 章 |
| 有经验的 C/C++ 开发者 | 第 1-4 章 → 第 6 章 → 第 10 章 → 第 12 章 |
| 后端/嵌入式开发者 | 第 1-4 章 → 第 9 章 → 第 14 章 |
| 工具链/IDE 开发者 | 第 5-6 章 → 第 12 章 → 第 15-16 章 |
| ML/DSL 研究者 | 第 1-4 章 → 第 17 章 |
| DevOps/基础设施 | 第 18 章 → 第 19-20 章 |
前置要求
- C/C++: 熟练掌握 C++17,了解模板元编程
- 编译原理: 了解词法分析、语法分析、中间表示的基本概念
- Linux: 熟悉命令行操作、CMake 构建系统
- Git: 基本的版本控制操作
环境准备
# 推荐环境
操作系统: Ubuntu 22.04 LTS / macOS 13+
LLVM 版本: 18.x / 19.x(本教程代码兼容)
构建工具: CMake 3.20+, Ninja
编译器: Clang 15+ 或 GCC 12+
内存: 建议 16GB+(编译 LLVM 源码需要)
磁盘: 完整构建约需 50GB 空间
教程目录
第一部分:基础篇(第 1-4 章)
| 章节 | 标题 | 核心内容 |
|---|
| 第 1 章 | LLVM 概述与设计哲学 | LLVM 历史、三阶段架构、模块化设计、与 GCC 对比 |
| 第 2 章 | 安装与环境搭建 | 源码编译、包管理器安装、预编译二进制、Docker |
| 第 3 章 | LLVM 整体架构 | IR 层次、Pass 框架、Backend 流水线、模块化库 |
| 第 4 章 | LLVM IR 详解 | 语法结构、类型系统、指令集、函数与模块 |
第二部分:前端篇(第 5-6 章)
| 章节 | 标题 | 核心内容 |
|---|
| 第 5 章 | Clang 前端 | 编译流程、诊断系统、驱动与编译管道 |
| 第 6 章 | Clang AST 与工具 | AST 结构、AST Matcher、libTooling、代码重构 |
第三部分:优化篇(第 7-8 章)
| 章节 | 标题 | 核心内容 |
|---|
| 第 7 章 | LLVM Pass 框架 | 分析 Pass、转换 Pass、新旧 PassManager |
| 第 8 章 | 优化管线 | 函数内联、向量化、循环优化、LTO |
第四部分:后端篇(第 9-11 章)
| 章节 | 标题 | 核心内容 |
|---|
| 第 9 章 | 代码生成 | SelectionDAG、指令选择、寄存器分配、指令调度 |
| 第 10 章 | JIT 编译 | ORC JIT、MCJIT、懒编译、符号解析 |
| 第 11 章 | MC 层与汇编 | MCInst、汇编器、反汇编器、目标文件生成 |
第五部分:API 与扩展篇(第 12-14 章)
| 章节 | 标题 | 核心内容 |
|---|
| 第 12 章 | LLVM 库与 API | libLLVM、libClang、C API、C++ API |
| 第 13 章 | 自定义 Pass 开发 | Hello Pass、注册机制、实际案例 |
| 第 14 章 | 后端目标开发 | Target 描述、TableGen、指令定义 |
第六部分:工具篇(第 15-16 章)
| 章节 | 标题 | 核心内容 |
|---|
| 第 15 章 | Sanitizers | ASan、MSan、TSan 实现原理与使用 |
| 第 16 章 | LLDB 调试器 | 架构、脚本化、扩展开发、与 GDB 对比 |
第七部分:前沿篇(第 17 章)
| 章节 | 标题 | 核心内容 |
|---|
| 第 17 章 | MLIR 多级 IR | Dialect、Operation、变换 Pass、MLIR 方言生态 |
第八部分:工程实践篇(第 18-20 章)
| 章节 | 标题 | 核心内容 |
|---|
| 第 18 章 | 开发环境与构建系统 | Docker 开发环境、CMake 集成、CI/CD |
| 第 19 章 | 故障排查 | IR 验证、Pass 调试、性能分析、常见错误 |
| 第 20 章 | 最佳实践与贡献指南 | 代码规范、社区贡献、生产应用案例 |
学习路线图
┌─────────────────┐
│ 第1章: LLVM概述 │
└────────┬────────┘
│
┌────────▼────────┐
│ 第2章: 安装搭建 │
└────────┬────────┘
│
┌──────────────┼──────────────┐
│ │ │
┌────────▼────────┐ ┌──▼──────┐ ┌────▼────────┐
│ 第3章: 整体架构 │ │第4章:IR │ │第5章:Clang │
└────────┬────────┘ └──┬──────┘ └────┬────────┘
│ │ │
┌────────▼────────┐ │ ┌────────▼────────┐
│ 第7章: Pass框架 │◄───┘ │ 第6章: AST工具 │
└────────┬────────┘ └────────┬────────┘
│ │
┌────────▼────────┐ ┌────────▼────────┐
│ 第8章: 优化管线 │ │第12章: 库与API │
└────────┬────────┘ └────────┬────────┘
│ │
┌────────▼────────┐ ┌────────▼────────┐
│ 第9章: 代码生成 │ │第13章: 自定义Pass│
└────────┬────────┘ └─────────────────┘
│
┌────────▼────────┐
│ 第10章: JIT编译 │
└────────┬────────┘
│
┌────────▼────────┐
│ 第11章: MC层 │
└────────┬────────┘
│
┌────────▼────────┐ ┌─────────────────┐
│第14章: 后端开发 │────►│ 第17章: MLIR │
└────────┬────────┘ └─────────────────┘
│
┌────────▼────────┐
│第15章: Sanitizer│
└────────┬────────┘
│
┌────────▼────────┐
│ 第16章: LLDB │
└────────┬────────┘
│
┌────────▼────────┐
│第18章: 环境构建 │
└────────┬────────┘
│
┌────────▼────────┐
│第19章: 故障排查 │
└────────┬────────┘
│
┌────────▼────────┐
│第20章: 最佳实践 │
└─────────────────┘
代码仓库
本教程所有示例代码均可在以下环境编译运行:
# 验证 LLVM 安装
llvm-config --version
clang --version
# 创建工作目录
mkdir llvm-tutorial && cd llvm-tutorial
cmake -G Ninja -S . -B build
版本兼容性
| LLVM 版本 | 状态 | 备注 |
|---|
| 17.x | ✅ 支持 | 部分新 API 可用 |
| 18.x | ✅ 完全支持 | 推荐版本 |
| 19.x | ✅ 完全支持 | 最新稳定版 |
| 16.x | ⚠️ 部分兼容 | PassManager 接口略有差异 |
| 15.x 及更早 | ❌ 不推荐 | 新 PassManager 尚未完全就绪 |
参考资源
提示: 本教程基于 LLVM 18/19 编写,API 可能随版本变化。遇到兼容性问题请参考 第 19 章 故障排查章节。