From 8782d4dbd74dc85e45cd8a32981555e50b44cd2d Mon Sep 17 00:00:00 2001 From: CRACKbomber <1568512+CRACKbomber@users.noreply.github.com> Date: Sat, 31 May 2025 19:08:08 -0400 Subject: [PATCH] Added ability to alias function names to ease of debugging and reversing. --- XenonRecomp/recompiler.cpp | 22 ++++++++++++++++++++-- XenonRecomp/recompiler_config.cpp | 11 +++++++++++ XenonRecomp/recompiler_config.h | 1 + 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/XenonRecomp/recompiler.cpp b/XenonRecomp/recompiler.cpp index 4cb83bb..e3f9133 100644 --- a/XenonRecomp/recompiler.cpp +++ b/XenonRecomp/recompiler.cpp @@ -171,7 +171,19 @@ void Recompiler::Analyse() for (auto& [address, size] : config.functions) { functions.emplace_back(address, size); - image.symbols.emplace(fmt::format("sub_{:X}", address), address, size, Symbol_Function); + // Check if there's a function alias for this address + auto aliasIt = config.functionAliases.find(address); + std::string symbolName; + if (aliasIt != config.functionAliases.end()) + { + symbolName = aliasIt->second; + } + else + { + symbolName = fmt::format("sub_{:X}", address); + } + + image.symbols.emplace(symbolName, address, size, Symbol_Function); } auto& pdata = *image.Find(".pdata"); @@ -2784,7 +2796,13 @@ bool Recompiler::Recompile(const Function& fn) auto symbol = image.symbols.find(fn.base); std::string name; - if (symbol != image.symbols.end()) + auto aliasIt = config.functionAliases.find(fn.base); + + if (aliasIt != config.functionAliases.end()) + { + name = aliasIt->second; + } + else if (symbol != image.symbols.end()) { name = symbol->name; } diff --git a/XenonRecomp/recompiler_config.cpp b/XenonRecomp/recompiler_config.cpp index 81330a4..a145071 100644 --- a/XenonRecomp/recompiler_config.cpp +++ b/XenonRecomp/recompiler_config.cpp @@ -58,6 +58,17 @@ void RecompilerConfig::Load(const std::string_view& configFilePath) } } + if (auto functionAliasesArray = main["function_aliases"].as_array()) + { + for (auto& alias : *functionAliasesArray) + { + auto& aliasTable = *alias.as_table(); + uint32_t address = *aliasTable["address"].value(); + std::string name = fmt::format("_gfn_{}", *aliasTable["name"].value()); + functionAliases.emplace(address, std::move(name)); + } + } + if (auto invalidArray = main["invalid_instructions"].as_array()) { for (auto& instr : *invalidArray) diff --git a/XenonRecomp/recompiler_config.h b/XenonRecomp/recompiler_config.h index 534e503..2776a81 100644 --- a/XenonRecomp/recompiler_config.h +++ b/XenonRecomp/recompiler_config.h @@ -52,6 +52,7 @@ struct RecompilerConfig std::unordered_map functions; std::unordered_map invalidInstructions; std::unordered_map midAsmHooks; + std::unordered_map functionAliases; void Load(const std::string_view& configFilePath); };