summaryrefslogtreecommitdiffstats
path: root/lldb/source/Target/ThreadPlanStepOverBreakpoint.cpp
diff options
context:
space:
mode:
authorGreg Clayton <gclayton@apple.com>2013-05-09 01:55:29 +0000
committerGreg Clayton <gclayton@apple.com>2013-05-09 01:55:29 +0000
commit6e0ff1a3cb5a1719c12ce156c4297d724c20b955 (patch)
tree2ea43845a7393dc9bb2df095f72b25a3393ca914 /lldb/source/Target/ThreadPlanStepOverBreakpoint.cpp
parent083fcdb41448362b803c47fe85dfeb830d25220c (diff)
downloadbcm5719-llvm-6e0ff1a3cb5a1719c12ce156c4297d724c20b955.tar.gz
bcm5719-llvm-6e0ff1a3cb5a1719c12ce156c4297d724c20b955.zip
Changed the formerly pure virtual function:
namespace lldb_private { class Thread { virtual lldb::StopInfoSP GetPrivateStopReason() = 0; }; } To not be virtual. The lldb_private::Thread now handles the correct caching and will call a new pure virtual function: namespace lldb_private { class Thread { virtual bool CalculateStopInfo() = 0; } } This function must be overridden by thead lldb_private::Thread subclass and the only thing it needs to do is to set the Thread::StopInfo() with the current stop reason and return true, or return false if there is no stop reason. The lldb_private::Thread class will take care of calling this function only when it is required. This allows lldb_private::Thread subclasses to be a bit simpler and not all need to duplicate the cache and invalidation settings. Also renamed: lldb::StopInfoSP lldb_private::Thread::GetPrivateStopReason(); To: lldb::StopInfoSP lldb_private::Thread::GetPrivateStopInfo(); Also cleaned up a case where the ThreadPlanStepOverBreakpoint might not re-set its breakpoint if the thread disappears (which was happening due to a bug when using the OperatingSystem plug-ins with memory threads and real threads). llvm-svn: 181501
Diffstat (limited to 'lldb/source/Target/ThreadPlanStepOverBreakpoint.cpp')
-rw-r--r--lldb/source/Target/ThreadPlanStepOverBreakpoint.cpp28
1 files changed, 22 insertions, 6 deletions
diff --git a/lldb/source/Target/ThreadPlanStepOverBreakpoint.cpp b/lldb/source/Target/ThreadPlanStepOverBreakpoint.cpp
index 00a19804b2c..ff4fee72a3a 100644
--- a/lldb/source/Target/ThreadPlanStepOverBreakpoint.cpp
+++ b/lldb/source/Target/ThreadPlanStepOverBreakpoint.cpp
@@ -34,7 +34,8 @@ ThreadPlanStepOverBreakpoint::ThreadPlanStepOverBreakpoint (Thread &thread) :
// first in the thread plan stack when stepping
// over a breakpoint
m_breakpoint_addr (LLDB_INVALID_ADDRESS),
- m_auto_continue(false)
+ m_auto_continue(false),
+ m_reenabled_breakpoint_site (false)
{
m_breakpoint_addr = m_thread.GetRegisterContext()->GetPC();
@@ -105,9 +106,7 @@ ThreadPlanStepOverBreakpoint::DoWillResume (StateType resume_state, bool current
bool
ThreadPlanStepOverBreakpoint::WillStop ()
{
- BreakpointSiteSP bp_site_sp (m_thread.GetProcess()->GetBreakpointSiteList().FindByAddress (m_breakpoint_addr));
- if (bp_site_sp)
- m_thread.GetProcess()->EnableBreakpointSite (bp_site_sp.get());
+ ReenableBreakpointSite ();
return true;
}
@@ -128,13 +127,30 @@ ThreadPlanStepOverBreakpoint::MischiefManaged ()
if (log)
log->Printf("Completed step over breakpoint plan.");
// Otherwise, re-enable the breakpoint we were stepping over, and we're done.
+ ReenableBreakpointSite ();
+ ThreadPlan::MischiefManaged ();
+ return true;
+ }
+}
+
+void
+ThreadPlanStepOverBreakpoint::ReenableBreakpointSite ()
+{
+ if (!m_reenabled_breakpoint_site)
+ {
+ m_reenabled_breakpoint_site = true;
BreakpointSiteSP bp_site_sp (m_thread.GetProcess()->GetBreakpointSiteList().FindByAddress (m_breakpoint_addr));
if (bp_site_sp)
+ {
m_thread.GetProcess()->EnableBreakpointSite (bp_site_sp.get());
- ThreadPlan::MischiefManaged ();
- return true;
+ }
}
}
+void
+ThreadPlanStepOverBreakpoint::ThreadDestroyed ()
+{
+ ReenableBreakpointSite ();
+}
void
ThreadPlanStepOverBreakpoint::SetAutoContinue (bool do_it)
OpenPOWER on IntegriCloud