课题21:IR验证器
难度:中
概述:实现一个IR验证器,在优化前后检查IR的合法性(变量定义使用、跳转标签存在、类型一致、控制流完整性)。
详细任务:
1. 设计IR合法性规则:
- 变量必须先定义再使用。
- 跳转标签必须存在对应LABEL。
- 基本块必须以跳转(BR、JMP)或RET结尾。
- 二元运算的操作数类型一致。
2. 实现遍历Program、Function、BasicBlock的验证函数。
3. 检查控制流:无条件跳转后不能有后继指令,有条件跳转后恰好有两个分支。
4. 集成到编译器主流程,在每次优化Pass前后自动调用验证器,出错时输出详细报告并停止编译。
5. 添加--verify-ir命令行开关。
交付产物:
- ir_verifier.py模块
- 测试用例(合法和非法IR)
- 文档:验证规则列表、如何扩展
12周每周目标:
- W1:学习项目IR的数据结构(ir.py中的Instruction, BasicBlock, Function等)。
- W2:设计验证规则列表,按类别(变量、标签、类型、控制流)组织。
- W3:实现变量定义-使用检查:遍历每个基本块,维护变量定义集合,检测未定义使用。
- W4:实现标签存在性检查:收集所有LABEL指令的目标,检查跳转指令的目标是否存在。
- W5:实现基本块结尾检查:确保每个块以跳转或返回结尾,否则报错。
- W6:实现类型一致性检查:二元运算的两个操作数类型相同,比较操作结果类型为整数等。
- W7:实现控制流完整性检查:无条件跳转后不能有后继指令,有条件跳转后有两个后继块。
- W8:将验证器封装为函数verify_ir(program),返回错误列表。
- W9:集成到编译器主流程,在解析后、每个优化Pass后、代码生成前调用验证器。
- W10:添加--verify-ir命令行开关,默认开启(或仅在DEBUG模式开启)。
- W11:编写测试用例:构造非法IR(如缺失标签、类型不匹配),验证验证器能捕获。
- W12:撰写文档,包含所有验证规则及示例。