fix(mir): 修复全局变量 .bss/.data 段反复切换——统一分组输出

之前每个零初始化全局变量都会在 .bss → .data 之间切换一次,
大数组(12MB BSS)的 .data 插入可能导致链接器内存布局异常。
现在先输出全部 .bss 段,再输出 .data 段,消除无用的段切换。
这可能是 many_mat_cal-1/3 在平台 100MB 限制下 WA 的根因。
lzk
lzkk 2 days ago
parent d9ebea6668
commit 1b9c8cc40d

@ -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";

Loading…
Cancel
Save