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);