Two changes in this checkin.  Added a ThreadPlanKind so that I can do some reasoning based on the kind of thread plan
without having to use RTTI.
Removed the ThreadPlanContinue and replaced with a ShouldAutoContinue query that serves the same purpose.  Having to push
another plan to assert that if there's no other indication the target should continue when this plan is popped was flakey
and error prone.  This method is more stable, and fixed problems we were having with thread specific breakpoints.


git-svn-id: https://llvm.org/svn/llvm-project/llvdb/trunk@106378 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/API/SBThread.cpp b/source/API/SBThread.cpp
index a220cd8..7a86999 100644
--- a/source/API/SBThread.cpp
+++ b/source/API/SBThread.cpp
@@ -19,7 +19,6 @@
 #include "lldb/Symbol/CompileUnit.h"
 #include "lldb/Target/Target.h"
 #include "lldb/Target/ThreadPlan.h"
-#include "lldb/Target/ThreadPlanContinue.h"
 #include "lldb/Target/ThreadPlanStepInstruction.h"
 #include "lldb/Target/ThreadPlanStepOut.h"
 #include "lldb/Target/ThreadPlanStepRange.h"
diff --git a/source/Commands/CommandObjectThread.cpp b/source/Commands/CommandObjectThread.cpp
index 607383d..ef529f0 100644
--- a/source/Commands/CommandObjectThread.cpp
+++ b/source/Commands/CommandObjectThread.cpp
@@ -25,7 +25,6 @@
 #include "lldb/Target/Target.h"
 #include "lldb/Target/Thread.h"
 #include "lldb/Target/ThreadPlan.h"
-#include "lldb/Target/ThreadPlanContinue.h"
 #include "lldb/Target/ThreadPlanStepInstruction.h"
 #include "lldb/Target/ThreadPlanStepOut.h"
 #include "lldb/Target/ThreadPlanStepRange.h"
diff --git a/source/Plugins/DynamicLoader/MacOSX-DYLD/ThreadPlanStepThroughObjCTrampoline.cpp b/source/Plugins/DynamicLoader/MacOSX-DYLD/ThreadPlanStepThroughObjCTrampoline.cpp
index a0cb0a8..2f2cc39 100644
--- a/source/Plugins/DynamicLoader/MacOSX-DYLD/ThreadPlanStepThroughObjCTrampoline.cpp
+++ b/source/Plugins/DynamicLoader/MacOSX-DYLD/ThreadPlanStepThroughObjCTrampoline.cpp
@@ -33,7 +33,7 @@
         lldb::addr_t class_ptr, 
         lldb::addr_t sel_ptr, 
         bool stop_others) :
-    ThreadPlan ("MacOSX Step through ObjC Trampoline", thread, eVoteNoOpinion, eVoteNoOpinion),
+    ThreadPlan (ThreadPlan::eKindGeneric, "MacOSX Step through ObjC Trampoline", thread, eVoteNoOpinion, eVoteNoOpinion),
     m_objc_trampoline_handler (trampoline_handler),
     m_impl_function (trampoline_handler->GetLookupImplementationWrapperFunction()),
     m_args_addr (args_addr),
diff --git a/source/Target/Process.cpp b/source/Target/Process.cpp
index 9a6ab0c..970e1e4 100644
--- a/source/Target/Process.cpp
+++ b/source/Target/Process.cpp
@@ -1313,7 +1313,7 @@
             // We've stopped.  First see if we're going to restart the target.
             // If we are going to stop, then we always broadcast the event.
             // If we aren't going to stop, let the thread plans decide if we're going to report this event.
-            // If no thread has an opinion, we also report it.
+            // If no thread has an opinion, we don't report it.
             if (state != eStateInvalid)
             {
 
@@ -1326,8 +1326,6 @@
                         case eVoteYes:
                             Process::ProcessEventData::SetRestartedInEvent (event_ptr, true);
                         case eVoteNoOpinion:
-                            return_value = true;
-                            break;
                         case eVoteNo:
                             return_value = false;
                             break;
diff --git a/source/Target/Thread.cpp b/source/Target/Thread.cpp
index 97a55fb..40ea4df 100644
--- a/source/Target/Thread.cpp
+++ b/source/Target/Thread.cpp
@@ -20,7 +20,6 @@
 #include "lldb/Target/Thread.h"
 #include "lldb/Target/ThreadPlan.h"
 #include "lldb/Target/ThreadPlanCallFunction.h"
-#include "lldb/Target/ThreadPlanContinue.h"
 #include "lldb/Target/ThreadPlanBase.h"
 #include "lldb/Target/ThreadPlanStepInstruction.h"
 #include "lldb/Target/ThreadPlanStepOut.h"
@@ -431,28 +430,22 @@
         {
             // Note, don't assume there's a ThreadPlanStepOverBreakpoint, the target may not require anything
             // special to step over a breakpoint.
-            
-            // TODO: Jim Ingham -- this is the only place left that does RTTI in
-            // all of LLDB. I am adding a hack right now to let us compile 
-            // without RTTI, but we will need to look at and fix this. Right
-            // now it will always push the breakpoint thread plan which is 
-            // probably wrong. We will need to work around this.
-    
-//            ThreadPlan *cur_plan = GetCurrentPlan();
-//            ThreadPlanStepOverBreakpoint *step_over_bp = dynamic_cast<ThreadPlanStepOverBreakpoint *> (cur_plan);
-//            if (step_over_bp == NULL)
-            {
+                
+            ThreadPlan *cur_plan = GetCurrentPlan();
 
-                ThreadPlanSP step_bp_plan_sp (new ThreadPlanStepOverBreakpoint (*this));
-                if (step_bp_plan_sp)
+            if (cur_plan->GetKind() != ThreadPlan::eKindStepOverBreakpoint)
+            {
+                ThreadPlanStepOverBreakpoint *step_bp_plan = new ThreadPlanStepOverBreakpoint (*this);
+                if (step_bp_plan)
                 {
+                    ThreadPlanSP step_bp_plan_sp;
+                    step_bp_plan->SetPrivate (true);
+
                     if (GetCurrentPlan()->RunState() != eStateStepping)
                     {
-                        ThreadPlanSP continue_plan_sp (new ThreadPlanContinue(*this, false, eVoteNo, eVoteNoOpinion));
-                        continue_plan_sp->SetPrivate (true);
-                        QueueThreadPlan (continue_plan_sp, false);
+                        step_bp_plan->SetAutoContinue(true);
                     }
-                    step_bp_plan_sp->SetPrivate (true);
+                    step_bp_plan_sp.reset (step_bp_plan);
                     QueueThreadPlan (step_bp_plan_sp, false);
                 }
             }
@@ -524,6 +517,7 @@
 
     if (current_plan->PlanExplainsStop())
     {
+        bool over_ride_stop = current_plan->ShouldAutoContinue(event_ptr);
         while (1)
         {
             should_stop = current_plan->ShouldStop(event_ptr);
@@ -558,6 +552,8 @@
                 break;
             }
         }
+        if (over_ride_stop)
+            should_stop = false;
     }
     else
     {
@@ -949,14 +945,6 @@
 }
 
 ThreadPlan *
-Thread::QueueThreadPlanForContinue (bool abort_other_plans, bool stop_other_threads, Vote stop_vote, Vote run_vote, bool immediate)
-{
-    ThreadPlanSP thread_plan_sp (new ThreadPlanContinue (*this, stop_other_threads, stop_vote, run_vote, immediate));
-    QueueThreadPlan (thread_plan_sp, abort_other_plans);
-    return thread_plan_sp.get();
-}
-
-ThreadPlan *
 Thread::QueueThreadPlanForCallFunction (bool abort_other_plans,
                                         Address& function,
                                         lldb::addr_t arg,
diff --git a/source/Target/ThreadList.cpp b/source/Target/ThreadList.cpp
index 6bc2271..8255c5d 100644
--- a/source/Target/ThreadList.cpp
+++ b/source/Target/ThreadList.cpp
@@ -178,7 +178,7 @@
     // Running events should never stop, obviously...
 
 
-    bool should_stop = false;
+    bool should_stop = false;    
     m_process->UpdateThreadListIfNeeded();
 
     collection::iterator pos, end = m_threads.end();
@@ -189,12 +189,12 @@
     for (pos = m_threads.begin(); pos != end; ++pos)
     {
         ThreadSP thread_sp(*pos);
-        if ((thread_sp->ThreadStoppedForAReason())
-            && (thread_sp->GetResumeState () != eStateSuspended))
+        if ((thread_sp->GetResumeState () != eStateSuspended) && (thread_sp->ThreadStoppedForAReason()))
         {
-            should_stop |= thread_sp->ShouldStop(event_ptr);
+            should_stop |=  thread_sp->ShouldStop(event_ptr);
         }
     }
+
     if (should_stop)
     {
         for (pos = m_threads.begin(); pos != end; ++pos)
diff --git a/source/Target/ThreadPlan.cpp b/source/Target/ThreadPlan.cpp
index 3be8e9a..3e1a9fd 100644
--- a/source/Target/ThreadPlan.cpp
+++ b/source/Target/ThreadPlan.cpp
@@ -23,7 +23,8 @@
 //----------------------------------------------------------------------
 // ThreadPlan constructor
 //----------------------------------------------------------------------
-ThreadPlan::ThreadPlan(const char *name, Thread &thread, Vote stop_vote, Vote run_vote) :
+ThreadPlan::ThreadPlan(ThreadPlanKind kind, const char *name, Thread &thread, Vote stop_vote, Vote run_vote) :
+    m_kind (kind),
     m_name (name),
     m_thread (thread),
     m_plan_complete(false),
diff --git a/source/Target/ThreadPlanBase.cpp b/source/Target/ThreadPlanBase.cpp
index 283f3be..5f58454 100644
--- a/source/Target/ThreadPlanBase.cpp
+++ b/source/Target/ThreadPlanBase.cpp
@@ -21,8 +21,6 @@
 #include "lldb/Core/Stream.h"
 #include "lldb/Target/Process.h"
 #include "lldb/Target/RegisterContext.h"
-#include "lldb/Target/ThreadPlanContinue.h"
-#include "lldb/Target/ThreadPlanStepOverBreakpoint.h"
 
 using namespace lldb;
 using namespace lldb_private;
@@ -34,7 +32,7 @@
 //----------------------------------------------------------------------
 
 ThreadPlanBase::ThreadPlanBase (Thread &thread) :
-    ThreadPlan("base plan", thread, eVoteYes, eVoteNoOpinion)
+    ThreadPlan(ThreadPlan::eKindBase, "base plan", thread, eVoteYes, eVoteNoOpinion)
 {
 
 }
@@ -94,13 +92,16 @@
                 {
                     // We want to step over the breakpoint and then continue.  So push these two plans.
 
-                    StoppointCallbackContext hit_context(event_ptr, &m_thread.GetProcess(), &m_thread, m_thread.GetStackFrameAtIndex(0).get());
-                    bool should_stop = m_thread.GetProcess().GetBreakpointSiteList().ShouldStop(&hit_context, bp_site_sp->GetID());
+                    StoppointCallbackContext hit_context(event_ptr, &m_thread.GetProcess(), &m_thread, 
+                                                         m_thread.GetStackFrameAtIndex(0).get());
+                    bool should_stop = m_thread.GetProcess().GetBreakpointSiteList().ShouldStop(&hit_context, 
+                                                                                                bp_site_sp->GetID());
 
                     if (!should_stop)
                     {
-                        // If we aren't going to stop at this breakpoint, and it is internal, don't report this stop or the subsequent
-                        // running event.  Otherwise we will post the stopped & running, but the stopped event will get marked
+                        // If we aren't going to stop at this breakpoint, and it is internal, 
+                        // don't report this stop or the subsequent running event.  
+                        // Otherwise we will post the stopped & running, but the stopped event will get marked
                         // with "restarted" so the UI will know to wait and expect the consequent "running".
                         uint32_t i;
                         bool is_wholly_internal = true;
diff --git a/source/Target/ThreadPlanCallFunction.cpp b/source/Target/ThreadPlanCallFunction.cpp
index 4b3533a..0309505 100644
--- a/source/Target/ThreadPlanCallFunction.cpp
+++ b/source/Target/ThreadPlanCallFunction.cpp
@@ -35,7 +35,7 @@
                                                 lldb::addr_t arg,
                                                 bool stop_other_threads,
                                                 bool discard_on_error) :
-    ThreadPlan ("Call function plan", thread, eVoteNoOpinion, eVoteNoOpinion),
+    ThreadPlan (ThreadPlan::eKindCallFunction, "Call function plan", thread, eVoteNoOpinion, eVoteNoOpinion),
     m_valid(false),
     m_process(thread.GetProcess()),
     m_arg_addr (arg),
@@ -89,7 +89,7 @@
                                                 ValueList &args,
                                                 bool stop_other_threads,
                                                 bool discard_on_error) :
-    ThreadPlan ("Call function plan", thread, eVoteNoOpinion, eVoteNoOpinion),
+    ThreadPlan (ThreadPlan::eKindCallFunction, "Call function plan", thread, eVoteNoOpinion, eVoteNoOpinion),
     m_valid(false),
     m_process(thread.GetProcess()),
     m_arg_addr (0),
diff --git a/source/Target/ThreadPlanContinue.cpp b/source/Target/ThreadPlanContinue.cpp
deleted file mode 100644
index 63d8a33..0000000
--- a/source/Target/ThreadPlanContinue.cpp
+++ /dev/null
@@ -1,120 +0,0 @@
-//===-- ThreadPlanContinue.cpp ----------------------------------*- C++ -*-===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "lldb/Target/ThreadPlanContinue.h"
-
-// C Includes
-// C++ Includes
-// Other libraries and framework includes
-// Project includes
-#include "lldb/lldb-private-log.h"
-#include "lldb/Core/Log.h"
-#include "lldb/Core/Stream.h"
-
-using namespace lldb;
-using namespace lldb_private;
-
-//----------------------------------------------------------------------
-// ThreadPlanContinue: Continue plan
-//----------------------------------------------------------------------
-
-ThreadPlanContinue::ThreadPlanContinue (Thread &thread, bool stop_others, Vote stop_vote, Vote run_vote, bool immediate) :
-    ThreadPlan ("Continue after previous plan", thread, stop_vote, run_vote),
-    m_stop_others (stop_others),
-    m_did_run (false),
-    m_immediate (immediate)
-{
-}
-
-ThreadPlanContinue::~ThreadPlanContinue ()
-{
-}
-
-void
-ThreadPlanContinue::GetDescription (Stream *s, lldb::DescriptionLevel level)
-{
-    if (level == lldb::eDescriptionLevelBrief)
-        s->Printf ("continue");
-    else
-    {
-        s->Printf ("Continue from the previous plan");
-    }
-}
-
-bool
-ThreadPlanContinue::ValidatePlan (Stream *error)
-{
-    // Since we read the instruction we're stepping over from the thread,
-    // this plan will always work.
-    return true;
-}
-
-bool
-ThreadPlanContinue::PlanExplainsStop ()
-{
-    return true;
-}
-
-bool
-ThreadPlanContinue::ShouldStop (Event *event_ptr)
-{
-    return false;
-}
-
-bool
-ThreadPlanContinue::IsImmediate () const
-{
-    return m_immediate;
-    return false;
-}
-
-bool
-ThreadPlanContinue::StopOthers ()
-{
-    return m_stop_others;
-}
-
-StateType
-ThreadPlanContinue::RunState ()
-{
-    return eStateRunning;
-}
-
-bool
-ThreadPlanContinue::WillResume (StateType resume_state, bool current_plan)
-{
-    ThreadPlan::WillResume (resume_state, current_plan);
-    if (current_plan)
-    {
-        m_did_run = true;
-    }
-    return true;
-}
-
-bool
-ThreadPlanContinue::WillStop ()
-{
-    return true;
-}
-
-bool
-ThreadPlanContinue::MischiefManaged ()
-{
-    Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP);
-
-    if (m_did_run)
-    {
-        if (log)
-            log->Printf("Completed continue plan.");
-        ThreadPlan::MischiefManaged ();
-        return true;
-    }
-    else
-        return false;
-}
diff --git a/source/Target/ThreadPlanRunToAddress.cpp b/source/Target/ThreadPlanRunToAddress.cpp
index 0544ea5..077541e 100644
--- a/source/Target/ThreadPlanRunToAddress.cpp
+++ b/source/Target/ThreadPlanRunToAddress.cpp
@@ -34,7 +34,7 @@
     Address &address,
     bool stop_others
 ) :
-    ThreadPlan ("Run to breakpoint plan", thread, eVoteNoOpinion, eVoteNoOpinion),
+    ThreadPlan (ThreadPlan::eKindRunToAddress, "Run to breakpoint plan", thread, eVoteNoOpinion, eVoteNoOpinion),
     m_stop_others (stop_others),
     m_address (LLDB_INVALID_ADDRESS),
     m_break_id (LLDB_INVALID_BREAK_ID)
@@ -49,7 +49,7 @@
     lldb::addr_t address,
     bool stop_others
 ) :
-    ThreadPlan ("Run to breakpoint plan", thread, eVoteNoOpinion, eVoteNoOpinion),
+    ThreadPlan (ThreadPlan::eKindRunToAddress, "Run to breakpoint plan", thread, eVoteNoOpinion, eVoteNoOpinion),
     m_stop_others (stop_others),
     m_address (address),
     m_break_id (LLDB_INVALID_BREAK_ID)
diff --git a/source/Target/ThreadPlanStepInRange.cpp b/source/Target/ThreadPlanStepInRange.cpp
index f62fdb8..6084b4e 100644
--- a/source/Target/ThreadPlanStepInRange.cpp
+++ b/source/Target/ThreadPlanStepInRange.cpp
@@ -40,7 +40,7 @@
     const SymbolContext &addr_context,
     lldb::RunMode stop_others
 ) :
-    ThreadPlanStepRange ("Step Range stepping in", thread, range, addr_context, stop_others),
+    ThreadPlanStepRange (ThreadPlan::eKindStepInRange, "Step Range stepping in", thread, range, addr_context, stop_others),
     ThreadPlanShouldStopHere (this, ThreadPlanStepInRange::DefaultShouldStopHereCallback, NULL)
 {
     SetFlagsToDefault ();
diff --git a/source/Target/ThreadPlanStepInstruction.cpp b/source/Target/ThreadPlanStepInstruction.cpp
index 41c4373..644c768 100644
--- a/source/Target/ThreadPlanStepInstruction.cpp
+++ b/source/Target/ThreadPlanStepInstruction.cpp
@@ -37,12 +37,11 @@
     Vote stop_vote,
     Vote run_vote
 ) :
-    ThreadPlan ("Step over single instruction", thread, stop_vote, run_vote),
+    ThreadPlan (ThreadPlan::eKindStepInstruction, "Step over single instruction", thread, stop_vote, run_vote),
     m_instruction_addr (0),
     m_step_over (step_over),
     m_stack_depth(0),
-    m_stop_other_threads (stop_other_threads)
-{
+    m_stop_other_threads (stop_other_threads){
     m_instruction_addr = m_thread.GetRegisterContext()->GetPC(0);
     m_stack_depth = m_thread.GetStackFrameCount();
 }
diff --git a/source/Target/ThreadPlanStepOut.cpp b/source/Target/ThreadPlanStepOut.cpp
index e05a8a4..f72dca5 100644
--- a/source/Target/ThreadPlanStepOut.cpp
+++ b/source/Target/ThreadPlanStepOut.cpp
@@ -36,7 +36,7 @@
     Vote stop_vote,
     Vote run_vote
 ) :
-    ThreadPlan ("Step out", thread, stop_vote, run_vote),
+    ThreadPlan (ThreadPlan::eKindStepOut, "Step out", thread, stop_vote, run_vote),
     m_step_from_context (context),
     m_step_from_insn (LLDB_INVALID_ADDRESS),
     m_return_addr (LLDB_INVALID_ADDRESS),
diff --git a/source/Target/ThreadPlanStepOverBreakpoint.cpp b/source/Target/ThreadPlanStepOverBreakpoint.cpp
index 2b8b06d..9f5b1ce 100644
--- a/source/Target/ThreadPlanStepOverBreakpoint.cpp
+++ b/source/Target/ThreadPlanStepOverBreakpoint.cpp
@@ -27,13 +27,15 @@
 //----------------------------------------------------------------------
 
 ThreadPlanStepOverBreakpoint::ThreadPlanStepOverBreakpoint (Thread &thread) :
-    ThreadPlan ("Step over breakpoint trap",
+    ThreadPlan (ThreadPlan::eKindStepOverBreakpoint, "Step over breakpoint trap",
                 thread,
                 eVoteNo,
                 eVoteNoOpinion),  // We need to report the run since this happens
                             // first in the thread plan stack when stepping
                             // over a breakpoint
-    m_breakpoint_addr (LLDB_INVALID_ADDRESS)
+    m_breakpoint_addr (LLDB_INVALID_ADDRESS),
+    m_auto_continue(false)
+
 {
     m_breakpoint_addr = m_thread.GetRegisterContext()->GetPC();
     m_breakpoint_site_id =  m_thread.GetProcess().GetBreakpointSiteList().FindIDByAddress (m_breakpoint_addr);
@@ -128,3 +130,14 @@
     }
 }
 
+void
+ThreadPlanStepOverBreakpoint::SetAutoContinue (bool do_it)
+{
+    m_auto_continue = do_it;
+}
+
+bool
+ThreadPlanStepOverBreakpoint::ShouldAutoContinue (Event *event_ptr)
+{
+    return m_auto_continue;
+}
diff --git a/source/Target/ThreadPlanStepOverRange.cpp b/source/Target/ThreadPlanStepOverRange.cpp
index ea56412..bbc5104 100644
--- a/source/Target/ThreadPlanStepOverRange.cpp
+++ b/source/Target/ThreadPlanStepOverRange.cpp
@@ -39,7 +39,7 @@
     lldb::RunMode stop_others,
     bool okay_to_discard
 ) :
-    ThreadPlanStepRange ("Step range stepping over", thread, range, addr_context, stop_others)
+    ThreadPlanStepRange (ThreadPlan::eKindStepOverRange, "Step range stepping over", thread, range, addr_context, stop_others)
 {
     SetOkayToDiscard (okay_to_discard);
 }
diff --git a/source/Target/ThreadPlanStepRange.cpp b/source/Target/ThreadPlanStepRange.cpp
index edf80a5..2790d80 100644
--- a/source/Target/ThreadPlanStepRange.cpp
+++ b/source/Target/ThreadPlanStepRange.cpp
@@ -32,8 +32,8 @@
 // based on the value of \a type.
 //----------------------------------------------------------------------
 
-ThreadPlanStepRange::ThreadPlanStepRange (const char *name, Thread &thread, const AddressRange &range, const SymbolContext &addr_context, lldb::RunMode stop_others) :
-    ThreadPlan (name, thread, eVoteNoOpinion, eVoteNoOpinion),
+ThreadPlanStepRange::ThreadPlanStepRange (ThreadPlanKind kind, const char *name, Thread &thread, const AddressRange &range, const SymbolContext &addr_context, lldb::RunMode stop_others) :
+    ThreadPlan (ThreadPlan::eKindGeneric, name, thread, eVoteNoOpinion, eVoteNoOpinion),
     m_address_range (range),
     m_addr_context (addr_context),
     m_stop_others (stop_others),
diff --git a/source/Target/ThreadPlanStepThrough.cpp b/source/Target/ThreadPlanStepThrough.cpp
index 5e614e5..7fb7538 100644
--- a/source/Target/ThreadPlanStepThrough.cpp
+++ b/source/Target/ThreadPlanStepThrough.cpp
@@ -30,7 +30,7 @@
 //----------------------------------------------------------------------
 
 ThreadPlanStepThrough::ThreadPlanStepThrough (Thread &thread, bool stop_others) :
-    ThreadPlan ("Step through trampolines and prologues", thread, eVoteNoOpinion, eVoteNoOpinion),
+    ThreadPlan (ThreadPlan::eKindStepThrough, "Step through trampolines and prologues", thread, eVoteNoOpinion, eVoteNoOpinion),
     m_start_address (0),
     m_stop_others (stop_others)
 {
diff --git a/source/Target/ThreadPlanStepUntil.cpp b/source/Target/ThreadPlanStepUntil.cpp
index 3f9cdb5..d146b6a 100644
--- a/source/Target/ThreadPlanStepUntil.cpp
+++ b/source/Target/ThreadPlanStepUntil.cpp
@@ -38,7 +38,7 @@
     size_t num_addresses,
     bool stop_others
 ) :
-    ThreadPlan ("Step out", thread, eVoteNoOpinion, eVoteNoOpinion),
+    ThreadPlan (ThreadPlan::eKindStepUntil, "Step until", thread, eVoteNoOpinion, eVoteNoOpinion),
     m_step_from_insn (LLDB_INVALID_ADDRESS),
     m_return_addr (LLDB_INVALID_ADDRESS),
     m_return_bp_id(LLDB_INVALID_BREAK_ID),