summaryrefslogtreecommitdiffstats
path: root/lldb/source/Plugins/Process/gdb-remote
diff options
context:
space:
mode:
authorPavel Labath <labath@google.com>2016-04-06 16:49:13 +0000
committerPavel Labath <labath@google.com>2016-04-06 16:49:13 +0000
commit97a67572d65a6f26d209eb2b366814eda37e4917 (patch)
treedae3635c917919d64729e754228d57406a734828 /lldb/source/Plugins/Process/gdb-remote
parent6849f8f15f4fd874d0a7de4aaac65b1ad374912c (diff)
downloadbcm5719-llvm-97a67572d65a6f26d209eb2b366814eda37e4917.tar.gz
bcm5719-llvm-97a67572d65a6f26d209eb2b366814eda37e4917.zip
Reduce code duplication in ProcessGDBRemote
Summary: SetThreadStopInfo was checking for a breakpoint at the current PC several times. This merges the identical code into a separate function. I've left one breakpoint check alone, as it was doing more complicated stuff, and it did not see a way to merge that without making the interface complicated. NFC. Reviewers: clayborg Subscribers: lldb-commits Differential Revision: http://reviews.llvm.org/D18819 llvm-svn: 265560
Diffstat (limited to 'lldb/source/Plugins/Process/gdb-remote')
-rw-r--r--lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp56
-rw-r--r--lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h3
2 files changed, 20 insertions, 39 deletions
diff --git a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
index 0e95574cbbe..0f5b022b631 100644
--- a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
+++ b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
@@ -2009,40 +2009,15 @@ ProcessGDBRemote::SetThreadStopInfo (lldb::tid_t tid,
{
if (reason.compare("trace") == 0)
{
- addr_t pc = thread_sp->GetRegisterContext()->GetPC();
- lldb::BreakpointSiteSP bp_site_sp = thread_sp->GetProcess()->GetBreakpointSiteList().FindByAddress(pc);
-
- // If the current pc is a breakpoint site then the StopInfo should be set to Breakpoint
- // Otherwise, it will be set to Trace.
- if (bp_site_sp && bp_site_sp->ValidForThisThread(thread_sp.get()))
- {
- thread_sp->SetStopInfo(
- StopInfo::CreateStopReasonWithBreakpointSiteID(*thread_sp, bp_site_sp->GetID()));
- }
- else
- thread_sp->SetStopInfo (StopInfo::CreateStopReasonToTrace (*thread_sp));
+ if (!SetThreadStopReasonIfAtBreakpoint(*thread_sp))
+ thread_sp->SetStopInfo(StopInfo::CreateStopReasonToTrace(*thread_sp));
handled = true;
}
else if (reason.compare("breakpoint") == 0)
{
- addr_t pc = thread_sp->GetRegisterContext()->GetPC();
- lldb::BreakpointSiteSP bp_site_sp = thread_sp->GetProcess()->GetBreakpointSiteList().FindByAddress(pc);
- if (bp_site_sp)
- {
- // If the breakpoint is for this thread, then we'll report the hit, but if it is for another thread,
- // we can just report no reason. We don't need to worry about stepping over the breakpoint here, that
- // will be taken care of when the thread resumes and notices that there's a breakpoint under the pc.
- handled = true;
- if (bp_site_sp->ValidForThisThread (thread_sp.get()))
- {
- thread_sp->SetStopInfo (StopInfo::CreateStopReasonWithBreakpointSiteID (*thread_sp, bp_site_sp->GetID()));
- }
- else
- {
- StopInfoSP invalid_stop_info_sp;
- thread_sp->SetStopInfo (invalid_stop_info_sp);
- }
- }
+ if (!SetThreadStopReasonIfAtBreakpoint(*thread_sp))
+ thread_sp->SetStopInfo(StopInfoSP());
+ handled = true;
}
else if (reason.compare("trap") == 0)
{
@@ -2091,20 +2066,12 @@ ProcessGDBRemote::SetThreadStopInfo (lldb::tid_t tid,
}
else if (!signo)
{
- addr_t pc = thread_sp->GetRegisterContext()->GetPC();
- lldb::BreakpointSiteSP bp_site_sp =
- thread_sp->GetProcess()->GetBreakpointSiteList().FindByAddress(pc);
-
// If the current pc is a breakpoint site then the StopInfo should be set to Breakpoint
// even though the remote stub did not set it as such. This can happen when
// the thread is involuntarily interrupted (e.g. due to stops on other
// threads) just as it is about to execute the breakpoint instruction.
- if (bp_site_sp && bp_site_sp->ValidForThisThread(thread_sp.get()))
- {
- thread_sp->SetStopInfo(
- StopInfo::CreateStopReasonWithBreakpointSiteID(*thread_sp, bp_site_sp->GetID()));
+ if (SetThreadStopReasonIfAtBreakpoint(*thread_sp))
handled = true;
- }
}
if (!handled && signo && did_exec == false)
@@ -4964,6 +4931,17 @@ ProcessGDBRemote::ModulesDidLoad (ModuleList &module_list)
m_gdb_comm.ServeSymbolLookups(this);
}
+bool
+ProcessGDBRemote::SetThreadStopReasonIfAtBreakpoint(Thread &thread)
+{
+ const addr_t pc = thread.GetRegisterContext()->GetPC();
+ lldb::BreakpointSiteSP bp_site_sp = thread.GetProcess()->GetBreakpointSiteList().FindByAddress(pc);
+ if (!bp_site_sp || !bp_site_sp->ValidForThisThread(&thread))
+ return false;
+
+ thread.SetStopInfo(StopInfo::CreateStopReasonWithBreakpointSiteID(thread, bp_site_sp->GetID()));
+ return true;
+}
class CommandObjectProcessGDBRemoteSpeedTest: public CommandObjectParsed
{
diff --git a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h
index b67eb49e5e6..a361ae31857 100644
--- a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h
+++ b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h
@@ -481,6 +481,9 @@ private:
lldb::user_id_t break_id,
lldb::user_id_t break_loc_id);
+ bool
+ SetThreadStopReasonIfAtBreakpoint(Thread &thread);
+
DISALLOW_COPY_AND_ASSIGN (ProcessGDBRemote);
};
OpenPOWER on IntegriCloud