33 lines
1.0 KiB
C++
33 lines
1.0 KiB
C++
#ifndef CALLEE_SAVED_HANDLER_H
|
||
#define CALLEE_SAVED_HANDLER_H
|
||
|
||
#include "RISCv64LLIR.h"
|
||
#include "Pass.h"
|
||
|
||
namespace sysy {
|
||
|
||
/**
|
||
* @class CalleeSavedHandler
|
||
* @brief 处理被调用者保存寄存器(Callee-Saved Registers)的Pass。
|
||
* * 这个Pass在寄存器分配之后运行。它的主要职责是:
|
||
* 1. 扫描整个函数,找出所有被使用的 `s` 系列寄存器。
|
||
* 2. 在函数序言中插入 `sd` 指令来保存这些寄存器。
|
||
* 3. 在函数结尾(ret指令前)插入 `ld` 指令来恢复这些寄存器。
|
||
* 4. 正确计算因保存这些寄存器而需要的额外栈空间,并更新StackFrameInfo。
|
||
*/
|
||
class CalleeSavedHandler : public Pass {
|
||
public:
|
||
static char ID;
|
||
|
||
CalleeSavedHandler() : Pass("callee-saved-handler", Granularity::Function, PassKind::Optimization) {}
|
||
|
||
void *getPassID() const override { return &ID; }
|
||
|
||
bool runOnFunction(Function *F, AnalysisManager& AM) override;
|
||
|
||
void runOnMachineFunction(MachineFunction* mfunc);
|
||
};
|
||
|
||
} // namespace sysy
|
||
|
||
#endif // CALLEE_SAVED_HANDLER_H
|