Core: Speed up some debugger usage in interepter if not being used

This commit is contained in:
zilmar 2025-02-06 12:24:39 +10:30
parent d918225639
commit 4a68941c08
8 changed files with 45 additions and 3 deletions

View File

@ -121,7 +121,10 @@ void R4300iOp::ExecuteOps(uint32_t Cycles)
g_Settings->SaveBool(Debugger_SteppingOps, true);
}
g_Debugger->CPUStepStarted(); // May set stepping ops/skip op
if (TrackCPUStepStarted())
{
g_Debugger->CPUStepStarted(); // May set stepping ops/skip op
}
if (isStepping())
{
@ -136,7 +139,10 @@ void R4300iOp::ExecuteOps(uint32_t Cycles)
continue;
}
g_Debugger->CPUStep();
if (TrackCPUStep())
{
g_Debugger->CPUStep();
}
}
(this->*Jump_Opcode[m_Opcode.op])();
@ -147,7 +153,7 @@ void R4300iOp::ExecuteOps(uint32_t Cycles)
Cycles -= CountPerOp;
}
if (CDebugSettings::HaveDebugger())
if (TrackCPUStepEnded())
{
g_Debugger->CPUStepEnded();
}

View File

@ -344,6 +344,8 @@ void CSettings::AddHowToHandleSetting(const char * BaseDirectory)
AddHandler(Debugger_AppLogFlush, new CSettingTypeApplication("Logging", "Log Auto Flush", (uint32_t) false));
AddHandler(Debugger_RecordRecompilerAsm, new CSettingTypeApplication("Debugger", "Record Recompiler Asm", false));
AddHandler(Debugger_AutorunScripts, new CSettingTypeApplication("Debugger", "Autorun Scripts", ""));
AddHandler(Debugger_TrackCPUStepStarted, new CSettingTypeTempBool(false));
AddHandler(Debugger_TrackCPUStepEnded, new CSettingTypeTempBool(false));
// Logging
AddHandler(Debugger_TraceMD5, new CSettingTypeApplication("Logging", "MD5", (uint32_t)g_ModuleLogLevel[TraceMD5]));

View File

@ -26,6 +26,8 @@ bool CDebugSettings::m_EndOnPermLoop = false;
bool CDebugSettings::m_BreakOnUnhandledMemory = false;
bool CDebugSettings::m_BreakOnAddressError = false;
bool CDebugSettings::m_StepOnBreakOpCode = false;
bool CDebugSettings::m_TrackCPUStepStarted = false;
bool CDebugSettings::m_TrackCPUStepEnded = false;
CDebugSettings::CDebugSettings()
{
@ -52,6 +54,8 @@ CDebugSettings::CDebugSettings()
g_Settings->RegisterChangeCB(Debugger_BreakOnUnhandledMemory, this, (CSettings::SettingChangedFunc)StaticRefreshSettings);
g_Settings->RegisterChangeCB(Debugger_BreakOnAddressError, this, (CSettings::SettingChangedFunc)StaticRefreshSettings);
g_Settings->RegisterChangeCB(Debugger_StepOnBreakOpCode, this, (CSettings::SettingChangedFunc)StaticRefreshSettings);
g_Settings->RegisterChangeCB(Debugger_TrackCPUStepStarted, this, (CSettings::SettingChangedFunc)StaticRefreshSettings);
g_Settings->RegisterChangeCB(Debugger_TrackCPUStepEnded, this, (CSettings::SettingChangedFunc)StaticRefreshSettings);
RefreshSettings();
}
@ -80,6 +84,8 @@ CDebugSettings::~CDebugSettings()
g_Settings->UnregisterChangeCB(Debugger_BreakOnUnhandledMemory, this, (CSettings::SettingChangedFunc)StaticRefreshSettings);
g_Settings->UnregisterChangeCB(Debugger_BreakOnAddressError, this, (CSettings::SettingChangedFunc)StaticRefreshSettings);
g_Settings->UnregisterChangeCB(Debugger_StepOnBreakOpCode, this, (CSettings::SettingChangedFunc)StaticRefreshSettings);
g_Settings->UnregisterChangeCB(Debugger_TrackCPUStepStarted, this, (CSettings::SettingChangedFunc)StaticRefreshSettings);
g_Settings->UnregisterChangeCB(Debugger_TrackCPUStepEnded, this, (CSettings::SettingChangedFunc)StaticRefreshSettings);
}
}
@ -104,6 +110,8 @@ void CDebugSettings::RefreshSettings()
m_BreakOnUnhandledMemory = m_HaveDebugger && g_Settings->LoadBool(Debugger_BreakOnUnhandledMemory);
m_BreakOnAddressError = m_HaveDebugger && g_Settings->LoadBool(Debugger_BreakOnAddressError);
m_StepOnBreakOpCode = m_HaveDebugger && g_Settings->LoadBool(Debugger_StepOnBreakOpCode);
m_TrackCPUStepStarted = m_Stepping || m_ExceptionBreakpoints || (m_HaveDebugger && g_Settings->LoadBool(Debugger_TrackCPUStepStarted));
m_TrackCPUStepEnded = m_HaveDebugger && g_Settings->LoadBool(Debugger_TrackCPUStepEnded);
m_Debugging = m_HaveDebugger && (m_HaveExecutionBP || m_WaitingForStep || m_HaveWriteBP || m_HaveReadBP);
}

View File

@ -93,6 +93,21 @@ public:
return m_StepOnBreakOpCode;
}
static inline bool TrackCPUStepStarted(void)
{
return m_TrackCPUStepStarted;
}
static inline bool TrackCPUStepEnded(void)
{
return m_TrackCPUStepEnded;
}
static inline bool TrackCPUStep(void)
{
return m_bCPULoggingEnabled;
}
private:
static void StaticRefreshSettings(CDebugSettings * _this)
{
@ -122,6 +137,8 @@ private:
static bool m_BreakOnUnhandledMemory;
static bool m_BreakOnAddressError;
static bool m_StepOnBreakOpCode;
static bool m_TrackCPUStepStarted;
static bool m_TrackCPUStepEnded;
static int32_t m_RefCount;
static bool m_Registered;

View File

@ -270,6 +270,8 @@ enum SettingID
Debugger_IntrBreakpoints,
Debugger_RcpIntrBreakpoints,
Debugger_AutorunScripts,
Debugger_TrackCPUStepStarted,
Debugger_TrackCPUStepEnded,
// Trace
Debugger_TraceMD5,

View File

@ -318,6 +318,7 @@ void CBreakpoints::ToggleMemLock(uint32_t address)
if (m_MemLocks.count(address) == 0)
{
m_MemLocks.insert(address);
g_Settings->SaveBool(Debugger_TrackCPUStepStarted, true);
return;
}
m_MemLocks.erase(address);
@ -348,6 +349,10 @@ size_t CBreakpoints::NumMemLocks()
void CBreakpoints::UpdateHaveRegBP(void)
{
m_bHaveRegBP = HaveAnyGPRWriteBP() || HaveAnyGPRReadBP() || HaveHIWriteBP() || HaveHIReadBP() || HaveLOWriteBP() || HaveLOReadBP();
if (m_bHaveRegBP)
{
g_Settings->SaveBool(Debugger_TrackCPUStepStarted, true);
}
}
void CBreakpoints::ToggleGPRWriteBP(int nReg)

View File

@ -427,6 +427,7 @@ void CDebuggerUI::OpenStackTraceWindow(void)
if (m_StackTrace == nullptr)
{
m_StackTrace = new CDebugStackTrace(this);
g_Settings->SaveBool(Debugger_TrackCPUStepEnded, true);
}
m_StackTrace->ShowWindow();
}

View File

@ -487,6 +487,7 @@ JSAppCallbackID CScriptSystem::RawAddAppCallback(JSAppHookID hookId, JSAppCallba
return JS_INVALID_CALLBACK;
}
g_Settings->SaveBool(Debugger_TrackCPUStepStarted, true);
callback.m_Instance->IncRefCount();
callback.m_CallbackId = m_NextAppCallbackId++;
m_AppCallbackHooks[hookId].push_back(callback);