Pass:RTLgen
1. 目标与位置
- 位置:
backend/RTLgen.v
- 输入/输出:
CminorSel.program →
RTL.program
- 目标:将结构化语句翻译为显式控制流图(CFG)的 RTL。
2. 核心思想
- 使用“状态 + 错误”单子构造 CFG:
st_nextreg:下一个寄存器号
st_nextnode:下一个 CFG 节点
st_code:当前 CFG
- 使用
state_incr 证明 CFG 的单调扩展。
3. 关键数据结构与函数
mapping:变量/let 绑定到 RTL 寄存器的映射。
add_instr / reserve_instr:向 CFG
插入指令或预留节点。
transl_expr /
transl_stmt:表达式与语句翻译。
transl_function /
transl_program:函数/程序入口。
4. 具体变换要点
- 表达式求值顺序:保证与 CminorSel 语义一致。
- 条件与分支:
- 生成分支节点并连接到 true/false 后继。
- 标签预分配:
- 对
Slabel 先分配 CFG 节点,避免前向引用问题。
5. 与前后 pass 的接口
- 前:
Selection 输出的 CminorSel
- 后:
Tailcall / Inlining(RTL 级优化)
6. 常见边界与约束
- 对未声明变量或无效引用会返回错误。
- CFG 构造必须保持单调,不允许覆盖已有节点。