--- name: compiler-dev description: 编译器后端开发专家,专注于IR、CFG、SSA、数据流分析和优化Pass。 version: v1.0 tags: [compiler, backend, ir, cfg, ssa, optimization] allowed-tools: mcp__serena__find_symbol, mcp__serena__replace_symbol_body, mcp__serena__search_for_pattern, Read, Bash requires-skills: [ep-navigator, antlr4-dev] --- # 编译器后端开发 ## 🎯 垂直职责 **单一职责**: 编译器中后端技术 - 符号表、类型系统、IR、CFG、SSA、优化 ## 📦 核心能力 ### 1. 符号表与类型系统 (EP6-EP10) - **位置**: `ep20/src/main/java/org/teachfx/antlr4/ep20/symtab/` - **作用域**: `scope/GlobalScope`, `scope/LocalScope` - **符号**: `symbol/VariableSymbol`, `symbol/MethodSymbol` - **类型**: `type/Type`, `type/BuiltInType`, `type/StructType` ### 2. 中间表示 (EP11-EP17) - **位置**: `ep20/src/main/java/org/teachfx/antlr4/ep20/ir/` - **表达式**: `ir/expr/` (BinExpr, UnaryExpr, ConstVal) - **语句**: `ir/stmt/` (Assign, Jump, ConditionalJump) - **构建器**: `CymbolIRBuilder.java` ### 3. 控制流图 (EP16-EP17) - **位置**: `ep20/src/main/java/org/teachfx/antlr4/ep20/pass/cfg/` - **核心**: `ControlFlowAnalysis.java`, `CFG.java` - **基本块**: `BasicBlock` ### 4. SSA与优化 (EP21) - **位置**: `ep21/src/main/java/org/teachfx/antlr4/ep21/` - **SSA**: `analysis/ssa/SSAGraph.java` - **数据流**: `analysis/dataflow/` (LiveVariableAnalysis, ReachingDefinitions) - **优化**: `pass/cfg/` (ConstantFolding, CSE, DCE) ## 🔗 关系图 → **ep-navigator** (识别EP范围) → **antlr4-dev** (AST → IR转换) ← **vm-dev** (IR → 字节码) ## 🚀 快速开始 ### 实现新的优化Pass ```bash # 1. 创建优化器 (实现IFlowOptimizer) vim ep21/src/main/java/.../pass/cfg/NewOptimizer.java # 2. 标准模板 public class NewOptimizer implements IFlowOptimizer { @Override public void onHandle(CFG cfg) { // 遍历基本块 for (BasicBlock block : cfg) { // 优化逻辑 } } } # 3. 创建测试 vim ep21/src/test/java/.../pass/cfg/NewOptimizerTest.java # 4. 运行测试 mvn test -pl ep21 -Dtest="*NewOptimizer*" ``` ### SSA转换流程 ```bash # 1. 构建支配树 cfg.computeDominanceFrontier(); # 2. 插入Φ函数 ssa.insertPhiFunctions(); # 3. 变量重命名 ssa.renameVariables(); # 4. 验证 mvn test -pl ep21 -Dtest="*SSATest" ``` ## 📊 数据流分析模板 ```java // 标准数据流分析框架 public class MyDataFlowAnalysis extends AbstractDataFlowAnalysis, Set> { @Override public Set getBoundaryCondition() { return new HashSet<>(); // 初始状态 } @Override public Set getInitialFlow() { return new HashSet<>(); // 默认状态 } @Override public Set merge(List> inputs) { Set result = new HashSet<>(); for (Set input : inputs) { result.addAll(input); // 合并操作 } return result; } @Override public Set flowFunction(BasicBlock block, Set input) { Set output = new HashSet<>(input); // 传递函数: 根据block内容修改output return output; } } ``` ## 🛠️ 常用命令 ```bash # 编译器后端 mvn compile -pl ep20 # 编译EP20 mvn compile -pl ep21 # 编译EP21 # 测试 mvn test -pl ep20 -Dtest="*IR*" # 测试IR生成 mvn test -pl ep20 -Dtest="*CFG*" # 测试CFG mvn test -pl ep21 -Dtest="*SSA*" # 测试SSA mvn test -pl ep21 -Dtest="*Optimizer*" # 测试优化 # 覆盖率 mvn jacoco:report -pl ep21 open ep21/target/site/jacoco/index.html ``` ## 📐 IR节点速查 | 类型 | 类名 | 字段 | 用途 | |------|------|------|------| | 常量 | `ConstVal` | `val: T` | 字面量 | | 变量 | `VarSlot` | `name: String` | 变量引用 | | 二元运算 | `BinExpr` | `lhs, rhs: VarSlot`, `op: BinaryOpType` | a + b | | 一元运算 | `UnaryExpr` | `expr: VarSlot`, `op: UnaryOpType` | -a | | 赋值 | `Assign` | `lhs: VarSlot`, `rhs: Operand` | x = y | | 标签 | `Label` | `name: String`, `bb: BasicBlock` | 基本块标签 | | 跳转 | `Jump` | `target: BasicBlock` | goto L | | 条件跳转 | `CondJump` | `cond: VarSlot`, `true/false: BasicBlock` | if (cond) | ## ⚠️ 常见问题 | 问题 | 原因 | 解决方案 | |------|------|----------| | IR类型不匹配 | `Assign.rhs`是`Operand`不是`Expr` | 使用`ConstVal`或`VarSlot` | | CFG边方向错误 | `getSucceed(id)`返回`Set` | 遍历ID再查BasicBlock | | SSA重命名失败 | 未计算支配边界 | 先调用`computeDominanceFrontier()` | | 优化Pass未生效 | 未注册到优化管道 | 添加到`OptimizerPipeline` | --- *版本: v1.0 | 垂直职责: 编译器后端 | 2025-12-23*