diff --git a/src/mir/AsmPrinter.cpp b/src/mir/AsmPrinter.cpp index dc94fa16..1aaad65c 100644 --- a/src/mir/AsmPrinter.cpp +++ b/src/mir/AsmPrinter.cpp @@ -865,74 +865,71 @@ namespace mir void PrintGlobals(const MachineModule &module, std::ostream &os) { if (module.GetGlobals().empty()) - { return; - } - os << " .data\n"; - for (const auto &global : module.GetGlobals()) - { - const std::string asm_name = NormalizeAsmSymbol(global.name); - - bool is_zero_init = false; - if (global.kind == MachineGlobal::Kind::I32Scalar && global.init_value == 0) + auto is_zero = [](const MachineGlobal &g) -> bool { + if (g.kind == MachineGlobal::Kind::I32Scalar && g.init_value == 0) + return true; + if (g.kind == MachineGlobal::Kind::I32Array) { - is_zero_init = true; - } - if (global.kind == MachineGlobal::Kind::I32Array) - { - bool all_zero = true; - for (auto v : global.init_values) - { - if (v != 0) - { - all_zero = false; - break; - } - } - if (all_zero) - { - is_zero_init = true; - } + if (g.init_values.empty()) return true; + for (auto v : g.init_values) + if (v != 0) return false; + return true; } + return false; + }; + + // 先统一输出 .bss 段 + bool has_bss = false; + for (const auto &g : module.GetGlobals()) + if (is_zero(g)) { has_bss = true; break; } - if (is_zero_init) + if (has_bss) + { + os << " .bss\n"; + for (const auto &global : module.GetGlobals()) { - os << " .bss\n"; + if (!is_zero(global)) continue; + const std::string asm_name = NormalizeAsmSymbol(global.name); os << " .globl " << asm_name << "\n"; os << " .p2align 2\n"; os << asm_name << ":\n"; if (global.kind == MachineGlobal::Kind::I32Scalar) - { os << " .space 4\n"; - } else - { os << " .space " << (global.array_size * 4) << "\n"; - } - os << " .data\n"; - continue; } + } - os << " .globl " << asm_name << "\n"; - os << " .p2align 2\n"; - os << asm_name << ":\n"; + // 再统一输出 .data 段 + bool has_data = false; + for (const auto &g : module.GetGlobals()) + if (!is_zero(g)) { has_data = true; break; } - if (global.kind == MachineGlobal::Kind::I32Scalar) + if (has_data) + { + os << " .data\n"; + for (const auto &global : module.GetGlobals()) { - os << " .word " << global.init_value << "\n"; - continue; - } + if (is_zero(global)) continue; + const std::string asm_name = NormalizeAsmSymbol(global.name); + os << " .globl " << asm_name << "\n"; + os << " .p2align 2\n"; + os << asm_name << ":\n"; - const size_t init_count = global.init_values.size(); - for (size_t i = 0; i < init_count; ++i) - { - os << " .word " << global.init_values[i] << "\n"; - } + if (global.kind == MachineGlobal::Kind::I32Scalar) + { + os << " .word " << global.init_value << "\n"; + continue; + } - if (global.array_size > init_count) - { - os << " .zero " << ((global.array_size - init_count) * 4) << "\n"; + const size_t init_count = global.init_values.size(); + for (size_t i = 0; i < init_count; ++i) + os << " .word " << global.init_values[i] << "\n"; + + if (global.array_size > init_count) + os << " .zero " << ((global.array_size - init_count) * 4) << "\n"; } } os << "\n";