summaryrefslogtreecommitdiff
path: root/Source/Core/Common/BreakPoints.cpp
diff options
context:
space:
mode:
authorcomex <comexk@gmail.com>2015-04-23 00:05:31 -0400
committercomex <comexk@gmail.com>2015-04-24 22:37:53 -0400
commitb84f6a55ab848e41f23d9f712a116a276a6d0bda (patch)
tree21da95d477ee6b0fee546a2b8201cec4df702bce /Source/Core/Common/BreakPoints.cpp
parent3499f2c2d0a447f0d078f1e1293bdf6ee12fe98b (diff)
Automatically disable fastmem and enable memcheck when there are any watchpoints.
- Move JitState::memcheck to JitOptions because it's an option. - Add JitOptions::fastmem; switch JIT code to checking that rather than bFastmem directly. - Add JitBase::UpdateMemoryOptions(), which sets both two JIT options (replacing the duplicate lines in Jit64 and JitIL that set memcheck from bMMU). - (!) The ARM JITs both had some lines that checked js.memcheck despite it being uninitialized in their cases. I've added UpdateMemoryOptions to both. There is a chance this could make something slower compared to the old behavior if the uninitialized value happened to be nonzero... hdkr should check this. - UpdateMemoryOptions forces jo.fastmem and jo.memcheck off and on, respectively, if there are any watchpoints set. - Also call that function from ClearCache. - Have MemChecks call ClearCache when the {first,last} watchpoint is {added,removed}. Enabling jo.memcheck (bah, confusing names) is currently pointless because hitting a watchpoint does not interrupt the basic block. That will change in the next commit.
Diffstat (limited to 'Source/Core/Common/BreakPoints.cpp')
-rw-r--r--Source/Core/Common/BreakPoints.cpp7
1 files changed, 7 insertions, 0 deletions
diff --git a/Source/Core/Common/BreakPoints.cpp b/Source/Core/Common/BreakPoints.cpp
index 74dcb45030..2ee89389d3 100644
--- a/Source/Core/Common/BreakPoints.cpp
+++ b/Source/Core/Common/BreakPoints.cpp
@@ -165,8 +165,13 @@ void MemChecks::AddFromStrings(const TMemChecksStr& mcstrs)
void MemChecks::Add(const TMemCheck& _rMemoryCheck)
{
+ bool had_any = HasAny();
if (GetMemCheck(_rMemoryCheck.StartAddress) == nullptr)
m_MemChecks.push_back(_rMemoryCheck);
+ // If this is the first one, clear the JIT cache so it can switch to
+ // watchpoint-compatible code.
+ if (!had_any)
+ jit->ClearCache();
}
void MemChecks::Remove(u32 _Address)
@@ -179,6 +184,8 @@ void MemChecks::Remove(u32 _Address)
return;
}
}
+ if (!HasAny())
+ jit->ClearCache();
}
TMemCheck *MemChecks::GetMemCheck(u32 address)