勘误表
在这里我们会列出与实验相关的勘误,它会和问答墙上的勘误部分保持一致。同学们遇到问题时,请先在勘误表中查找查看是否已有解答。
Q: RiscvAsmEmitter
下 selectInstr
函数的返回值类型tuple[list[str],SubroutineInfo]
貌似不太合理,返回第一个元素实际上是list[TACInstr]
A: 感谢同学指出框架问题,请同学们将backend/asmemitter.py
下的AsmEmitter
抽象类和backend/riscv/riscvasmemitter.py
下的RiscvAsmEmitter
类中的selectInstr
函数返回值标注改为tuple[list[TACInstr], SubroutineInfo]
。
Q:使用 pip install -r ./requirements.txt
命令无法正确安装依赖?
A:如果你安装了多版本的 python,使用 pip 命令未必会对应 3.9 版本的包管理器。请尝试使用 python3.9 -m pip install -r ./requirements.txt
安装依赖。
Q:代码框架无法正确输出三地址码?
A:非常抱歉,框架中输出时有一个小错误。在 main.py
中,输出三地址码时,请使用 prog.printTo()
语句;此外,想要输出带有缩进格式的抽象语法树,请使用如下语句:
printer = TreePrinter(indentLen=<缩进空格数>)
printer.work(prog)
Q: 代码框架 step7 中,由 multi_nesting.c 生成的以下中间代码无法成功生成目标代码。
经过使用 print 法调试,发现是 _T1
所对应的寄存器在 return _T1
前就被释放了,后端会尝试到栈中寻找 _T1
并且不会找到,出现报错:
utils.error.IllegalArgumentException: error: encounter a non-returned basic block
请问是后端实现上有问题,还是这一部分本来就需要我们自己修改呢?
A:代码框架的后端除了要修改指令选择部分之外,还需要修改基本块 CFG,可以参见 BruteRegAlloc 的注释里给出的提示。
Q:我怎样才能知道我的提交通过了所有测试用例?
A:在 2021.10.5 更新评测脚本之后,现在通过 CI 结果可以直接判断是否通过了本阶段测例(不过你需要确保你的提交在对应的 branch 上,如 stage1 对应 stage-1 分支)。本地测试不受此次更新影响,因此更新本地的测试仓库 submodule 不是必须的。
Q:实验指导书中step4的目标代码生成部分,给出的IR对应汇编指令不正确,修改了原有寄存器的值?
A:原先的汇编指令确实有问题,我们已经修正。感谢彭晋钧和郭昊同学!
Q:如何提交课程报告?
A:
请将实验报告以 pdf 格式提交到 git.tsinghua 自己的仓库中,放在仓库根目录下的
reports/<branch-name>.pdf
,比如 stage 1 的实验报告需要放在 stage-1 这个 branch 下的reports/stage-1.pdf
。最新的 CI 会检查是否通过所有测例及是否有提交报告,只有通过所有测例且正确地提交报告,才会算作 pass。
如果关于报告提交有任何问题,请及时联系助教。
Q:代码框架寄存器分配中 allocRegFor 函数实现有错误?(已经在2023-2024年编译课程中修复)
A:请修改 bruteregalloc.py 中第 119 行处随机数生成的范围,将上界改为 len(...) - 1
,避免溢出。感谢孟本源同学!
reg = self.emitter.allocatableRegs[
random.randint(0, len(self.emitter.allocatableRegs) - 1)
]
Q: Parser Stage中的test-parser-stage.sh
无法正常使用?(Parser Stage已经在2023-2024年编译课程移除)
A: 发布作业时打包有失误,请使用原有的minidecaf-tests
中的check.sh
测试脚本,将parser-stage的前端接入到原先的中后端来进行测试。