#include "mir/MIR.h" #include #include #include "utils/Log.h" namespace mir { namespace { int AlignTo(int value, int align) { return ((value + align - 1) / align) * align; } } // namespace void RunFrameLowering(MachineFunction& function) { int cursor = 0; const auto& slots = function.GetFrameSlots(); // 为每个栈槽分配偏移 for (const auto& slot : slots) { int align = slot.size; cursor = AlignTo(cursor, align); function.GetFrameSlot(slot.index).offset = cursor; cursor += slot.size; } // 局部变量区按 16 字节对齐 int local_vars_size = AlignTo(cursor, 16); function.SetLocalVarsSize(local_vars_size); // 总帧大小 = 局部变量区 + 16(保存 ra 和 s0) function.SetFrameSize(local_vars_size + 16); // 插入 Prologue/Epilogue 占位符(原逻辑) auto& insts = function.GetEntry()->GetInstructions(); std::vector lowered; lowered.emplace_back(Opcode::Prologue); for (const auto& inst : insts) { if (inst.GetOpcode() == Opcode::Ret) { lowered.emplace_back(Opcode::Epilogue); } lowered.push_back(inst); } insts = std::move(lowered); } } // namespace mir