diff --git a/lldb/include/lldb/Target/ThreadPlanStepOut.h b/lldb/include/lldb/Target/ThreadPlanStepOut.h index e414a6e0a2d49..ad4434be14120 100644 --- a/lldb/include/lldb/Target/ThreadPlanStepOut.h +++ b/lldb/include/lldb/Target/ThreadPlanStepOut.h @@ -17,6 +17,9 @@ namespace lldb_private { class ThreadPlanStepOut : public ThreadPlan, public ThreadPlanShouldStopHere { public: + /// Creates a thread plan to step out from frame_idx, skipping parent frames + /// if they are artificial or hidden frames. Also skips frames without debug + /// info based on step_out_avoids_code_without_debug_info. ThreadPlanStepOut(Thread &thread, SymbolContext *addr_context, bool first_insn, bool stop_others, Vote report_stop_vote, Vote report_run_vote, uint32_t frame_idx, @@ -24,6 +27,12 @@ class ThreadPlanStepOut : public ThreadPlan, public ThreadPlanShouldStopHere { bool continue_to_next_branch = false, bool gather_return_value = true); + /// Creates a thread plan to step out from frame_idx to frame_idx + 1. + ThreadPlanStepOut(Thread &thread, bool stop_others, Vote report_stop_vote, + Vote report_run_vote, uint32_t frame_idx, + bool continue_to_next_branch = false, + bool gather_return_value = true); + ~ThreadPlanStepOut() override; void GetDescription(Stream *s, lldb::DescriptionLevel level) override; diff --git a/lldb/source/Target/Thread.cpp b/lldb/source/Target/Thread.cpp index accc4708c24e1..b0e0f1e67c060 100644 --- a/lldb/source/Target/Thread.cpp +++ b/lldb/source/Target/Thread.cpp @@ -1360,9 +1360,8 @@ ThreadPlanSP Thread::QueueThreadPlanForStepOutNoShouldStop( const bool calculate_return_value = false; // No need to calculate the return value here. ThreadPlanSP thread_plan_sp(new ThreadPlanStepOut( - *this, addr_context, first_insn, stop_other_threads, report_stop_vote, - report_run_vote, frame_idx, eLazyBoolNo, continue_to_next_branch, - calculate_return_value)); + *this, stop_other_threads, report_stop_vote, report_run_vote, frame_idx, + continue_to_next_branch, calculate_return_value)); ThreadPlanStepOut *new_plan = static_cast(thread_plan_sp.get()); diff --git a/lldb/source/Target/ThreadPlanStepOut.cpp b/lldb/source/Target/ThreadPlanStepOut.cpp index f2606403016a6..0628451a5abf9 100644 --- a/lldb/source/Target/ThreadPlanStepOut.cpp +++ b/lldb/source/Target/ThreadPlanStepOut.cpp @@ -83,6 +83,28 @@ ThreadPlanStepOut::ThreadPlanStepOut( continue_to_next_branch); } +ThreadPlanStepOut::ThreadPlanStepOut(Thread &thread, bool stop_others, + Vote report_stop_vote, + Vote report_run_vote, uint32_t frame_idx, + bool continue_to_next_branch, + bool gather_return_value) + : ThreadPlan(ThreadPlan::eKindStepOut, "Step out", thread, report_stop_vote, + report_run_vote), + ThreadPlanShouldStopHere(this), m_return_bp_id(LLDB_INVALID_BREAK_ID), + m_return_addr(LLDB_INVALID_ADDRESS), m_stop_others(stop_others), + m_immediate_step_from_function(nullptr), + m_calculate_return_value(gather_return_value) { + SetFlagsToDefault(); + m_step_from_insn = thread.GetRegisterContext()->GetPC(0); + + StackFrameSP return_frame_sp = thread.GetStackFrameAtIndex(frame_idx + 1); + StackFrameSP immediate_return_from_sp = + thread.GetStackFrameAtIndex(frame_idx); + + SetupReturnAddress(return_frame_sp, immediate_return_from_sp, frame_idx, + continue_to_next_branch); +} + void ThreadPlanStepOut::SetupReturnAddress( StackFrameSP return_frame_sp, StackFrameSP immediate_return_from_sp, uint32_t frame_idx, bool continue_to_next_branch) {