From 31410e843b46ef8df6b73f3b19cab434ef157680 Mon Sep 17 00:00:00 2001
From: Michael Snyder <msnyder@vmware.com>
Date: Thu, 18 Jun 2009 23:41:27 +0000
Subject: [PATCH] 2009-06-18  Hui Zhu  <teawater@gmail.com> 	    Michael
 Snyder  <msnyder@vmware.com>

	* infrun.c (handle_inferior_event): Improve reverse stepping
	through function epilogue.
---
 gdb/ChangeLog |  6 ++++++
 gdb/infrun.c  | 12 ++++++++++--
 2 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 352deeb3284..0d5e763163e 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,9 @@
+2009-06-18  Hui Zhu  <teawater@gmail.com>
+	    Michael Snyder  <msnyder@vmware.com>
+
+	* infrun.c (handle_inferior_event): Improve reverse stepping
+	through function epilogue.
+
 2009-06-18  Paul Pluzhnikov  <ppluzhnikov@google.com>
 
 	* dwarf2-frame.c (struct comp_unit): Use bfd_size_type for
diff --git a/gdb/infrun.c b/gdb/infrun.c
index 3eaf89e1b61..7488912c06b 100644
--- a/gdb/infrun.c
+++ b/gdb/infrun.c
@@ -3630,9 +3630,17 @@ infrun: not switching back to stepped thread, it has vanished\n");
 
      Note that step_range_end is the address of the first instruction
      beyond the step range, and NOT the address of the last instruction
-     within it! */
+     within it!
+
+     Note also that during reverse execution, we may be stepping
+     through a function epilogue and therefore must detect when
+     the current-frame changes in the middle of a line.  */
+
   if (stop_pc >= ecs->event_thread->step_range_start
-      && stop_pc < ecs->event_thread->step_range_end)
+      && stop_pc < ecs->event_thread->step_range_end
+      && (execution_direction != EXEC_REVERSE
+	  || frame_id_eq (get_frame_id (get_current_frame ()),
+			  ecs->event_thread->step_frame_id)))
     {
       if (debug_infrun)
 	fprintf_unfiltered (gdb_stdlog, "infrun: stepping inside range [0x%s-0x%s]\n",
-- 
GitLab