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