summaryrefslogtreecommitdiffstats
path: root/lldb/source
diff options
context:
space:
mode:
authorJim Ingham <jingham@apple.com>2010-08-10 00:59:59 +0000
committerJim Ingham <jingham@apple.com>2010-08-10 00:59:59 +0000
commit3ebcf7f09bd70a41af22b627e8302cccb001053f (patch)
treed894f33a1eb348c7d27717f31c514e6b6abca1a8 /lldb/source
parent1ac0e2a027303228088454ffb1d378c1c2b25f39 (diff)
downloadbcm5719-llvm-3ebcf7f09bd70a41af22b627e8302cccb001053f.tar.gz
bcm5719-llvm-3ebcf7f09bd70a41af22b627e8302cccb001053f.zip
Make breakpoint commands work again. Added a PerformAction to the stop info - actions are run when the
stop event is pulled from the event queue. Then made the StopInfoBreakpoint's PerformAction do the breakpoint command. Also fixed the StopInfoBreakpoint's GetDescription so it gets the breakpoint location info, not the breakpoint site info. llvm-svn: 110637
Diffstat (limited to 'lldb/source')
-rw-r--r--lldb/source/Target/Process.cpp23
-rw-r--r--lldb/source/Target/StopInfo.cpp46
2 files changed, 48 insertions, 21 deletions
diff --git a/lldb/source/Target/Process.cpp b/lldb/source/Target/Process.cpp
index 148eabe1ea3..1a1f93c2ada 100644
--- a/lldb/source/Target/Process.cpp
+++ b/lldb/source/Target/Process.cpp
@@ -1746,8 +1746,6 @@ Process::ProcessEventData::DoOnRemoval (Event *event_ptr)
int num_threads = m_process_sp->GetThreadList().GetSize();
int idx;
- int32_t should_stop_count = -1;
- int32_t should_run_count = -1;
for (idx = 0; idx < num_threads; ++idx)
{
lldb::ThreadSP thread_sp = m_process_sp->GetThreadList().GetThreadAtIndex(idx);
@@ -1755,25 +1753,14 @@ Process::ProcessEventData::DoOnRemoval (Event *event_ptr)
StopInfo *stop_info = thread_sp->GetStopInfo ();
if (stop_info)
{
- if (stop_info->ShouldStop(event_ptr))
- {
- if (should_stop_count < 0)
- should_stop_count = 1;
- else
- should_stop_count++;
- }
- else
- {
- if (should_run_count < 0)
- should_run_count = 1;
- else
- should_run_count++;
- }
+ stop_info->PerformAction(event_ptr);
}
}
- // Are we secretly watching the private state here? Should we look at the
- // should_run_count or the "should_stop_count" and the "should_run_count"???
+ // The stop action might restart the target. If it does, then we want to mark that in the
+ // event so that whoever is receiving it will know to wait for the running event and reflect
+ // that state appropriately.
+
if (m_process_sp->GetPrivateState() == eStateRunning)
SetRestarted(true);
}
diff --git a/lldb/source/Target/StopInfo.cpp b/lldb/source/Target/StopInfo.cpp
index 54fc6daeaf7..d301cc156ff 100644
--- a/lldb/source/Target/StopInfo.cpp
+++ b/lldb/source/Target/StopInfo.cpp
@@ -96,6 +96,35 @@ public:
}
return m_should_stop;
}
+
+ virtual void
+ PerformAction (Event *event_ptr)
+ {
+ BreakpointSiteSP bp_site_sp (m_thread.GetProcess().GetBreakpointSiteList().FindByID (m_value));
+ if (bp_site_sp)
+ {
+ size_t num_owners = bp_site_sp->GetNumberOfOwners();
+ for (size_t j = 0; j < num_owners; j++)
+ {
+ // The breakpoint action is an asynchronous breakpoint callback. If we ever need to have both
+ // callbacks and actions on the same breakpoint, we'll have to split this into two.
+ lldb::BreakpointLocationSP bp_loc_sp = bp_site_sp->GetOwnerAtIndex(j);
+ StoppointCallbackContext context (event_ptr,
+ &m_thread.GetProcess(),
+ &m_thread,
+ m_thread.GetStackFrameAtIndex(0).get(),
+ false);
+ bp_loc_sp->InvokeCallback (&context);
+ }
+ }
+ else
+ {
+ Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS);
+
+ if (log)
+ log->Printf ("Process::%s could not find breakpoint site id: %lld...", __FUNCTION__, m_value);
+ }
+ }
virtual bool
ShouldNotify (Event *event_ptr)
@@ -123,9 +152,20 @@ public:
{
if (m_description.empty())
{
- StreamString strm;
- strm.Printf("breakpoint %lli", m_value);
- m_description.swap (strm.GetString());
+ BreakpointSiteSP bp_site_sp (m_thread.GetProcess().GetBreakpointSiteList().FindByID (m_value));
+ if (bp_site_sp)
+ {
+ StreamString strm;
+ strm.Printf("breakpoint ");
+ bp_site_sp->GetDescription(&strm, eDescriptionLevelBrief);
+ m_description.swap (strm.GetString());
+ }
+ else
+ {
+ StreamString strm;
+ strm.Printf("breakpoint site %lli", m_value);
+ m_description.swap (strm.GetString());
+ }
}
return m_description.c_str();
}
OpenPOWER on IntegriCloud