From acdaaae7a4b0af0efe93eb6f3760b2cd85fe6a5f Mon Sep 17 00:00:00 2001 From: Nemoumbra Date: Wed, 12 Oct 2022 11:55:01 +0300 Subject: [PATCH] Added optional parameter to hle.func.scan, improved code of hle.func.removeRange --- Core/Debugger/WebSocket/HLESubscriber.cpp | 92 ++++++++++++++++------- 1 file changed, 66 insertions(+), 26 deletions(-) diff --git a/Core/Debugger/WebSocket/HLESubscriber.cpp b/Core/Debugger/WebSocket/HLESubscriber.cpp index 2a90ca619d..50ef77163d 100644 --- a/Core/Debugger/WebSocket/HLESubscriber.cpp +++ b/Core/Debugger/WebSocket/HLESubscriber.cpp @@ -362,6 +362,41 @@ void WebSocketHLEFuncRemove(DebuggerRequest &req) { json.writeUint("size", funcSize); } +static u32 RemoveFuncSymbolsInRange(u32 addr, u32 size) { + // Note: this makes no checks whether the range is valid + + u32 func_address = g_symbolMap->GetFunctionStart(addr); + if (func_address == SymbolMap::INVALID_ADDRESS) { + func_address = g_symbolMap->GetNextSymbolAddress(addr, SymbolType::ST_FUNCTION); + } + + u32 counter = 0; + while (func_address < addr + size && func_address != SymbolMap::INVALID_ADDRESS) { + g_symbolMap->RemoveFunction(func_address, true); + ++counter; + func_address = g_symbolMap->GetNextSymbolAddress(addr, SymbolType::ST_FUNCTION); + } + + if (counter) { + MIPSAnalyst::ForgetFunctions(addr, addr + size - 1); + + // The following was copied from hle.func.remove: + g_symbolMap->SortSymbols(); + + MIPSAnalyst::UpdateHashMap(); + MIPSAnalyst::ApplyHashMap(); + + if (g_Config.bFuncReplacements) { + MIPSAnalyst::ReplaceFunctions(); + } + + // Clear cache for branch lines and such. + DisassemblyManager manager; + manager.clear(); + } + return counter; +} + // Remove function symbols in range (hle.func.removeRange) // // Parameters: @@ -386,34 +421,10 @@ void WebSocketHLEFuncRemoveRange(DebuggerRequest &req) { if (!Memory::IsValidRange(addr, size)) return req.Fail("Address or size outside valid memory"); - u32 first_address = g_symbolMap->GetFunctionStart(addr); - if (first_address == SymbolMap::INVALID_ADDRESS) { - first_address = g_symbolMap->GetNextSymbolAddress(addr, SymbolType::ST_FUNCTION); - } - - u32 counter = 0; - for (u32 current_addr = first_address; (current_addr < addr + size) && current_addr != SymbolMap::INVALID_ADDRESS; current_addr = g_symbolMap->GetNextSymbolAddress(addr, SymbolType::ST_FUNCTION)) { - g_symbolMap->RemoveFunction(current_addr, true); - ++counter; - } - MIPSAnalyst::ForgetFunctions(addr, addr + size - 1); - - // The following was copied from hle.func.remove: - g_symbolMap->SortSymbols(); - - MIPSAnalyst::UpdateHashMap(); - MIPSAnalyst::ApplyHashMap(); - - if (g_Config.bFuncReplacements) { - MIPSAnalyst::ReplaceFunctions(); - } - - // Clear cache for branch lines and such. - DisassemblyManager manager; - manager.clear(); + u32 count = RemoveFuncSymbolsInRange(addr, size); JsonWriter &json = req.Respond(); - json.writeUint("count", counter); + json.writeUint("count", count); } // Rename a function symbol (hle.func.rename) @@ -480,9 +491,38 @@ void WebSocketHLEFuncScan(DebuggerRequest &req) { if (!req.ParamU32("size", &size)) return; + bool has_recreate = req.HasParam("recreate"); + bool recreate; + if (has_recreate) { + if (!req.ParamBool("recreate", &recreate)) { + return; + } + } + if (!Memory::IsValidRange(addr, size)) return req.Fail("Address or size outside valid memory"); + if (recreate) { + // let's see if the last function is partially inside our range + + u32 last_func_start = g_symbolMap->GetFunctionStart(addr + size - 1); + if (last_func_start != SymbolMap::INVALID_ADDRESS) { + // there is a function + // u32 end = last_func_start + g_symbolMap->GetFunctionSize(last_func_start); + if (last_func_start + g_symbolMap->GetFunctionSize(last_func_start) != addr + size) { + size = last_func_start - addr; + } + } + // let's see if the first function is partially inside our range + u32 start = g_symbolMap->GetFunctionStart(addr); + + if (start != SymbolMap::INVALID_ADDRESS && start != addr) { + // skip to a byte after end + addr = start + g_symbolMap->GetFunctionSize(start); + } + RemoveFuncSymbolsInRange(addr, size); + } + bool insertSymbols = MIPSAnalyst::ScanForFunctions(addr, addr + size - 1, true); MIPSAnalyst::FinalizeScan(insertSymbols);