• 前端(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 后端输出目标平台的可执行文件