35 lines
1.3 KiB
C++
35 lines
1.3 KiB
C++
#ifndef SYSY_PROLOGUE_EPILOGUE_INSERTION_H
|
||
#define SYSY_PROLOGUE_EPILOGUE_INSERTION_H
|
||
|
||
#include "RISCv64LLIR.h"
|
||
#include "Pass.h"
|
||
|
||
namespace sysy {
|
||
|
||
class MachineFunction;
|
||
|
||
/**
|
||
* @class PrologueEpilogueInsertionPass
|
||
* @brief 在函数中插入序言和尾声的机器指令。
|
||
*
|
||
* 这个Pass在所有栈帧大小计算完毕后(包括局部变量、溢出槽、被调用者保存寄存器),
|
||
* 在寄存器分配之后运行。它的职责是:
|
||
* 1. 根据 StackFrameInfo 中的最终栈大小,生成用于分配和释放栈帧的指令 (addi sp, sp, +/-size)。
|
||
* 2. 生成用于保存和恢复返回地址(ra)和旧帧指针(s0)的指令。
|
||
* 3. 将这些指令作为 MachineInstr 对象插入到 MachineFunction 的入口块和所有返回块中。
|
||
* 4. 这个Pass可能会生成带有大立即数的指令,需要后续的 LegalizeImmediatesPass 来处理。
|
||
*/
|
||
class PrologueEpilogueInsertionPass : public Pass {
|
||
public:
|
||
static char ID;
|
||
|
||
PrologueEpilogueInsertionPass() : Pass("prologue-epilogue-insertion", Granularity::Function, PassKind::Optimization) {}
|
||
|
||
void *getPassID() const override { return &ID; }
|
||
|
||
void runOnMachineFunction(MachineFunction* mfunc);
|
||
};
|
||
|
||
} // namespace sysy
|
||
|
||
#endif // SYSY_PROLOGUE_EPILOGUE_INSERTION_H
|