本页目录
GCC 与 Clang 内部
覆盖: 编译流水线 (frontend/middle-end/backend) → IR (GIMPLE/LLVM IR) → LTO → PGO → sanitizers → 编译器优化一览 适用: GCC 12+, Clang 15+, 用户态编译
编译流水线
flowchart TD
SRC["📄 C 源码"]
SRC --> FRONTEND["🔍 Frontend (语言相关)<br/>预处理 + 词法分析 + 语法分析 + 语义分析"]
FRONTEND --> AST["🌳 抽象语法树 (AST)"]
AST --> MIDDLE["⚙️ Middle-end (语言无关, 架构无关)<br/>GIMPLE (GCC) 或 LLVM IR (Clang)<br/>→ 优化遍: 死代码删除, 循环优化, 向量化, ..."]
MIDDLE --> BACKEND["🔧 Backend (架构相关)<br/>寄存器分配 + 指令选择 + 指令调度"]
BACKEND --> ASM["📝 目标汇编 (.s)"]
ASM --> ASSEMBLER["🔗 Assembler"]
ASSEMBLER --> OBJ["📦 目标文件 (.o)"]
classDef src fill:#e3f2fd,stroke:#1565c0
classDef step fill:#f3e5f5,stroke:#7b1fa2
classDef ir fill:#fff3e0,stroke:#ef6c00
classDef out fill:#e8f5e9,stroke:#2e7d32
class SRC,OBJ src
class FRONTEND,BACKEND,ASSEMBLER step
class MIDDLE ir
class AST,ASM out
GCC GIMPLE vs LLVM IR
GCC GIMPLE (GNU Compiler Collection):
3-地址码形式 → ~200 个优化遍
格式: 函数 → basic blocks → GIMPLE statements
用 -fdump-tree-all 观察各优化遍的输出
LLVM IR (Clang):
SSA 形式 → 更接近高级语言
-emit-llvm → 输出 .ll 文本 → 可读
opt → 单独的优化器工具 (独立于 clang)
llc → 单独的代码生成器
LTO: Link-Time Optimization
# GCC LTO:
# Thin LTO (Clang, 更快的增量 LTO):
# LTO 的典型收益:
# - 内联跨文件的小函数 (成本模型能看成千上万个函数)
# - 死代码消除 (分析整个程序 → 移除未调用的函数)
# - 常量传播 (跨文件追踪常量)
# 二进制大小: ↓5-15%, 性能: ↑2-5%
PGO: Profile-Guided Optimization
# 1. Instrument (插桩):
# 2. Recompile (用 profile 指导):
# PGO 的典型收益:
# - 分支预测优化 (热路径上的代码重排)
# - 内联决策更准 (频繁调用的函数 → 内联)
# - 寄存器分配更优 (热变量的优先级高)
# 性能: ↑5-15%
Sanitizers: 运行时错误检测
# Address Sanitizer (ASAN): heap out-of-bounds, UAF, stack overflow
# Undefined Behavior Sanitizer (UBSAN):
# 检测: 整数溢出, 移位越界, null 解引用, 类型对齐
# Thread Sanitizer (TSAN): data races
# Memory Sanitizer (MSAN): uninitialized reads (Clang only)
# 开销:
# ASAN: ~2x slow, ~2x mem
# TSAN: ~5-10x slow, ~5-10x mem
# UBSAN: ~1.2x slow (最轻量, 生产可用)
常用优化选项
# 特定优化:
-march=native # 针对本机 CPU 优化 (使用 AVX2/BMI/...)
编译产物分析
# 观察优化结果:
|
# 二进制分析:
| |
参考
- 文档: GCC Internals Manual, LLVM Language Reference
- LWN: "LTO and PGO", "Sanitizers in GCC and Clang"
关键词: GCC, Clang, GIMPLE, LLVM IR, LTO, ThinLTO, PGO, ASAN, UBSAN, TSAN, optimization flags