
项目地址https://github.com/llvm/llvm-project官方网站https://llvm.org/当前最新稳定版LLVM 22.1.82026 年 6 月发布许可证Apache 2.0 License with LLVM exceptions一、项目概述LLVM 是一个模块化、可复用的编译器与工具链技术集合。尽管名字中带有 “VM”但它与传统的虚拟机毫无关系——“LLVM” 本身就是项目的全称并非缩写。项目起源于伊利诺伊大学厄巴纳-香槟分校UIUC的一个研究项目目标是构建一种基于 SSA静态单赋值的现代编译策略能够同时支持静态和动态编译适用于任意编程语言。经过二十余年的发展LLVM 已成长为一个庞大的伞形项目包含十余个子项目被大量商业和开源项目用于生产环境同时也是学术研究的重镇。LLVM 于 2012 年荣获ACM 软件系统奖——该奖项每年仅授予全球一个软件系统与 LLVM 同列的包括 Unix、Java、Mosaic 浏览器等。二、整体架构三层式编译器设计LLVM 的核心设计哲学是模块化的三段式架构┌──────────────┐ ┌──────────────────┐ ┌──────────────┐ │ 前端 │ ──→ │ 优化器 (LLVM IR) │ ──→ │ 后端 (代码生成) │ │ (Frontend) │ │ (Optimizer) │ │ (CodeGen) │ └──────────────┘ └──────────────────┘ └──────────────┘ Clang/Flang LLVM Core Target Backends Rustc/Swift Pass Framework X86/ARM/RISC-V 等语言前端 IR 优化 GPU/...这种架构的关键在于前端将源代码解析为抽象语法树AST再翻译为 LLVM IR中间表示优化器对 LLVM IR 进行一系列与源语言和目标平台无关的优化后端将优化后的 IR 转换为目标平台的机器码三阶段之间通过明确定义的接口隔离任意一端都可以被独立替换。这意味着新语言只需实现前端即可复用全部优化器和后端能力新硬件平台只需实现后端即可支持所有已有前端语言优化器中的每个 Pass 都是独立的可以自由组合三、LLVM IR一切的核心枢纽LLVM IRIntermediate Representation是整个架构的枢纽。它是一种类型化、低级别、类似 RISC 的指令集具有以下特性基于 SSA 形式每个值只被赋值一次简化了数据流分析和优化类型安全拥有完整的类型系统整数、浮点、指针、向量、结构体、数组等三种表示形式人类可读的文本形式.ll文件、二进制位码形式.bc文件和内存中的 C 对象表示一个简单的 LLVM IR 示例——计算两个整数之和; 定义函数i32 add(i32 %a, i32 %b) define i32 add(i32 %a, i32 %b) { entry: %result add i32 %a, %b ret i32 %result }对应的 C 代码仅为int add(int a, int b) { return a b; }但 IR 显式表达了每个操作。LLVM IR 的指令体系覆盖了指令类别代表指令说明终结指令ret,br,switch,invoke控制流转移二元运算add,sub,mul,sdiv,udiv整数算术浮点运算fadd,fsub,fmul,fdiv浮点算术位运算shl,lshr,ashr,and,or,xor位级操作内存访问alloca,load,store,getelementptr栈分配与内存读写类型转换trunc,zext,sext,bitcast,fptosi类型间转换比较运算icmp,fcmp整数/浮点比较向量运算extractelement,insertelement,shufflevectorSIMD 向量操作其他phi,select,callSSA 节点、条件选择、函数调用LLVM IR 还包含丰富的内联函数Intrinsics如llvm.memcpy、llvm.sqrt、llvm.ctlz等这些在 IR 层面提供了语义明确的高级操作由后端负责映射到目标平台的最优实现。四、代码生成流水线后端代码生成是 LLVM 最复杂的部分之一。从 LLVM IR 到目标机器码需要经过以下阶段LLVM IR │ ▼ ① 指令选择 (Instruction Selection) │ SelectionDAG / GlobalISel将 IR 操作匹配为目标指令 ▼ ② 调度与形成 (Scheduling Formation) │ 确定指令顺序生成 MachineInstr ▼ ③ SSA 机器码优化 (SSA Machine Code Optimizations) │ 在 SSA 形式上进行窥孔优化等 ▼ ④ 寄存器分配 (Register Allocation) │ 将无限虚拟寄存器映射到有限物理寄存器插入溢出代码 ▼ ⑤ 序言/尾声插入 (Prolog/Epilog Insertion) │ 插入栈帧管理代码实现帧指针消除等 ▼ ⑥ 后期机器码优化 (Late Machine Code Optimizations) │ 溢出代码调度、最终窥孔优化 ▼ ⑦ 代码发射 (Code Emission) │ 输出汇编文件或二进制目标文件 ▼ 机器码 / 目标文件4.1 指令选择SelectionDAGSelectionDAG 是 LLVM 最成熟的指令选择框架。它将 LLVM IR 转换为有向无环图DAG节点是SDNode然后通过以下步骤处理构建初始 DAG将 IR 翻译为目标无关的 DAG 节点第一次优化简化 DAG识别旋转、div/rem 配对等元指令类型合法化将不支持的数据类型转换为支持的类型如将 i1 提升为 i32第二次优化清理类型合法化引入的冗余操作合法化将不支持的操作替换为支持的等价操作序列第三次优化清理操作合法化引入的冗余指令选择通过模式匹配将目标无关节点转换为目标指令节点调度与形成线性化 DAG生成MachineInstr序列此外GlobalISel是新一代指令选择框架使用更统一的 IRGlobaMIR设计目标是将更多逻辑从 C 硬编码迁移到声明式描述。4.2 寄存器分配指令选择后代码使用无限的虚拟寄存器SSA 形式。寄存器分配阶段将其映射到目标平台有限的物理寄存器当物理寄存器不够时插入溢出代码spill code将值暂存到栈上处理调用约定约束如 x86 的EAX/EDX用于除法SSA 形式在分配后被破坏虚拟寄存器消失4.3 MC 层目标文件级表示MC 层是代码生成的最后一层处理标签、节、指令等汇编级概念不含常量池、跳转表等高级抽象。它负责将MachineInstr转换为MCInst更简洁的指令表示输出汇编文件.s或二进制目标文件.o支持多种目标文件格式ELF、Mach-O、COFF、WASM、SPIR-V 等五、核心子项目详解LLVM 项目包含十余个子项目覆盖编译器工具链的每个环节。5.1 LLVM Core编译器基础设施的核心包含LLVM IR定义和操作 API优化器200 个优化 Pass包括死代码消除、循环展开、向量化、内联、常量传播等代码生成器支持 X86、ARM、AArch64、RISC-V、MIPS、PowerPC、AMDGPU、NVPTX、WebAssembly、BPF 等数十种架构5.2 ClangLLVM 原生的 C/C/Objective-C 编译器前端设计目标极速编译比 GCC 快数倍高质量的错误诊断精确的行列定位、修复建议、彩色输出基于库的设计Clang 的 AST 和表达式解析器可作为库复用支撑静态分析工具衍生工具包括Clang Static Analyzer符号执行驱动的静态分析器clang-tidy基于规则的 C/C 代码质量检查与自动修复工具clang-format代码格式化工具5.3 Flang现代 Fortran 编译器前端目标是生成高性能代码支持 Fortran 2023 及所有正式 Fortran 标准回溯至 Fortran 77支持 OpenMP 并行CPU 和 GPU包含常用 Fortran 扩展5.4 LLDB基于 LLVM 和 Clang 构建的原生调试器复用 Clang AST 和表达式解析器实现 C/C/Objective-C 表达式求值利用 LLVM JIT 实现动态代码注入加载符号比 GDB 更快内存效率更高原生支持 macOS/Linux/Windows 等平台5.5 libc / libc ABIC 标准库的高性能实现完整支持 C11/14/17/20/23 标准由 LLVM 团队维护被 Apple 等公司作为系统默认 C 标准库使用5.6 libcC 标准库的高性能实现与 LLVM 深度集成针对现代 C 标准C11/C17/C23优化利用 LLVM 编译器优化能力实现高性能5.7 compiler-rt编译器运行时库提供两类功能低级运算支持当目标平台没有原生指令实现某 IR 操作时提供软件实现如__fixunsdfdi动态检测工具运行时AddressSanitizer内存越界检测、ThreadSanitizer数据竞争检测、MemorySanitizer未初始化内存检测、DataFlowSanitizer数据流跟踪的运行时库5.8 MLIR多级中间表示Multi-Level IR是编译器基础设施领域的一项创新可扩展的 IR 生态允许定义自定义的 Dialect方言每种 Dialect 有自己的操作、类型和约束多层抽象可以在不同抽象层次之间渐进式 lowering——从高层 DSL 到底层机器码逐步细化异构计算原生支持 GPU、TPU、AI 加速器等异构硬件的编译降低编译器开发成本领域专用编译器可以复用 MLIR 的基础设施Pass 管理、模式匹配、验证框架等MLIR 已被广泛用于 AI 编译器如 TensorFlow/XLA、PyTorch/Torch-MLIR、量子计算编译器、硬件设计等领域。5.9 LLD新一代链接器设计为系统链接器的直接替代品比 GNU ld 和 gold 快数倍支持 ELF、Mach-O、COFF、WASM 等格式内存占用更低5.10 BOLT链接后优化器Post-Link Optimizer基于运行时采样 profile 数据优化代码布局通过重新排列基本块和函数布局提升指令缓存命中率对大型应用可获得 2-15% 的性能提升5.11 Polly基于多面体模型Polyhedral Model的优化框架缓存局部性优化自动并行化自动向量化5.12 OpenMP为 Clang 和 Flang 提供 OpenMP 运行时支持包括 CPU 和 GPU 的 offloading 能力。5.13 libclc / kleelibclcOpenCL 标准库实现klee符号虚拟机使用定理证明器探索程序所有动态路径自动发现 bug 并生成测试用例六、TableGen声明式目标描述TableGen 是 LLVM 的代码生成工具用于描述目标架构的信息指令定义指令的助记符、操作数、编码、调度信息寄存器定义寄存器名、别名、寄存器类调用约定参数传递规则指令映射不同模式间的映射关系TableGen 将.td描述文件转换为 C 代码大幅减少手写代码量。这使得为新架构添加后端支持时开发者只需编写声明式描述而非大量 C 样板代码。七、优化器 Pass 系统LLVM 优化器基于 Pass 框架每个 Pass 是一个独立的优化模块LLVM IR ──→ [Pass1] ──→ [Pass2] ──→ [Pass3] ──→ ... ──→ 优化后的 IR常见的优化 Pass 包括标量优化常量传播、死代码消除、指令合并、标量替换循环优化循环展开、循环不变量外提、循环旋转、循环向量化过程间优化函数内联、过程间常量传播、死参数消除向量化SLPSuperword-Level Parallelism向量化、循环向量化Profile-Guided Optimization (PGO)基于 profile 数据的优化LTOLink-Time Optimization跨模块的全文优化从 LLVM 15 开始旧的 Legacy PassManager 已完全迁移到New PassManager它采用更现代的设计Pass 按 Pass Manager 分组管理Pass 之间通过 Analysis Manager 共享分析结果更好的缓存友好性和更低的 Pass 开销八、生态与社区8.1 依赖 LLVM 的语言与项目LLVM 是众多现代编程语言的编译器后端SwiftApple 的编程语言使用 Clang 和 LLVMRust使用 LLVM 作为默认后端通过rustc的 LLVM 后端和 Cranelift 后端Zig使用 LLVM 后端JuliaJIT 编译使用 LLVMCrystal使用 LLVM 后端HaskellGHC 的 LLVM 后端RubyMJIT 和 YJIT 使用 LLVM 相关技术PythonNumba 使用 LLVM 进行 JIT 编译8.2 商业用户ApplemacOS/iOS 工具链完全基于 LLVM/ClangGoogleAndroid NDK、Chrome OS 使用 Clang/LLVMAMDGPU 编译器基于 LLVMNVIDIACUDA 工具链使用 LLVM索尼/微软主机开发工具链基于 LLVM8.3 社区治理LLVM Foundation独立的非营利组织负责社区治理和年度开发者大会LLVM Developers’ Meeting每年举办美国和欧洲两场开发者大会代码审查通过 Phabricator/GitHub Pull RequestsDiscourse 论坛和Discord频道日常交流发布节奏每年 2 个大版本如 22.x、23.x每个大版本包含 6-9 个小版本九、版本与发布截至 2026 年 7 月LLVM 的发布情况版本系列首次发布最新小版本状态22.1.x2026-0222.1.8 (2026-06)当前稳定版23.1.x预计 2026-08开发中release/23.x 分支已创建LLVM 采用时间驱动的发布策略每个大版本约 6 个月周期每个小版本约 2 周间隔严格遵循 RCRelease Candidate流程十、如何开始使用10.1 安装macOS通过 HomebrewbrewinstallllvmUbuntu/Debian通过 APT 仓库# 添加 LLVM 官方仓库echodeb http://apt.llvm.org/$(lsb_release-cs)main|sudotee/etc/apt/sources.list.d/llvm.listsudoaptinstallllvmWindows从 releases.llvm.org 下载预编译二进制包。10.2 从源码构建gitclone https://github.com/llvm/llvm-project.gitcdllvm-project# 使用 CMake 配置cmake-Sllvm-Bbuild-GNinja\-DCMAKE_BUILD_TYPERelease\-DLLVM_ENABLE_PROJECTSclang;lld;lldb\-DLLVM_ENABLE_RUNTIMESlibcxx;libcxxabi\-DLLVM_TARGETS_TO_BUILDX86;AArch64;RISC-V# 编译ninja-Cbuild10.3 实战从源码到 IR 到可执行文件# 1. 将 C 代码编译为 LLVM IR 文本格式clang-S-emit-llvm hello.c-ohello.ll# 2. 优化 IRopt-passesO2 hello.ll-ohello_opt.bc# 3. 将 IR 编译为可执行文件clang hello_opt.bc-ohello# 4. 查看优化过程中发生了什么opt-passesO2-statshello.ll-o/dev/null10.4 编写自定义 Pass#includellvm/Pass.h#includellvm/IR/Function.h#includellvm/Support/raw_ostream.husingnamespacellvm;structHelloPass:PassInfoMixinHelloPass{PreservedAnalysesrun(FunctionF,FunctionAnalysisManagerAM){errs()Hello from function: F.getName()\n;returnPreservedAnalyses::all();}};十一、LLVM 的技术影响LLVM 对编译器领域和整个软件行业产生了深远影响重新定义了编译器架构三段式设计成为现代编译器的标准模式GCC 后期也引入了类似结构GIMPLE IR 多后端降低了编译器开发门槛任何新语言只需实现前端即可获得工业级优化和跨平台能力。Rust、Swift 等语言的成功很大程度上受益于此推动了 JIT 编译的普及LLVM 的 JIT 能力使得运行时优化成为可能被 Julia、Numba 等动态语言项目广泛采用催生了 MLIR 生态MLIR 正在成为 AI 编译器和异构计算编译的事实标准连接了从高层 DSL 到底层硬件的完整编译链路工业标准级工具链Apple、Google、Sony、Microsoft 等公司的产品工具链均以 LLVM 为基础覆盖数十亿设备十二、结语LLVM 项目是现代计算机科学领域最成功的开源基础设施项目之一。它不仅是编译器技术的集大成者更通过模块化设计和可复用组件深刻改变了编程语言、开发工具和高性能计算的生态格局。无论你是想为新语言实现编译器、为新型硬件添加后端支持、开发静态分析工具还是深入理解代码优化原理LLVM 都是一个值得深入研究的宝库。项目提供了从入门教程到深度文档的完整资源体系社区也以开放和友好著称。相关链接GitHub: https://github.com/llvm/llvm-project官方文档: https://llvm.org/docs/Discourse 论坛: https://discourse.llvm.org/LLVM 博客: https://blog.llvm.org/Doxygen 文档: https://llvm.org/doxygen/