From 56438bde447696f8d5c2aca135d0e75ce88c7b2f Mon Sep 17 00:00:00 2001 From: Sintendo <3380580+Sintendo@users.noreply.github.com> Date: Sun, 21 Dec 2025 14:37:45 +0100 Subject: [PATCH] PPCSymbolDB: Avoid double lookup --- Source/Core/Core/PowerPC/PPCSymbolDB.cpp | 59 ++++++++++-------------- Source/Core/Core/PowerPC/PPCSymbolDB.h | 1 - 2 files changed, 24 insertions(+), 36 deletions(-) diff --git a/Source/Core/Core/PowerPC/PPCSymbolDB.cpp b/Source/Core/Core/PowerPC/PPCSymbolDB.cpp index 250d901bc2..5eea9b42bd 100644 --- a/Source/Core/Core/PowerPC/PPCSymbolDB.cpp +++ b/Source/Core/Core/PowerPC/PPCSymbolDB.cpp @@ -68,40 +68,39 @@ void PPCSymbolDB::AddKnownSymbol(const Core::CPUThreadGuard& guard, u32 startAdd Common::Symbol::Type type, XFuncMap* functions, XFuncPtrMap* checksum_to_function) { - auto iter = functions->find(startAddr); - if (iter != functions->end()) + const auto [iter, inserted] = functions->try_emplace(startAddr, name); + + Common::Symbol& symbol = iter->second; + symbol.object_name = object_name; + symbol.type = type; + + if (!inserted) { // already got it, let's just update name, checksum & size to be sure. - Common::Symbol* tempfunc = &iter->second; - tempfunc->Rename(name); - tempfunc->object_name = object_name; - tempfunc->hash = HashSignatureDB::ComputeCodeChecksum(guard, startAddr, startAddr + size - 4); - tempfunc->type = type; - tempfunc->size = size; + symbol.Rename(name); + symbol.hash = HashSignatureDB::ComputeCodeChecksum(guard, startAddr, startAddr + size - 4); + symbol.size = size; } else { // new symbol. run analyze. - auto& new_symbol = functions->emplace(startAddr, name).first->second; - new_symbol.object_name = object_name; - new_symbol.type = type; - new_symbol.address = startAddr; + symbol.address = startAddr; - if (new_symbol.type == Common::Symbol::Type::Function) + if (symbol.type == Common::Symbol::Type::Function) { - PPCAnalyst::AnalyzeFunction(guard, startAddr, new_symbol, size); + PPCAnalyst::AnalyzeFunction(guard, startAddr, symbol, size); // Do not truncate symbol when a size is expected - if (size != 0 && new_symbol.size != size) + if (size != 0 && symbol.size != size) { WARN_LOG_FMT(SYMBOLS, "Analysed symbol ({}) size mismatch, {} expected but {} computed", - name, size, new_symbol.size); - new_symbol.size = size; + name, size, symbol.size); + symbol.size = size; } - (*checksum_to_function)[new_symbol.hash].insert(&new_symbol); + (*checksum_to_function)[symbol.hash].insert(&symbol); } else { - new_symbol.size = size; + symbol.size = size; } } } @@ -114,24 +113,14 @@ void PPCSymbolDB::AddKnownNote(u32 start_addr, u32 size, const std::string& name void PPCSymbolDB::AddKnownNote(u32 start_addr, u32 size, const std::string& name, XNoteMap* notes) { - auto iter = notes->find(start_addr); + const auto [iter, inserted] = notes->try_emplace(start_addr); - if (iter != notes->end()) - { - // Already got it, just update the name and size. - Common::Note* tempfunc = &iter->second; - tempfunc->name = name; - tempfunc->size = size; - } - else - { - Common::Note tf; - tf.name = name; - tf.address = start_addr; - tf.size = size; + Common::Note& note = iter->second; + note.name = name; + note.size = size; - (*notes)[start_addr] = tf; - } + if (inserted) + note.address = start_addr; } void PPCSymbolDB::DetermineNoteLayers() diff --git a/Source/Core/Core/PowerPC/PPCSymbolDB.h b/Source/Core/Core/PowerPC/PPCSymbolDB.h index 8ebc26a810..fb23e266d6 100644 --- a/Source/Core/Core/PowerPC/PPCSymbolDB.h +++ b/Source/Core/Core/PowerPC/PPCSymbolDB.h @@ -4,7 +4,6 @@ #pragma once #include -#include #include "Common/CommonTypes.h" #include "Common/SymbolDB.h"