diff --git a/src/xenia/cpu/backend/a64/a64_emitter.cc b/src/xenia/cpu/backend/a64/a64_emitter.cc index 83854ed2d..513a489ad 100644 --- a/src/xenia/cpu/backend/a64/a64_emitter.cc +++ b/src/xenia/cpu/backend/a64/a64_emitter.cc @@ -265,8 +265,7 @@ bool A64Emitter::Emit(HIRBuilder* builder, EmitFunctionInfo& func_info) { // Mark block labels. auto label = block->label_head; while (label) { - // TODO(wunkolo): string-labels? - // L(label->name); + l(label_lookup_[label->name]); label = label->next; } diff --git a/src/xenia/cpu/backend/a64/a64_emitter.h b/src/xenia/cpu/backend/a64/a64_emitter.h index 1cbd60e30..a0f4a88c6 100644 --- a/src/xenia/cpu/backend/a64/a64_emitter.h +++ b/src/xenia/cpu/backend/a64/a64_emitter.h @@ -10,6 +10,7 @@ #ifndef XENIA_CPU_BACKEND_A64_A64_EMITTER_H_ #define XENIA_CPU_BACKEND_A64_A64_EMITTER_H_ +#include #include #include "xenia/base/arena.h" @@ -165,6 +166,11 @@ class A64Emitter : public oaknut::CodeBlock, public oaknut::CodeGenerator { r = oaknut::QReg(idx); } + // Gets(and possibly create) an HIR label with the specified name + oaknut::Label* lookup_label(const char* label_name) { + return &label_lookup_[label_name]; + } + oaknut::Label& epilog_label() { return *epilog_label_; } void MarkSourceOffset(const hir::Instr* i); @@ -229,6 +235,9 @@ class A64Emitter : public oaknut::CodeBlock, public oaknut::CodeGenerator { oaknut::Label* epilog_label_ = nullptr; + // Convert from plain-text label-names into oaknut-labels + std::unordered_map label_lookup_; + hir::Instr* current_instr_ = nullptr; FunctionDebugInfo* debug_info_ = nullptr;