#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