123 lines
5.3 KiB
C++
123 lines
5.3 KiB
C++
#include "RISCv64LLIR.h"
|
|
#include <vector>
|
|
#include <iostream> // 用于 std::ostream 和 std::cerr
|
|
#include <string> // 用于 std::string
|
|
|
|
namespace sysy {
|
|
|
|
// 辅助函数:将 PhysicalReg 枚举转换为可读的字符串
|
|
std::string regToString(PhysicalReg reg) {
|
|
switch (reg) {
|
|
case PhysicalReg::ZERO: return "x0"; case PhysicalReg::RA: return "ra";
|
|
case PhysicalReg::SP: return "sp"; case PhysicalReg::GP: return "gp";
|
|
case PhysicalReg::TP: return "tp"; case PhysicalReg::T0: return "t0";
|
|
case PhysicalReg::T1: return "t1"; case PhysicalReg::T2: return "t2";
|
|
case PhysicalReg::S0: return "s0"; case PhysicalReg::S1: return "s1";
|
|
case PhysicalReg::A0: return "a0"; case PhysicalReg::A1: return "a1";
|
|
case PhysicalReg::A2: return "a2"; case PhysicalReg::A3: return "a3";
|
|
case PhysicalReg::A4: return "a4"; case PhysicalReg::A5: return "a5";
|
|
case PhysicalReg::A6: return "a6"; case PhysicalReg::A7: return "a7";
|
|
case PhysicalReg::S2: return "s2"; case PhysicalReg::S3: return "s3";
|
|
case PhysicalReg::S4: return "s4"; case PhysicalReg::S5: return "s5";
|
|
case PhysicalReg::S6: return "s6"; case PhysicalReg::S7: return "s7";
|
|
case PhysicalReg::S8: return "s8"; case PhysicalReg::S9: return "s9";
|
|
case PhysicalReg::S10: return "s10"; case PhysicalReg::S11: return "s11";
|
|
case PhysicalReg::T3: return "t3"; case PhysicalReg::T4: return "t4";
|
|
case PhysicalReg::T5: return "t5"; case PhysicalReg::T6: return "t6";
|
|
case PhysicalReg::F0: return "f0"; case PhysicalReg::F1: return "f1";
|
|
case PhysicalReg::F2: return "f2"; case PhysicalReg::F3: return "f3";
|
|
case PhysicalReg::F4: return "f4"; case PhysicalReg::F5: return "f5";
|
|
case PhysicalReg::F6: return "f6"; case PhysicalReg::F7: return "f7";
|
|
case PhysicalReg::F8: return "f8"; case PhysicalReg::F9: return "f9";
|
|
case PhysicalReg::F10: return "f10"; case PhysicalReg::F11: return "f11";
|
|
case PhysicalReg::F12: return "f12"; case PhysicalReg::F13: return "f13";
|
|
case PhysicalReg::F14: return "f14"; case PhysicalReg::F15: return "f15";
|
|
case PhysicalReg::F16: return "f16"; case PhysicalReg::F17: return "f17";
|
|
case PhysicalReg::F18: return "f18"; case PhysicalReg::F19: return "f19";
|
|
case PhysicalReg::F20: return "f20"; case PhysicalReg::F21: return "f21";
|
|
case PhysicalReg::F22: return "f22"; case PhysicalReg::F23: return "f23";
|
|
case PhysicalReg::F24: return "f24"; case PhysicalReg::F25: return "f25";
|
|
case PhysicalReg::F26: return "f26"; case PhysicalReg::F27: return "f27";
|
|
case PhysicalReg::F28: return "f28"; case PhysicalReg::F29: return "f29";
|
|
case PhysicalReg::F30: return "f30"; case PhysicalReg::F31: return "f31";
|
|
default: return "UNKNOWN_REG";
|
|
}
|
|
}
|
|
|
|
// 打印栈帧信息的完整实现
|
|
void MachineFunction::dumpStackFrameInfo(std::ostream& os) const {
|
|
const StackFrameInfo& info = frame_info;
|
|
|
|
os << "--- Stack Frame Info for function '" << getName() << "' ---\n";
|
|
|
|
// 打印尺寸信息
|
|
os << " Sizes:\n";
|
|
os << " Total Size: " << info.total_size << " bytes\n";
|
|
os << " Locals Size: " << info.locals_size << " bytes\n";
|
|
os << " Spill Size: " << info.spill_size << " bytes\n";
|
|
os << " Callee-Saved Size: " << info.callee_saved_size << " bytes\n";
|
|
os << "\n";
|
|
|
|
// 打印 Alloca 变量的偏移量
|
|
os << " Alloca Offsets (vreg -> offset from FP):\n";
|
|
if (info.alloca_offsets.empty()) {
|
|
os << " (None)\n";
|
|
} else {
|
|
for (const auto& pair : info.alloca_offsets) {
|
|
os << " %vreg" << pair.first << " -> " << pair.second << "\n";
|
|
}
|
|
}
|
|
os << "\n";
|
|
|
|
// 打印溢出变量的偏移量
|
|
os << " Spill Offsets (vreg -> offset from FP):\n";
|
|
if (info.spill_offsets.empty()) {
|
|
os << " (None)\n";
|
|
} else {
|
|
for (const auto& pair : info.spill_offsets) {
|
|
os << " %vreg" << pair.first << " -> " << pair.second << "\n";
|
|
}
|
|
}
|
|
os << "\n";
|
|
|
|
// 打印使用的被调用者保存寄存器
|
|
os << " Used Callee-Saved Registers:\n";
|
|
if (info.used_callee_saved_regs.empty()) {
|
|
os << " (None)\n";
|
|
} else {
|
|
os << " { ";
|
|
for (const auto& reg : info.used_callee_saved_regs) {
|
|
os << regToString(reg) << " ";
|
|
}
|
|
os << "}\n";
|
|
}
|
|
os << "\n";
|
|
|
|
// 打印需要保存/恢复的被调用者保存寄存器 (有序)
|
|
os << " Callee-Saved Registers to Store/Restore:\n";
|
|
if (info.callee_saved_regs_to_store.empty()) {
|
|
os << " (None)\n";
|
|
} else {
|
|
os << " [ ";
|
|
for (const auto& reg : info.callee_saved_regs_to_store) {
|
|
os << regToString(reg) << " ";
|
|
}
|
|
os << "]\n";
|
|
}
|
|
os << "\n";
|
|
|
|
// 打印最终的寄存器分配结果
|
|
os << " Final Register Allocation Map (vreg -> preg):\n";
|
|
if (info.vreg_to_preg_map.empty()) {
|
|
os << " (None)\n";
|
|
} else {
|
|
for (const auto& pair : info.vreg_to_preg_map) {
|
|
os << " %vreg" << pair.first << " -> " << regToString(pair.second) << "\n";
|
|
}
|
|
}
|
|
|
|
os << "---------------------------------------------------\n";
|
|
}
|
|
|
|
}
|