强曰为道

与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

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 库与 APIlibLLVM、libClang、C API、C++ API
第 13 章自定义 Pass 开发Hello Pass、注册机制、实际案例
第 14 章后端目标开发Target 描述、TableGen、指令定义

第六部分:工具篇(第 15-16 章)

章节标题核心内容
第 15 章SanitizersASan、MSan、TSan 实现原理与使用
第 16 章LLDB 调试器架构、脚本化、扩展开发、与 GDB 对比

第七部分:前沿篇(第 17 章)

章节标题核心内容
第 17 章MLIR 多级 IRDialect、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 章 故障排查章节。