#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