Pass:SimplLocals
1. 目标与位置
- 位置:
cfrontend/SimplLocals.v
- 输入/输出:
Clight.program →
Clight.program
- 目标:提升/规整化局部变量,消除不必要的内存读写,使后续 IR 更接近
SSA 风格的显式临时变量使用。
2. 核心思想
- “可提升”的局部变量(地址未被取走)被转换为临时变量。
- 保留必须保存在内存中的局部变量(地址被取走或类型限制)。
- 插入调试注释,维持源级变量与临时变量之间的对应关系。
3. 关键数据结构与函数
compilenv:可提升变量集合(VSet.t)。
is_liftable_var:判定表达式中是否可提升为临时变量。
- 调试语句构造器:
Sdebug_temp / Sdebug_var /
Sset_debug。
simpl_expr /
simpl_stmt:表达式与语句重写主入口。
cenv_for:计算函数级可提升变量集合。
- 程序入口:
transf_program。
4. 具体变换要点
- 表达式重写:将对可提升变量的访问改为临时变量访问。
- 函数参数处理:
- 未提升的参数保持内存形式;
- 提升的参数在函数入口处进行初始化与调试标注。
- 局部变量重排:
remove_lifted / add_lifted
调整变量列表与作用域。
5. 与前后 pass 的接口
- 前:
SimplExpr 输出的 Clight
- 后:
Cshmgen(转到 Csharpminor)
6. 常见边界与约束
- 任何“地址被取走”的局部变量必须保留为内存变量。
- 调试信息插入必须与变量生命周期一致,避免悬空引用。