summaryrefslogtreecommitdiffstats
path: root/lldb/source
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source')
-rw-r--r--lldb/source/Target/Thread.cpp13
-rw-r--r--lldb/source/Target/ThreadPlan.cpp3
-rw-r--r--lldb/source/Target/ThreadPlanBase.cpp1
-rw-r--r--lldb/source/Target/ThreadPlanCallFunction.cpp6
-rw-r--r--lldb/source/Target/ThreadPlanStepOverRange.cpp3
-rw-r--r--lldb/source/Target/ThreadPlanStepUntil.cpp4
6 files changed, 28 insertions, 2 deletions
diff --git a/lldb/source/Target/Thread.cpp b/lldb/source/Target/Thread.cpp
index 6a86a3b435b..fe5c4295443 100644
--- a/lldb/source/Target/Thread.cpp
+++ b/lldb/source/Target/Thread.cpp
@@ -349,7 +349,7 @@ Thread::ShouldStop (Event* event_ptr)
}
else
{
- // If the current plan doesn't explain the stop, then, find one that
+ // If the current plan doesn't explain the stop, then find one that
// does and let it handle the situation.
ThreadPlan *plan_ptr = current_plan;
while ((plan_ptr = GetPreviousPlan(plan_ptr)) != NULL)
@@ -839,6 +839,17 @@ Thread::DiscardThreadPlans(bool force)
}
}
+bool
+Thread::PlanIsBasePlan (ThreadPlan *plan_ptr)
+{
+ if (plan_ptr->IsBasePlan())
+ return true;
+ else if (m_plan_stack.size() == 0)
+ return false;
+ else
+ return m_plan_stack[0].get() == plan_ptr;
+}
+
ThreadPlan *
Thread::QueueFundamentalPlan (bool abort_other_plans)
{
diff --git a/lldb/source/Target/ThreadPlan.cpp b/lldb/source/Target/ThreadPlan.cpp
index 8e9cb477447..5f396d94755 100644
--- a/lldb/source/Target/ThreadPlan.cpp
+++ b/lldb/source/Target/ThreadPlan.cpp
@@ -36,7 +36,8 @@ ThreadPlan::ThreadPlan(ThreadPlanKind kind, const char *name, Thread &thread, Vo
m_plan_complete_mutex (Mutex::eMutexTypeRecursive),
m_plan_complete (false),
m_plan_private (false),
- m_okay_to_discard (false)
+ m_okay_to_discard (false),
+ m_is_master_plan (false)
{
SetID (GetNextID());
}
diff --git a/lldb/source/Target/ThreadPlanBase.cpp b/lldb/source/Target/ThreadPlanBase.cpp
index ebaa4dcf86f..fcb868302da 100644
--- a/lldb/source/Target/ThreadPlanBase.cpp
+++ b/lldb/source/Target/ThreadPlanBase.cpp
@@ -47,6 +47,7 @@ ThreadPlanBase::ThreadPlanBase (Thread &thread) :
#endif
new_tracer_sp->EnableTracing (m_thread.GetTraceEnabledState());
SetThreadPlanTracer(new_tracer_sp);
+ SetIsMasterPlan (true);
}
ThreadPlanBase::~ThreadPlanBase ()
diff --git a/lldb/source/Target/ThreadPlanCallFunction.cpp b/lldb/source/Target/ThreadPlanCallFunction.cpp
index 09bdd3d73c0..9f6c18e5bd8 100644
--- a/lldb/source/Target/ThreadPlanCallFunction.cpp
+++ b/lldb/source/Target/ThreadPlanCallFunction.cpp
@@ -52,6 +52,9 @@ ThreadPlanCallFunction::ThreadPlanCallFunction (Thread &thread,
m_takedown_done (false),
m_stop_address (LLDB_INVALID_ADDRESS)
{
+ // Call function thread plans need to be master plans so that they can potentially stay on the stack when
+ // a breakpoint is hit during the function call.
+ SetIsMasterPlan (true);
SetOkayToDiscard (discard_on_error);
ProcessSP process_sp (thread.GetProcess());
@@ -172,6 +175,9 @@ ThreadPlanCallFunction::ThreadPlanCallFunction (Thread &thread,
m_return_type (return_type),
m_takedown_done (false)
{
+ // Call function thread plans need to be master plans so that they can potentially stay on the stack when
+ // a breakpoint is hit during the function call.
+ SetIsMasterPlan (true);
SetOkayToDiscard (discard_on_error);
ProcessSP process_sp (thread.GetProcess());
diff --git a/lldb/source/Target/ThreadPlanStepOverRange.cpp b/lldb/source/Target/ThreadPlanStepOverRange.cpp
index 54fe8ea62a8..c147e83b19e 100644
--- a/lldb/source/Target/ThreadPlanStepOverRange.cpp
+++ b/lldb/source/Target/ThreadPlanStepOverRange.cpp
@@ -43,6 +43,9 @@ ThreadPlanStepOverRange::ThreadPlanStepOverRange
) :
ThreadPlanStepRange (ThreadPlan::eKindStepOverRange, "Step range stepping over", thread, range, addr_context, stop_others)
{
+ // Step over range plans can be master plans, since you could hit a breakpoint while stepping over, step around
+ // a bit, then continue to finish up the step over.
+ SetIsMasterPlan (true);
SetOkayToDiscard (okay_to_discard);
}
diff --git a/lldb/source/Target/ThreadPlanStepUntil.cpp b/lldb/source/Target/ThreadPlanStepUntil.cpp
index 79c2544dfff..3c418f20aca 100644
--- a/lldb/source/Target/ThreadPlanStepUntil.cpp
+++ b/lldb/source/Target/ThreadPlanStepUntil.cpp
@@ -52,7 +52,11 @@ ThreadPlanStepUntil::ThreadPlanStepUntil
m_stop_others (stop_others)
{
+ // Step until plans can be master plans, since you could hit a breakpoint while stepping to the stop point, step around
+ // a bit, then continue to finish up the step until.
+ SetIsMasterPlan (true);
SetOkayToDiscard(true);
+
// Stash away our "until" addresses:
TargetSP target_sp (m_thread.CalculateTarget());
OpenPOWER on IntegriCloud