From 303325768bba7b7e85b7d3d1689b7bb0b71e2052 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Lam?= Date: Mon, 26 Sep 2016 15:41:57 +0200 Subject: [PATCH] SymbolDB: Only match against the function name This changes GetSymbolFromName to not require the passed name to completely match with the symbol name. Instead, we now match against the stripped symbol name (i.e. only the function name). This fixes a regression introduced by #4160, which prevented HLE::PatchFunctions() from working properly. --- Source/Core/Common/SymbolDB.cpp | 2 +- Source/Core/Common/SymbolDB.h | 1 + Source/Core/Core/PowerPC/PPCSymbolDB.cpp | 11 +++++++++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/Source/Core/Common/SymbolDB.cpp b/Source/Core/Common/SymbolDB.cpp index 6b6f72d33e..9e91b64457 100644 --- a/Source/Core/Common/SymbolDB.cpp +++ b/Source/Core/Common/SymbolDB.cpp @@ -41,7 +41,7 @@ Symbol* SymbolDB::GetSymbolFromName(const std::string& name) { for (auto& func : functions) { - if (func.second.name == name) + if (func.second.function_name == name) return &func.second; } diff --git a/Source/Core/Common/SymbolDB.h b/Source/Core/Common/SymbolDB.h index db4f735683..8d2ae11614 100644 --- a/Source/Core/Common/SymbolDB.h +++ b/Source/Core/Common/SymbolDB.h @@ -30,6 +30,7 @@ struct Symbol }; std::string name; + std::string function_name; // stripped function name std::vector callers; // addresses of functions that call this function std::vector calls; // addresses of functions that are called by this function u32 hash = 0; // use for HLE function finding diff --git a/Source/Core/Core/PowerPC/PPCSymbolDB.cpp b/Source/Core/Core/PowerPC/PPCSymbolDB.cpp index 345ed2602c..f9a7d6efaf 100644 --- a/Source/Core/Core/PowerPC/PPCSymbolDB.cpp +++ b/Source/Core/Core/PowerPC/PPCSymbolDB.cpp @@ -16,6 +16,15 @@ #include "Core/PowerPC/PowerPC.h" #include "Core/PowerPC/SignatureDB.h" +static std::string GetStrippedFunctionName(const std::string& symbol_name) +{ + std::string name = symbol_name.substr(0, symbol_name.find('(')); + size_t position = name.find(' '); + if (position != std::string::npos) + name.erase(position); + return name; +} + PPCSymbolDB g_symbolDB; PPCSymbolDB::PPCSymbolDB() @@ -62,6 +71,7 @@ void PPCSymbolDB::AddKnownSymbol(u32 startAddr, u32 size, const std::string& nam // already got it, let's just update name, checksum & size to be sure. Symbol* tempfunc = &iter->second; tempfunc->name = name; + tempfunc->function_name = GetStrippedFunctionName(name); tempfunc->hash = SignatureDB::ComputeCodeChecksum(startAddr, startAddr + size - 4); tempfunc->type = type; tempfunc->size = size; @@ -77,6 +87,7 @@ void PPCSymbolDB::AddKnownSymbol(u32 startAddr, u32 size, const std::string& nam { PPCAnalyst::AnalyzeFunction(startAddr, tf, size); checksumToFunction[tf.hash] = &(functions[startAddr]); + tf.function_name = GetStrippedFunctionName(name); } tf.size = size; functions[startAddr] = tf;