diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 0d5e763163ea7c89faab06fa16a0212232090ad3..3c4748ca2d39fb82b6e3b9179d5b488c9d7ff9fd 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -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 diff --git a/gdb/infrun.c b/gdb/infrun.c index 7488912c06ba84eaf319283e5abdf1ed48ad466b..e9d870d242c6b7380cebabaebf60efb0c1b3890f 100644 --- a/gdb/infrun.c +++ b/gdb/infrun.c @@ -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);