diff options
-rw-r--r-- | lldb/include/lldb/Target/ThreadPlanStepOut.h | 29 | ||||
-rw-r--r-- | lldb/source/Target/Thread.cpp | 4 | ||||
-rw-r--r-- | lldb/source/Target/ThreadPlanStepOut.cpp | 9 |
3 files changed, 26 insertions, 16 deletions
diff --git a/lldb/include/lldb/Target/ThreadPlanStepOut.h b/lldb/include/lldb/Target/ThreadPlanStepOut.h index ccf829f636d..8a7db347346 100644 --- a/lldb/include/lldb/Target/ThreadPlanStepOut.h +++ b/lldb/include/lldb/Target/ThreadPlanStepOut.h @@ -32,7 +32,8 @@ public: Vote run_vote, uint32_t frame_idx, LazyBool step_out_avoids_code_without_debug_info, - bool continue_to_next_branch = false); + bool continue_to_next_branch = false, + bool gather_return_value = true); ~ThreadPlanStepOut() override; @@ -46,11 +47,12 @@ public: void DidPush() override; bool IsPlanStale() override; - lldb::ValueObjectSP GetReturnValueObject() override + lldb::ValueObjectSP + GetReturnValueObject() override { return m_return_valobj_sp; } - + protected: void SetFlagsToDefault() override @@ -65,18 +67,19 @@ protected: private: static uint32_t s_default_flag_values; // These are the default flag values for the ThreadPlanStepThrough. - lldb::addr_t m_step_from_insn; - StackID m_step_out_to_id; - StackID m_immediate_step_from_id; - lldb::break_id_t m_return_bp_id; - lldb::addr_t m_return_addr; - bool m_stop_others; - lldb::ThreadPlanSP m_step_out_to_inline_plan_sp; // This plan implements step out to the real function containing + lldb::addr_t m_step_from_insn; + StackID m_step_out_to_id; + StackID m_immediate_step_from_id; + lldb::break_id_t m_return_bp_id; + lldb::addr_t m_return_addr; + bool m_stop_others; + lldb::ThreadPlanSP m_step_out_to_inline_plan_sp; // This plan implements step out to the real function containing // an inlined frame so we can then step out of that. - lldb::ThreadPlanSP m_step_through_inline_plan_sp; // This plan then steps past the inlined frame(s). - lldb::ThreadPlanSP m_step_out_further_plan_sp; // This plan keeps stepping out if ShouldStopHere told us to. - Function *m_immediate_step_from_function; + lldb::ThreadPlanSP m_step_through_inline_plan_sp; // This plan then steps past the inlined frame(s). + lldb::ThreadPlanSP m_step_out_further_plan_sp; // This plan keeps stepping out if ShouldStopHere told us to. + Function *m_immediate_step_from_function; lldb::ValueObjectSP m_return_valobj_sp; + bool m_calculate_return_value; friend lldb::ThreadPlanSP Thread::QueueThreadPlanForStepOut (bool abort_other_plans, diff --git a/lldb/source/Target/Thread.cpp b/lldb/source/Target/Thread.cpp index 40c137c4d52..26502f2eb4b 100644 --- a/lldb/source/Target/Thread.cpp +++ b/lldb/source/Target/Thread.cpp @@ -1626,6 +1626,7 @@ Thread::QueueThreadPlanForStepOutNoShouldStop(bool abort_other_plans, uint32_t frame_idx, bool continue_to_next_branch) { + 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, @@ -1634,7 +1635,8 @@ Thread::QueueThreadPlanForStepOutNoShouldStop(bool abort_other_plans, run_vote, frame_idx, eLazyBoolNo, - continue_to_next_branch)); + continue_to_next_branch, + calculate_return_value)); ThreadPlanStepOut *new_plan = static_cast<ThreadPlanStepOut *>(thread_plan_sp.get()); new_plan->ClearShouldStopHereCallbacks(); diff --git a/lldb/source/Target/ThreadPlanStepOut.cpp b/lldb/source/Target/ThreadPlanStepOut.cpp index 82b823be62e..eac4a36b0a9 100644 --- a/lldb/source/Target/ThreadPlanStepOut.cpp +++ b/lldb/source/Target/ThreadPlanStepOut.cpp @@ -46,7 +46,8 @@ ThreadPlanStepOut::ThreadPlanStepOut Vote run_vote, uint32_t frame_idx, LazyBool step_out_avoids_code_without_debug_info, - bool continue_to_next_branch + bool continue_to_next_branch, + bool gather_return_value ) : ThreadPlan (ThreadPlan::eKindStepOut, "Step out", thread, stop_vote, run_vote), ThreadPlanShouldStopHere (this), @@ -54,7 +55,8 @@ ThreadPlanStepOut::ThreadPlanStepOut 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_immediate_step_from_function(nullptr), + m_calculate_return_value(gather_return_value) { SetFlagsToDefault(); SetupAvoidNoDebug(step_out_avoids_code_without_debug_info); @@ -538,6 +540,9 @@ ThreadPlanStepOut::CalculateReturnValue () if (m_return_valobj_sp) return; + if (!m_calculate_return_value) + return; + if (m_immediate_step_from_function != nullptr) { CompilerType return_compiler_type = m_immediate_step_from_function->GetCompilerType().GetFunctionReturnType(); |