diff --git a/lldb/include/lldb/Target/ThreadPlanShouldStopHere.h b/lldb/include/lldb/Target/ThreadPlanShouldStopHere.h index 54b30291c399..d0094c90b91a 100644 --- a/lldb/include/lldb/Target/ThreadPlanShouldStopHere.h +++ b/lldb/include/lldb/Target/ThreadPlanShouldStopHere.h @@ -59,7 +59,8 @@ public: eNone = 0, eAvoidInlines = (1 << 0), eStepInAvoidNoDebug = (1 << 1), - eStepOutAvoidNoDebug = (1 << 2) + eStepOutAvoidNoDebug = (1 << 2), + eStepOutPastThunks = (1 << 3) }; // Constructors and Destructors diff --git a/lldb/source/Target/ThreadPlanShouldStopHere.cpp b/lldb/source/Target/ThreadPlanShouldStopHere.cpp index fa6bc08a9914..d2cca49987f0 100644 --- a/lldb/source/Target/ThreadPlanShouldStopHere.cpp +++ b/lldb/source/Target/ThreadPlanShouldStopHere.cpp @@ -8,6 +8,7 @@ #include "lldb/Target/ThreadPlanShouldStopHere.h" #include "lldb/Symbol/Symbol.h" +#include "lldb/Target/Language.h" #include "lldb/Target/LanguageRuntime.h" #include "lldb/Target/RegisterContext.h" #include "lldb/Target/Thread.h" @@ -83,7 +84,12 @@ bool ThreadPlanShouldStopHere::DefaultShouldStopHereCallback( if (Symbol *symbol = frame->GetSymbolContext(eSymbolContextSymbol).symbol) { ProcessSP process_sp(current_plan->GetThread().GetProcess()); for (auto *runtime : process_sp->GetLanguageRuntimes()) { - if (runtime->IsSymbolARuntimeThunk(*symbol)) { + if (runtime->IsSymbolARuntimeThunk(*symbol) && + flags.Test(ThreadPlanShouldStopHere::eStepOutPastThunks)) { + LLDB_LOGF( + log, "Stepping out past a language thunk %s for: %s", + frame->GetFunctionName(), + Language::GetNameForLanguageType(runtime->GetLanguageType())); should_stop_here = false; break; } @@ -131,9 +137,12 @@ ThreadPlanSP ThreadPlanShouldStopHere::DefaultStepFromHereCallback( // because it's marked line 0. bool is_thunk = false; for (auto *runtime : process_sp->GetLanguageRuntimes()) { - if (runtime->IsSymbolARuntimeThunk(*sc.symbol)) { - LLDB_LOGF(log, "In runtime thunk %s - stepping out.", - sc.symbol->GetName().GetCString()); + if (runtime->IsSymbolARuntimeThunk(*sc.symbol) && + flags.Test(ThreadPlanShouldStopHere::eStepOutPastThunks)) { + LLDB_LOGF( + log, "Stepping out past a language thunk %s for: %s", + frame->GetFunctionName(), + Language::GetNameForLanguageType(runtime->GetLanguageType())); is_thunk = true; break; } diff --git a/lldb/source/Target/ThreadPlanStepInRange.cpp b/lldb/source/Target/ThreadPlanStepInRange.cpp index 109d1b6b3435..8a2417e9da32 100644 --- a/lldb/source/Target/ThreadPlanStepInRange.cpp +++ b/lldb/source/Target/ThreadPlanStepInRange.cpp @@ -27,7 +27,8 @@ using namespace lldb; using namespace lldb_private; uint32_t ThreadPlanStepInRange::s_default_flag_values = - ThreadPlanShouldStopHere::eStepInAvoidNoDebug; + ThreadPlanShouldStopHere::eStepInAvoidNoDebug | + ThreadPlanShouldStopHere::eStepOutPastThunks; // ThreadPlanStepInRange: Step through a stack range, either stepping over or // into based on the value of \a type.