diff options
Diffstat (limited to 'source/Target/ThreadPlanStepThrough.cpp')
| -rw-r--r-- | source/Target/ThreadPlanStepThrough.cpp | 39 | 
1 files changed, 34 insertions, 5 deletions
diff --git a/source/Target/ThreadPlanStepThrough.cpp b/source/Target/ThreadPlanStepThrough.cpp index c039a32f5515..d1f3c2219f6d 100644 --- a/source/Target/ThreadPlanStepThrough.cpp +++ b/source/Target/ThreadPlanStepThrough.cpp @@ -7,12 +7,9 @@  //  //===----------------------------------------------------------------------===// -// C Includes -// C++ Includes -// Other libraries and framework includes -// Project includes  #include "lldb/Target/ThreadPlanStepThrough.h"  #include "lldb/Breakpoint/Breakpoint.h" +#include "lldb/Target/CPPLanguageRuntime.h"  #include "lldb/Target/DynamicLoader.h"  #include "lldb/Target/ObjCLanguageRuntime.h"  #include "lldb/Target/Process.h" @@ -61,7 +58,10 @@ ThreadPlanStepThrough::ThreadPlanStepThrough(Thread &thread,                ->GetTarget()                .CreateBreakpoint(m_backstop_addr, true, false)                .get(); +        if (return_bp != nullptr) { +        if (return_bp->IsHardware() && !return_bp->HasResolvedLocations()) +          m_could_not_resolve_hw_bp = true;          return_bp->SetThreadID(m_thread.GetID());          m_backstop_bkpt_id = return_bp->GetID();          return_bp->SetBreakpointKind("step-through-backstop"); @@ -95,6 +95,15 @@ void ThreadPlanStepThrough::LookForPlanToStepThroughFromCurrentPC() {      if (objc_runtime)        m_sub_plan_sp =            objc_runtime->GetStepThroughTrampolinePlan(m_thread, m_stop_others); + +    CPPLanguageRuntime *cpp_runtime = +        m_thread.GetProcess()->GetCPPLanguageRuntime(); + +    // If the ObjC runtime did not provide us with a step though plan then if we +    // have it check the C++ runtime for a step though plan. +    if (!m_sub_plan_sp.get() && cpp_runtime) +      m_sub_plan_sp = +          cpp_runtime->GetStepThroughTrampolinePlan(m_thread, m_stop_others);    }    Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_STEP)); @@ -129,7 +138,26 @@ void ThreadPlanStepThrough::GetDescription(Stream *s,  }  bool ThreadPlanStepThrough::ValidatePlan(Stream *error) { -  return m_sub_plan_sp.get() != nullptr; +  if (m_could_not_resolve_hw_bp) { +    if (error) +      error->PutCString( +          "Could not create hardware breakpoint for thread plan."); +    return false; +  } + +  if (m_backstop_bkpt_id == LLDB_INVALID_BREAK_ID) { +    if (error) +      error->PutCString("Could not create backstop breakpoint."); +    return false; +  } + +  if (!m_sub_plan_sp.get()) { +    if (error) +      error->PutCString("Does not have a subplan."); +    return false; +  } + +  return true;  }  bool ThreadPlanStepThrough::DoPlanExplainsStop(Event *event_ptr) { @@ -205,6 +233,7 @@ void ThreadPlanStepThrough::ClearBackstopBreakpoint() {    if (m_backstop_bkpt_id != LLDB_INVALID_BREAK_ID) {      m_thread.GetProcess()->GetTarget().RemoveBreakpointByID(m_backstop_bkpt_id);      m_backstop_bkpt_id = LLDB_INVALID_BREAK_ID; +    m_could_not_resolve_hw_bp = false;    }  }  | 
