]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - gdb/f-valprint.c
* defs.h (extract_signed_integer, extract_unsigned_integer,
[thirdparty/binutils-gdb.git] / gdb / f-valprint.c
index a70a47c0b7ab75370701ca54f18c165cf505f030..0a574042fcd63a0e440be62d0ff5bf8ad2337071 100644 (file)
@@ -1,6 +1,8 @@
 /* Support for printing Fortran values for GDB, the GNU debugger.
-   Copyright 1993, 1994, 1995, 1996, 1998, 1999, 2000
-   Free Software Foundation, Inc.
+
+   Copyright (C) 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2003, 2005, 2006,
+   2007, 2008, 2009 Free Software Foundation, Inc.
+
    Contributed by Motorola.  Adapted from the C definitions by Farooq Butt
    (fmbutt@engage.sps.mot.com), additionally worked over by Stan Shebs.
 
@@ -8,7 +10,7 @@
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
@@ -17,9 +19,7 @@
    GNU General Public License for more details.
 
    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.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include "defs.h"
 #include "gdb_string.h"
 #include "gdbtypes.h"
 #include "expression.h"
 #include "value.h"
-#include "demangle.h"
 #include "valprint.h"
 #include "language.h"
 #include "f-lang.h"
 #include "frame.h"
 #include "gdbcore.h"
 #include "command.h"
+#include "block.h"
 
 #if 0
 static int there_is_a_visible_common_named (char *);
@@ -42,12 +42,6 @@ static int there_is_a_visible_common_named (char *);
 extern void _initialize_f_valprint (void);
 static void info_common_command (char *, int);
 static void list_all_visible_commons (char *);
-static void f77_print_array (struct type *, char *, CORE_ADDR,
-                            struct ui_file *, int, int, int,
-                            enum val_prettyprint);
-static void f77_print_array_1 (int, int, struct type *, char *,
-                              CORE_ADDR, struct ui_file *, int, int, int,
-                              enum val_prettyprint);
 static void f77_create_arrayprint_offset_tbl (struct type *,
                                              struct ui_file *);
 static void f77_get_dynamic_length_of_aggregate (struct type *);
@@ -67,124 +61,28 @@ int f77_array_offset_tbl[MAX_FORTRAN_DIMS + 1][2];
 #define F77_DIM_OFFSET(n) (f77_array_offset_tbl[n][0])
 
 int
-f77_get_dynamic_lowerbound (struct type *type, int *lower_bound)
+f77_get_lowerbound (struct type *type)
 {
-  CORE_ADDR current_frame_addr;
-  CORE_ADDR ptr_to_lower_bound;
-
-  switch (TYPE_ARRAY_LOWER_BOUND_TYPE (type))
-    {
-    case BOUND_BY_VALUE_ON_STACK:
-      current_frame_addr = selected_frame->frame;
-      if (current_frame_addr > 0)
-       {
-         *lower_bound =
-           read_memory_integer (current_frame_addr +
-                                TYPE_ARRAY_LOWER_BOUND_VALUE (type),
-                                4);
-       }
-      else
-       {
-         *lower_bound = DEFAULT_LOWER_BOUND;
-         return BOUND_FETCH_ERROR;
-       }
-      break;
-
-    case BOUND_SIMPLE:
-      *lower_bound = TYPE_ARRAY_LOWER_BOUND_VALUE (type);
-      break;
+  if (TYPE_ARRAY_LOWER_BOUND_IS_UNDEFINED (type))
+    error (_("Lower bound may not be '*' in F77"));
 
-    case BOUND_CANNOT_BE_DETERMINED:
-      error ("Lower bound may not be '*' in F77");
-      break;
-
-    case BOUND_BY_REF_ON_STACK:
-      current_frame_addr = selected_frame->frame;
-      if (current_frame_addr > 0)
-       {
-         ptr_to_lower_bound =
-           read_memory_integer (current_frame_addr +
-                                TYPE_ARRAY_LOWER_BOUND_VALUE (type),
-                                4);
-         *lower_bound = read_memory_integer (ptr_to_lower_bound, 4);
-       }
-      else
-       {
-         *lower_bound = DEFAULT_LOWER_BOUND;
-         return BOUND_FETCH_ERROR;
-       }
-      break;
-
-    case BOUND_BY_REF_IN_REG:
-    case BOUND_BY_VALUE_IN_REG:
-    default:
-      error ("??? unhandled dynamic array bound type ???");
-      break;
-    }
-  return BOUND_FETCH_OK;
+  return TYPE_ARRAY_LOWER_BOUND_VALUE (type);
 }
 
 int
-f77_get_dynamic_upperbound (struct type *type, int *upper_bound)
+f77_get_upperbound (struct type *type)
 {
-  CORE_ADDR current_frame_addr = 0;
-  CORE_ADDR ptr_to_upper_bound;
-
-  switch (TYPE_ARRAY_UPPER_BOUND_TYPE (type))
+  if (TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (type))
     {
-    case BOUND_BY_VALUE_ON_STACK:
-      current_frame_addr = selected_frame->frame;
-      if (current_frame_addr > 0)
-       {
-         *upper_bound =
-           read_memory_integer (current_frame_addr +
-                                TYPE_ARRAY_UPPER_BOUND_VALUE (type),
-                                4);
-       }
-      else
-       {
-         *upper_bound = DEFAULT_UPPER_BOUND;
-         return BOUND_FETCH_ERROR;
-       }
-      break;
-
-    case BOUND_SIMPLE:
-      *upper_bound = TYPE_ARRAY_UPPER_BOUND_VALUE (type);
-      break;
-
-    case BOUND_CANNOT_BE_DETERMINED:
-      /* we have an assumed size array on our hands. Assume that 
-         upper_bound == lower_bound so that we show at least 
-         1 element.If the user wants to see more elements, let 
-         him manually ask for 'em and we'll subscript the 
-         array and show him */
-      f77_get_dynamic_lowerbound (type, upper_bound);
-      break;
+      /* We have an assumed size array on our hands.  Assume that
+        upper_bound == lower_bound so that we show at least 1 element.
+        If the user wants to see more elements, let him manually ask for 'em
+        and we'll subscript the array and show him.  */
 
-    case BOUND_BY_REF_ON_STACK:
-      current_frame_addr = selected_frame->frame;
-      if (current_frame_addr > 0)
-       {
-         ptr_to_upper_bound =
-           read_memory_integer (current_frame_addr +
-                                TYPE_ARRAY_UPPER_BOUND_VALUE (type),
-                                4);
-         *upper_bound = read_memory_integer (ptr_to_upper_bound, 4);
-       }
-      else
-       {
-         *upper_bound = DEFAULT_UPPER_BOUND;
-         return BOUND_FETCH_ERROR;
-       }
-      break;
-
-    case BOUND_BY_REF_IN_REG:
-    case BOUND_BY_VALUE_IN_REG:
-    default:
-      error ("??? unhandled dynamic array bound type ???");
-      break;
+      return f77_get_lowerbound (type);
     }
-  return BOUND_FETCH_OK;
+
+  return TYPE_ARRAY_UPPER_BOUND_VALUE (type);
 }
 
 /* Obtain F77 adjustable array dimensions */
@@ -210,13 +108,8 @@ f77_get_dynamic_length_of_aggregate (struct type *type)
     f77_get_dynamic_length_of_aggregate (TYPE_TARGET_TYPE (type));
 
   /* Recursion ends here, start setting up lengths.  */
-  retcode = f77_get_dynamic_lowerbound (type, &lower_bound);
-  if (retcode == BOUND_FETCH_ERROR)
-    error ("Cannot obtain valid array lower bound");
-
-  retcode = f77_get_dynamic_upperbound (type, &upper_bound);
-  if (retcode == BOUND_FETCH_ERROR)
-    error ("Cannot obtain valid array upper bound");
+  lower_bound = f77_get_lowerbound (type);
+  upper_bound = f77_get_upperbound (type);
 
   /* Patch in a valid length value. */
 
@@ -239,16 +132,8 @@ f77_create_arrayprint_offset_tbl (struct type *type, struct ui_file *stream)
 
   while ((TYPE_CODE (tmp_type) == TYPE_CODE_ARRAY))
     {
-      if (TYPE_ARRAY_UPPER_BOUND_TYPE (tmp_type) == BOUND_CANNOT_BE_DETERMINED)
-       fprintf_filtered (stream, "<assumed size array> ");
-
-      retcode = f77_get_dynamic_upperbound (tmp_type, &upper);
-      if (retcode == BOUND_FETCH_ERROR)
-       error ("Cannot obtain dynamic upper bound");
-
-      retcode = f77_get_dynamic_lowerbound (tmp_type, &lower);
-      if (retcode == BOUND_FETCH_ERROR)
-       error ("Cannot obtain dynamic lower bound");
+      upper = f77_get_upperbound (tmp_type);
+      lower = f77_get_lowerbound (tmp_type);
 
       F77_DIM_SIZE (ndimen) = upper - lower + 1;
 
@@ -271,42 +156,50 @@ f77_create_arrayprint_offset_tbl (struct type *type, struct ui_file *stream)
     }
 }
 
+
+
 /* Actual function which prints out F77 arrays, Valaddr == address in 
    the superior.  Address == the address in the inferior.  */
 
 static void
-f77_print_array_1 (int nss, int ndimensions, struct type *type, char *valaddr,
-                  CORE_ADDR address, struct ui_file *stream, int format,
-                  int deref_ref, int recurse, enum val_prettyprint pretty)
+f77_print_array_1 (int nss, int ndimensions, struct type *type,
+                  const gdb_byte *valaddr, CORE_ADDR address,
+                  struct ui_file *stream, int recurse,
+                  const struct value_print_options *options,
+                  int *elts)
 {
   int i;
 
   if (nss != ndimensions)
     {
-      for (i = 0; i < F77_DIM_SIZE (nss); i++)
+      for (i = 0; (i < F77_DIM_SIZE (nss) && (*elts) < options->print_max); i++)
        {
          fprintf_filtered (stream, "( ");
          f77_print_array_1 (nss + 1, ndimensions, TYPE_TARGET_TYPE (type),
                             valaddr + i * F77_DIM_OFFSET (nss),
                             address + i * F77_DIM_OFFSET (nss),
-                            stream, format, deref_ref, recurse, pretty);
+                            stream, recurse, options, elts);
          fprintf_filtered (stream, ") ");
        }
+      if (*elts >= options->print_max && i < F77_DIM_SIZE (nss)) 
+       fprintf_filtered (stream, "...");
     }
   else
     {
-      for (i = 0; (i < F77_DIM_SIZE (nss) && i < print_max); i++)
+      for (i = 0; i < F77_DIM_SIZE (nss) && (*elts) < options->print_max;
+          i++, (*elts)++)
        {
          val_print (TYPE_TARGET_TYPE (type),
                     valaddr + i * F77_DIM_OFFSET (ndimensions),
                     0,
                     address + i * F77_DIM_OFFSET (ndimensions),
-                    stream, format, deref_ref, recurse, pretty);
+                    stream, recurse, options, current_language);
 
          if (i != (F77_DIM_SIZE (nss) - 1))
            fprintf_filtered (stream, ", ");
 
-         if (i == print_max - 1)
+         if ((*elts == options->print_max - 1)
+             && (i != (F77_DIM_SIZE (nss) - 1)))
            fprintf_filtered (stream, "...");
        }
     }
@@ -316,16 +209,17 @@ f77_print_array_1 (int nss, int ndimensions, struct type *type, char *valaddr,
    stuff and then immediately call f77_print_array_1() */
 
 static void
-f77_print_array (struct type *type, char *valaddr, CORE_ADDR address,
-                struct ui_file *stream, int format, int deref_ref, int recurse,
-                enum val_prettyprint pretty)
+f77_print_array (struct type *type, const gdb_byte *valaddr,
+                CORE_ADDR address, struct ui_file *stream,
+                int recurse, const struct value_print_options *options)
 {
   int ndimensions;
+  int elts = 0;
 
   ndimensions = calc_f77_array_dims (type);
 
   if (ndimensions > MAX_FORTRAN_DIMS || ndimensions < 0)
-    error ("Type node corrupt! F77 arrays cannot have %d subscripts (%d Max)",
+    error (_("Type node corrupt! F77 arrays cannot have %d subscripts (%d Max)"),
           ndimensions, MAX_FORTRAN_DIMS);
 
   /* Since F77 arrays are stored column-major, we set up an 
@@ -334,57 +228,50 @@ f77_print_array (struct type *type, char *valaddr, CORE_ADDR address,
 
   f77_create_arrayprint_offset_tbl (type, stream);
 
-  f77_print_array_1 (1, ndimensions, type, valaddr, address, stream, format,
-                    deref_ref, recurse, pretty);
+  f77_print_array_1 (1, ndimensions, type, valaddr, address, stream,
+                    recurse, options, &elts);
 }
 \f
 
 /* Print data of type TYPE located at VALADDR (within GDB), which came from
    the inferior at address ADDRESS, onto stdio stream STREAM according to
-   FORMAT (a letter or 0 for natural format).  The data at VALADDR is in
-   target byte order.
+   OPTIONS.  The data at VALADDR is in target byte order.
 
    If the data are a string pointer, returns the number of string characters
-   printed.
-
-   If DEREF_REF is nonzero, then dereference references, otherwise just print
-   them like pointers.
-
-   The PRETTY parameter controls prettyprinting.  */
+   printed.  */
 
 int
-f_val_print (struct type *type, char *valaddr, int embedded_offset,
-            CORE_ADDR address, struct ui_file *stream, int format,
-            int deref_ref, int recurse, enum val_prettyprint pretty)
+f_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
+            CORE_ADDR address, struct ui_file *stream, int recurse,
+            const struct value_print_options *options)
 {
-  register unsigned int i = 0; /* Number of characters printed */
+  struct gdbarch *gdbarch = get_type_arch (type);
+  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
+  unsigned int i = 0;  /* Number of characters printed */
   struct type *elttype;
   LONGEST val;
   CORE_ADDR addr;
+  int index;
 
   CHECK_TYPEDEF (type);
   switch (TYPE_CODE (type))
     {
     case TYPE_CODE_STRING:
       f77_get_dynamic_length_of_aggregate (type);
-      LA_PRINT_STRING (stream, valaddr, TYPE_LENGTH (type), 1, 0);
+      LA_PRINT_STRING (stream, builtin_type (gdbarch)->builtin_char,
+                      valaddr, TYPE_LENGTH (type), 0, options);
       break;
 
     case TYPE_CODE_ARRAY:
       fprintf_filtered (stream, "(");
-      f77_print_array (type, valaddr, address, stream, format,
-                      deref_ref, recurse, pretty);
+      f77_print_array (type, valaddr, address, stream, recurse, options);
       fprintf_filtered (stream, ")");
       break;
-#if 0
-      /* Array of unspecified length: treat like pointer to first elt.  */
-      valaddr = (char *) &address;
-      /* FALL THROUGH */
-#endif
+
     case TYPE_CODE_PTR:
-      if (format && format != 's')
+      if (options->format && options->format != 's')
        {
-         print_scalar_formatted (valaddr, type, format, 0, stream);
+         print_scalar_formatted (valaddr, type, options, 0, stream);
          break;
        }
       else
@@ -395,32 +282,62 @@ f_val_print (struct type *type, char *valaddr, int embedded_offset,
          if (TYPE_CODE (elttype) == TYPE_CODE_FUNC)
            {
              /* Try to print what function it points to.  */
-             print_address_demangle (addr, stream, demangle);
+             print_address_demangle (gdbarch, addr, stream, demangle);
              /* Return value is irrelevant except for string pointers.  */
              return 0;
            }
 
-         if (addressprint && format != 's')
-           fprintf_filtered (stream, "0x%s", paddr_nz (addr));
+         if (options->addressprint && options->format != 's')
+           fputs_filtered (paddress (gdbarch, addr), stream);
 
          /* For a pointer to char or unsigned char, also print the string
             pointed to, unless pointer is null.  */
          if (TYPE_LENGTH (elttype) == 1
              && TYPE_CODE (elttype) == TYPE_CODE_INT
-             && (format == 0 || format == 's')
+             && (options->format == 0 || options->format == 's')
              && addr != 0)
-           i = val_print_string (addr, -1, TYPE_LENGTH (elttype), stream);
+           i = val_print_string (TYPE_TARGET_TYPE (type), addr, -1, stream,
+                                 options);
+
+         /* Return number of characters printed, including the terminating
+            '\0' if we reached the end.  val_print_string takes care including
+            the terminating '\0' if necessary.  */
+         return i;
+       }
+      break;
 
-         /* Return number of characters printed, plus one for the
-            terminating null if we have "reached the end".  */
-         return (i + (print_max && i != print_max));
+    case TYPE_CODE_REF:
+      elttype = check_typedef (TYPE_TARGET_TYPE (type));
+      if (options->addressprint)
+       {
+         CORE_ADDR addr
+           = extract_typed_address (valaddr + embedded_offset, type);
+         fprintf_filtered (stream, "@");
+         fputs_filtered (paddress (gdbarch, addr), stream);
+         if (options->deref_ref)
+           fputs_filtered (": ", stream);
+       }
+      /* De-reference the reference.  */
+      if (options->deref_ref)
+       {
+         if (TYPE_CODE (elttype) != TYPE_CODE_UNDEF)
+           {
+             struct value *deref_val =
+             value_at
+             (TYPE_TARGET_TYPE (type),
+              unpack_pointer (type, valaddr + embedded_offset));
+             common_val_print (deref_val, stream, recurse,
+                               options, current_language);
+           }
+         else
+           fputs_filtered ("???", stream);
        }
       break;
 
     case TYPE_CODE_FUNC:
-      if (format)
+      if (options->format)
        {
-         print_scalar_formatted (valaddr, type, format, 0, stream);
+         print_scalar_formatted (valaddr, type, options, 0, stream);
          break;
        }
       /* FIXME, we should consider, at least for ANSI C language, eliminating
@@ -429,13 +346,17 @@ f_val_print (struct type *type, char *valaddr, int embedded_offset,
       type_print (type, "", stream, -1);
       fprintf_filtered (stream, "} ");
       /* Try to print what function it points to, and its address.  */
-      print_address_demangle (address, stream, demangle);
+      print_address_demangle (gdbarch, address, stream, demangle);
       break;
 
     case TYPE_CODE_INT:
-      format = format ? format : output_format;
-      if (format)
-       print_scalar_formatted (valaddr, type, format, 0, stream);
+      if (options->format || options->output_format)
+       {
+         struct value_print_options opts = *options;
+         opts.format = (options->format ? options->format
+                        : options->output_format);
+         print_scalar_formatted (valaddr, type, &opts, 0, stream);
+       }
       else
        {
          val_print_type_code_int (type, valaddr, stream);
@@ -447,14 +368,21 @@ f_val_print (struct type *type, char *valaddr, int embedded_offset,
            {
              fputs_filtered (" ", stream);
              LA_PRINT_CHAR ((unsigned char) unpack_long (type, valaddr),
-                            stream);
+                            type, stream);
            }
        }
       break;
 
+    case TYPE_CODE_FLAGS:
+      if (options->format)
+         print_scalar_formatted (valaddr, type, options, 0, stream);
+      else
+       val_print_type_code_flags (type, valaddr, stream);
+      break;
+
     case TYPE_CODE_FLT:
-      if (format)
-       print_scalar_formatted (valaddr, type, format, 0, stream);
+      if (options->format)
+       print_scalar_formatted (valaddr, type, options, 0, stream);
       else
        print_floating (valaddr, type, stream);
       break;
@@ -473,32 +401,17 @@ f_val_print (struct type *type, char *valaddr, int embedded_offset,
       break;
 
     case TYPE_CODE_BOOL:
-      format = format ? format : output_format;
-      if (format)
-       print_scalar_formatted (valaddr, type, format, 0, stream);
+      if (options->format || options->output_format)
+       {
+         struct value_print_options opts = *options;
+         opts.format = (options->format ? options->format
+                        : options->output_format);
+         print_scalar_formatted (valaddr, type, &opts, 0, stream);
+       }
       else
        {
-         val = 0;
-         switch (TYPE_LENGTH (type))
-           {
-           case 1:
-             val = unpack_long (builtin_type_f_logical_s1, valaddr);
-             break;
-
-           case 2:
-             val = unpack_long (builtin_type_f_logical_s2, valaddr);
-             break;
-
-           case 4:
-             val = unpack_long (builtin_type_f_logical, valaddr);
-             break;
-
-           default:
-             error ("Logicals of length %d bytes not supported",
-                    TYPE_LENGTH (type));
-
-           }
-
+         val = extract_unsigned_integer (valaddr,
+                                         TYPE_LENGTH (type), byte_order);
          if (val == 0)
            fprintf_filtered (stream, ".FALSE.");
          else if (val == 1)
@@ -508,8 +421,7 @@ f_val_print (struct type *type, char *valaddr, int embedded_offset,
            {
              /* Bash the type code temporarily.  */
              TYPE_CODE (type) = TYPE_CODE_INT;
-             f_val_print (type, valaddr, 0, address, stream, format,
-                          deref_ref, recurse, pretty);
+             f_val_print (type, valaddr, 0, address, stream, recurse, options);
              /* Restore the type code so later uses work as intended. */
              TYPE_CODE (type) = TYPE_CODE_BOOL;
            }
@@ -517,20 +429,7 @@ f_val_print (struct type *type, char *valaddr, int embedded_offset,
       break;
 
     case TYPE_CODE_COMPLEX:
-      switch (TYPE_LENGTH (type))
-       {
-       case 8:
-         type = builtin_type_f_real;
-         break;
-       case 16:
-         type = builtin_type_f_real_s8;
-         break;
-       case 32:
-         type = builtin_type_f_real_s16;
-         break;
-       default:
-         error ("Cannot print out complex*%d variables", TYPE_LENGTH (type));
-       }
+      type = TYPE_TARGET_TYPE (type);
       fputs_filtered ("(", stream);
       print_floating (valaddr, type, stream);
       fputs_filtered (",", stream);
@@ -545,8 +444,24 @@ f_val_print (struct type *type, char *valaddr, int embedded_offset,
       fprintf_filtered (stream, "<incomplete type>");
       break;
 
+    case TYPE_CODE_STRUCT:
+    case TYPE_CODE_UNION:
+      /* Starting from the Fortran 90 standard, Fortran supports derived
+         types.  */
+      fprintf_filtered (stream, "( ");
+      for (index = 0; index < TYPE_NFIELDS (type); index++)
+        {
+          int offset = TYPE_FIELD_BITPOS (type, index) / 8;
+          f_val_print (TYPE_FIELD_TYPE (type, index), valaddr + offset,
+                       embedded_offset, address, stream, recurse, options);
+          if (index != TYPE_NFIELDS (type) - 1)
+            fputs_filtered (", ", stream);
+        }
+      fprintf_filtered (stream, " )");
+      break;     
+
     default:
-      error ("Invalid F77 type code %d in symbol table.", TYPE_CODE (type));
+      error (_("Invalid F77 type code %d in symbol table."), TYPE_CODE (type));
     }
   gdb_flush (stream);
   return 0;
@@ -559,11 +474,11 @@ list_all_visible_commons (char *funname)
 
   tmp = head_common_list;
 
-  printf_filtered ("All COMMON blocks visible at this level:\n\n");
+  printf_filtered (_("All COMMON blocks visible at this level:\n\n"));
 
   while (tmp != NULL)
     {
-      if (STREQ (tmp->owning_function, funname))
+      if (strcmp (tmp->owning_function, funname) == 0)
        printf_filtered ("%s\n", tmp->name);
 
       tmp = tmp->next;
@@ -580,7 +495,7 @@ info_common_command (char *comname, int from_tty)
   SAVED_F77_COMMON_PTR the_common;
   COMMON_ENTRY_PTR entry;
   struct frame_info *fi;
-  register char *funname = 0;
+  char *funname = 0;
   struct symbol *func;
 
   /* We have been told to display the contents of F77 COMMON 
@@ -588,15 +503,12 @@ info_common_command (char *comname, int from_tty)
      first make sure that it is visible and if so, let 
      us display its contents */
 
-  fi = selected_frame;
-
-  if (fi == NULL)
-    error ("No frame selected");
+  fi = get_selected_frame (_("No frame selected"));
 
   /* The following is generally ripped off from stack.c's routine 
      print_frame_info() */
 
-  func = find_pc_function (fi->pc);
+  func = find_pc_function (get_frame_pc (fi));
   if (func)
     {
       /* In certain pathological cases, the symtabs give the wrong
@@ -613,22 +525,25 @@ info_common_command (char *comname, int from_tty)
          be any minimal symbols in the middle of a function.
          FIXME:  (Not necessarily true.  What about text labels) */
 
-      struct minimal_symbol *msymbol = lookup_minimal_symbol_by_pc (fi->pc);
+      struct minimal_symbol *msymbol = 
+       lookup_minimal_symbol_by_pc (get_frame_pc (fi));
 
       if (msymbol != NULL
          && (SYMBOL_VALUE_ADDRESS (msymbol)
              > BLOCK_START (SYMBOL_BLOCK_VALUE (func))))
-       funname = SYMBOL_NAME (msymbol);
+       funname = SYMBOL_LINKAGE_NAME (msymbol);
       else
-       funname = SYMBOL_NAME (func);
+       funname = SYMBOL_LINKAGE_NAME (func);
     }
   else
     {
-      register struct minimal_symbol *msymbol =
-      lookup_minimal_symbol_by_pc (fi->pc);
+      struct minimal_symbol *msymbol =
+      lookup_minimal_symbol_by_pc (get_frame_pc (fi));
 
       if (msymbol != NULL)
-       funname = SYMBOL_NAME (msymbol);
+       funname = SYMBOL_LINKAGE_NAME (msymbol);
+      else /* Got no 'funname', code below will fail.  */
+       error (_("No function found for frame."));
     }
 
   /* If comname is NULL, we assume the user wishes to see the 
@@ -644,24 +559,22 @@ info_common_command (char *comname, int from_tty)
 
   if (the_common)
     {
-      if (STREQ (comname, BLANK_COMMON_NAME_LOCAL))
-       printf_filtered ("Contents of blank COMMON block:\n");
+      if (strcmp (comname, BLANK_COMMON_NAME_LOCAL) == 0)
+       printf_filtered (_("Contents of blank COMMON block:\n"));
       else
-       printf_filtered ("Contents of F77 COMMON block '%s':\n", comname);
+       printf_filtered (_("Contents of F77 COMMON block '%s':\n"), comname);
 
       printf_filtered ("\n");
       entry = the_common->entries;
 
       while (entry != NULL)
        {
-         printf_filtered ("%s = ", SYMBOL_NAME (entry->symbol));
-         print_variable_value (entry->symbol, fi, gdb_stdout);
-         printf_filtered ("\n");
+         print_variable_and_value (NULL, entry->symbol, fi, gdb_stdout, 0);
          entry = entry->next;
        }
     }
   else
-    printf_filtered ("Cannot locate the common block %s in function '%s'\n",
+    printf_filtered (_("Cannot locate the common block %s in function '%s'\n"),
                     comname, funname);
 }
 
@@ -674,16 +587,13 @@ there_is_a_visible_common_named (char *comname)
 {
   SAVED_F77_COMMON_PTR the_common;
   struct frame_info *fi;
-  register char *funname = 0;
+  char *funname = 0;
   struct symbol *func;
 
   if (comname == NULL)
-    error ("Cannot deal with NULL common name!");
-
-  fi = selected_frame;
+    error (_("Cannot deal with NULL common name!"));
 
-  if (fi == NULL)
-    error ("No frame selected");
+  fi = get_selected_frame (_("No frame selected"));
 
   /* The following is generally ripped off from stack.c's routine 
      print_frame_info() */
@@ -710,17 +620,17 @@ there_is_a_visible_common_named (char *comname)
       if (msymbol != NULL
          && (SYMBOL_VALUE_ADDRESS (msymbol)
              > BLOCK_START (SYMBOL_BLOCK_VALUE (func))))
-       funname = SYMBOL_NAME (msymbol);
+       funname = SYMBOL_LINKAGE_NAME (msymbol);
       else
-       funname = SYMBOL_NAME (func);
+       funname = SYMBOL_LINKAGE_NAME (func);
     }
   else
     {
-      register struct minimal_symbol *msymbol =
+      struct minimal_symbol *msymbol =
       lookup_minimal_symbol_by_pc (fi->pc);
 
       if (msymbol != NULL)
-       funname = SYMBOL_NAME (msymbol);
+       funname = SYMBOL_LINKAGE_NAME (msymbol);
     }
 
   the_common = find_common_for_function (comname, funname);
@@ -733,8 +643,8 @@ void
 _initialize_f_valprint (void)
 {
   add_info ("common", info_common_command,
-           "Print out the values contained in a Fortran COMMON block.");
+           _("Print out the values contained in a Fortran COMMON block."));
   if (xdb_commands)
     add_com ("lc", class_info, info_common_command,
-            "Print out the values contained in a Fortran COMMON block.");
+            _("Print out the values contained in a Fortran COMMON block."));
 }