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. llvm-svn: 265647
This commit is contained in:
parent
d54bae6525
commit
ef40912a2f
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue