Revert "Reduce code duplication in ProcessGDBRemote"
authorPavel Labath <labath@google.com>
Thu, 7 Apr 2016 08:16:10 +0000 (08:16 +0000)
committerPavel Labath <labath@google.com>
Thu, 7 Apr 2016 08:16:10 +0000 (08:16 +0000)
In turns out this does make a functional change, in case when the inferior hits an int3 that was
not placed by the debugger. Backing out for now.

llvm-svn: 265647

lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h

index 0f5b022..0e95574 100644 (file)
@@ -2009,15 +2009,40 @@ ProcessGDBRemote::SetThreadStopInfo (lldb::tid_t tid,
                     {
                         if (reason.compare("trace") == 0)
                         {
-                            if (!SetThreadStopReasonIfAtBreakpoint(*thread_sp))
-                                thread_sp->SetStopInfo(StopInfo::CreateStopReasonToTrace(*thread_sp));
+                            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));
                             handled = true;
                         }
                         else if (reason.compare("breakpoint") == 0)
                         {
-                            if (!SetThreadStopReasonIfAtBreakpoint(*thread_sp))
-                                thread_sp->SetStopInfo(StopInfoSP());
-                            handled = true;
+                            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);
+                                }
+                            }
                         }
                         else if (reason.compare("trap") == 0)
                         {
@@ -2066,12 +2091,20 @@ 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 (SetThreadStopReasonIfAtBreakpoint(*thread_sp))
+                        if (bp_site_sp && bp_site_sp->ValidForThisThread(thread_sp.get()))
+                        {
+                            thread_sp->SetStopInfo(
+                                StopInfo::CreateStopReasonWithBreakpointSiteID(*thread_sp, bp_site_sp->GetID()));
                             handled = true;
+                        }
                     }
 
                     if (!handled && signo && did_exec == false)
@@ -4931,17 +4964,6 @@ 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
 {
index a361ae3..b67eb49 100644 (file)
@@ -481,9 +481,6 @@ private:
                          lldb::user_id_t break_id,
                          lldb::user_id_t break_loc_id);
 
-    bool
-    SetThreadStopReasonIfAtBreakpoint(Thread &thread);
-
     DISALLOW_COPY_AND_ASSIGN (ProcessGDBRemote);
 };