From 0179c13cf4521b466405b22921e2e9e10370a672 Mon Sep 17 00:00:00 2001 From: Lixuanwang Date: Mon, 4 Aug 2025 16:32:54 +0800 Subject: [PATCH] =?UTF-8?q?[backend]=E6=B7=BB=E5=8A=A0=E4=BA=86=E4=B8=80?= =?UTF-8?q?=E4=BA=9B=E5=B7=A5=E5=85=B7=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/RISCv64/RISCv64AsmPrinter.cpp | 29 ++++++++++++++++++- src/backend/RISCv64/RISCv64ISel.cpp | 4 +++ src/backend/RISCv64/RISCv64RegAlloc.cpp | 24 --------------- .../backend/RISCv64/RISCv64AsmPrinter.h | 2 ++ src/include/backend/RISCv64/RISCv64ISel.h | 3 +- 5 files changed, 36 insertions(+), 26 deletions(-) diff --git a/src/backend/RISCv64/RISCv64AsmPrinter.cpp b/src/backend/RISCv64/RISCv64AsmPrinter.cpp index fcedb43..4dd8fd8 100644 --- a/src/backend/RISCv64/RISCv64AsmPrinter.cpp +++ b/src/backend/RISCv64/RISCv64AsmPrinter.cpp @@ -1,7 +1,8 @@ #include "RISCv64AsmPrinter.h" #include "RISCv64ISel.h" #include - +#include +#include namespace sysy { // 检查是否为内存加载/存储指令,以处理特殊的打印格式 @@ -236,4 +237,30 @@ std::string RISCv64AsmPrinter::regToString(PhysicalReg reg) { } } +std::string RISCv64AsmPrinter::formatInstr(const MachineInstr* instr) { + if (!instr) return "(null instr)"; + + // 使用 stringstream 作为临时的输出目标 + std::stringstream ss; + + // 关键: 临时将类成员 'OS' 指向我们的 stringstream + std::ostream* old_os = this->OS; + this->OS = &ss; + + // 修正: 调用正确的内部打印函数 printMachineInstr + printInstruction(const_cast(instr), false); + + // 恢复旧的 ostream 指针 + this->OS = old_os; + + // 获取stringstream的内容并做一些清理 + std::string result = ss.str(); + size_t endpos = result.find_last_not_of(" \t\n\r"); + if (std::string::npos != endpos) { + result = result.substr(0, endpos + 1); + } + + return result; +} + } // namespace sysy \ No newline at end of file diff --git a/src/backend/RISCv64/RISCv64ISel.cpp b/src/backend/RISCv64/RISCv64ISel.cpp index a96b578..c3879f5 100644 --- a/src/backend/RISCv64/RISCv64ISel.cpp +++ b/src/backend/RISCv64/RISCv64ISel.cpp @@ -1699,4 +1699,8 @@ void RISCv64ISel::print_dag(const std::vector>& dag, co std::cerr << "======================================\n\n"; } +unsigned int RISCv64ISel::getVRegCounter() const { + return vreg_counter; +} + } // namespace sysy \ No newline at end of file diff --git a/src/backend/RISCv64/RISCv64RegAlloc.cpp b/src/backend/RISCv64/RISCv64RegAlloc.cpp index 195ef6c..4245c16 100644 --- a/src/backend/RISCv64/RISCv64RegAlloc.cpp +++ b/src/backend/RISCv64/RISCv64RegAlloc.cpp @@ -122,30 +122,6 @@ void RISCv64RegAlloc::precolorByCallingConvention() { } } - // // --- 部分2:为CALL指令的返回值预着色 --- - // for (auto& mbb : MFunc->getBlocks()) { - // for (auto& instr : mbb->getInstructions()) { - // if (instr->getOpcode() == RVOpcodes::CALL) { - // if (!instr->getOperands().empty() && - // instr->getOperands().front()->getKind() == MachineOperand::KIND_REG) - // { - // auto reg_op = static_cast(instr->getOperands().front().get()); - // if (reg_op->isVirtual()) { - // unsigned ret_vreg = reg_op->getVRegNum(); - // assert(vreg_to_value_map.count(ret_vreg) && "Return vreg not found!"); - // Value* ret_val = vreg_to_value_map.at(ret_vreg); - - // if (ret_val->getType()->isFloat()) { - // color_map[ret_vreg] = PhysicalReg::F10; // fa0 - // } else { - // color_map[ret_vreg] = PhysicalReg::A0; // a0 - // } - // } - // } - // } - // } - // } - // 将所有预着色的vreg视为已着色节点 for(const auto& pair : color_map) { coloredNodes.insert(pair.first); diff --git a/src/include/backend/RISCv64/RISCv64AsmPrinter.h b/src/include/backend/RISCv64/RISCv64AsmPrinter.h index 473ca7f..c9b439b 100644 --- a/src/include/backend/RISCv64/RISCv64AsmPrinter.h +++ b/src/include/backend/RISCv64/RISCv64AsmPrinter.h @@ -20,6 +20,8 @@ public: void setStream(std::ostream& os) { OS = &os; } // 辅助函数 std::string regToString(PhysicalReg reg); + std::string formatInstr(const MachineInstr *instr); + private: // 打印各个部分 void printBasicBlock(MachineBasicBlock* mbb, bool debug = false); diff --git a/src/include/backend/RISCv64/RISCv64ISel.h b/src/include/backend/RISCv64/RISCv64ISel.h index d24432d..db96c62 100644 --- a/src/include/backend/RISCv64/RISCv64ISel.h +++ b/src/include/backend/RISCv64/RISCv64ISel.h @@ -17,7 +17,8 @@ public: // 公开接口,以便后续模块(如RegAlloc)可以查询或创建vreg unsigned getVReg(Value* val); unsigned getNewVReg() { return vreg_counter++; } - unsigned getNewVReg(Type* type); + unsigned getNewVReg(Type* type); + unsigned getVRegCounter() const; // 获取 vreg_map 的公共接口 const std::map& getVRegMap() const { return vreg_map; } const std::map& getVRegValueMap() const { return vreg_to_value_map; }