diff --git a/doc/lab2剩余任务分工.md b/doc/lab2剩余任务分工.md index 8969726..998c0fc 100644 --- a/doc/lab2剩余任务分工.md +++ b/doc/lab2剩余任务分工.md @@ -99,4 +99,39 @@ **完整测试脚本** ```bash for f in test/test_case/functional/*.sy; do echo "Testing $f..."; ./scripts/verify_ir.sh "$f" --run > /dev/null || echo "FAILED $f"; done - ``` \ No newline at end of file + ``` + +## 人员 3 完成情况详细说明(更新于 2026-04-06) + +### ✅ 已完成任务 + +人员 3 (hp) 已完整实现 Lab2 IR 生成中函数及常量的扩展支持,包括: + +1. **支持全局变量声明与初始化**(任务 3.1) + - 在 `IRGenDecl.cpp` 中通过判断 `func_ == nullptr` 区分全局和局部作用域。 + - 扩充了 `Float` / `PtrFloat` 及 `ConstantFloat` 等浮点数支持,补充 `GlobalVariable` 派生类。 + - 正确调用 `module_.CreateGlobalVariable` 处理整型和浮点型全局初始化,维护在 `storage_map_` 中。 +2. **支持函数参数处理**(任务 3.2) + - 在 `IR.h` 的 `Value` 体系中增加 `Argument` 类。 + - 在 `IRGenFunc.cpp` 中实现对 `funcFParams` 的处理。 + - 在入口块为每个参数 `alloca` 栈槽,通过 `store` 存入形参初值,并绑定至 `storage_map_` 供内部读取。 +3. **支持函数调用生成**(任务 3.3) + - 在 `IR.h` 与 `IRBuilder.cpp` 补充 `Opcode::Call` 与 `CallInst` 及其打印逻辑。 + - 在 `IRGenExp.cpp` (`visitUnaryExp`) 支持 `funcCallExp` 解析。 + - 提取计算所有的实参表达式 (`funcRParams`) 后生成 `call` 指令;对于库函数支持基于 `Sema` 的占位符签名构建。 +4. **支持 const 常量声明**(任务 3.4) + - 在 `IRGenDecl.cpp` 新增 `visitConstDecl` 和 `visitConstDef` 实现。 + - 维护独立的 `const_values_` 映射表记录 `ConstantValue*`。 + - 在 `visitLVal` 时如果检测到是已定义的常量,直接嵌入常量值完成折叠,省去内存的 `load` 开销。 + +### 🧪 测试验证 + +- **全局/局部变量、常量引用测试**:✅ IR 输出正确(通过访问 `storage_map_` 和 `const_values_` 获取数据)。 +- **参数传递与函数调用链路测试**:✅ 多参数函数(包含返回值)和调用外部 `putint` 的样例生成的 LLVM IR 结构清晰、运行正确。 +- **集成测试验证**:✅ 能完美与人员 1 和人员 2 的前置工作合并通过,确保了控制流、运算体系与函数调用的兼容。 + +### 🔄 协作接口 + +人员 3 的实现对全局体系及调用链路做出了以下约定: +- **常量折叠访问机制**:扩展引入了 `const_values_` 映射机制,允许表达式树中的左值在编译期直接折叠为字面量常量。 +- **参数栈操作模型**:统一了函数的栈变量调用约定(将传参全统一按 Alloca 栈分配处理),这为后续实验中后端进行简单且一致的寄存器/栈映射及死代码消除等数据流分析提供了稳定基础。 \ No newline at end of file