Author: labath Date: Thu Apr 7 03:16:10 2016 New Revision: 265647 URL: http://llvm.org/viewvc/llvm-project?rev=265647&view=rev Log: Revert "Reduce code duplication in ProcessGDBRemote"
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. Modified: lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h Modified: lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp?rev=265647&r1=265646&r2=265647&view=diff ============================================================================== --- lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp (original) +++ lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp Thu Apr 7 03:16:10 2016 @@ -2009,15 +2009,40 @@ ProcessGDBRemote::SetThreadStopInfo (lld { 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 (lld } 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 (Module 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 { Modified: lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h?rev=265647&r1=265646&r2=265647&view=diff ============================================================================== --- lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h (original) +++ lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h Thu Apr 7 03:16:10 2016 @@ -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); }; _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits