LLVM
- 前端(Front-End):处理高级语言(如 C/C++/Obj-C)的编译,生成中间表示(IR)
- 优化器(Optimizer):对中间表示进行优化,提高代码执行效率
- 后端(Back-End):将优化后的中间表示转换为目标平台的机器码
当用户编写的 C/C++/Obj-C 代码输入到 Clang 前端时,Clang 会执行以下步骤:
- 词法分析(Lexical Analysis):将源代码转换为标记(tokens)
- 语法分析(Syntax Analysis):将标记转换为抽象语法树(AST)
- 语义分析(Semantic Analysis):检查语义正确性,生成中间表示(IR)
生成的抽象语法树(AST)通过进一步处理,转换为 LLVM 的中间表示(IR)这个中间表示是一种平台无关的低级编程语言,用于连接前端和后端
在前端,Clang 将高级语言代码转换为为 LLVM 的中间表示(IR)
LLVM 的优化器
Analysis pass
Transform pass
作用:
- 常量折叠(Constant Folding):将编译时已知的常量表达式直接计算并替换。
- 循环优化(Loop Optimizations):如循环展开、循环交换等,以提高循环执行效率。
- 死代码消除(Dead Code Elimination):移除不必要的代码,提高执行效率。 经过优化后的 IR 是一个更高效的中间表示,准备好进行后续的代码生成。
LLVM 后端
- 指令选择(Instruction Selection):将 IR 转换为目标架构的汇编指令
- 寄存器分配(Register Allocation):为指令分配合适的寄存器
- 指令调度(Instruction Scheduling):优化指令执行顺序,以提高指令流水线的效率
- 代码布局(Code Layout):调整代码的排列顺序,以适应目标硬件的执行特性
- 代码生成(Code Generation):生成目标平台的汇编代码和最终的机器码。 最终,LLVM 后端输出目标平台的可执行文件