Pass:Cminorgen
1. 目标与位置
- 位置:
cfrontend/Cminorgen.v
- 输入/输出:
Csharpminor.program →
Cminor.program
- 目标:显式构造栈帧布局与变量寻址,把 Csharpminor 翻译为更接近机器的
Cminor。
2. 核心思想
- 对每个 Csharpminor 局部变量分配栈槽,并在 Cminor
中显式使用地址计算。
- 将结构化控制流与表达式翻译为 Cminor 语句序列。
3. 关键数据结构与函数
compilenv:变量到栈偏移的映射(PTree.t Z)。
build_compilenv:按照变量大小/对齐规划栈布局。
var_addr:生成变量地址表达式。
transl_expr /
transl_stmt:表达式与语句翻译。
transl_function:构造 Cminor 函数。
- 程序入口:
transl_program。
4. 具体变换要点
- 栈布局与对齐:
assign_variables
按大小排序并分配偏移,确保对齐要求。
- 计算
stacksize 用于函数帧。
- switch/exit 处理:
5. 与前后 pass 的接口
- 前:
Cshmgen 产出的 Csharpminor
- 后:
Selection(进入指令选择)
6. 常见边界与约束
- 对齐与大小的计算依赖类型信息;错误会导致
res
失败。
- 变量地址的显式化要求严格一致的栈布局规则。