summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lldb/include/lldb/Target/ThreadPlanStepOut.h29
-rw-r--r--lldb/source/Target/Thread.cpp4
-rw-r--r--lldb/source/Target/ThreadPlanStepOut.cpp9
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();
OpenPOWER on IntegriCloud