课题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:撰写文档,包含所有验证规则及示例。

实现文档