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.cpp65
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;
OpenPOWER on IntegriCloud