Skip to content

Commit

Permalink
fix typo
Browse files Browse the repository at this point in the history
  • Loading branch information
Ksitta committed Sep 8, 2024
1 parent 0071b76 commit 00184ba
Showing 1 changed file with 2 additions and 15 deletions.
17 changes: 2 additions & 15 deletions docs/step9/example.md
Original file line number Diff line number Diff line change
Expand Up @@ -202,23 +202,10 @@ main_exit:

你在后端主要需要实现的即为“**对于调用者的处理**”与“**对于被调用者的处理**”两部分。

更加具体地,助教推荐大家首先在`backend/reg/bruteregalloc.py`中实现对函数调用指令翻译的额外处理,包括以下步骤:

+ 保存活跃的临时变量
+ 正确地传递参数
+ 翻译真正的函数调用指令
+ 妥善处理函数返回值

其次,在`backend/riscv/riscvasmemitter.py`中实现生成被调用函数体时的额外处理,包括:

+ 保存和恢复返回地址
+ 接收调用者传入的参数

### 对于调用者的处理

这里我们需要关注源文件`backend/reg/bruteregalloc.py`中的`BruteRegAlloc`类。事实上处理函数调用的额外代码应该在指令翻译时生成,但寄存器传参等调用约定细节与寄存器分配过程中的信息密切相关,在本框架中将额外的翻译步骤实现在寄存器分配过程里比较方便。

`BruteRegAlloc`类的`localAlloc`方法中遍历了基本块中的所有指令,调用`allocForLoc`方法为每条指令执行物理寄存器分配。这里我们可以判断每条指令是否为TAC的函数调用指令,如果是则进入下面对call指令的单独处理逻辑,否则仍调用`allocForLoc`
这里我们需要关注源文件`backend/reg/bruteregalloc.py`中的`BruteRegAlloc`类。

根据调用约定,调用其它函数后caller-saved即volatile寄存器中的值全部是无效的。这意味着如果函数调用前caller-saved寄存器中存放了后续仍活跃的临时变量,它们必须被倒腾到别的地方,如callee-saved寄存器或栈上。因此我们先将活跃且在caller-saved寄存器中的临时变量保存到栈上,这实际上让所有caller-saved寄存器变得空闲,以便于接下来在`a0``a7`中容纳参数。

Expand Down Expand Up @@ -246,7 +233,7 @@ main_exit:

这里我们需要关注源文件`backend/riscv/riscvasmemitter.py`中的`RiscvSubroutineEmitter`类和`backend/reg/bruteregalloc.py`中的`BruteRegAlloc`类。被调用者需要从正确的位置获取到传入的参数,因此需要处理寄存器和临时变量的对应关系;同时在被调用函数的结尾我们要准确无误地返回到调用处,因此需要处理和返回地址相关的信息。

1. **处理返回地址**:具体需要保存和恢复`ra`寄存器,相关实现在`emitEnd`函数中。框架的现有部分已经帮助大家处理好了callee-saved寄存器的保存和恢复,你可以参照这部分实现`ra`寄存器的保存和恢复。(备注:严格来讲`ra`并不是callee-saved寄存器。`ra`会在什么情况下被修改?不过你可以选择总是保存和恢复`ra`。)
1. **处理返回地址**:具体需要保存和恢复`ra`寄存器,相关实现在`emitFunc`函数中。框架的现有部分已经帮助大家处理好了callee-saved寄存器的保存和恢复,你可以参照这部分实现`ra`寄存器的保存和恢复。(备注:严格来讲`ra`并不是callee-saved寄存器。`ra`会在什么情况下被修改?不过你可以选择总是保存和恢复`ra`。)

2. **处理传入的函数参数和临时变量的对应关系**:将传入的参数与临时变量绑定,这样在函数体中就可以直接使用这些参数。`BruteRegAlloc`类中的的`bindings`变量记录了临时变量和物理寄存器的对应关系,你可以使用`bind`, `unbind`函数来完成这些操作。思考应该在何处进行这个绑定操作。

Expand Down

0 comments on commit 00184ba

Please sign in to comment.