https://github.com/augusto2112 updated 
https://github.com/llvm/llvm-project/pull/209629

>From 09ad767e2566adf0934db57f3edf0e659fedaa35 Mon Sep 17 00:00:00 2001
From: Augusto Noronha <[email protected]>
Date: Tue, 14 Jul 2026 13:08:24 -0700
Subject: [PATCH] [lldb] Skip the prologue before reading `this` when stepping
 into std::function

Commit 40152b8 broke CPPLanguageRuntime::GetStepThroughTrampolinePlan by
changing operator() from a multi-line function to a single line function.

This used to work by accident, because the fallback step-in plan first advanced
past the prologue and the trampoline detection was re-invoked there with a valid
`this`. Once operator() became a one-line inline definition that intermediate
step no longer happened.

Run past the prologue when stopped at the function entry and let the
step-through machinery re-invoke the plan, so the thread plan has a
valid `this` to read from.
---
 .../CPlusPlus/CPPLanguageRuntime.cpp              | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git 
a/lldb/source/Plugins/LanguageRuntime/CPlusPlus/CPPLanguageRuntime.cpp 
b/lldb/source/Plugins/LanguageRuntime/CPlusPlus/CPPLanguageRuntime.cpp
index c517ec8611932..90cedd6df6606 100644
--- a/lldb/source/Plugins/LanguageRuntime/CPlusPlus/CPPLanguageRuntime.cpp
+++ b/lldb/source/Plugins/LanguageRuntime/CPlusPlus/CPPLanguageRuntime.cpp
@@ -470,6 +470,21 @@ CPPLanguageRuntime::GetStepThroughTrampolinePlan(Thread 
&thread,
   StackFrameSP frame = thread.GetStackFrameAtIndex(0);
 
   if (frame) {
+    // Advance past the prologue if we stopped there.
+    Address func_start_address =
+        sc.function ? sc.function->GetAddress() : symbol->GetAddress();
+    lldb::addr_t func_start =
+        func_start_address.GetLoadAddress(target_sp.get());
+    if (func_start != LLDB_INVALID_ADDRESS && func_start == curr_pc) {
+      uint32_t prologue_size = sc.function ? sc.function->GetPrologueByteSize()
+                                           : symbol->GetPrologueByteSize();
+      if (prologue_size > 0) {
+        func_start_address.Slide(prologue_size);
+        return std::make_shared<ThreadPlanRunToAddress>(
+            thread, func_start_address, stop_others);
+      }
+    }
+
     ValueObjectSP value_sp = frame->FindVariable(g_this);
 
     CPPLanguageRuntime::LibCppStdFunctionCallableInfo callable_info =

_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to