]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - gdb/stack.c
2005-02-11 Andrew Cagney <cagney@gnu.org>
[thirdparty/binutils-gdb.git] / gdb / stack.c
index ce986c79e876f82d0fb25b0a821dd131de4fc8a3..3dae3a39f9deca6f0b363cc8a8c9eaefccf2564a 100644 (file)
@@ -1,8 +1,8 @@
 /* Print and select stack frames for GDB, the GNU debugger.
 
    Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
 /* Print and select stack frames for GDB, the GNU debugger.
 
    Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
-   1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free
-   Software Foundation, Inc.
+   1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+   Free Software Foundation, Inc.
 
    This file is part of GDB.
 
 
    This file is part of GDB.
 
@@ -43,6 +43,7 @@
 #include "stack.h"
 #include "gdb_assert.h"
 #include "dictionary.h"
 #include "stack.h"
 #include "gdb_assert.h"
 #include "dictionary.h"
+#include "exceptions.h"
 #include "reggroups.h"
 #include "regcache.h"
 
 #include "reggroups.h"
 #include "regcache.h"
 
@@ -100,9 +101,9 @@ static void print_frame (struct frame_info *fi,
                         int print_args, 
                         struct symtab_and_line sal);
 
                         int print_args, 
                         struct symtab_and_line sal);
 
-static void backtrace_command (char *, int);
+static void set_current_sal_from_frame (struct frame_info *, int);
 
 
-struct frame_info *parse_frame_specification (char *);
+static void backtrace_command (char *, int);
 
 static void frame_info (char *, int);
 
 
 static void frame_info (char *, int);
 
@@ -130,9 +131,12 @@ struct print_stack_frame_args
 static int
 print_stack_frame_stub (void *args)
 {
 static int
 print_stack_frame_stub (void *args)
 {
-  struct print_stack_frame_args *p = (struct print_stack_frame_args *) args;
+  struct print_stack_frame_args *p = args;
+  int center = (p->print_what == SRC_LINE
+                || p->print_what == SRC_AND_LOC);
 
   print_frame_info (p->fi, p->print_level, p->print_what, p->print_args);
 
   print_frame_info (p->fi, p->print_level, p->print_what, p->print_args);
+  set_current_sal_from_frame (p->fi, center);
   return 0;
 }
 
   return 0;
 }
 
@@ -346,11 +350,11 @@ print_frame_args (struct symbol *func, struct frame_info *fi, int num,
             2 for each recurse.  */
          val = read_var_value (sym, fi);
 
             2 for each recurse.  */
          val = read_var_value (sym, fi);
 
-         annotate_arg_value (val == NULL ? NULL : VALUE_TYPE (val));
+         annotate_arg_value (val == NULL ? NULL : value_type (val));
 
          if (val)
            {
 
          if (val)
            {
-             val_print (VALUE_TYPE (val), VALUE_CONTENTS (val), 0,
+             val_print (value_type (val), value_contents (val), 0,
                         VALUE_ADDRESS (val),
                         stb->stream, 0, 0, 2, Val_no_prettyprint);
              ui_out_field_stream (uiout, "value", stb);
                         VALUE_ADDRESS (val),
                         stb->stream, 0, 0, 2, Val_no_prettyprint);
              ui_out_field_stream (uiout, "value", stb);
@@ -403,6 +407,24 @@ print_args_stub (void *args)
   return 0;
 }
 
   return 0;
 }
 
+/* Set the current source and line to the location of the given
+   frame, if possible.  When CENTER is true, adjust so the
+   relevant line is in the center of the next 'list'. */
+
+static void
+set_current_sal_from_frame (struct frame_info *fi, int center)
+{
+  struct symtab_and_line sal;
+
+  find_frame_sal (fi, &sal);
+  if (sal.symtab)
+    {
+      if (center)
+        sal.line = max (sal.line - get_lines_to_list () / 2, 1);
+      set_current_source_symtab_and_line (&sal);
+    }
+}
+
 /* Print information about a frame for frame "fi" at level "level".
    Used in "where" output, also used to emit breakpoint or step
    messages.  
 /* Print information about a frame for frame "fi" at level "level".
    Used in "where" output, also used to emit breakpoint or step
    messages.  
@@ -479,12 +501,8 @@ print_frame_info (struct frame_info *fi, int print_level,
 
   source_print = (print_what == SRC_LINE || print_what == SRC_AND_LOC);
 
 
   source_print = (print_what == SRC_LINE || print_what == SRC_AND_LOC);
 
-  if (sal.symtab)
-    set_current_source_symtab_and_line (&sal);
-
   if (source_print && sal.symtab)
     {
   if (source_print && sal.symtab)
     {
-      struct symtab_and_line cursal;
       int done = 0;
       int mid_statement = ((print_what == SRC_LINE)
                           && (get_frame_pc (fi) != sal.pc));
       int done = 0;
       int mid_statement = ((print_what == SRC_LINE)
                           && (get_frame_pc (fi) != sal.pc));
@@ -495,7 +513,9 @@ print_frame_info (struct frame_info *fi, int print_level,
       if (!done)
        {
          if (deprecated_print_frame_info_listing_hook)
       if (!done)
        {
          if (deprecated_print_frame_info_listing_hook)
-           deprecated_print_frame_info_listing_hook (sal.symtab, sal.line, sal.line + 1, 0);
+           deprecated_print_frame_info_listing_hook (sal.symtab, 
+                                                     sal.line, 
+                                                     sal.line + 1, 0);
          else
            {
              /* We used to do this earlier, but that is clearly
          else
            {
              /* We used to do this earlier, but that is clearly
@@ -505,7 +525,7 @@ print_frame_info (struct frame_info *fi, int print_level,
                 when we stepi/nexti into the middle of a source
                 line. Only the command line really wants this
                 behavior. Other UIs probably would like the
                 when we stepi/nexti into the middle of a source
                 line. Only the command line really wants this
                 behavior. Other UIs probably would like the
-                ability to decide for themselves if it is desired. */
+                ability to decide for themselves if it is desired.  */
              if (addressprint && mid_statement)
                {
                  ui_out_field_core_addr (uiout, "addr", get_frame_pc (fi));
              if (addressprint && mid_statement)
                {
                  ui_out_field_core_addr (uiout, "addr", get_frame_pc (fi));
@@ -515,11 +535,6 @@ print_frame_info (struct frame_info *fi, int print_level,
              print_source_lines (sal.symtab, sal.line, sal.line + 1, 0);
            }
        }
              print_source_lines (sal.symtab, sal.line, sal.line + 1, 0);
            }
        }
-      /* Make sure we have at least a default source file */
-      set_default_source_symtab_and_line ();
-      cursal = get_current_source_symtab_and_line ();
-      cursal.line = max (sal.line - get_lines_to_list () / 2, 1);
-      set_current_source_symtab_and_line (&cursal);
     }
 
   if (print_what != LOCATION)
     }
 
   if (print_what != LOCATION)
@@ -702,122 +717,146 @@ show_stack_frame (struct frame_info *fi)
 \f
 
 /* Read a frame specification in whatever the appropriate format is.
 \f
 
 /* Read a frame specification in whatever the appropriate format is.
-   Call error() if the specification is in any way invalid (i.e.
-   this function never returns NULL).  */
+   Call error() if the specification is in any way invalid (i.e.  this
+   function never returns NULL).  When SEPECTED_P is non-NULL set it's
+   target to indicate that the default selected frame was used.  */
 
 
-struct frame_info *
-parse_frame_specification (char *frame_exp)
+static struct frame_info *
+parse_frame_specification_1 (const char *frame_exp, const char *message,
+                            int *selected_frame_p)
 {
 {
-  int numargs = 0;
-#define        MAXARGS 4
-  CORE_ADDR args[MAXARGS];
-  int level;
+  int numargs;
+  struct value *args[4];
+  CORE_ADDR addrs[ARRAY_SIZE (args)];
 
 
-  if (frame_exp)
+  if (frame_exp == NULL)
+    numargs = 0;
+  else
     {
     {
-      char *addr_string, *p;
+      char *addr_string;
       struct cleanup *tmp_cleanup;
 
       struct cleanup *tmp_cleanup;
 
-      while (*frame_exp == ' ')
-       frame_exp++;
-
-      while (*frame_exp)
+      numargs = 0;
+      while (1)
        {
        {
-         if (numargs > MAXARGS)
-           error ("Too many args in frame specification");
-         /* Parse an argument.  */
-         for (p = frame_exp; *p && *p != ' '; p++)
-           ;
-         addr_string = savestring (frame_exp, p - frame_exp);
-
-         {
-           struct value *vp;
-
-           tmp_cleanup = make_cleanup (xfree, addr_string);
-
-           /* NOTE: we call parse_and_eval and then both
-              value_as_long and value_as_address rather than calling
-              parse_and_eval_long and parse_and_eval_address because
-              of the issue of potential side effects from evaluating
-              the expression.  */
-           vp = parse_and_eval (addr_string);
-           if (numargs == 0)
-             level = value_as_long (vp);
-
-           args[numargs++] = value_as_address (vp);
-           do_cleanups (tmp_cleanup);
-         }
+         char *addr_string;
+         struct cleanup *cleanup;
+         const char *p;
+
+         /* Skip leading white space, bail of EOL.  */
+         while (isspace (*frame_exp))
+           frame_exp++;
+         if (!*frame_exp)
+           break;
 
 
-         /* Skip spaces, move to possible next arg.  */
-         while (*p == ' ')
-           p++;
+         /* Parse the argument, extract it, save it.  */
+         for (p = frame_exp;
+              *p && !isspace (*p);
+              p++);
+         addr_string = savestring (frame_exp, p - frame_exp);
          frame_exp = p;
          frame_exp = p;
+         cleanup = make_cleanup (xfree, addr_string);
+         
+         /* NOTE: Parse and evaluate expression, but do not use
+            functions such as parse_and_eval_long or
+            parse_and_eval_address to also extract the value.
+            Instead value_as_long and value_as_address are used.
+            This avoids problems with expressions that contain
+            side-effects.  */
+         if (numargs >= ARRAY_SIZE (args))
+           error (_("Too many args in frame specification"));
+         args[numargs++] = parse_and_eval (addr_string);
+
+         do_cleanups (cleanup);
        }
     }
 
        }
     }
 
-  switch (numargs)
+  /* If no args, default to the selected frame.  */
+  if (numargs == 0)
     {
     {
-    case 0:
-      if (deprecated_selected_frame == NULL)
-       error ("No selected frame.");
-      return deprecated_selected_frame;
-      /* NOTREACHED */
-    case 1:
-      {
-       struct frame_info *fid =
-       find_relative_frame (get_current_frame (), &level);
-       struct frame_info *tfid;
-
-       if (level == 0)
-         /* find_relative_frame was successful */
-         return fid;
-
-       /* If SETUP_ARBITRARY_FRAME is defined, then frame specifications
-          take at least 2 addresses.  It is important to detect this case
-          here so that "frame 100" does not give a confusing error message
-          like "frame specification requires two addresses".  This of course
-          does not solve the "frame 100" problem for machines on which
-          a frame specification can be made with one address.  To solve
-          that, we need a new syntax for a specifying a frame by address.
-          I think the cleanest syntax is $frame(0x45) ($frame(0x23,0x45) for
-          two args, etc.), but people might think that is too much typing,
-          so I guess *0x23,0x45 would be a possible alternative (commas
-          really should be used instead of spaces to delimit; using spaces
-          normally works in an expression).  */
-#ifdef SETUP_ARBITRARY_FRAME
-       error ("No frame %s", paddr_d (args[0]));
-#endif
-
-       /* If (s)he specifies the frame with an address, he deserves what
-          (s)he gets.  Still, give the highest one that matches.  */
+      if (selected_frame_p != NULL)
+       (*selected_frame_p) = 1;
+      return get_selected_frame (message);
+    }
 
 
-       for (fid = get_current_frame ();
-            fid && get_frame_base (fid) != args[0];
-            fid = get_prev_frame (fid))
-         ;
+  /* None of the remaining use the selected frame.  */
+  if (selected_frame_p != NULL)
+    (*selected_frame_p) = 0;
 
 
-       if (fid)
-         while ((tfid = get_prev_frame (fid)) &&
-                (get_frame_base (tfid) == args[0]))
-           fid = tfid;
+  /* Assume the single arg[0] is an integer, and try using that to
+     select a frame relative to current.  */
+  if (numargs == 1)
+    {
+      struct frame_info *fid;
+      int level = value_as_long (args[0]);
+      fid = find_relative_frame (get_current_frame (), &level);
+      if (level == 0)
+       /* find_relative_frame was successful */
+       return fid;
+    }
 
 
-       /* We couldn't identify the frame as an existing frame, but
-          perhaps we can create one with a single argument.  */
-      }
+  /* Convert each value into a corresponding address.  */
+  {
+    int i;
+    for (i = 0; i < numargs; i++)
+      addrs[i] = value_as_address (args[0]);
+  }
 
 
-    default:
+  /* Assume that the single arg[0] is an address, use that to identify
+     a frame with a matching ID.  Should this also accept stack/pc or
+     stack/pc/special.  */
+  if (numargs == 1)
+    {
+      struct frame_id id = frame_id_build_wild (addrs[0]);
+      struct frame_info *fid;
+
+      /* If SETUP_ARBITRARY_FRAME is defined, then frame
+        specifications take at least 2 addresses.  It is important to
+        detect this case here so that "frame 100" does not give a
+        confusing error message like "frame specification requires
+        two addresses".  This of course does not solve the "frame
+        100" problem for machines on which a frame specification can
+        be made with one address.  To solve that, we need a new
+        syntax for a specifying a frame by address.  I think the
+        cleanest syntax is $frame(0x45) ($frame(0x23,0x45) for two
+        args, etc.), but people might think that is too much typing,
+        so I guess *0x23,0x45 would be a possible alternative (commas
+        really should be used instead of spaces to delimit; using
+        spaces normally works in an expression).  */
 #ifdef SETUP_ARBITRARY_FRAME
 #ifdef SETUP_ARBITRARY_FRAME
-      return SETUP_ARBITRARY_FRAME (numargs, args);
-#else
-      /* Usual case.  Do it here rather than have everyone supply
-         a SETUP_ARBITRARY_FRAME that does this.  */
-      if (numargs == 1)
-       return create_new_frame (args[0], 0);
-      error ("Too many args in frame specification");
+      error (_("No frame %s"), paddr_d (addrs[0]));
 #endif
 #endif
-      /* NOTREACHED */
-    }
-  /* NOTREACHED */
+      /* If (s)he specifies the frame with an address, he deserves
+        what (s)he gets.  Still, give the highest one that matches.
+        (NOTE: cagney/2004-10-29: Why highest, or outer-most, I don't
+        know).  */
+      for (fid = get_current_frame ();
+          fid != NULL;
+          fid = get_prev_frame (fid))
+       {
+         if (frame_id_eq (id, get_frame_id (fid)))
+           {
+             while (frame_id_eq (id, frame_unwind_id (fid)))
+               fid = get_prev_frame (fid);
+             return fid;
+           }
+       }
+      }
+
+  /* We couldn't identify the frame as an existing frame, but
+     perhaps we can create one with a single argument.  */
+  if (numargs == 1)
+    return create_new_frame (addrs[0], 0);
+  else if (numargs == 2)
+    return create_new_frame (addrs[0], addrs[1]);
+  else
+    error (_("Too many args in frame specification"));
+}
+
+struct frame_info *
+parse_frame_specification (char *frame_exp)
+{
+  return parse_frame_specification_1 (frame_exp, NULL, NULL);
 }
 
 /* Print verbosely the selected frame or the frame at address ADDR.
 }
 
 /* Print verbosely the selected frame or the frame at address ADDR.
@@ -835,9 +874,9 @@ frame_info (char *addr_exp, int from_tty)
   char *funname = 0;
   enum language funlang = language_unknown;
   const char *pc_regname;
   char *funname = 0;
   enum language funlang = language_unknown;
   const char *pc_regname;
+  int selected_frame_p;
 
 
-  if (!target_has_stack)
-    error ("No stack.");
+  fi = parse_frame_specification_1 (addr_exp, "No stack.", &selected_frame_p);
 
   /* Name of the value returned by get_frame_pc().  Per comments, "pc"
      is not a good name.  */
 
   /* Name of the value returned by get_frame_pc().  Per comments, "pc"
      is not a good name.  */
@@ -853,10 +892,6 @@ frame_info (char *addr_exp, int from_tty)
        get_frame_pc().  */
     pc_regname = "pc";
 
        get_frame_pc().  */
     pc_regname = "pc";
 
-  fi = parse_frame_specification (addr_exp);
-  if (fi == NULL)
-    error ("Invalid frame specified.");
-
   find_frame_sal (fi, &sal);
   func = get_frame_function (fi);
   /* FIXME: cagney/2002-11-28: Why bother?  Won't sal.symtab contain
   find_frame_sal (fi, &sal);
   func = get_frame_function (fi);
   /* FIXME: cagney/2002-11-28: Why bother?  Won't sal.symtab contain
@@ -902,16 +937,16 @@ frame_info (char *addr_exp, int from_tty)
     }
   calling_frame_info = get_prev_frame (fi);
 
     }
   calling_frame_info = get_prev_frame (fi);
 
-  if (!addr_exp && frame_relative_level (deprecated_selected_frame) >= 0)
+  if (selected_frame_p && frame_relative_level (fi) >= 0)
     {
     {
-      printf_filtered ("Stack level %d, frame at ",
-                      frame_relative_level (deprecated_selected_frame));
+      printf_filtered (_("Stack level %d, frame at "),
+                      frame_relative_level (fi));
       print_address_numeric (get_frame_base (fi), 1, gdb_stdout);
       printf_filtered (":\n");
     }
   else
     {
       print_address_numeric (get_frame_base (fi), 1, gdb_stdout);
       printf_filtered (":\n");
     }
   else
     {
-      printf_filtered ("Stack frame at ");
+      printf_filtered (_("Stack frame at "));
       print_address_numeric (get_frame_base (fi), 1, gdb_stdout);
       printf_filtered (":\n");
     }
       print_address_numeric (get_frame_base (fi), 1, gdb_stdout);
       printf_filtered (":\n");
     }
@@ -1003,9 +1038,6 @@ frame_info (char *addr_exp, int from_tty)
       }
   }
 
       }
   }
 
-  if (DEPRECATED_FRAME_INIT_SAVED_REGS_P ()
-      && deprecated_get_frame_saved_regs (fi) == NULL)
-    DEPRECATED_FRAME_INIT_SAVED_REGS (fi);
   /* Print as much information as possible on the location of all the
      registers.  */
   {
   /* Print as much information as possible on the location of all the
      registers.  */
   {
@@ -1037,7 +1069,7 @@ frame_info (char *addr_exp, int from_tty)
            /* NOTE: cagney/2003-05-22: This is assuming that the
                stack pointer was packed as an unsigned integer.  That
                may or may not be valid.  */
            /* NOTE: cagney/2003-05-22: This is assuming that the
                stack pointer was packed as an unsigned integer.  That
                may or may not be valid.  */
-           sp = extract_unsigned_integer (value, DEPRECATED_REGISTER_RAW_SIZE (SP_REGNUM));
+           sp = extract_unsigned_integer (value, register_size (current_gdbarch, SP_REGNUM));
            printf_filtered (" Previous frame's sp is ");
            print_address_numeric (sp, 1, gdb_stdout);
            printf_filtered ("\n");
            printf_filtered (" Previous frame's sp is ");
            print_address_numeric (sp, 1, gdb_stdout);
            printf_filtered ("\n");
@@ -1102,7 +1134,7 @@ backtrace_command_1 (char *count_exp, int show_locals, int from_tty)
   int trailing_level;
 
   if (!target_has_stack)
   int trailing_level;
 
   if (!target_has_stack)
-    error ("No stack.");
+    error (_("No stack."));
 
   /* The following code must do two things.  First, it must
      set the variable TRAILING to the frame from which we should start
 
   /* The following code must do two things.  First, it must
      set the variable TRAILING to the frame from which we should start
@@ -1113,7 +1145,7 @@ backtrace_command_1 (char *count_exp, int show_locals, int from_tty)
   /* The target can be in a state where there is no valid frames
      (e.g., just connected). */
   if (trailing == NULL)
   /* The target can be in a state where there is no valid frames
      (e.g., just connected). */
   if (trailing == NULL)
-    error ("No stack.");
+    error (_("No stack."));
 
   trailing_level = 0;
   if (count_exp)
 
   trailing_level = 0;
   if (count_exp)
@@ -1186,7 +1218,23 @@ backtrace_command_1 (char *count_exp, int show_locals, int from_tty)
 
   /* If we've stopped before the end, mention that.  */
   if (fi && from_tty)
 
   /* If we've stopped before the end, mention that.  */
   if (fi && from_tty)
-    printf_filtered ("(More stack frames follow...)\n");
+    printf_filtered (_("(More stack frames follow...)\n"));
+}
+
+struct backtrace_command_args
+  {
+    char *count_exp;
+    int show_locals;
+    int from_tty;
+  };
+
+/* Stub to call backtrace_command_1 by way of an error catcher.  */
+static int
+backtrace_command_stub (void *data)
+{
+  struct backtrace_command_args *args = (struct backtrace_command_args *)data;
+  backtrace_command_1 (args->count_exp, args->show_locals, args->from_tty);
+  return 0;
 }
 
 static void
 }
 
 static void
@@ -1196,6 +1244,7 @@ backtrace_command (char *arg, int from_tty)
   char **argv = (char **) NULL;
   int argIndicatingFullTrace = (-1), totArgLen = 0, argc = 0;
   char *argPtr = arg;
   char **argv = (char **) NULL;
   int argIndicatingFullTrace = (-1), totArgLen = 0, argc = 0;
   char *argPtr = arg;
+  struct backtrace_command_args btargs;
 
   if (arg != (char *) NULL)
     {
 
   if (arg != (char *) NULL)
     {
@@ -1245,7 +1294,10 @@ backtrace_command (char *arg, int from_tty)
        }
     }
 
        }
     }
 
-  backtrace_command_1 (argPtr, (argIndicatingFullTrace >= 0), from_tty);
+  btargs.count_exp = argPtr;
+  btargs.show_locals = (argIndicatingFullTrace >= 0);
+  btargs.from_tty = from_tty;
+  catch_errors (backtrace_command_stub, (char *)&btargs, "", RETURN_MASK_ERROR);
 
   if (argIndicatingFullTrace >= 0 && totArgLen > 0)
     xfree (argPtr);
 
   if (argIndicatingFullTrace >= 0 && totArgLen > 0)
     xfree (argPtr);
@@ -1258,7 +1310,11 @@ static void backtrace_full_command (char *arg, int from_tty);
 static void
 backtrace_full_command (char *arg, int from_tty)
 {
 static void
 backtrace_full_command (char *arg, int from_tty)
 {
-  backtrace_command_1 (arg, 1, from_tty);
+  struct backtrace_command_args btargs;
+  btargs.count_exp = arg;
+  btargs.show_locals = 1;
+  btargs.from_tty = from_tty;
+  catch_errors (backtrace_command_stub, (char *)&btargs, "", RETURN_MASK_ERROR);
 }
 \f
 
 }
 \f
 
@@ -1404,9 +1460,9 @@ print_frame_label_vars (struct frame_info *fi, int this_level_only,
       int last_index;
 
       if (bl != blockvector_for_pc (end, &index))
       int last_index;
 
       if (bl != blockvector_for_pc (end, &index))
-       error ("blockvector blotch");
+       error (_("blockvector blotch"));
       if (BLOCKVECTOR_BLOCK (bl, index) != block)
       if (BLOCKVECTOR_BLOCK (bl, index) != block)
-       error ("blockvector botch");
+       error (_("blockvector botch"));
       last_index = BLOCKVECTOR_NBLOCKS (bl);
       index += 1;
 
       last_index = BLOCKVECTOR_NBLOCKS (bl);
       index += 1;
 
@@ -1448,9 +1504,8 @@ print_frame_label_vars (struct frame_info *fi, int this_level_only,
 void
 locals_info (char *args, int from_tty)
 {
 void
 locals_info (char *args, int from_tty)
 {
-  if (!deprecated_selected_frame)
-    error ("No frame selected.");
-  print_frame_local_vars (deprecated_selected_frame, 0, gdb_stdout);
+  print_frame_local_vars (get_selected_frame ("No frame selected."),
+                         0, gdb_stdout);
 }
 
 static void
 }
 
 static void
@@ -1470,10 +1525,8 @@ catch_info (char *ignore, int from_tty)
   else
     {
       /* Assume g++ compiled code -- old v 4.16 behaviour */
   else
     {
       /* Assume g++ compiled code -- old v 4.16 behaviour */
-      if (!deprecated_selected_frame)
-       error ("No frame selected.");
-
-      print_frame_label_vars (deprecated_selected_frame, 0, gdb_stdout);
+      print_frame_label_vars (get_selected_frame ("No frame selected."),
+                             0, gdb_stdout);
     }
 }
 
     }
 }
 
@@ -1540,9 +1593,8 @@ print_frame_arg_vars (struct frame_info *fi,
 void
 args_info (char *ignore, int from_tty)
 {
 void
 args_info (char *ignore, int from_tty)
 {
-  if (!deprecated_selected_frame)
-    error ("No frame selected.");
-  print_frame_arg_vars (deprecated_selected_frame, gdb_stdout);
+  print_frame_arg_vars (get_selected_frame ("No frame selected."),
+                       gdb_stdout);
 }
 
 
 }
 
 
@@ -1578,7 +1630,7 @@ get_selected_block (CORE_ADDR *addr_in_block)
     return 0;
 
   /* NOTE: cagney/2002-11-28: Why go to all this effort to not create
     return 0;
 
   /* NOTE: cagney/2002-11-28: Why go to all this effort to not create
-     a selected/current frame?  Perhaphs this function is called,
+     a selected/current frame?  Perhaps this function is called,
      indirectly, by WFI in "infrun.c" where avoiding the creation of
      an inner most frame is very important (it slows down single
      step).  I suspect, though that this was true in the deep dark
      indirectly, by WFI in "infrun.c" where avoiding the creation of
      an inner most frame is very important (it slows down single
      step).  I suspect, though that this was true in the deep dark
@@ -1647,14 +1699,7 @@ find_relative_frame (struct frame_info *frame,
 void
 select_frame_command (char *level_exp, int from_tty)
 {
 void
 select_frame_command (char *level_exp, int from_tty)
 {
-  struct frame_info *frame;
-
-  if (!target_has_stack)
-    error ("No stack.");
-
-  frame = parse_frame_specification (level_exp);
-
-  select_frame (frame);
+  select_frame (parse_frame_specification_1 (level_exp, "No stack.", NULL));
 }
 
 /* The "frame" command.  With no arg, print selected frame briefly.
 }
 
 /* The "frame" command.  With no arg, print selected frame briefly.
@@ -1665,7 +1710,7 @@ void
 frame_command (char *level_exp, int from_tty)
 {
   select_frame_command (level_exp, from_tty);
 frame_command (char *level_exp, int from_tty)
 {
   select_frame_command (level_exp, from_tty);
-  print_stack_frame (get_selected_frame (), 1, SRC_AND_LOC);
+  print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC);
 }
 
 /* The XDB Compatibility command to print the current frame. */
 }
 
 /* The XDB Compatibility command to print the current frame. */
@@ -1673,9 +1718,7 @@ frame_command (char *level_exp, int from_tty)
 static void
 current_frame_command (char *level_exp, int from_tty)
 {
 static void
 current_frame_command (char *level_exp, int from_tty)
 {
-  if (target_has_stack == 0 || deprecated_selected_frame == 0)
-    error ("No stack.");
-  print_stack_frame (get_selected_frame (), 1, SRC_AND_LOC);
+  print_stack_frame (get_selected_frame ("No stack."), 1, SRC_AND_LOC);
 }
 
 /* Select the frame up one or COUNT stack levels
 }
 
 /* Select the frame up one or COUNT stack levels
@@ -1690,12 +1733,9 @@ up_silently_base (char *count_exp)
     count = parse_and_eval_long (count_exp);
   count1 = count;
 
     count = parse_and_eval_long (count_exp);
   count1 = count;
 
-  if (target_has_stack == 0 || deprecated_selected_frame == 0)
-    error ("No stack.");
-
-  fi = find_relative_frame (deprecated_selected_frame, &count1);
+  fi = find_relative_frame (get_selected_frame ("No stack."), &count1);
   if (count1 != 0 && count_exp == 0)
   if (count1 != 0 && count_exp == 0)
-    error ("Initial frame selected; you cannot go up.");
+    error (_("Initial frame selected; you cannot go up."));
   select_frame (fi);
 }
 
   select_frame (fi);
 }
 
@@ -1709,7 +1749,7 @@ static void
 up_command (char *count_exp, int from_tty)
 {
   up_silently_base (count_exp);
 up_command (char *count_exp, int from_tty)
 {
   up_silently_base (count_exp);
-  print_stack_frame (get_selected_frame (), 1, SRC_AND_LOC);
+  print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC);
 }
 
 /* Select the frame down one or COUNT stack levels
 }
 
 /* Select the frame down one or COUNT stack levels
@@ -1724,10 +1764,7 @@ down_silently_base (char *count_exp)
     count = -parse_and_eval_long (count_exp);
   count1 = count;
 
     count = -parse_and_eval_long (count_exp);
   count1 = count;
 
-  if (target_has_stack == 0 || deprecated_selected_frame == 0)
-    error ("No stack.");
-
-  frame = find_relative_frame (deprecated_selected_frame, &count1);
+  frame = find_relative_frame (get_selected_frame ("No stack."), &count1);
   if (count1 != 0 && count_exp == 0)
     {
 
   if (count1 != 0 && count_exp == 0)
     {
 
@@ -1736,7 +1773,7 @@ down_silently_base (char *count_exp)
          impossible), but "down 9999" can be used to mean go all the way
          down without getting an error.  */
 
          impossible), but "down 9999" can be used to mean go all the way
          down without getting an error.  */
 
-      error ("Bottom (i.e., innermost) frame selected; you cannot go down.");
+      error (_("Bottom (i.e., innermost) frame selected; you cannot go down."));
     }
 
   select_frame (frame);
     }
 
   select_frame (frame);
@@ -1752,7 +1789,7 @@ static void
 down_command (char *count_exp, int from_tty)
 {
   down_silently_base (count_exp);
 down_command (char *count_exp, int from_tty)
 {
   down_silently_base (count_exp);
-  print_stack_frame (get_selected_frame (), 1, SRC_AND_LOC);
+  print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC);
 }
 \f
 void
 }
 \f
 void
@@ -1762,13 +1799,7 @@ return_command (char *retval_exp, int from_tty)
   struct value *return_value = NULL;
   const char *query_prefix = "";
 
   struct value *return_value = NULL;
   const char *query_prefix = "";
 
-  /* FIXME: cagney/2003-10-20: Perform a minimal existance test on the
-     target.  If that fails, error out.  For the moment don't rely on
-     get_selected_frame as it's error message is the the singularly
-     obscure "No registers".  */
-  if (!target_has_registers)
-    error ("No selected frame.");
-  thisfun = get_frame_function (get_selected_frame ());
+  thisfun = get_frame_function (get_selected_frame ("No selected frame."));
 
   /* Compute the return value.  If the computation triggers an error,
      let it bail.  If the return type can't be handled, set
 
   /* Compute the return value.  If the computation triggers an error,
      let it bail.  If the return type can't be handled, set
@@ -1793,7 +1824,7 @@ return_command (char *retval_exp, int from_tty)
 
       /* Make sure the value is fully evaluated.  It may live in the
          stack frame we're about to pop.  */
 
       /* Make sure the value is fully evaluated.  It may live in the
          stack frame we're about to pop.  */
-      if (VALUE_LAZY (return_value))
+      if (value_lazy (return_value))
        value_fetch_lazy (return_value);
 
       if (TYPE_CODE (return_type) == TYPE_CODE_VOID)
        value_fetch_lazy (return_value);
 
       if (TYPE_CODE (return_type) == TYPE_CODE_VOID)
@@ -1835,13 +1866,13 @@ If you continue, the return value that you specified will be ignored.\n";
     {
       int confirmed;
       if (thisfun == NULL)
     {
       int confirmed;
       if (thisfun == NULL)
-       confirmed = query ("%sMake selected stack frame return now? ",
+       confirmed = query (_("%sMake selected stack frame return now? "),
                           query_prefix);
       else
                           query_prefix);
       else
-       confirmed = query ("%sMake %s return now? ", query_prefix,
+       confirmed = query (_("%sMake %s return now? "), query_prefix,
                           SYMBOL_PRINT_NAME (thisfun));
       if (!confirmed)
                           SYMBOL_PRINT_NAME (thisfun));
       if (!confirmed)
-       error ("Not confirmed");
+       error (_("Not confirmed"));
     }
 
   /* NOTE: cagney/2003-01-18: Is this silly?  Rather than pop each
     }
 
   /* NOTE: cagney/2003-01-18: Is this silly?  Rather than pop each
@@ -1851,13 +1882,13 @@ If you continue, the return value that you specified will be ignored.\n";
   /* First discard all frames inner-to the selected frame (making the
      selected frame current).  */
   {
   /* First discard all frames inner-to the selected frame (making the
      selected frame current).  */
   {
-    struct frame_id selected_id = get_frame_id (get_selected_frame ());
+    struct frame_id selected_id = get_frame_id (get_selected_frame (NULL));
     while (!frame_id_eq (selected_id, get_frame_id (get_current_frame ())))
       {
        if (frame_id_inner (selected_id, get_frame_id (get_current_frame ())))
          /* Caught in the safety net, oops!  We've gone way past the
              selected frame.  */
     while (!frame_id_eq (selected_id, get_frame_id (get_current_frame ())))
       {
        if (frame_id_inner (selected_id, get_frame_id (get_current_frame ())))
          /* Caught in the safety net, oops!  We've gone way past the
              selected frame.  */
-         error ("Problem while popping stack frames (corrupt stack?)");
+         error (_("Problem while popping stack frames (corrupt stack?)"));
        frame_pop (get_current_frame ());
       }
   }
        frame_pop (get_current_frame ());
       }
   }
@@ -1869,13 +1900,13 @@ If you continue, the return value that you specified will be ignored.\n";
   /* Store RETURN_VAUE in the just-returned register set.  */
   if (return_value != NULL)
     {
   /* Store RETURN_VAUE in the just-returned register set.  */
   if (return_value != NULL)
     {
-      struct type *return_type = VALUE_TYPE (return_value);
+      struct type *return_type = value_type (return_value);
       gdb_assert (gdbarch_return_value (current_gdbarch, return_type,
                                        NULL, NULL, NULL)
                  == RETURN_VALUE_REGISTER_CONVENTION);
       gdbarch_return_value (current_gdbarch, return_type,
                            current_regcache, NULL /*read*/,
       gdb_assert (gdbarch_return_value (current_gdbarch, return_type,
                                        NULL, NULL, NULL)
                  == RETURN_VALUE_REGISTER_CONVENTION);
       gdbarch_return_value (current_gdbarch, return_type,
                            current_regcache, NULL /*read*/,
-                           VALUE_CONTENTS (return_value) /*write*/);
+                           value_contents (return_value) /*write*/);
     }
 
   /* If we are at the end of a call dummy now, pop the dummy frame
     }
 
   /* If we are at the end of a call dummy now, pop the dummy frame
@@ -1946,7 +1977,7 @@ func_command (char *arg, int from_tty)
     xfree (func_bounds);
 
   if (!found)
     xfree (func_bounds);
 
   if (!found)
-    printf_filtered ("'%s' not within current stack frame.\n", arg);
+    printf_filtered (_("'%s' not within current stack frame.\n"), arg);
   else if (fp != deprecated_selected_frame)
     select_and_print_frame (fp);
 }
   else if (fp != deprecated_selected_frame)
     select_and_print_frame (fp);
 }