From 5b0b15676c9f2c0646fdd6271bd9fdcd117da1e1 Mon Sep 17 00:00:00 2001 From: Reality Date: Sat, 21 Mar 2026 15:27:33 +0900 Subject: [PATCH] [CPU/A64] Avoid static init order in A64 sequences The A64 sequence table is populated by registration statics spread across multiple translation units. Keeping the backing map as a global object makes registration depend on cross-TU initialization order and can hit the table before it has been constructed. Move the sequence table behind a function-local static so sequence registration is safe regardless of which unit initializes first. --- src/xenia/cpu/backend/a64/a64_sequences.cc | 7 ++++++- src/xenia/cpu/backend/a64/a64_sequences.h | 4 ++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/xenia/cpu/backend/a64/a64_sequences.cc b/src/xenia/cpu/backend/a64/a64_sequences.cc index 2b52a3b18..aa3808f34 100644 --- a/src/xenia/cpu/backend/a64/a64_sequences.cc +++ b/src/xenia/cpu/backend/a64/a64_sequences.cc @@ -35,7 +35,11 @@ namespace a64 { using namespace xe::cpu::hir; using namespace Xbyak_aarch64; -std::unordered_map sequence_table; +std::unordered_map& SequenceTable() { + static auto* sequence_table = + new std::unordered_map(); + return *sequence_table; +} // ============================================================================ // Debug validation helpers @@ -4821,6 +4825,7 @@ static int anchor_vector_dest = anchor_vector; bool SelectSequence(A64Emitter* e, const hir::Instr* i, const hir::Instr** new_tail) { const InstrKey key(i); + auto& sequence_table = SequenceTable(); auto it = sequence_table.find(key); if (it != sequence_table.end()) { if (it->second(*e, i, InstrKeyValue(key))) { diff --git a/src/xenia/cpu/backend/a64/a64_sequences.h b/src/xenia/cpu/backend/a64/a64_sequences.h index d65d9361a..1b82ffc3f 100644 --- a/src/xenia/cpu/backend/a64/a64_sequences.h +++ b/src/xenia/cpu/backend/a64/a64_sequences.h @@ -22,11 +22,11 @@ namespace a64 { class A64Emitter; typedef bool (*SequenceSelectFn)(A64Emitter&, const hir::Instr*, uint32_t ikey); -extern std::unordered_map sequence_table; +std::unordered_map& SequenceTable(); template bool Register() { - sequence_table.insert({T::head_key(), T::Select}); + SequenceTable().insert({T::head_key(), T::Select}); return true; }