diff options
Diffstat (limited to 'lldb/source/Target/Thread.cpp')
-rw-r--r-- | lldb/source/Target/Thread.cpp | 65 |
1 files changed, 17 insertions, 48 deletions
diff --git a/lldb/source/Target/Thread.cpp b/lldb/source/Target/Thread.cpp index 2f4d95db022..5ead5905285 100644 --- a/lldb/source/Target/Thread.cpp +++ b/lldb/source/Target/Thread.cpp @@ -380,32 +380,24 @@ lldb::StopInfoSP Thread::GetStopInfo() { if (m_destroy_called) return m_stop_info_sp; - ThreadPlanSP completed_plan_sp(GetCompletedPlan()); + ThreadPlanSP plan_sp(GetCompletedPlan()); ProcessSP process_sp(GetProcess()); const uint32_t stop_id = process_sp ? process_sp->GetStopID() : UINT32_MAX; - - // Here we select the stop info according to priorirty: - // - m_stop_info_sp (if not trace) - preset value - // - completed plan stop info - new value with plan from completed plan stack - // - m_stop_info_sp (trace stop reason is OK now) - // - ask GetPrivateStopInfo to set stop info - - bool have_valid_stop_info = m_stop_info_sp && - m_stop_info_sp ->IsValid() && - m_stop_info_stop_id == stop_id; - bool have_valid_completed_plan = completed_plan_sp && completed_plan_sp->PlanSucceeded(); - bool plan_overrides_trace = - have_valid_stop_info && have_valid_completed_plan - && (m_stop_info_sp->GetStopReason() == eStopReasonTrace); - - if (have_valid_stop_info && !plan_overrides_trace) { - return m_stop_info_sp; - } else if (have_valid_completed_plan) { - return StopInfo::CreateStopReasonWithPlan( - completed_plan_sp, GetReturnValueObject(), GetExpressionVariable()); + if (plan_sp && plan_sp->PlanSucceeded()) { + return StopInfo::CreateStopReasonWithPlan(plan_sp, GetReturnValueObject(), + GetExpressionVariable()); } else { - GetPrivateStopInfo(); - return m_stop_info_sp; + if ((m_stop_info_stop_id == stop_id) || // Stop info is valid, just return + // what we have (even if empty) + (m_stop_info_sp && + m_stop_info_sp + ->IsValid())) // Stop info is valid, just return what we have + { + return m_stop_info_sp; + } else { + GetPrivateStopInfo(); + return m_stop_info_sp; + } } } @@ -467,12 +459,6 @@ bool Thread::StopInfoIsUpToDate() const { // date... } -void Thread::ResetStopInfo() { - if (m_stop_info_sp) { - m_stop_info_sp.reset(); - } -} - void Thread::SetStopInfo(const lldb::StopInfoSP &stop_info_sp) { m_stop_info_sp = stop_info_sp; if (m_stop_info_sp) { @@ -540,8 +526,7 @@ bool Thread::CheckpointThreadState(ThreadStateCheckpoint &saved_state) { if (process_sp) saved_state.orig_stop_id = process_sp->GetStopID(); saved_state.current_inlined_depth = GetCurrentInlinedDepth(); - saved_state.m_completed_plan_stack = m_completed_plan_stack; - + return true; } @@ -574,7 +559,6 @@ bool Thread::RestoreThreadStateFromCheckpoint( SetStopInfo(saved_state.stop_info_sp); GetStackFrameList()->SetCurrentInlinedDepth( saved_state.current_inlined_depth); - m_completed_plan_stack = saved_state.m_completed_plan_stack; return true; } @@ -911,9 +895,6 @@ bool Thread::ShouldStop(Event *event_ptr) { if (should_stop) { ThreadPlan *plan_ptr = GetCurrentPlan(); - - // Discard the stale plans and all plans below them in the stack, - // plus move the completed plans to the completed plan stack while (!PlanIsBasePlan(plan_ptr)) { bool stale = plan_ptr->IsPlanStale(); ThreadPlan *examined_plan = plan_ptr; @@ -924,15 +905,7 @@ bool Thread::ShouldStop(Event *event_ptr) { log->Printf( "Plan %s being discarded in cleanup, it says it is already done.", examined_plan->GetName()); - while (GetCurrentPlan() != examined_plan) { - DiscardPlan(); - } - if (examined_plan->IsPlanComplete()) { - // plan is complete but does not explain the stop (example: step to a line - // with breakpoint), let us move the plan to completed_plan_stack anyway - PopPlan(); - } else - DiscardPlan(); + DiscardThreadPlansUpToPlan(examined_plan); } } } @@ -1160,10 +1133,6 @@ bool Thread::WasThreadPlanDiscarded(ThreadPlan *plan) { return false; } -bool Thread::CompletedPlanOverridesBreakpoint() { - return (!m_completed_plan_stack.empty()) ; -} - ThreadPlan *Thread::GetPreviousPlan(ThreadPlan *current_plan) { if (current_plan == nullptr) return nullptr; |