]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - gdb/infrun.c
* regcache.c (struct regcache): Add ptid_t member.
[thirdparty/binutils-gdb.git] / gdb / infrun.c
index a425b6708e43ca15ff43227fd59c978a96eb4868..1557dc70f419e9d2216acdab1ec6b8fd83cfbddb 100644 (file)
@@ -1,9 +1,9 @@
 /* Target-struct-independent code to start (run) and stop an inferior
    process.
 
-   Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
-   1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free
-   Software Foundation, Inc.
+   Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
+   1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
+   Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -19,8 +19,8 @@
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
+   Foundation, Inc., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA.  */
 
 #include "defs.h"
 #include "gdb_string.h"
@@ -28,6 +28,7 @@
 #include "symtab.h"
 #include "frame.h"
 #include "inferior.h"
+#include "exceptions.h"
 #include "breakpoint.h"
 #include "gdb_wait.h"
 #include "gdbcore.h"
 #include "value.h"
 #include "observer.h"
 #include "language.h"
+#include "solib.h"
+#include "main.h"
+
 #include "gdb_assert.h"
+#include "mi/mi-common.h"
 
 /* Prototypes for local functions */
 
@@ -86,6 +91,12 @@ int inferior_ignoring_leading_exec_events = 0;
    no line number information.  The normal behavior is that we step
    over such function.  */
 int step_stop_if_no_debug = 0;
+static void
+show_step_stop_if_no_debug (struct ui_file *file, int from_tty,
+                           struct cmd_list_element *c, const char *value)
+{
+  fprintf_filtered (file, _("Mode of the step operation is %s.\n"), value);
+}
 
 /* In asynchronous mode, but simulating synchronous execution. */
 
@@ -107,6 +118,12 @@ static ptid_t previous_inferior_ptid;
 static int may_follow_exec = MAY_FOLLOW_EXEC;
 
 static int debug_infrun = 0;
+static void
+show_debug_infrun (struct ui_file *file, int from_tty,
+                  struct cmd_list_element *c, const char *value)
+{
+  fprintf_filtered (file, _("Inferior debugging is %s.\n"), value);
+}
 
 /* If the program uses ELF-style shared libraries, then calls to
    functions in shared libraries go through stubs, which live in a
@@ -147,10 +164,6 @@ static int debug_infrun = 0;
    signalling an error, which will obscure the change in the
    inferior's state.  */
 
-#ifndef IN_SOLIB_DYNSYM_RESOLVE_CODE
-#define IN_SOLIB_DYNSYM_RESOLVE_CODE(pc) 0
-#endif
-
 /* This function returns TRUE if pc is the address of an instruction
    that lies within the dynamic linker (such as the event hook, or the
    dld itself).
@@ -163,34 +176,10 @@ static int debug_infrun = 0;
 #define SOLIB_IN_DYNAMIC_LINKER(pid,pc) 0
 #endif
 
-/* We can't step off a permanent breakpoint in the ordinary way, because we
-   can't remove it.  Instead, we have to advance the PC to the next
-   instruction.  This macro should expand to a pointer to a function that
-   does that, or zero if we have no such function.  If we don't have a
-   definition for it, we have to report an error.  */
-#ifndef SKIP_PERMANENT_BREAKPOINT
-#define SKIP_PERMANENT_BREAKPOINT (default_skip_permanent_breakpoint)
-static void
-default_skip_permanent_breakpoint (void)
-{
-  error ("\
-The program is stopped at a permanent breakpoint, but GDB does not know\n\
-how to step past a permanent breakpoint on this architecture.  Try using\n\
-a command like `return' or `jump' to continue execution.");
-}
-#endif
-
 
 /* Convert the #defines into values.  This is temporary until wfi control
    flow is completely sorted out.  */
 
-#ifndef HAVE_STEPPABLE_WATCHPOINT
-#define HAVE_STEPPABLE_WATCHPOINT 0
-#else
-#undef  HAVE_STEPPABLE_WATCHPOINT
-#define HAVE_STEPPABLE_WATCHPOINT 1
-#endif
-
 #ifndef CANNOT_STEP_HW_WATCHPOINTS
 #define CANNOT_STEP_HW_WATCHPOINTS 0
 #else
@@ -240,11 +229,16 @@ static struct symbol *step_start_function;
 
 static int trap_expected;
 
-#ifdef SOLIB_ADD
 /* Nonzero if we want to give control to the user when we're notified
    of shared library events by the dynamic linker.  */
 static int stop_on_solib_events;
-#endif
+static void
+show_stop_on_solib_events (struct ui_file *file, int from_tty,
+                          struct cmd_list_element *c, const char *value)
+{
+  fprintf_filtered (file, _("Stopping for shared library events is %s.\n"),
+                   value);
+}
 
 /* Nonzero means expecting a trace trap
    and should stop the inferior and return silently when it happens.  */
@@ -270,10 +264,6 @@ int proceed_to_finish;
 
 struct regcache *stop_registers;
 
-/* Nonzero if program stopped due to error trying to insert breakpoints.  */
-
-static int breakpoints_failed;
-
 /* Nonzero after stop if current stack frame should be printed.  */
 
 static int stop_print_frame;
@@ -313,6 +303,14 @@ static const char *follow_fork_mode_kind_names[] = {
 };
 
 static const char *follow_fork_mode_string = follow_fork_mode_parent;
+static void
+show_follow_fork_mode_string (struct ui_file *file, int from_tty,
+                             struct cmd_list_element *c, const char *value)
+{
+  fprintf_filtered (file, _("\
+Debugger response to a program call of fork or vfork is \"%s\".\n"),
+                   value);
+}
 \f
 
 static int
@@ -389,7 +387,7 @@ follow_exec (int pid, char *execd_pathname)
   step_range_end = 0;
 
   /* What is this a.out's name? */
-  printf_unfiltered ("Executing new program: %s\n", execd_pathname);
+  printf_unfiltered (_("Executing new program: %s\n"), execd_pathname);
 
   /* We've followed the inferior through an exec.  Therefore, the
      inferior has essentially been killed & reborn. */
@@ -398,7 +396,7 @@ follow_exec (int pid, char *execd_pathname)
   tgt = find_run_target ();
   /* If we can't find one, things are in a very strange state...  */
   if (tgt == NULL)
-    error ("Could find run target to save before following exec");
+    error (_("Could find run target to save before following exec"));
 
   gdb_flush (gdb_stdout);
   target_mourn_inferior ();
@@ -420,6 +418,8 @@ follow_exec (int pid, char *execd_pathname)
 #endif
 #ifdef SOLIB_CREATE_INFERIOR_HOOK
   SOLIB_CREATE_INFERIOR_HOOK (PIDGET (inferior_ptid));
+#else
+  solib_create_inferior_hook ();
 #endif
 
   /* Reinsert all breakpoints.  (Those which were symbolic have
@@ -441,6 +441,9 @@ static int singlestep_breakpoints_inserted_p = 0;
 /* The thread we inserted single-step breakpoints for.  */
 static ptid_t singlestep_ptid;
 
+/* PC when we started this single-step.  */
+static CORE_ADDR singlestep_pc;
+
 /* If another thread hit the singlestep breakpoint, we save the original
    thread here so that we can resume single-stepping it later.  */
 static ptid_t saved_singlestep_ptid;
@@ -457,32 +460,30 @@ resume_cleanups (void *ignore)
 static const char schedlock_off[] = "off";
 static const char schedlock_on[] = "on";
 static const char schedlock_step[] = "step";
-static const char *scheduler_mode = schedlock_off;
 static const char *scheduler_enums[] = {
   schedlock_off,
   schedlock_on,
   schedlock_step,
   NULL
 };
+static const char *scheduler_mode = schedlock_off;
+static void
+show_scheduler_mode (struct ui_file *file, int from_tty,
+                    struct cmd_list_element *c, const char *value)
+{
+  fprintf_filtered (file, _("\
+Mode for locking scheduler during execution is \"%s\".\n"),
+                   value);
+}
 
 static void
 set_schedlock_func (char *args, int from_tty, struct cmd_list_element *c)
 {
-  /* NOTE: cagney/2002-03-17: The deprecated_add_show_from_set()
-     function clones the set command passed as a parameter.  The clone
-     operation will include (BUG?) any ``set'' command callback, if
-     present.  Commands like ``info set'' call all the ``show''
-     command callbacks.  Unfortunately, for ``show'' commands cloned
-     from ``set'', this includes callbacks belonging to ``set''
-     commands.  Making this worse, this only occures if
-     deprecated_add_show_from_set() is called after add_cmd_sfunc()
-     (BUG?).  */
-  if (cmd_type (c) == set_cmd)
-    if (!target_can_lock_scheduler)
-      {
-       scheduler_mode = schedlock_off;
-       error ("Target '%s' cannot support this command.", target_shortname);
-      }
+  if (!target_can_lock_scheduler)
+    {
+      scheduler_mode = schedlock_off;
+      error (_("Target '%s' cannot support this command."), target_shortname);
+    }
 }
 
 
@@ -502,7 +503,8 @@ resume (int step, enum target_signal sig)
   QUIT;
 
   if (debug_infrun)
-    printf_unfiltered ("infrun: resume (step=%d, signal=%d)\n", step, sig);
+    fprintf_unfiltered (gdb_stdlog, "infrun: resume (step=%d, signal=%d)\n",
+                       step, sig);
 
   /* FIXME: calling breakpoint_here_p (read_pc ()) three times! */
 
@@ -524,18 +526,30 @@ resume (int step, enum target_signal sig)
      at a permanent breakpoint; we need to step over it, but permanent
      breakpoints can't be removed.  So we have to test for it here.  */
   if (breakpoint_here_p (read_pc ()) == permanent_breakpoint_here)
-    SKIP_PERMANENT_BREAKPOINT ();
+    {
+      if (gdbarch_skip_permanent_breakpoint_p (current_gdbarch))
+       gdbarch_skip_permanent_breakpoint (current_gdbarch,
+                                          get_current_regcache ());
+      else
+       error (_("\
+The program is stopped at a permanent breakpoint, but GDB does not know\n\
+how to step past a permanent breakpoint on this architecture.  Try using\n\
+a command like `return' or `jump' to continue execution."));
+    }
 
   if (SOFTWARE_SINGLE_STEP_P () && step)
     {
       /* Do it the hard way, w/temp breakpoints */
-      SOFTWARE_SINGLE_STEP (sig, 1 /*insert-breakpoints */ );
-      /* ...and don't ask hardware to do it.  */
-      step = 0;
-      /* and do not pull these breakpoints until after a `wait' in
-         `wait_for_inferior' */
-      singlestep_breakpoints_inserted_p = 1;
-      singlestep_ptid = inferior_ptid;
+      if (SOFTWARE_SINGLE_STEP (get_current_frame ()))
+        {
+          /* ...and don't ask hardware to do it.  */
+          step = 0;
+          /* and do not pull these breakpoints until after a `wait' in
+          `wait_for_inferior' */
+          singlestep_breakpoints_inserted_p = 1;
+          singlestep_ptid = inferior_ptid;
+          singlestep_pc = read_pc ();
+        }
     }
 
   /* If there were any forks/vforks/execs that were caught and are
@@ -587,7 +601,7 @@ resume (int step, enum target_signal sig)
          resume_ptid = inferior_ptid;
        }
 
-      if (CANNOT_STEP_BREAKPOINT)
+      if (gdbarch_cannot_step_breakpoint (current_gdbarch))
        {
          /* Most targets can step a breakpoint instruction, thus
             executing it normally.  But if this one cannot, just
@@ -655,10 +669,9 @@ prepare_to_proceed (void)
 
          /* FIXME: This stuff came from switch_to_thread() in
             thread.c (which should probably be a public function).  */
-         flush_cached_frames ();
+         reinit_frame_cache ();
          registers_changed ();
          stop_pc = wait_pc;
-         select_frame (get_current_frame ());
        }
 
       /* We return 1 to indicate that there is a breakpoint here,
@@ -720,8 +733,9 @@ proceed (CORE_ADDR addr, enum target_signal siggnal, int step)
     }
 
   if (debug_infrun)
-    printf_unfiltered ("infrun: proceed (addr=0x%s, signal=%d, step=%d)\n",
-                      paddr_nz (addr), siggnal, step);
+    fprintf_unfiltered (gdb_stdlog,
+                       "infrun: proceed (addr=0x%s, signal=%d, step=%d)\n",
+                       paddr_nz (addr), siggnal, step);
 
   /* In a multi-threaded task we may select another thread
      and then continue or step.
@@ -804,7 +818,7 @@ proceed (CORE_ADDR addr, enum target_signal siggnal, int step)
 /* Start remote-debugging of a machine over a serial link.  */
 
 void
-start_remote (void)
+start_remote (int from_tty)
 {
   init_thread_list ();
   init_wait_for_inferior ();
@@ -826,6 +840,12 @@ start_remote (void)
      is currently running and GDB state should be set to the same as
      for an async run. */
   wait_for_inferior ();
+
+  /* Now that the inferior has stopped, do any bookkeeping like
+     loading shared libraries.  We want to do this before normal_stop,
+     so that the displayed frame is up to date.  */
+  post_create_inferior (&current_target, from_tty);
+
   normal_stop ();
 }
 
@@ -866,12 +886,8 @@ enum infwait_states
    to the interface from within handle_inferior_event(). */
 enum inferior_stop_reason
 {
-  /* We don't know why. */
-  STOP_UNKNOWN,
   /* Step, next, nexti, stepi finished. */
   END_STEPPING_RANGE,
-  /* Found breakpoint. */
-  BREAKPOINT_HIT,
   /* Inferior terminated by signal. */
   SIGNAL_EXITED,
   /* Inferior exited. */
@@ -915,6 +931,7 @@ void handle_inferior_event (struct execution_control_state *ecs);
 
 static void step_into_function (struct execution_control_state *ecs);
 static void insert_step_resume_breakpoint_at_frame (struct frame_info *step_frame);
+static void insert_step_resume_breakpoint_at_caller (struct frame_info *);
 static void insert_step_resume_breakpoint_at_sal (struct symtab_and_line sr_sal,
                                                  struct frame_id sr_id);
 static void stop_stepping (struct execution_control_state *ecs);
@@ -937,7 +954,7 @@ wait_for_inferior (void)
   struct execution_control_state *ecs;
 
   if (debug_infrun)
-    printf_unfiltered ("infrun: wait_for_inferior\n");
+    fprintf_unfiltered (gdb_stdlog, "infrun: wait_for_inferior\n");
 
   old_cleanups = make_cleanup (delete_step_resume_breakpoint,
                               &step_resume_breakpoint);
@@ -1048,7 +1065,7 @@ fetch_inferior_event (void *client_data)
 void
 init_execution_control_state (struct execution_control_state *ecs)
 {
-  /* ecs->another_trap? */
+  ecs->another_trap = 0;
   ecs->random_signal = 0;
   ecs->step_after_step_resume_breakpoint = 0;
   ecs->handling_longjmp = 0;   /* FIXME */
@@ -1074,6 +1091,12 @@ get_last_target_status (ptid_t *ptidp, struct target_waitstatus *status)
   *status = target_last_waitstatus;
 }
 
+void
+nullify_last_target_wait_ptid (void)
+{
+  target_last_wait_ptid = minus_one_ptid;
+}
+
 /* Switch thread contexts, maintaining "infrun state". */
 
 static void
@@ -1085,6 +1108,14 @@ context_switch (struct execution_control_state *ecs)
      be lost.  This may happen as a result of the target module
      mishandling thread creation.  */
 
+  if (debug_infrun)
+    {
+      fprintf_unfiltered (gdb_stdlog, "infrun: Switching context from %s ",
+                         target_pid_to_str (inferior_ptid));
+      fprintf_unfiltered (gdb_stdlog, "to %s\n",
+                         target_pid_to_str (ecs->ptid));
+    }
+
   if (in_thread_list (inferior_ptid) && in_thread_list (ecs->ptid))
     {                          /* Perform infrun state context switch: */
       /* Save infrun state for the old thread.  */
@@ -1108,6 +1139,7 @@ context_switch (struct execution_control_state *ecs)
                         &ecs->current_line, &ecs->current_symtab);
     }
   inferior_ptid = ecs->ptid;
+  reinit_frame_cache ();
 }
 
 static void
@@ -1117,29 +1149,29 @@ adjust_pc_after_break (struct execution_control_state *ecs)
 
   /* If this target does not decrement the PC after breakpoints, then
      we have nothing to do.  */
-  if (DECR_PC_AFTER_BREAK == 0)
+  if (gdbarch_decr_pc_after_break (current_gdbarch) == 0)
     return;
 
   /* If we've hit a breakpoint, we'll normally be stopped with SIGTRAP.  If
      we aren't, just return.
 
      We assume that waitkinds other than TARGET_WAITKIND_STOPPED are not
-     affected by DECR_PC_AFTER_BREAK.  Other waitkinds which are implemented
-     by software breakpoints should be handled through the normal breakpoint
-     layer.
+     affected by gdbarch_decr_pc_after_break.  Other waitkinds which are
+     implemented by software breakpoints should be handled through the normal
+     breakpoint layer.
 
      NOTE drow/2004-01-31: On some targets, breakpoints may generate
      different signals (SIGILL or SIGEMT for instance), but it is less
      clear where the PC is pointing afterwards.  It may not match
-     DECR_PC_AFTER_BREAK.  I don't know any specific target that generates
-     these signals at breakpoints (the code has been in GDB since at least
-     1992) so I can not guess how to handle them here.
+     gdbarch_decr_pc_after_break.  I don't know any specific target that
+     generates these signals at breakpoints (the code has been in GDB since at
+     least 1992) so I can not guess how to handle them here.
 
-     In earlier versions of GDB, a target with HAVE_NONSTEPPABLE_WATCHPOINTS
-     would have the PC after hitting a watchpoint affected by
-     DECR_PC_AFTER_BREAK.  I haven't found any target with both of these set
-     in GDB history, and it seems unlikely to be correct, so
-     HAVE_NONSTEPPABLE_WATCHPOINTS is not checked here.  */
+     In earlier versions of GDB, a target with 
+     gdbarch_have_nonsteppable_watchpoint would have the PC after hitting a
+     watchpoint affected by gdbarch_decr_pc_after_break.  I haven't found any
+     target with both of these set in GDB history, and it seems unlikely to be
+     correct, so gdbarch_have_nonsteppable_watchpoint is not checked here.  */
 
   if (ecs->ws.kind != TARGET_WAITKIND_STOPPED)
     return;
@@ -1149,7 +1181,8 @@ adjust_pc_after_break (struct execution_control_state *ecs)
 
   /* Find the location where (if we've hit a breakpoint) the
      breakpoint would be.  */
-  breakpoint_pc = read_pc_pid (ecs->ptid) - DECR_PC_AFTER_BREAK;
+  breakpoint_pc = read_pc_pid (ecs->ptid) - gdbarch_decr_pc_after_break
+                                           (current_gdbarch);
 
   if (SOFTWARE_SINGLE_STEP_P ())
     {
@@ -1173,8 +1206,12 @@ adjust_pc_after_break (struct execution_control_state *ecs)
       /* When using hardware single-step, a SIGTRAP is reported for
          both a completed single-step and a software breakpoint.  Need
          to differentiate between the two as the latter needs
-         adjusting but the former does not.  */
-      if (currently_stepping (ecs))
+         adjusting but the former does not.
+
+         When the thread to be examined does not match the current thread
+         context we can't use currently_stepping, so assume no
+         single-stepping in this case.  */
+      if (ptid_equal (ecs->ptid, inferior_ptid) && currently_stepping (ecs))
        {
          if (prev_pc == breakpoint_pc
              && software_breakpoint_inserted_here_p (breakpoint_pc))
@@ -1205,11 +1242,10 @@ int stepped_after_stopped_by_watchpoint;
 void
 handle_inferior_event (struct execution_control_state *ecs)
 {
-  /* NOTE: cagney/2003-03-28: If you're looking at this code and
-     thinking that the variable stepped_after_stopped_by_watchpoint
-     isn't used, then you're wrong!  The macro STOPPED_BY_WATCHPOINT,
-     defined in the file "config/pa/nm-hppah.h", accesses the variable
-     indirectly.  Mutter something rude about the HP merge.  */
+  /* NOTE: bje/2005-05-02: If you're looking at this code and thinking
+     that the variable stepped_after_stopped_by_watchpoint isn't used,
+     then you're wrong!  See remote.c:remote_stopped_data_address.  */
+
   int sw_single_step_trap_p = 0;
   int stopped_by_watchpoint = -1;      /* Mark as unknown.  */
 
@@ -1223,20 +1259,21 @@ handle_inferior_event (struct execution_control_state *ecs)
     {
     case infwait_thread_hop_state:
       if (debug_infrun)
-        printf_unfiltered ("infrun: infwait_thread_hop_state\n");
+        fprintf_unfiltered (gdb_stdlog, "infrun: infwait_thread_hop_state\n");
       /* Cancel the waiton_ptid. */
       ecs->waiton_ptid = pid_to_ptid (-1);
       break;
 
     case infwait_normal_state:
       if (debug_infrun)
-        printf_unfiltered ("infrun: infwait_normal_state\n");
+        fprintf_unfiltered (gdb_stdlog, "infrun: infwait_normal_state\n");
       stepped_after_stopped_by_watchpoint = 0;
       break;
 
     case infwait_nonstep_watch_state:
       if (debug_infrun)
-        printf_unfiltered ("infrun: infwait_nonstep_watch_state\n");
+        fprintf_unfiltered (gdb_stdlog,
+                           "infrun: infwait_nonstep_watch_state\n");
       insert_breakpoints ();
 
       /* FIXME-maybe: is this cleaner than setting a flag?  Does it
@@ -1246,11 +1283,11 @@ handle_inferior_event (struct execution_control_state *ecs)
       break;
 
     default:
-      internal_error (__FILE__, __LINE__, "bad switch");
+      internal_error (__FILE__, __LINE__, _("bad switch"));
     }
   ecs->infwait_state = infwait_normal_state;
 
-  flush_cached_frames ();
+  reinit_frame_cache ();
 
   /* If it's a new process, add it to the thread database */
 
@@ -1272,7 +1309,7 @@ handle_inferior_event (struct execution_control_state *ecs)
     {
     case TARGET_WAITKIND_LOADED:
       if (debug_infrun)
-        printf_unfiltered ("infrun: TARGET_WAITKIND_LOADED\n");
+        fprintf_unfiltered (gdb_stdlog, "infrun: TARGET_WAITKIND_LOADED\n");
       /* Ignore gracefully during startup of the inferior, as it
          might be the shell which has just loaded some objects,
          otherwise add the symbols for the newly loaded objects.  */
@@ -1318,14 +1355,14 @@ handle_inferior_event (struct execution_control_state *ecs)
 
     case TARGET_WAITKIND_SPURIOUS:
       if (debug_infrun)
-        printf_unfiltered ("infrun: TARGET_WAITKIND_SPURIOUS\n");
+        fprintf_unfiltered (gdb_stdlog, "infrun: TARGET_WAITKIND_SPURIOUS\n");
       resume (0, TARGET_SIGNAL_0);
       prepare_to_wait (ecs);
       return;
 
     case TARGET_WAITKIND_EXITED:
       if (debug_infrun)
-        printf_unfiltered ("infrun: TARGET_WAITKIND_EXITED\n");
+        fprintf_unfiltered (gdb_stdlog, "infrun: TARGET_WAITKIND_EXITED\n");
       target_terminal_ours (); /* Must do this before mourn anyway */
       print_stop_reason (EXITED, ecs->ws.value.integer);
 
@@ -1336,14 +1373,14 @@ handle_inferior_event (struct execution_control_state *ecs)
                                           (LONGEST) ecs->ws.value.integer));
       gdb_flush (gdb_stdout);
       target_mourn_inferior ();
-      singlestep_breakpoints_inserted_p = 0;   /*SOFTWARE_SINGLE_STEP_P() */
+      singlestep_breakpoints_inserted_p = 0;   /* SOFTWARE_SINGLE_STEP_P() */
       stop_print_frame = 0;
       stop_stepping (ecs);
       return;
 
     case TARGET_WAITKIND_SIGNALLED:
       if (debug_infrun)
-        printf_unfiltered ("infrun: TARGET_WAITKIND_SIGNALLED\n");
+        fprintf_unfiltered (gdb_stdlog, "infrun: TARGET_WAITKIND_SIGNALLED\n");
       stop_print_frame = 0;
       stop_signal = ecs->ws.value.sig;
       target_terminal_ours (); /* Must do this before mourn anyway */
@@ -1356,7 +1393,7 @@ handle_inferior_event (struct execution_control_state *ecs)
       target_mourn_inferior ();
 
       print_stop_reason (SIGNAL_EXITED, stop_signal);
-      singlestep_breakpoints_inserted_p = 0;   /*SOFTWARE_SINGLE_STEP_P() */
+      singlestep_breakpoints_inserted_p = 0;   /* SOFTWARE_SINGLE_STEP_P() */
       stop_stepping (ecs);
       return;
 
@@ -1365,13 +1402,19 @@ handle_inferior_event (struct execution_control_state *ecs)
     case TARGET_WAITKIND_FORKED:
     case TARGET_WAITKIND_VFORKED:
       if (debug_infrun)
-        printf_unfiltered ("infrun: TARGET_WAITKIND_FORKED\n");
+        fprintf_unfiltered (gdb_stdlog, "infrun: TARGET_WAITKIND_FORKED\n");
       stop_signal = TARGET_SIGNAL_TRAP;
       pending_follow.kind = ecs->ws.kind;
 
       pending_follow.fork_event.parent_pid = PIDGET (ecs->ptid);
       pending_follow.fork_event.child_pid = ecs->ws.value.related_pid;
 
+      if (!ptid_equal (ecs->ptid, inferior_ptid))
+       {
+         context_switch (ecs);
+         reinit_frame_cache ();
+       }
+
       stop_pc = read_pc ();
 
       stop_bpstat = bpstat_stop_status (stop_pc, ecs->ptid, 0);
@@ -1389,7 +1432,7 @@ handle_inferior_event (struct execution_control_state *ecs)
 
     case TARGET_WAITKIND_EXECD:
       if (debug_infrun)
-        printf_unfiltered ("infrun: TARGET_WAITKIND_EXECED\n");
+        fprintf_unfiltered (gdb_stdlog, "infrun: TARGET_WAITKIND_EXECD\n");
       stop_signal = TARGET_SIGNAL_TRAP;
 
       /* NOTE drow/2002-12-05: This code should be pushed down into the
@@ -1402,9 +1445,6 @@ handle_inferior_event (struct execution_control_state *ecs)
       if (inferior_ignoring_leading_exec_events)
        {
          inferior_ignoring_leading_exec_events--;
-         if (pending_follow.kind == TARGET_WAITKIND_VFORKED)
-           ENSURE_VFORKING_PARENT_REMAINS_STOPPED (pending_follow.fork_event.
-                                                   parent_pid);
          target_resume (ecs->ptid, 0, TARGET_SIGNAL_0);
          prepare_to_wait (ecs);
          return;
@@ -1430,6 +1470,12 @@ handle_inferior_event (struct execution_control_state *ecs)
       ecs->random_signal = !bpstat_explains_signal (stop_bpstat);
       inferior_ptid = ecs->saved_inferior_ptid;
 
+      if (!ptid_equal (ecs->ptid, inferior_ptid))
+       {
+         context_switch (ecs);
+         reinit_frame_cache ();
+       }
+
       /* If no catchpoint triggered for this, then keep going.  */
       if (ecs->random_signal)
        {
@@ -1443,7 +1489,7 @@ handle_inferior_event (struct execution_control_state *ecs)
          that's in a syscall.  It's frequently a losing proposition.  */
     case TARGET_WAITKIND_SYSCALL_ENTRY:
       if (debug_infrun)
-        printf_unfiltered ("infrun: TARGET_WAITKIND_SYSCALL_ENTRY\n");
+        fprintf_unfiltered (gdb_stdlog, "infrun: TARGET_WAITKIND_SYSCALL_ENTRY\n");
       resume (0, TARGET_SIGNAL_0);
       prepare_to_wait (ecs);
       return;
@@ -1455,14 +1501,14 @@ handle_inferior_event (struct execution_control_state *ecs)
          into user code.)  */
     case TARGET_WAITKIND_SYSCALL_RETURN:
       if (debug_infrun)
-        printf_unfiltered ("infrun: TARGET_WAITKIND_SYSCALL_RETURN\n");
+        fprintf_unfiltered (gdb_stdlog, "infrun: TARGET_WAITKIND_SYSCALL_RETURN\n");
       target_resume (ecs->ptid, 1, TARGET_SIGNAL_0);
       prepare_to_wait (ecs);
       return;
 
     case TARGET_WAITKIND_STOPPED:
       if (debug_infrun)
-        printf_unfiltered ("infrun: TARGET_WAITKIND_STOPPED\n");
+        fprintf_unfiltered (gdb_stdlog, "infrun: TARGET_WAITKIND_STOPPED\n");
       stop_signal = ecs->ws.value.sig;
       break;
 
@@ -1477,7 +1523,7 @@ handle_inferior_event (struct execution_control_state *ecs)
          reported multiple times without an intervening resume.  */
     case TARGET_WAITKIND_IGNORE:
       if (debug_infrun)
-        printf_unfiltered ("infrun: TARGET_WAITKIND_IGNORE\n");
+        fprintf_unfiltered (gdb_stdlog, "infrun: TARGET_WAITKIND_IGNORE\n");
       prepare_to_wait (ecs);
       return;
     }
@@ -1499,7 +1545,7 @@ handle_inferior_event (struct execution_control_state *ecs)
   stop_pc = read_pc_pid (ecs->ptid);
 
   if (debug_infrun)
-    printf_unfiltered ("infrun: stop_pc = 0x%s\n", paddr_nz (stop_pc));
+    fprintf_unfiltered (gdb_stdlog, "infrun: stop_pc = 0x%s\n", paddr_nz (stop_pc));
 
   if (stepping_past_singlestep_breakpoint)
     {
@@ -1516,9 +1562,9 @@ handle_inferior_event (struct execution_control_state *ecs)
       if (stop_signal == TARGET_SIGNAL_TRAP)
        {
          if (debug_infrun)
-           printf_unfiltered ("infrun: stepping_past_singlestep_breakpoint\n");
+           fprintf_unfiltered (gdb_stdlog, "infrun: stepping_past_singlestep_breakpoint\n");
          /* Pull the single step breakpoints out of the target.  */
-         SOFTWARE_SINGLE_STEP (0, 0);
+         remove_single_step_breakpoints ();
          singlestep_breakpoints_inserted_p = 0;
 
          ecs->random_signal = 0;
@@ -1555,6 +1601,14 @@ handle_inferior_event (struct execution_control_state *ecs)
        }
       else if (SOFTWARE_SINGLE_STEP_P () && singlestep_breakpoints_inserted_p)
        {
+         /* We have not context switched yet, so this should be true
+            no matter which thread hit the singlestep breakpoint.  */
+         gdb_assert (ptid_equal (inferior_ptid, singlestep_ptid));
+         if (debug_infrun)
+           fprintf_unfiltered (gdb_stdlog, "infrun: software single step "
+                               "trap for %s\n",
+                               target_pid_to_str (ecs->ptid));
+
          ecs->random_signal = 0;
          /* The call to in_thread_list is necessary because PTIDs sometimes
             change when we go from single-threaded to multi-threaded.  If
@@ -1563,9 +1617,46 @@ handle_inferior_event (struct execution_control_state *ecs)
          if (!ptid_equal (singlestep_ptid, ecs->ptid)
              && in_thread_list (singlestep_ptid))
            {
-             thread_hop_needed = 1;
-             stepping_past_singlestep_breakpoint = 1;
-             saved_singlestep_ptid = singlestep_ptid;
+             /* If the PC of the thread we were trying to single-step
+                has changed, discard this event (which we were going
+                to ignore anyway), and pretend we saw that thread
+                trap.  This prevents us continuously moving the
+                single-step breakpoint forward, one instruction at a
+                time.  If the PC has changed, then the thread we were
+                trying to single-step has trapped or been signalled,
+                but the event has not been reported to GDB yet.
+
+                There might be some cases where this loses signal
+                information, if a signal has arrived at exactly the
+                same time that the PC changed, but this is the best
+                we can do with the information available.  Perhaps we
+                should arrange to report all events for all threads
+                when they stop, or to re-poll the remote looking for
+                this particular thread (i.e. temporarily enable
+                schedlock).  */
+             if (read_pc_pid (singlestep_ptid) != singlestep_pc)
+              {
+                if (debug_infrun)
+                  fprintf_unfiltered (gdb_stdlog, "infrun: unexpected thread,"
+                                      " but expected thread advanced also\n");
+
+                /* The current context still belongs to
+                   singlestep_ptid.  Don't swap here, since that's
+                   the context we want to use.  Just fudge our
+                   state and continue.  */
+                 ecs->ptid = singlestep_ptid;
+                 stop_pc = read_pc_pid (ecs->ptid);
+               }
+             else
+              {
+                if (debug_infrun)
+                  fprintf_unfiltered (gdb_stdlog,
+                                      "infrun: unexpected thread\n");
+
+                thread_hop_needed = 1;
+                stepping_past_singlestep_breakpoint = 1;
+                saved_singlestep_ptid = singlestep_ptid;
+              }
            }
        }
 
@@ -1574,7 +1665,7 @@ handle_inferior_event (struct execution_control_state *ecs)
          int remove_status;
 
          if (debug_infrun)
-           printf_unfiltered ("infrun: thread_hop_needed\n");
+           fprintf_unfiltered (gdb_stdlog, "infrun: thread_hop_needed\n");
 
          /* Saw a breakpoint, but it was hit by the wrong thread.
             Just continue. */
@@ -1582,7 +1673,7 @@ handle_inferior_event (struct execution_control_state *ecs)
          if (SOFTWARE_SINGLE_STEP_P () && singlestep_breakpoints_inserted_p)
            {
              /* Pull the single step breakpoints out of the target. */
-             SOFTWARE_SINGLE_STEP (0, 0);
+             remove_single_step_breakpoints ();
              singlestep_breakpoints_inserted_p = 0;
            }
 
@@ -1642,20 +1733,18 @@ handle_inferior_event (struct execution_control_state *ecs)
   if (!ptid_equal (ecs->ptid, inferior_ptid))
     {
       if (debug_infrun)
-       printf_unfiltered ("infrun: context switch\n");
+       fprintf_unfiltered (gdb_stdlog, "infrun: context switch\n");
 
       context_switch (ecs);
 
       if (deprecated_context_hook)
        deprecated_context_hook (pid_to_thread_id (ecs->ptid));
-
-      flush_cached_frames ();
     }
 
   if (SOFTWARE_SINGLE_STEP_P () && singlestep_breakpoints_inserted_p)
     {
       /* Pull the single step breakpoints out of the target. */
-      SOFTWARE_SINGLE_STEP (0, 0);
+      remove_single_step_breakpoints ();
       singlestep_breakpoints_inserted_p = 0;
     }
 
@@ -1665,7 +1754,7 @@ handle_inferior_event (struct execution_control_state *ecs)
   if (HAVE_STEPPABLE_WATCHPOINT && STOPPED_BY_WATCHPOINT (ecs->ws))
     {
       if (debug_infrun)
-       printf_unfiltered ("infrun: STOPPED_BY_WATCHPOINT\n");
+       fprintf_unfiltered (gdb_stdlog, "infrun: STOPPED_BY_WATCHPOINT\n");
       resume (1, 0);
       prepare_to_wait (ecs);
       return;
@@ -1674,7 +1763,8 @@ handle_inferior_event (struct execution_control_state *ecs)
   /* It is far more common to need to disable a watchpoint to step
      the inferior over it.  FIXME.  What else might a debug
      register or page protection watchpoint scheme need here?  */
-  if (HAVE_NONSTEPPABLE_WATCHPOINT && STOPPED_BY_WATCHPOINT (ecs->ws))
+  if (gdbarch_have_nonsteppable_watchpoint (current_gdbarch)
+      && STOPPED_BY_WATCHPOINT (ecs->ws))
     {
       /* At this point, we are stopped at an instruction which has
          attempted to write to a piece of memory under control of
@@ -1694,7 +1784,7 @@ handle_inferior_event (struct execution_control_state *ecs)
          stop in the correct manner.  */
 
       if (debug_infrun)
-       printf_unfiltered ("infrun: STOPPED_BY_WATCHPOINT\n");
+       fprintf_unfiltered (gdb_stdlog, "infrun: STOPPED_BY_WATCHPOINT\n");
       remove_breakpoints ();
       registers_changed ();
       target_resume (ecs->ptid, 1, TARGET_SIGNAL_0);   /* Single step */
@@ -1725,7 +1815,6 @@ handle_inferior_event (struct execution_control_state *ecs)
   stop_print_frame = 1;
   ecs->random_signal = 0;
   stopped_by_random_signal = 0;
-  breakpoints_failed = 0;
 
   if (stop_signal == TARGET_SIGNAL_TRAP
       && trap_expected
@@ -1741,7 +1830,7 @@ handle_inferior_event (struct execution_control_state *ecs)
        = gdbarch_single_step_through_delay (current_gdbarch,
                                             get_current_frame ());
       if (debug_infrun && step_through_delay)
-       printf_unfiltered ("infrun: step through delay\n");
+       fprintf_unfiltered (gdb_stdlog, "infrun: step through delay\n");
       if (step_range_end == 0 && step_through_delay)
        {
          /* The user issued a continue when stopped at a breakpoint.
@@ -1791,7 +1880,7 @@ handle_inferior_event (struct execution_control_state *ecs)
       if (stop_signal == TARGET_SIGNAL_TRAP && stop_after_trap)
        {
           if (debug_infrun)
-           printf_unfiltered ("infrun: stopped\n");
+           fprintf_unfiltered (gdb_stdlog, "infrun: stopped\n");
          stop_print_frame = 0;
          stop_stepping (ecs);
          return;
@@ -1802,7 +1891,7 @@ handle_inferior_event (struct execution_control_state *ecs)
       if (stop_soon == STOP_QUIETLY)
        {
           if (debug_infrun)
-           printf_unfiltered ("infrun: quietly stopped\n");
+           fprintf_unfiltered (gdb_stdlog, "infrun: quietly stopped\n");
          stop_stepping (ecs);
          return;
        }
@@ -1824,7 +1913,7 @@ handle_inferior_event (struct execution_control_state *ecs)
       if (stop_signal == TARGET_SIGNAL_TRAP && trap_expected)
        {
           if (debug_infrun)
-           printf_unfiltered ("infrun: trap expected\n");
+           fprintf_unfiltered (gdb_stdlog, "infrun: trap expected\n");
          bpstat_clear (&stop_bpstat);
        }
       else
@@ -1888,7 +1977,7 @@ process_event_stop_test:
       int printed = 0;
 
       if (debug_infrun)
-        printf_unfiltered ("infrun: random signal %d\n", stop_signal);
+        fprintf_unfiltered (gdb_stdlog, "infrun: random signal %d\n", stop_signal);
 
       stopped_by_random_signal = 1;
 
@@ -1927,14 +2016,19 @@ process_event_stop_test:
             code paths as single-step - set a breakpoint at the
             signal return address and then, once hit, step off that
             breakpoint.  */
+
          insert_step_resume_breakpoint_at_frame (get_current_frame ());
          ecs->step_after_step_resume_breakpoint = 1;
+         keep_going (ecs);
+         return;
        }
-      else if (step_range_end != 0
-              && stop_signal != TARGET_SIGNAL_0
-              && stop_pc >= step_range_start && stop_pc < step_range_end
-              && frame_id_eq (get_frame_id (get_current_frame ()),
-                              step_frame_id))
+
+      if (step_range_end != 0
+         && stop_signal != TARGET_SIGNAL_0
+         && stop_pc >= step_range_start && stop_pc < step_range_end
+         && frame_id_eq (get_frame_id (get_current_frame ()),
+                         step_frame_id)
+         && step_resume_breakpoint == NULL)
        {
          /* The inferior is about to take a signal that will take it
             out of the single step range.  Set a breakpoint at the
@@ -1946,7 +2040,16 @@ process_event_stop_test:
             while in the single-step range.  Nested signals aren't a
             problem as they eventually all return.  */
          insert_step_resume_breakpoint_at_frame (get_current_frame ());
+         keep_going (ecs);
+         return;
        }
+
+      /* Note: step_resume_breakpoint may be non-NULL.  This occures
+        when either there's a nested signal, or when there's a
+        pending signal enabled just as the signal handler returns
+        (leaving the inferior at the step-resume-breakpoint without
+        actually executing it).  Either way continue until the
+        breakpoint is really hit.  */
       keep_going (ecs);
       return;
     }
@@ -1970,11 +2073,13 @@ process_event_stop_test:
           duration of this command.  Then, install a temporary
           breakpoint at the target of the jmp_buf. */
         if (debug_infrun)
-         printf_unfiltered ("infrun: BPSTATE_WHAT_SET_LONGJMP_RESUME\n");
+         fprintf_unfiltered (gdb_stdlog, "infrun: BPSTAT_WHAT_SET_LONGJMP_RESUME\n");
        disable_longjmp_breakpoint ();
        remove_breakpoints ();
        breakpoints_inserted = 0;
-       if (!GET_LONGJMP_TARGET_P () || !GET_LONGJMP_TARGET (&jmp_buf_pc))
+       if (!gdbarch_get_longjmp_target_p (current_gdbarch)
+           || !gdbarch_get_longjmp_target (current_gdbarch,
+                                           get_current_frame (), &jmp_buf_pc))
          {
            keep_going (ecs);
            return;
@@ -1995,7 +2100,7 @@ process_event_stop_test:
       case BPSTAT_WHAT_CLEAR_LONGJMP_RESUME:
       case BPSTAT_WHAT_CLEAR_LONGJMP_RESUME_SINGLE:
         if (debug_infrun)
-         printf_unfiltered ("infrun: BPSTATE_WHAT_CLEAR_LONGJMP_RESUME\n");
+         fprintf_unfiltered (gdb_stdlog, "infrun: BPSTAT_WHAT_CLEAR_LONGJMP_RESUME\n");
        remove_breakpoints ();
        breakpoints_inserted = 0;
        disable_longjmp_breakpoint ();
@@ -2006,11 +2111,9 @@ process_event_stop_test:
 
       case BPSTAT_WHAT_SINGLE:
         if (debug_infrun)
-         printf_unfiltered ("infrun: BPSTATE_WHAT_SINGLE\n");
+         fprintf_unfiltered (gdb_stdlog, "infrun: BPSTAT_WHAT_SINGLE\n");
        if (breakpoints_inserted)
-         {
-           remove_breakpoints ();
-         }
+         remove_breakpoints ();
        breakpoints_inserted = 0;
        ecs->another_trap = 1;
        /* Still need to check other stuff, at least the case
@@ -2019,7 +2122,7 @@ process_event_stop_test:
 
       case BPSTAT_WHAT_STOP_NOISY:
         if (debug_infrun)
-         printf_unfiltered ("infrun: BPSTATE_WHAT_STOP_NOISY\n");
+         fprintf_unfiltered (gdb_stdlog, "infrun: BPSTAT_WHAT_STOP_NOISY\n");
        stop_print_frame = 1;
 
        /* We are about to nuke the step_resume_breakpointt via the
@@ -2030,7 +2133,7 @@ process_event_stop_test:
 
       case BPSTAT_WHAT_STOP_SILENT:
         if (debug_infrun)
-         printf_unfiltered ("infrun: BPSTATE_WHAT_STOP_SILENT\n");
+         fprintf_unfiltered (gdb_stdlog, "infrun: BPSTAT_WHAT_STOP_SILENT\n");
        stop_print_frame = 0;
 
        /* We are about to nuke the step_resume_breakpoin via the
@@ -2058,7 +2161,7 @@ process_event_stop_test:
           the one deleted is the one currently stopped at.  MVS  */
 
         if (debug_infrun)
-         printf_unfiltered ("infrun: BPSTATE_WHAT_STEP_RESUME\n");
+         fprintf_unfiltered (gdb_stdlog, "infrun: BPSTAT_WHAT_STEP_RESUME\n");
 
        if (step_resume_breakpoint == NULL)
          {
@@ -2080,21 +2183,11 @@ process_event_stop_test:
          }
        break;
 
-      case BPSTAT_WHAT_THROUGH_SIGTRAMP:
-        if (debug_infrun)
-         printf_unfiltered ("infrun: BPSTATE_WHAT_THROUGH_SIGTRAMP\n");
-       /* If were waiting for a trap, hitting the step_resume_break
-          doesn't count as getting it.  */
-       if (trap_expected)
-         ecs->another_trap = 1;
-       break;
-
       case BPSTAT_WHAT_CHECK_SHLIBS:
       case BPSTAT_WHAT_CHECK_SHLIBS_RESUME_FROM_HOOK:
-#ifdef SOLIB_ADD
        {
           if (debug_infrun)
-           printf_unfiltered ("infrun: BPSTATE_WHAT_CHECK_SHLIBS\n");
+           fprintf_unfiltered (gdb_stdlog, "infrun: BPSTAT_WHAT_CHECK_SHLIBS\n");
          /* Remove breakpoints, we eventually want to step over the
             shlib event breakpoint, and SOLIB_ADD might adjust
             breakpoint addresses via breakpoint_re_set.  */
@@ -2122,7 +2215,11 @@ process_event_stop_test:
             exec/process stratum, instead relying on the target stack
             to propagate relevant changes (stop, section table
             changed, ...) up to other layers.  */
+#ifdef SOLIB_ADD
          SOLIB_ADD (NULL, 0, &current_target, auto_solib_add);
+#else
+         solib_add (NULL, 0, &current_target, auto_solib_add);
+#endif
          target_terminal_inferior ();
 
          /* Try to reenable shared library breakpoints, additional
@@ -2181,7 +2278,6 @@ process_event_stop_test:
              break;
            }
        }
-#endif
        break;
 
       case BPSTAT_WHAT_LAST:
@@ -2198,9 +2294,9 @@ process_event_stop_test:
      test for stepping.  But, if not stepping,
      do not stop.  */
 
-  /* Are we stepping to get the inferior out of the dynamic
-     linker's hook (and possibly the dld itself) after catching
-     a shlib event? */
+  /* Are we stepping to get the inferior out of the dynamic linker's
+     hook (and possibly the dld itself) after catching a shlib
+     event?  */
   if (ecs->stepping_through_solib_after_catch)
     {
 #if defined(SOLIB_ADD)
@@ -2208,14 +2304,14 @@ process_event_stop_test:
       if (SOLIB_IN_DYNAMIC_LINKER (PIDGET (ecs->ptid), stop_pc))
        {
           if (debug_infrun)
-           printf_unfiltered ("infrun: stepping in dynamic linker\n");
+           fprintf_unfiltered (gdb_stdlog, "infrun: stepping in dynamic linker\n");
          ecs->another_trap = 1;
          keep_going (ecs);
          return;
        }
 #endif
       if (debug_infrun)
-        printf_unfiltered ("infrun: step past dynamic linker\n");
+        fprintf_unfiltered (gdb_stdlog, "infrun: step past dynamic linker\n");
       /* Else, stop and report the catchpoint(s) whose triggering
          caused us to begin stepping. */
       ecs->stepping_through_solib_after_catch = 0;
@@ -2230,7 +2326,8 @@ process_event_stop_test:
   if (step_resume_breakpoint)
     {
       if (debug_infrun)
-        printf_unfiltered ("infrun: step-resume breakpoint\n");
+        fprintf_unfiltered (gdb_stdlog,
+                            "infrun: step-resume breakpoint is inserted\n");
 
       /* Having a step-resume breakpoint overrides anything
          else having to do with stepping commands until
@@ -2242,7 +2339,7 @@ process_event_stop_test:
   if (step_range_end == 0)
     {
       if (debug_infrun)
-        printf_unfiltered ("infrun: no stepping, continue\n");
+        fprintf_unfiltered (gdb_stdlog, "infrun: no stepping, continue\n");
       /* Likewise if we aren't even stepping.  */
       keep_going (ecs);
       return;
@@ -2256,7 +2353,7 @@ process_event_stop_test:
   if (stop_pc >= step_range_start && stop_pc < step_range_end)
     {
       if (debug_infrun)
-        printf_unfiltered ("infrun: stepping inside range [0x%s-0x%s]\n",
+        fprintf_unfiltered (gdb_stdlog, "infrun: stepping inside range [0x%s-0x%s]\n",
                            paddr_nz (step_range_start),
                            paddr_nz (step_range_end));
       keep_going (ecs);
@@ -2270,13 +2367,18 @@ process_event_stop_test:
      until we exit the run time loader code and reach the callee's
      address.  */
   if (step_over_calls == STEP_OVER_UNDEBUGGABLE
-      && IN_SOLIB_DYNSYM_RESOLVE_CODE (stop_pc))
+#ifdef IN_SOLIB_DYNSYM_RESOLVE_CODE
+      && IN_SOLIB_DYNSYM_RESOLVE_CODE (stop_pc)
+#else
+      && in_solib_dynsym_resolve_code (stop_pc)
+#endif
+      )
     {
       CORE_ADDR pc_after_resolver =
        gdbarch_skip_solib_resolver (current_gdbarch, stop_pc);
 
       if (debug_infrun)
-        printf_unfiltered ("infrun: stepped into dynsym resolve code\n");
+        fprintf_unfiltered (gdb_stdlog, "infrun: stepped into dynsym resolve code\n");
 
       if (pc_after_resolver)
        {
@@ -2299,7 +2401,7 @@ process_event_stop_test:
       && get_frame_type (get_current_frame ()) == SIGTRAMP_FRAME)
     {
       if (debug_infrun)
-        printf_unfiltered ("infrun: stepped into signal trampoline\n");
+        fprintf_unfiltered (gdb_stdlog, "infrun: stepped into signal trampoline\n");
       /* The inferior, while doing a "step" or "next", has ended up in
          a signal trampoline (either by a signal being delivered or by
          the signal handler returning).  Just single-step until the
@@ -2309,13 +2411,21 @@ process_event_stop_test:
       return;
     }
 
-  if (frame_id_eq (frame_unwind_id (get_current_frame ()), step_frame_id))
+  /* Check for subroutine calls.  The check for the current frame
+     equalling the step ID is not necessary - the check of the
+     previous frame's ID is sufficient - but it is a common case and
+     cheaper than checking the previous frame's ID.
+
+     NOTE: frame_id_eq will never report two invalid frame IDs as
+     being equal, so to get into this block, both the current and
+     previous frame must have valid frame IDs.  */
+  if (!frame_id_eq (get_frame_id (get_current_frame ()), step_frame_id)
+      && frame_id_eq (frame_unwind_id (get_current_frame ()), step_frame_id))
     {
-      /* It's a subroutine call.  */
       CORE_ADDR real_stop_pc;
 
       if (debug_infrun)
-        printf_unfiltered ("infrun: stepped into subroutine\n");
+        fprintf_unfiltered (gdb_stdlog, "infrun: stepped into subroutine\n");
 
       if ((step_over_calls == STEP_OVER_NONE)
          || ((step_range_end == 1)
@@ -2338,7 +2448,7 @@ process_event_stop_test:
          /* We're doing a "next", set a breakpoint at callee's return
             address (the address at which the caller will
             resume).  */
-         insert_step_resume_breakpoint_at_frame (get_prev_frame (get_current_frame ()));
+         insert_step_resume_breakpoint_at_caller (get_current_frame ());
          keep_going (ecs);
          return;
        }
@@ -2348,13 +2458,20 @@ process_event_stop_test:
          function.  That's what tells us (a) whether we want to step
          into it at all, and (b) what prologue we want to run to the
          end of, if we do step into it.  */
-      real_stop_pc = skip_language_trampoline (stop_pc);
+      real_stop_pc = skip_language_trampoline (get_current_frame (), stop_pc);
       if (real_stop_pc == 0)
-       real_stop_pc = SKIP_TRAMPOLINE_CODE (stop_pc);
+       real_stop_pc = gdbarch_skip_trampoline_code
+                        (current_gdbarch, get_current_frame (), stop_pc);
       if (real_stop_pc != 0)
        ecs->stop_func_start = real_stop_pc;
 
-      if (IN_SOLIB_DYNSYM_RESOLVE_CODE (ecs->stop_func_start))
+      if (
+#ifdef IN_SOLIB_DYNSYM_RESOLVE_CODE
+         IN_SOLIB_DYNSYM_RESOLVE_CODE (ecs->stop_func_start)
+#else
+         in_solib_dynsym_resolve_code (ecs->stop_func_start)
+#endif
+)
        {
          struct symtab_and_line sr_sal;
          init_sal (&sr_sal);
@@ -2395,20 +2512,23 @@ process_event_stop_test:
 
       /* Set a breakpoint at callee's return address (the address at
          which the caller will resume).  */
-      insert_step_resume_breakpoint_at_frame (get_prev_frame (get_current_frame ()));
+      insert_step_resume_breakpoint_at_caller (get_current_frame ());
       keep_going (ecs);
       return;
     }
 
   /* If we're in the return path from a shared library trampoline,
      we want to proceed through the trampoline when stepping.  */
-  if (IN_SOLIB_RETURN_TRAMPOLINE (stop_pc, ecs->stop_func_name))
+  if (gdbarch_in_solib_return_trampoline (current_gdbarch,
+                                         stop_pc, ecs->stop_func_name))
     {
       /* Determine where this trampoline returns.  */
-      CORE_ADDR real_stop_pc = SKIP_TRAMPOLINE_CODE (stop_pc);
+      CORE_ADDR real_stop_pc;
+      real_stop_pc = gdbarch_skip_trampoline_code
+                      (current_gdbarch, get_current_frame (), stop_pc);
 
       if (debug_infrun)
-        printf_unfiltered ("infrun: stepped into solib return tramp\n");
+        fprintf_unfiltered (gdb_stdlog, "infrun: stepped into solib return tramp\n");
 
       /* Only proceed through if we know where it's going.  */
       if (real_stop_pc)
@@ -2432,22 +2552,28 @@ process_event_stop_test:
        }
     }
 
+  ecs->sal = find_pc_line (stop_pc, 0);
+
   /* NOTE: tausq/2004-05-24: This if block used to be done before all
      the trampoline processing logic, however, there are some trampolines 
      that have no names, so we should do trampoline handling first.  */
   if (step_over_calls == STEP_OVER_UNDEBUGGABLE
-      && ecs->stop_func_name == NULL)
+      && ecs->stop_func_name == NULL
+      && ecs->sal.line == 0)
     {
       if (debug_infrun)
-        printf_unfiltered ("infrun: stepped into undebuggable function\n");
+        fprintf_unfiltered (gdb_stdlog, "infrun: stepped into undebuggable function\n");
 
       /* The inferior just stepped into, or returned to, an
-         undebuggable function (where there is no symbol, not even a
-         minimal symbol, corresponding to the address where the
+         undebuggable function (where there is no debugging information
+         and no line number corresponding to the address where the
          inferior stopped).  Since we want to skip this kind of code,
          we keep going until the inferior returns from this
-         function.  */
-      if (step_stop_if_no_debug)
+         function - unless the user has asked us not to (via
+         set step-mode) or we no longer know how to get back
+         to the call site.  */
+      if (step_stop_if_no_debug
+         || !frame_id_p (frame_unwind_id (get_current_frame ())))
        {
          /* If we have no line number and the step-stop-if-no-debug
             is set, we stop the step so that the user has a chance to
@@ -2461,7 +2587,7 @@ process_event_stop_test:
        {
          /* Set a breakpoint at callee's return address (the address
             at which the caller will resume).  */
-         insert_step_resume_breakpoint_at_frame (get_prev_frame (get_current_frame ()));
+         insert_step_resume_breakpoint_at_caller (get_current_frame ());
          keep_going (ecs);
          return;
        }
@@ -2472,15 +2598,13 @@ process_event_stop_test:
       /* It is stepi or nexti.  We always want to stop stepping after
          one instruction.  */
       if (debug_infrun)
-        printf_unfiltered ("infrun: stepi/nexti\n");
+        fprintf_unfiltered (gdb_stdlog, "infrun: stepi/nexti\n");
       stop_step = 1;
       print_stop_reason (END_STEPPING_RANGE, 0);
       stop_stepping (ecs);
       return;
     }
 
-  ecs->sal = find_pc_line (stop_pc, 0);
-
   if (ecs->sal.line == 0)
     {
       /* We have no line number information.  That means to stop
@@ -2488,7 +2612,7 @@ process_event_stop_test:
          when we do "s" in a function with no line numbers,
          or can this happen as a result of a return or longjmp?).  */
       if (debug_infrun)
-        printf_unfiltered ("infrun: no line number info\n");
+        fprintf_unfiltered (gdb_stdlog, "infrun: no line number info\n");
       stop_step = 1;
       print_stop_reason (END_STEPPING_RANGE, 0);
       stop_stepping (ecs);
@@ -2504,7 +2628,7 @@ process_event_stop_test:
          That is said to make things like for (;;) statements work
          better.  */
       if (debug_infrun)
-        printf_unfiltered ("infrun: stepped to a different line\n");
+        fprintf_unfiltered (gdb_stdlog, "infrun: stepped to a different line\n");
       stop_step = 1;
       print_stop_reason (END_STEPPING_RANGE, 0);
       stop_stepping (ecs);
@@ -2526,7 +2650,7 @@ process_event_stop_test:
          in which after skipping the prologue we better stop even though
          we will be in mid-line.  */
       if (debug_infrun)
-        printf_unfiltered ("infrun: stepped to a different function\n");
+        fprintf_unfiltered (gdb_stdlog, "infrun: stepped to a different function\n");
       stop_step = 1;
       print_stop_reason (END_STEPPING_RANGE, 0);
       stop_stepping (ecs);
@@ -2564,7 +2688,7 @@ process_event_stop_test:
   }
 
   if (debug_infrun)
-     printf_unfiltered ("infrun: keep going\n");
+     fprintf_unfiltered (gdb_stdlog, "infrun: keep going\n");
   keep_going (ecs);
 }
 
@@ -2591,7 +2715,8 @@ step_into_function (struct execution_control_state *ecs)
 
   s = find_pc_symtab (stop_pc);
   if (s && s->language != language_asm)
-    ecs->stop_func_start = SKIP_PROLOGUE (ecs->stop_func_start);
+    ecs->stop_func_start = gdbarch_skip_prologue
+                            (current_gdbarch, ecs->stop_func_start);
 
   ecs->sal = find_pc_line (ecs->stop_func_start, 0);
   /* Use the step_resume_break to step until the end of the prologue,
@@ -2654,7 +2779,7 @@ step_into_function (struct execution_control_state *ecs)
   keep_going (ecs);
 }
 
-/* Insert a "step resume breakpoint" at SR_SAL with frame ID SR_ID.
+/* Insert a "step-resume breakpoint" at SR_SAL with frame ID SR_ID.
    This is used to both functions and to skip over code.  */
 
 static void
@@ -2665,25 +2790,24 @@ insert_step_resume_breakpoint_at_sal (struct symtab_and_line sr_sal,
      thread, so we should never be setting a new
      step_resume_breakpoint when one is already active.  */
   gdb_assert (step_resume_breakpoint == NULL);
+
+  if (debug_infrun)
+    fprintf_unfiltered (gdb_stdlog,
+                       "infrun: inserting step-resume breakpoint at 0x%s\n",
+                       paddr_nz (sr_sal.pc));
+
   step_resume_breakpoint = set_momentary_breakpoint (sr_sal, sr_id,
                                                     bp_step_resume);
   if (breakpoints_inserted)
     insert_breakpoints ();
 }
-                                     
-/* Insert a "step resume breakpoint" at RETURN_FRAME.pc.  This is used
-   to skip a function (next, skip-no-debug) or signal.  It's assumed
-   that the function/signal handler being skipped eventually returns
-   to the breakpoint inserted at RETURN_FRAME.pc.
 
-   For the skip-function case, the function may have been reached by
-   either single stepping a call / return / signal-return instruction,
-   or by hitting a breakpoint.  In all cases, the RETURN_FRAME belongs
-   to the skip-function's caller.
+/* Insert a "step-resume breakpoint" at RETURN_FRAME.pc.  This is used
+   to skip a potential signal handler.
 
-   For the signals case, this is called with the interrupted
-   function's frame.  The signal handler, when it returns, will resume
-   the interrupted function at RETURN_FRAME.pc.  */
+   This is called with the interrupted function's frame.  The signal
+   handler, when it returns, will resume the interrupted function at
+   RETURN_FRAME.pc.  */
 
 static void
 insert_step_resume_breakpoint_at_frame (struct frame_info *return_frame)
@@ -2692,17 +2816,51 @@ insert_step_resume_breakpoint_at_frame (struct frame_info *return_frame)
 
   init_sal (&sr_sal);          /* initialize to zeros */
 
-  sr_sal.pc = ADDR_BITS_REMOVE (get_frame_pc (return_frame));
+  sr_sal.pc = gdbarch_addr_bits_remove
+               (current_gdbarch, get_frame_pc (return_frame));
   sr_sal.section = find_pc_overlay (sr_sal.pc);
 
   insert_step_resume_breakpoint_at_sal (sr_sal, get_frame_id (return_frame));
 }
 
+/* Similar to insert_step_resume_breakpoint_at_frame, except
+   but a breakpoint at the previous frame's PC.  This is used to
+   skip a function after stepping into it (for "next" or if the called
+   function has no debugging information).
+
+   The current function has almost always been reached by single
+   stepping a call or return instruction.  NEXT_FRAME belongs to the
+   current function, and the breakpoint will be set at the caller's
+   resume address.
+
+   This is a separate function rather than reusing
+   insert_step_resume_breakpoint_at_frame in order to avoid
+   get_prev_frame, which may stop prematurely (see the implementation
+   of frame_unwind_id for an example).  */
+
+static void
+insert_step_resume_breakpoint_at_caller (struct frame_info *next_frame)
+{
+  struct symtab_and_line sr_sal;
+
+  /* We shouldn't have gotten here if we don't know where the call site
+     is.  */
+  gdb_assert (frame_id_p (frame_unwind_id (next_frame)));
+
+  init_sal (&sr_sal);          /* initialize to zeros */
+
+  sr_sal.pc = gdbarch_addr_bits_remove
+               (current_gdbarch, frame_pc_unwind (next_frame));
+  sr_sal.section = find_pc_overlay (sr_sal.pc);
+
+  insert_step_resume_breakpoint_at_sal (sr_sal, frame_unwind_id (next_frame));
+}
+
 static void
 stop_stepping (struct execution_control_state *ecs)
 {
   if (debug_infrun)
-    printf_unfiltered ("infrun: stop_stepping\n");
+    fprintf_unfiltered (gdb_stdlog, "infrun: stop_stepping\n");
 
   /* Let callers know we don't want to wait for the inferior anymore.  */
   ecs->wait_some_more = 0;
@@ -2741,8 +2899,9 @@ keep_going (struct execution_control_state *ecs)
 
       if (!breakpoints_inserted && !ecs->another_trap)
        {
-         breakpoints_failed = insert_breakpoints ();
-         if (breakpoints_failed)
+         /* Stop stepping when inserting breakpoints
+            has failed.  */
+         if (insert_breakpoints () != 0)
            {
              stop_stepping (ecs);
              return;
@@ -2782,7 +2941,7 @@ static void
 prepare_to_wait (struct execution_control_state *ecs)
 {
   if (debug_infrun)
-    printf_unfiltered ("infrun: prepare_to_wait\n");
+    fprintf_unfiltered (gdb_stdlog, "infrun: prepare_to_wait\n");
   if (ecs->infwait_state == infwait_normal_state)
     {
       overlay_cache_invalid = 1;
@@ -2813,10 +2972,6 @@ print_stop_reason (enum inferior_stop_reason stop_reason, int stop_info)
 {
   switch (stop_reason)
     {
-    case STOP_UNKNOWN:
-      /* We don't deal with these cases from handle_inferior_event()
-         yet. */
-      break;
     case END_STEPPING_RANGE:
       /* We are done with a step/next/si/ni command. */
       /* For now print nothing. */
@@ -2824,17 +2979,17 @@ print_stop_reason (enum inferior_stop_reason stop_reason, int stop_info)
          operation for n > 1 */
       if (!step_multi || !stop_step)
        if (ui_out_is_mi_like_p (uiout))
-         ui_out_field_string (uiout, "reason", "end-stepping-range");
-      break;
-    case BREAKPOINT_HIT:
-      /* We found a breakpoint. */
-      /* For now print nothing. */
+         ui_out_field_string
+           (uiout, "reason",
+            async_reason_lookup (EXEC_ASYNC_END_STEPPING_RANGE));
       break;
     case SIGNAL_EXITED:
       /* The inferior was terminated by a signal. */
       annotate_signalled ();
       if (ui_out_is_mi_like_p (uiout))
-       ui_out_field_string (uiout, "reason", "exited-signalled");
+       ui_out_field_string
+         (uiout, "reason",
+          async_reason_lookup (EXEC_ASYNC_EXITED_SIGNALLED));
       ui_out_text (uiout, "\nProgram terminated with signal ");
       annotate_signal_name ();
       ui_out_field_string (uiout, "signal-name",
@@ -2854,7 +3009,8 @@ print_stop_reason (enum inferior_stop_reason stop_reason, int stop_info)
       if (stop_info)
        {
          if (ui_out_is_mi_like_p (uiout))
-           ui_out_field_string (uiout, "reason", "exited");
+           ui_out_field_string (uiout, "reason", 
+                                async_reason_lookup (EXEC_ASYNC_EXITED));
          ui_out_text (uiout, "\nProgram exited with code ");
          ui_out_field_fmt (uiout, "exit-code", "0%o",
                            (unsigned int) stop_info);
@@ -2863,9 +3019,13 @@ print_stop_reason (enum inferior_stop_reason stop_reason, int stop_info)
       else
        {
          if (ui_out_is_mi_like_p (uiout))
-           ui_out_field_string (uiout, "reason", "exited-normally");
+           ui_out_field_string
+             (uiout, "reason",
+              async_reason_lookup (EXEC_ASYNC_EXITED_NORMALLY));
          ui_out_text (uiout, "\nProgram exited normally.\n");
        }
+      /* Support the --return-child-result option.  */
+      return_child_result_value = stop_info;
       break;
     case SIGNAL_RECEIVED:
       /* Signal received. The signal table tells us to print about
@@ -2874,7 +3034,8 @@ print_stop_reason (enum inferior_stop_reason stop_reason, int stop_info)
       ui_out_text (uiout, "\nProgram received signal ");
       annotate_signal_name ();
       if (ui_out_is_mi_like_p (uiout))
-       ui_out_field_string (uiout, "reason", "signal-received");
+       ui_out_field_string
+         (uiout, "reason", async_reason_lookup (EXEC_ASYNC_SIGNAL_RECEIVED));
       ui_out_field_string (uiout, "signal-name",
                           target_signal_to_name (stop_info));
       annotate_signal_name_end ();
@@ -2887,7 +3048,7 @@ print_stop_reason (enum inferior_stop_reason stop_reason, int stop_info)
       break;
     default:
       internal_error (__FILE__, __LINE__,
-                     "print_stop_reason: unrecognized enum value");
+                     _("print_stop_reason: unrecognized enum value"));
       break;
     }
 }
@@ -2922,7 +3083,7 @@ normal_stop (void)
       && last.kind != TARGET_WAITKIND_EXITED)
     {
       target_terminal_ours_for_output ();
-      printf_filtered ("[Switching to %s]\n",
+      printf_filtered (_("[Switching to %s]\n"),
                       target_pid_or_tid_to_str (inferior_ptid));
       previous_inferior_ptid = inferior_ptid;
     }
@@ -2930,12 +3091,12 @@ normal_stop (void)
   /* NOTE drow/2004-01-17: Is this still necessary?  */
   /* Make sure that the current_frame's pc is correct.  This
      is a correction for setting up the frame info before doing
-     DECR_PC_AFTER_BREAK */
+     gdbarch_decr_pc_after_break */
   if (target_has_execution)
     /* FIXME: cagney/2002-12-06: Has the PC changed?  Thanks to
-       DECR_PC_AFTER_BREAK, the program counter can change.  Ask the
+       gdbarch_decr_pc_after_break, the program counter can change.  Ask the
        frame code to check for this and sort out any resultant mess.
-       DECR_PC_AFTER_BREAK needs to just go away.  */
+       gdbarch_decr_pc_after_break needs to just go away.  */
     deprecated_update_frame_pc_hack (get_current_frame (), read_pc ());
 
   if (target_has_execution && breakpoints_inserted)
@@ -2943,10 +3104,10 @@ normal_stop (void)
       if (remove_breakpoints ())
        {
          target_terminal_ours_for_output ();
-         printf_filtered ("Cannot remove breakpoints because ");
-         printf_filtered ("program is no longer writable.\n");
-         printf_filtered ("It might be running in another process.\n");
-         printf_filtered ("Further execution is probably impossible.\n");
+         printf_filtered (_("\
+Cannot remove breakpoints because program is no longer writable.\n\
+It might be running in another process.\n\
+Further execution is probably impossible.\n"));
        }
     }
   breakpoints_inserted = 0;
@@ -2969,6 +3130,12 @@ normal_stop (void)
 
   target_terminal_ours ();
 
+  /* Set the current source location.  This will also happen if we
+     display the frame below, but the current SAL will be incorrect
+     during a user hook-stop function.  */
+  if (target_has_stack && !stop_stack_dummy)
+    set_current_sal_from_frame (get_current_frame (), 1);
+
   /* Look up the hook_stop and run it (CLI internally handles problem
      of stop_command's pre-hook not existing).  */
   if (stop_command)
@@ -2996,7 +3163,7 @@ normal_stop (void)
          bpstat_print() contains the logic deciding in detail
          what to print, based on the event(s) that just occurred. */
 
-      if (stop_print_frame && deprecated_selected_frame)
+      if (stop_print_frame)
        {
          int bpstat_ret;
          int source_flag;
@@ -3028,12 +3195,8 @@ normal_stop (void)
              do_frame_printing = 0;
              break;
            default:
-             internal_error (__FILE__, __LINE__, "Unknown value.");
+             internal_error (__FILE__, __LINE__, _("Unknown value."));
            }
-         /* For mi, have the same behavior every time we stop:
-            print everything but the source line. */
-         if (ui_out_is_mi_like_p (uiout))
-           source_flag = LOC_AND_ADDRESS;
 
          if (ui_out_is_mi_like_p (uiout))
            ui_out_field_int (uiout, "thread-id",
@@ -3056,7 +3219,7 @@ normal_stop (void)
   if (proceed_to_finish)
     /* NB: The copy goes through to the target picking up the value of
        all the registers.  */
-    regcache_cpy (stop_registers, current_regcache);
+    regcache_cpy (stop_registers, get_current_regcache ());
 
   if (stop_stack_dummy)
     {
@@ -3128,8 +3291,8 @@ signal_pass_update (int signo, int state)
 static void
 sig_print_header (void)
 {
-  printf_filtered ("\
-Signal        Stop\tPrint\tPass to program\tDescription\n");
+  printf_filtered (_("\
+Signal        Stop\tPrint\tPass to program\tDescription\n"));
 }
 
 static void
@@ -3165,7 +3328,7 @@ handle_command (char *args, int from_tty)
 
   if (args == NULL)
     {
-      error_no_arg ("signal to handle");
+      error_no_arg (_("signal to handle"));
     }
 
   /* Allocate and zero an array of flags for which signals to handle. */
@@ -3272,7 +3435,7 @@ handle_command (char *args, int from_tty)
          else
            {
              /* Not a number and not a recognized flag word => complain.  */
-             error ("Unrecognized or ambiguous flag word: \"%s\".", *argv);
+             error (_("Unrecognized or ambiguous flag word: \"%s\"."), *argv);
            }
        }
 
@@ -3294,7 +3457,7 @@ Are you sure you want to change it? ", target_signal_to_name ((enum target_signa
                    }
                  else
                    {
-                     printf_unfiltered ("Not confirmed, unchanged.\n");
+                     printf_unfiltered (_("Not confirmed, unchanged.\n"));
                      gdb_flush (gdb_stdout);
                    }
                }
@@ -3390,7 +3553,7 @@ xdb_handle_command (char *args, int from_tty)
          if (validFlag)
            handle_command (argBuf, from_tty);
          else
-           printf_filtered ("Invalid signal handling flag.\n");
+           printf_filtered (_("Invalid signal handling flag.\n"));
          if (argBuf)
            xfree (argBuf);
        }
@@ -3436,7 +3599,7 @@ signals_info (char *signum_exp, int from_tty)
        sig_print_info (oursig);
     }
 
-  printf_filtered ("\nUse the \"handle\" command to change these tables.\n");
+  printf_filtered (_("\nUse the \"handle\" command to change these tables.\n"));
 }
 \f
 struct inferior_status
@@ -3513,9 +3676,9 @@ save_inferior_status (int restore_stack_info)
 
   inf_status->stop_registers = regcache_dup_no_passthrough (stop_registers);
 
-  inf_status->registers = regcache_dup (current_regcache);
+  inf_status->registers = regcache_dup (get_current_regcache ());
 
-  inf_status->selected_frame_id = get_frame_id (deprecated_selected_frame);
+  inf_status->selected_frame_id = get_frame_id (get_selected_frame (NULL));
   return inf_status;
 }
 
@@ -3531,7 +3694,7 @@ restore_selected_frame (void *args)
      selected frame.  */
   if (frame == NULL)
     {
-      warning ("Unable to restore previously selected frame.\n");
+      warning (_("Unable to restore previously selected frame."));
       return 0;
     }
 
@@ -3568,7 +3731,7 @@ restore_inferior_status (struct inferior_status *inf_status)
      (and perhaps other times).  */
   if (target_has_execution)
     /* NB: The register write goes through to the target.  */
-    regcache_cpy (current_regcache, inf_status->registers);
+    regcache_cpy (get_current_regcache (), inf_status->registers);
   regcache_xfree (inf_status->registers);
 
   /* FIXME: If we are being called after stopping in a function which
@@ -3773,56 +3936,63 @@ _initialize_infrun (void)
   DEPRECATED_REGISTER_GDBARCH_SWAP (stop_registers);
   deprecated_register_gdbarch_swap (NULL, 0, build_infrun);
 
-  add_info ("signals", signals_info,
-           "What debugger does when program gets various signals.\n\
-Specify a signal as argument to print info on that signal only.");
+  add_info ("signals", signals_info, _("\
+What debugger does when program gets various signals.\n\
+Specify a signal as argument to print info on that signal only."));
   add_info_alias ("handle", "signals", 0);
 
-  add_com ("handle", class_run, handle_command,
-          concat ("Specify how to handle a signal.\n\
+  add_com ("handle", class_run, handle_command, _("\
+Specify how to handle a signal.\n\
 Args are signals and actions to apply to those signals.\n\
 Symbolic signals (e.g. SIGSEGV) are recommended but numeric signals\n\
 from 1-15 are allowed for compatibility with old versions of GDB.\n\
 Numeric ranges may be specified with the form LOW-HIGH (e.g. 1-5).\n\
 The special arg \"all\" is recognized to mean all signals except those\n\
-used by the debugger, typically SIGTRAP and SIGINT.\n", "Recognized actions include \"stop\", \"nostop\", \"print\", \"noprint\",\n\
+used by the debugger, typically SIGTRAP and SIGINT.\n\
+Recognized actions include \"stop\", \"nostop\", \"print\", \"noprint\",\n\
 \"pass\", \"nopass\", \"ignore\", or \"noignore\".\n\
 Stop means reenter debugger if this signal happens (implies print).\n\
 Print means print a message if this signal happens.\n\
 Pass means let program see this signal; otherwise program doesn't know.\n\
 Ignore is a synonym for nopass and noignore is a synonym for pass.\n\
-Pass and Stop may be combined.", NULL));
+Pass and Stop may be combined."));
   if (xdb_commands)
     {
-      add_com ("lz", class_info, signals_info,
-              "What debugger does when program gets various signals.\n\
-Specify a signal as argument to print info on that signal only.");
-      add_com ("z", class_run, xdb_handle_command,
-              concat ("Specify how to handle a signal.\n\
+      add_com ("lz", class_info, signals_info, _("\
+What debugger does when program gets various signals.\n\
+Specify a signal as argument to print info on that signal only."));
+      add_com ("z", class_run, xdb_handle_command, _("\
+Specify how to handle a signal.\n\
 Args are signals and actions to apply to those signals.\n\
 Symbolic signals (e.g. SIGSEGV) are recommended but numeric signals\n\
 from 1-15 are allowed for compatibility with old versions of GDB.\n\
 Numeric ranges may be specified with the form LOW-HIGH (e.g. 1-5).\n\
 The special arg \"all\" is recognized to mean all signals except those\n\
-used by the debugger, typically SIGTRAP and SIGINT.\n", "Recognized actions include \"s\" (toggles between stop and nostop), \n\
+used by the debugger, typically SIGTRAP and SIGINT.\n\
+Recognized actions include \"s\" (toggles between stop and nostop), \n\
 \"r\" (toggles between print and noprint), \"i\" (toggles between pass and \
 nopass), \"Q\" (noprint)\n\
 Stop means reenter debugger if this signal happens (implies print).\n\
 Print means print a message if this signal happens.\n\
 Pass means let program see this signal; otherwise program doesn't know.\n\
 Ignore is a synonym for nopass and noignore is a synonym for pass.\n\
-Pass and Stop may be combined.", NULL));
+Pass and Stop may be combined."));
     }
 
   if (!dbx_commands)
-    stop_command =
-      add_cmd ("stop", class_obscure, not_just_help_class_command, "There is no `stop' command, but you can set a hook on `stop'.\n\
+    stop_command = add_cmd ("stop", class_obscure,
+                           not_just_help_class_command, _("\
+There is no `stop' command, but you can set a hook on `stop'.\n\
 This allows you to set a list of commands to be run each time execution\n\
-of the program stops.", &cmdlist);
+of the program stops."), &cmdlist);
 
-  add_set_cmd ("infrun", class_maintenance, var_zinteger,
-                 &debug_infrun, "Set inferior debugging.\n\
-When non-zero, inferior specific debugging is enabled.", &setdebuglist);
+  add_setshow_zinteger_cmd ("infrun", class_maintenance, &debug_infrun, _("\
+Set inferior debugging."), _("\
+Show inferior debugging."), _("\
+When non-zero, inferior specific debugging is enabled."),
+                           NULL,
+                           show_debug_infrun,
+                           &setdebuglist, &showdebuglist);
 
   numsigs = (int) TARGET_SIGNAL_LAST;
   signal_stop = (unsigned char *) xmalloc (sizeof (signal_stop[0]) * numsigs);
@@ -3871,47 +4041,53 @@ When non-zero, inferior specific debugging is enabled.", &setdebuglist);
   signal_stop[TARGET_SIGNAL_CANCEL] = 0;
   signal_print[TARGET_SIGNAL_CANCEL] = 0;
 
-#ifdef SOLIB_ADD
-  deprecated_add_show_from_set
-    (add_set_cmd ("stop-on-solib-events", class_support, var_zinteger,
-                 (char *) &stop_on_solib_events,
-                 "Set stopping for shared library events.\n\
+  add_setshow_zinteger_cmd ("stop-on-solib-events", class_support,
+                           &stop_on_solib_events, _("\
+Set stopping for shared library events."), _("\
+Show stopping for shared library events."), _("\
 If nonzero, gdb will give control to the user when the dynamic linker\n\
 notifies gdb of shared library events.  The most common event of interest\n\
-to the user would be loading/unloading of a new library.\n", &setlist), &showlist);
-#endif
-
-  c = add_set_enum_cmd ("follow-fork-mode",
-                       class_run,
-                       follow_fork_mode_kind_names, &follow_fork_mode_string,
-                       "Set debugger response to a program call of fork \
-or vfork.\n\
+to the user would be loading/unloading of a new library."),
+                           NULL,
+                           show_stop_on_solib_events,
+                           &setlist, &showlist);
+
+  add_setshow_enum_cmd ("follow-fork-mode", class_run,
+                       follow_fork_mode_kind_names,
+                       &follow_fork_mode_string, _("\
+Set debugger response to a program call of fork or vfork."), _("\
+Show debugger response to a program call of fork or vfork."), _("\
 A fork or vfork creates a new process.  follow-fork-mode can be:\n\
   parent  - the original process is debugged after a fork\n\
   child   - the new process is debugged after a fork\n\
 The unfollowed process will continue to run.\n\
-By default, the debugger will follow the parent process.", &setlist);
-  deprecated_add_show_from_set (c, &showlist);
-
-  c = add_set_enum_cmd ("scheduler-locking", class_run, scheduler_enums,       /* array of string names */
-                       &scheduler_mode,        /* current mode  */
-                       "Set mode for locking scheduler during execution.\n\
+By default, the debugger will follow the parent process."),
+                       NULL,
+                       show_follow_fork_mode_string,
+                       &setlist, &showlist);
+
+  add_setshow_enum_cmd ("scheduler-locking", class_run, 
+                       scheduler_enums, &scheduler_mode, _("\
+Set mode for locking scheduler during execution."), _("\
+Show mode for locking scheduler during execution."), _("\
 off  == no locking (threads may preempt at any time)\n\
 on   == full locking (no thread except the current thread may run)\n\
 step == scheduler locked during every single-step operation.\n\
        In this mode, no other thread may run during a step command.\n\
-       Other threads may run while stepping over a function call ('next').", &setlist);
-
-  set_cmd_sfunc (c, set_schedlock_func);       /* traps on target vector */
-  deprecated_add_show_from_set (c, &showlist);
-
-  c = add_set_cmd ("step-mode", class_run,
-                  var_boolean, (char *) &step_stop_if_no_debug,
-                  "Set mode of the step operation. When set, doing a step over a\n\
-function without debug line information will stop at the first\n\
-instruction of that function. Otherwise, the function is skipped and\n\
-the step command stops at a different source line.", &setlist);
-  deprecated_add_show_from_set (c, &showlist);
+       Other threads may run while stepping over a function call ('next')."), 
+                       set_schedlock_func,     /* traps on target vector */
+                       show_scheduler_mode,
+                       &setlist, &showlist);
+
+  add_setshow_boolean_cmd ("step-mode", class_run, &step_stop_if_no_debug, _("\
+Set mode of the step operation."), _("\
+Show mode of the step operation."), _("\
+When set, doing a step over a function without debug line information\n\
+will stop at the first instruction of that function. Otherwise, the\n\
+function is skipped and the step command stops at a different source line."),
+                          NULL,
+                          show_step_stop_if_no_debug,
+                          &setlist, &showlist);
 
   /* ptid initializations */
   null_ptid = ptid_build (0, 0, 0);