summaryrefslogtreecommitdiffstats
path: root/lldb/source/Target/Thread.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source/Target/Thread.cpp')
-rw-r--r--lldb/source/Target/Thread.cpp111
1 files changed, 66 insertions, 45 deletions
diff --git a/lldb/source/Target/Thread.cpp b/lldb/source/Target/Thread.cpp
index e1264a12ead..378d0266d5a 100644
--- a/lldb/source/Target/Thread.cpp
+++ b/lldb/source/Target/Thread.cpp
@@ -479,33 +479,37 @@ Thread::SetupForResume ()
// telling the current plan it will resume, since we might change what the current
// plan is.
-// StopReason stop_reason = lldb::eStopReasonInvalid;
-// StopInfoSP stop_info_sp = GetStopInfo();
-// if (stop_info_sp.get())
-// stop_reason = stop_info_sp->GetStopReason();
-// if (stop_reason == lldb::eStopReasonBreakpoint)
- BreakpointSiteSP bp_site_sp = GetProcess()->GetBreakpointSiteList().FindByAddress(GetRegisterContext()->GetPC());
- if (bp_site_sp)
+// StopReason stop_reason = lldb::eStopReasonInvalid;
+// StopInfoSP stop_info_sp = GetStopInfo();
+// if (stop_info_sp.get())
+// stop_reason = stop_info_sp->GetStopReason();
+// if (stop_reason == lldb::eStopReasonBreakpoint)
+ lldb::RegisterContextSP reg_ctx_sp (GetRegisterContext());
+ if (reg_ctx_sp)
{
- // Note, don't assume there's a ThreadPlanStepOverBreakpoint, the target may not require anything
- // special to step over a breakpoint.
-
- ThreadPlan *cur_plan = GetCurrentPlan();
-
- if (cur_plan->GetKind() != ThreadPlan::eKindStepOverBreakpoint)
+ BreakpointSiteSP bp_site_sp = GetProcess()->GetBreakpointSiteList().FindByAddress(reg_ctx_sp->GetPC());
+ if (bp_site_sp)
{
- ThreadPlanStepOverBreakpoint *step_bp_plan = new ThreadPlanStepOverBreakpoint (*this);
- if (step_bp_plan)
- {
- ThreadPlanSP step_bp_plan_sp;
- step_bp_plan->SetPrivate (true);
+ // Note, don't assume there's a ThreadPlanStepOverBreakpoint, the target may not require anything
+ // special to step over a breakpoint.
+
+ ThreadPlan *cur_plan = GetCurrentPlan();
- if (GetCurrentPlan()->RunState() != eStateStepping)
+ if (cur_plan->GetKind() != ThreadPlan::eKindStepOverBreakpoint)
+ {
+ ThreadPlanStepOverBreakpoint *step_bp_plan = new ThreadPlanStepOverBreakpoint (*this);
+ if (step_bp_plan)
{
- step_bp_plan->SetAutoContinue(true);
+ ThreadPlanSP step_bp_plan_sp;
+ step_bp_plan->SetPrivate (true);
+
+ if (GetCurrentPlan()->RunState() != eStateStepping)
+ {
+ step_bp_plan->SetAutoContinue(true);
+ }
+ step_bp_plan_sp.reset (step_bp_plan);
+ QueueThreadPlan (step_bp_plan_sp, false);
}
- step_bp_plan_sp.reset (step_bp_plan);
- QueueThreadPlan (step_bp_plan_sp, false);
}
}
}
@@ -595,7 +599,7 @@ Thread::ShouldStop (Event* event_ptr)
log->Printf ("Thread::%s for tid = 0x%4.4" PRIx64 ", pc = 0x%16.16" PRIx64 ", should_stop = 0 (ignore since no stop reason)",
__FUNCTION__,
GetID (),
- GetRegisterContext()->GetPC());
+ GetRegisterContext() ? GetRegisterContext()->GetPC() : LLDB_INVALID_ADDRESS);
return false;
}
@@ -604,7 +608,7 @@ Thread::ShouldStop (Event* event_ptr)
log->Printf ("Thread::%s for tid = 0x%4.4" PRIx64 ", pc = 0x%16.16" PRIx64,
__FUNCTION__,
GetID (),
- GetRegisterContext()->GetPC());
+ GetRegisterContext() ? GetRegisterContext()->GetPC() : LLDB_INVALID_ADDRESS);
log->Printf ("^^^^^^^^ Thread::ShouldStop Begin ^^^^^^^^");
StreamString s;
s.IndentMore();
@@ -1587,17 +1591,25 @@ Thread::ReturnFromFrame (lldb::StackFrameSP frame_sp, lldb::ValueObjectSP return
StackFrameSP youngest_frame_sp = thread->GetStackFrameAtIndex(0);
if (youngest_frame_sp)
{
- bool copy_success = youngest_frame_sp->GetRegisterContext()->CopyFromRegisterContext(older_frame_sp->GetRegisterContext());
- if (copy_success)
+ lldb::RegisterContextSP reg_ctx_sp (youngest_frame_sp->GetRegisterContext());
+ if (reg_ctx_sp)
{
- thread->DiscardThreadPlans(true);
- thread->ClearStackFrames();
- if (broadcast && EventTypeHasListeners(eBroadcastBitStackChanged))
- BroadcastEvent(eBroadcastBitStackChanged, new ThreadEventData (this->shared_from_this()));
+ bool copy_success = reg_ctx_sp->CopyFromRegisterContext(older_frame_sp->GetRegisterContext());
+ if (copy_success)
+ {
+ thread->DiscardThreadPlans(true);
+ thread->ClearStackFrames();
+ if (broadcast && EventTypeHasListeners(eBroadcastBitStackChanged))
+ BroadcastEvent(eBroadcastBitStackChanged, new ThreadEventData (this->shared_from_this()));
+ }
+ else
+ {
+ return_error.SetErrorString("Could not reset register values.");
+ }
}
else
{
- return_error.SetErrorString("Could not reset register values.");
+ return_error.SetErrorString("Frame has no register context.");
}
}
else
@@ -1760,7 +1772,9 @@ Thread::SaveFrameZeroState (RegisterCheckpoint &checkpoint)
if (frame_sp)
{
checkpoint.SetStackID(frame_sp->GetStackID());
- return frame_sp->GetRegisterContext()->ReadAllRegisterValues (checkpoint.GetData());
+ lldb::RegisterContextSP reg_ctx_sp (frame_sp->GetRegisterContext());
+ if (reg_ctx_sp)
+ return reg_ctx_sp->ReadAllRegisterValues (checkpoint.GetData());
}
return false;
}
@@ -1777,15 +1791,18 @@ Thread::ResetFrameZeroRegisters (lldb::DataBufferSP register_data_sp)
lldb::StackFrameSP frame_sp(GetStackFrameAtIndex (0));
if (frame_sp)
{
- bool ret = frame_sp->GetRegisterContext()->WriteAllRegisterValues (register_data_sp);
-
- // Clear out all stack frames as our world just changed.
- ClearStackFrames();
- frame_sp->GetRegisterContext()->InvalidateIfNeeded(true);
- if (m_unwinder_ap.get())
- m_unwinder_ap->Clear();
-
- return ret;
+ lldb::RegisterContextSP reg_ctx_sp (frame_sp->GetRegisterContext());
+ if (reg_ctx_sp)
+ {
+ bool ret = reg_ctx_sp->WriteAllRegisterValues (register_data_sp);
+
+ // Clear out all stack frames as our world just changed.
+ ClearStackFrames();
+ reg_ctx_sp->InvalidateIfNeeded(true);
+ if (m_unwinder_ap.get())
+ m_unwinder_ap->Clear();
+ return ret;
+ }
}
return false;
}
@@ -1833,10 +1850,14 @@ Thread::IsStillAtLastBreakpointHit ()
StopReason stop_reason = m_actual_stop_info_sp->GetStopReason();
if (stop_reason == lldb::eStopReasonBreakpoint) {
uint64_t value = m_actual_stop_info_sp->GetValue();
- lldb::addr_t pc = GetRegisterContext()->GetPC();
- BreakpointSiteSP bp_site_sp = GetProcess()->GetBreakpointSiteList().FindByAddress(pc);
- if (bp_site_sp && value == bp_site_sp->GetID())
- return true;
+ lldb::RegisterContextSP reg_ctx_sp (GetRegisterContext());
+ if (reg_ctx_sp)
+ {
+ lldb::addr_t pc = reg_ctx_sp->GetPC();
+ BreakpointSiteSP bp_site_sp = GetProcess()->GetBreakpointSiteList().FindByAddress(pc);
+ if (bp_site_sp && value == bp_site_sp->GetID())
+ return true;
+ }
}
}
return false;
OpenPOWER on IntegriCloud