Author: jingham Date: Tue Aug 23 12:55:21 2016 New Revision: 279540 URL: http://llvm.org/viewvc/llvm-project?rev=279540&view=rev Log: Implementation "step out" plans shouldn't gather the return value.
When, for instance, "step-in" steps into a function that it doesn't want to stop in (e.g. has no debug info) it will push a step-out plan to implement the step out so it can then continue stepping. These step out's don't use the result of the function stepped out of, so they shouldn't spend the time to compute it. Modified: lldb/trunk/include/lldb/Target/ThreadPlanStepOut.h lldb/trunk/source/Target/Thread.cpp lldb/trunk/source/Target/ThreadPlanStepOut.cpp Modified: lldb/trunk/include/lldb/Target/ThreadPlanStepOut.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/ThreadPlanStepOut.h?rev=279540&r1=279539&r2=279540&view=diff ============================================================================== --- lldb/trunk/include/lldb/Target/ThreadPlanStepOut.h (original) +++ lldb/trunk/include/lldb/Target/ThreadPlanStepOut.h Tue Aug 23 12:55:21 2016 @@ -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, Modified: lldb/trunk/source/Target/Thread.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/Thread.cpp?rev=279540&r1=279539&r2=279540&view=diff ============================================================================== --- lldb/trunk/source/Target/Thread.cpp (original) +++ lldb/trunk/source/Target/Thread.cpp Tue Aug 23 12:55:21 2016 @@ -1626,6 +1626,7 @@ Thread::QueueThreadPlanForStepOutNoShoul 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::QueueThreadPlanForStepOutNoShoul 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(); Modified: lldb/trunk/source/Target/ThreadPlanStepOut.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/ThreadPlanStepOut.cpp?rev=279540&r1=279539&r2=279540&view=diff ============================================================================== --- lldb/trunk/source/Target/ThreadPlanStepOut.cpp (original) +++ lldb/trunk/source/Target/ThreadPlanStepOut.cpp Tue Aug 23 12:55:21 2016 @@ -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(); _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits