2009-06-14 Hui Zhu <teawater@gmail.com>
authorMichael Snyder <msnyder@vmware.com>
Thu, 18 Jun 2009 23:55:57 +0000 (23:55 +0000)
committerMichael Snyder <msnyder@vmware.com>
Thu, 18 Jun 2009 23:55:57 +0000 (23:55 +0000)
    Michael Snyder  <msnyder@vmware.com>

* infrun.c (handle_inferior_event): Reverse-next through
          trampoline.

gdb/ChangeLog
gdb/infrun.c

index 0d5e763163ea7c89faab06fa16a0212232090ad3..3c4748ca2d39fb82b6e3b9179d5b488c9d7ff9fd 100644 (file)
@@ -4,6 +4,9 @@
        * infrun.c (handle_inferior_event): Improve reverse stepping
        through function epilogue.
 
+       * infrun.c (handle_inferior_event): Reverse-next through
+       trampoline.
+
 2009-06-18  Paul Pluzhnikov  <ppluzhnikov@google.com>
 
        * dwarf2-frame.c (struct comp_unit): Use bfd_size_type for
index 7488912c06ba84eaf319283e5abdf1ed48ad466b..e9d870d242c6b7380cebabaebf60efb0c1b3890f 100644 (file)
@@ -3777,10 +3777,21 @@ infrun: not switching back to stepped thread, it has vanished\n");
                  keep_going (ecs);
                  return;
                }
-             /* Normal (staticly linked) function call return.  */
-             init_sal (&sr_sal);
-             sr_sal.pc = ecs->stop_func_start;
-             insert_step_resume_breakpoint_at_sal (sr_sal, null_frame_id);
+             if (gdbarch_skip_trampoline_code(current_gdbarch,
+                                              get_current_frame (),
+                                              stop_pc))
+               {
+                 /* We are in a function call trampoline.
+                    Keep stepping backward to get to the caller.  */
+                 ecs->event_thread->stepping_over_breakpoint = 1;
+               }
+             else
+               {
+                 /* Normal function call return (static or dynamic).  */
+                 init_sal (&sr_sal);
+                 sr_sal.pc = ecs->stop_func_start;
+                 insert_step_resume_breakpoint_at_sal (sr_sal, null_frame_id);
+               }
            }
          else
            insert_step_resume_breakpoint_at_caller (frame);