From 34ec79c399aadca7f8235824390a3ee77d075a07 Mon Sep 17 00:00:00 2001 From: mxr <> Date: Thu, 9 Apr 2026 14:47:19 +0800 Subject: [PATCH] =?UTF-8?q?feat(mir)=E4=BF=AE=E5=A4=8D=E6=A0=88=E5=B8=A7?= =?UTF-8?q?=E6=8C=87=E4=BB=A4=E9=81=8D=E5=8E=86=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/mir/AsmPrinter.cpp | 55 +++++++------- src/mir/FrameLowering.cpp | 153 ++++++++++---------------------------- 2 files changed, 66 insertions(+), 142 deletions(-) diff --git a/src/mir/AsmPrinter.cpp b/src/mir/AsmPrinter.cpp index 0be85f8..350a3b4 100644 --- a/src/mir/AsmPrinter.cpp +++ b/src/mir/AsmPrinter.cpp @@ -5,6 +5,15 @@ #include "utils/Log.h" +#define DEBUG_Asm + +#ifdef DEBUG_Asm +#include +#define DEBUG_MSG(msg) std::cerr << "[Asm Debug] " << msg << std::endl +#else +#define DEBUG_MSG(msg) +#endif + namespace mir { namespace { @@ -55,12 +64,19 @@ void PrintInstruction(std::ostream& os, const MachineInstr& instr, const auto& ops = instr.GetOperands(); switch (instr.GetOpcode()) { - case Opcode::Prologue: - // Prologue 在 RunFrameLowering 中已经生成具体指令,这里不需要输出 - break; - case Opcode::Epilogue: - // Epilogue 在 RunFrameLowering 中已经生成具体指令,这里不需要输出 - break; + case Opcode::Prologue: + os << " stp x29, x30, [sp, #-16]!\n"; + os << " mov x29, sp\n"; + if (function.GetFrameSize() > 0) { + os << " sub sp, sp, #" << function.GetFrameSize() << "\n"; + } + break; + case Opcode::Epilogue: + if (function.GetFrameSize() > 0) { + os << " add sp, sp, #" << function.GetFrameSize() << "\n"; + } + os << " ldp x29, x30, [sp], #16\n"; + break; case Opcode::MovImm: os << " mov " << PhysRegName(ops.at(0).GetReg()) << ", #" << ops.at(1).GetImm() << "\n"; @@ -225,21 +241,9 @@ void PrintInstruction(std::ostream& os, const MachineInstr& instr, PrintOperand(os, ops.at(0)); os << "\n"; break; - //case Opcode::Ret: - // os << " ret\n"; - // break; - case Opcode::Ret: { - // 输出函数尾声 - int frameSize = function.GetFrameSize(); - int alignedSize = (frameSize + 15) & ~15; - - if (alignedSize > 0) { - os << " add sp, sp, #" << alignedSize << "\n"; - } - os << " ldp x29, x30, [sp], #16\n"; + case Opcode::Ret: os << " ret\n"; break; - } case Opcode::Nop: os << " nop\n"; break; @@ -259,21 +263,13 @@ void PrintAsm(const MachineFunction& function, std::ostream& os) { // 计算栈帧大小 int frameSize = function.GetFrameSize(); - int alignedSize = (frameSize + 15) & ~15; // 16 字节对齐 - - // ========== 函数序言 ========== - os << " stp x29, x30, [sp, #-16]!\n"; // 保存 FP/LR,sp -= 16 - os << " mov x29, sp\n"; // 设置 FP - - if (alignedSize > 0) { - os << " sub sp, sp, #" << alignedSize << "\n"; // 分配局部变量空间 - } // 输出每个基本块 const auto& blocks = function.GetBasicBlocks(); bool firstBlock = true; for (const auto& bb : blocks) { + DEBUG_MSG("block"); // 输出基本块标签(非第一个基本块) if (!firstBlock) { os << bb->GetName() << ":\n"; @@ -282,6 +278,7 @@ void PrintAsm(const MachineFunction& function, std::ostream& os) { // 输出基本块中的指令 for (const auto& inst : bb->GetInstructions()) { + DEBUG_MSG("inst"); PrintInstruction(os, inst, function); } } @@ -297,8 +294,10 @@ void PrintAsm(const MachineModule& module, std::ostream& os) { os << ".arch armv8-a\n"; os << ".text\n"; + DEBUG_MSG("module"); // 遍历所有函数,输出汇编 for (const auto& func : module.GetFunctions()) { + DEBUG_MSG("func"); PrintAsm(*func, os); os << "\n"; } diff --git a/src/mir/FrameLowering.cpp b/src/mir/FrameLowering.cpp index af3a863..62d7ccb 100644 --- a/src/mir/FrameLowering.cpp +++ b/src/mir/FrameLowering.cpp @@ -5,6 +5,15 @@ #include "utils/Log.h" +#define DEBUG_Frame + +#ifdef DEBUG_Frame +#include +#define DEBUG_MSG(msg) std::cerr << "[Frame Debug] " << msg << std::endl +#else +#define DEBUG_MSG(msg) +#endif + namespace mir { namespace { @@ -14,112 +23,8 @@ int AlignTo(int value, int align) { } // namespace -// 计算栈帧中所有栈槽的总大小 -static int CalculateStackFrameSize(MachineFunction& function) { - int totalSize = 0; - - // 计算所有栈槽的总大小 - for (auto& slot : function.GetFrameSlots()) { - // 栈槽偏移从 -4, -8, -12 开始(负偏移) - int offset = -(totalSize + slot.size); - slot.offset = offset; - totalSize += slot.size; - } - - // 返回局部变量总大小(不需要额外加 16,因为 sp 已经减了 16) - return totalSize; -} - -// 单函数版本的栈帧布局(原有逻辑扩展) void RunFrameLowering(MachineFunction& function) { - // 计算栈帧大小 - int frameSize = CalculateStackFrameSize(function); - function.SetFrameSize(frameSize); - - // 获取入口基本块 - if (function.GetBasicBlocks().empty()) { - throw std::runtime_error(FormatError("framelowering", "函数没有基本块")); - } - - MachineBasicBlock& entry = function.GetEntry(); - - // 获取指令列表 - auto& instrs = entry.GetInstructions(); - - // 创建新的指令列表,先放序言,再放原有指令 - std::vector newInstrs; - - // ========== 函数序言 ========== - // 1. stp x29, x30, [sp, #-16]! (保存 FP 和 LR,同时 sp -= 16) - /* newInstrs.emplace_back(Opcode::StoreStackPair, - std::vector{Operand::Reg(PhysReg::X29), - Operand::Reg(PhysReg::X30), - Operand::Imm(-16)}); - - // 2. mov x29, sp (设置 FP) - newInstrs.emplace_back(Opcode::MovReg, - std::vector{Operand::Reg(PhysReg::X29), - Operand::Reg(PhysReg::SP)}); - - // 3. sub sp, sp, #frameSize (分配局部变量空间) - if (frameSize > 0) { - int alignedSize = (frameSize + 15) & ~15; // 16 字节对齐 - newInstrs.emplace_back(Opcode::SubRI, - std::vector{Operand::Reg(PhysReg::SP), - Operand::Reg(PhysReg::SP), - Operand::Imm(alignedSize)}); - } - - // 复制原有指令 - for (auto& instr : instrs) { - newInstrs.push_back(std::move(instr)); - } - - // 替换指令列表 - instrs = std::move(newInstrs); */ - - // ========== 处理尾声 ========== - /* for (auto& bb : function.GetBasicBlocks()) { - auto& instructions = bb->GetInstructions(); - - // 查找 Ret 指令 - for (auto it = instructions.begin(); it != instructions.end(); ++it) { - if (it->GetOpcode() == Opcode::Ret) { - // 创建尾声指令 - std::vector epilogue; - - // 1. add sp, sp, #frameSize (释放局部变量空间) - if (frameSize > 0) { - int alignedSize = (frameSize + 15) & ~15; - epilogue.emplace_back(Opcode::AddRI, - std::vector{Operand::Reg(PhysReg::SP), - Operand::Reg(PhysReg::SP), - Operand::Imm(alignedSize)}); - } - - // 2. ldp x29, x30, [sp], #16 (恢复 FP 和 LR,同时 sp += 16) - epilogue.emplace_back(Opcode::LoadStackPair, - std::vector{Operand::Reg(PhysReg::X29), - Operand::Reg(PhysReg::X30), - Operand::Imm(16)}); - - // 在 Ret 指令前插入尾声 - instructions.insert(it, epilogue.begin(), epilogue.end()); - break; // 每个函数只处理第一个 Ret(实际应该处理所有) - } - } - } */ -} - -// 模块版本的栈帧布局 -void RunFrameLowering(MachineModule& module) { - // 对模块中的每个函数执行栈帧布局 - for (auto& func : module.GetFunctions()) { - RunFrameLowering(*func); - } -} - -/* void RunFrameLowering(MachineFunction& function) { + DEBUG_MSG("function RunFrameLowering"); int cursor = 0; for (const auto& slot : function.GetFrameSlots()) { cursor += slot.size; @@ -135,16 +40,36 @@ void RunFrameLowering(MachineModule& module) { } function.SetFrameSize(AlignTo(cursor, 16)); - 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); + // 基本块 + const auto& blocks = function.GetBasicBlocks(); + + for (const auto& bb : blocks) { + DEBUG_MSG("block"); + auto& insts = bb->GetInstructions(); + std::vector lowered; + DEBUG_MSG("empalace Prologue"); + lowered.emplace_back(Opcode::Prologue); + // 输出基本块中的指令 + for (const auto& inst : insts) { + DEBUG_MSG("inst"); + if (inst.GetOpcode() == Opcode::Ret) { + DEBUG_MSG("empalace Epilogue"); + lowered.emplace_back(Opcode::Epilogue); + } + lowered.push_back(inst); } - lowered.push_back(inst); + insts = std::move(lowered); + } +} + +// 模块版本的栈帧布局 +void RunFrameLowering(MachineModule& module) { + // 对模块中的每个函数执行栈帧布局 + DEBUG_MSG("module RunFrameLowering"); + for (auto& func : module.GetFunctions()) { + RunFrameLowering(*func); } - insts = std::move(lowered); -} */ +} } // namespace mir +