勘误表

在这里我们会列出与实验相关的勘误,它会和问答墙上的勘误部分保持一致。同学们遇到问题时,请先在勘误表中查找查看是否已有解答。

 

Q: RiscvAsmEmitterselectInstr 函数的返回值类型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:

  1. 请将实验报告以 pdf 格式提交到 git.tsinghua 自己的仓库中,放在仓库根目录下的 reports/<branch-name>.pdf,比如 stage 1 的实验报告需要放在 stage-1 这个 branch 下的 reports/stage-1.pdf

  2. 最新的 CI 会检查是否通过所有测例及是否有提交报告,只有通过所有测例且正确地提交报告,才会算作 pass。

  3. 如果关于报告提交有任何问题,请及时联系助教。

 

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的前端接入到原先的中后端来进行测试。

results matching ""

    No results matching ""

    results matching ""

      No results matching ""