* sparc64nbsd-tdep.c: Include "regset.h".
[deliverable/binutils-gdb.git] / gdb / f-valprint.c
index f3b3114b3ac43d6ff0f3382563c21d032eae54e9..805590f0a9110b09614d6b13a231d58f46736644 100644 (file)
@@ -1,5 +1,6 @@
 /* Support for printing Fortran values for GDB, the GNU debugger.
-   Copyright 1993, 1994, 1995 Free Software Foundation, Inc.
+   Copyright 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2003
+   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.
 
 #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 PARAMS ((char *));
+static int there_is_a_visible_common_named (char *);
 #endif
 
-extern void _initialize_f_valprint PARAMS ((void));
-static void info_common_command PARAMS ((char *, int));
-static void list_all_visible_commons PARAMS ((char *));
-static void f77_print_array PARAMS ((struct type *, char *, CORE_ADDR,
-                                    GDB_FILE *, int, int, int,
-                                    enum val_prettyprint));
-static void f77_print_array_1 PARAMS ((int, int, struct type *, char *,
-                                      CORE_ADDR, GDB_FILE *, int, int, int,
-                                      enum val_prettyprint));
-static void f77_create_arrayprint_offset_tbl PARAMS ((struct type *,
-                                                     GDB_FILE *));
-static void f77_get_dynamic_length_of_aggregate PARAMS ((struct type *));
+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,
+                              int *elts);
+static void f77_create_arrayprint_offset_tbl (struct type *,
+                                             struct ui_file *);
+static void f77_get_dynamic_length_of_aggregate (struct type *);
 
 int f77_array_offset_tbl[MAX_FORTRAN_DIMS + 1][2];
 
@@ -66,9 +68,7 @@ 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 (type, lower_bound)
-     struct type *type;
-     int *lower_bound;
+f77_get_dynamic_lowerbound (struct type *type, int *lower_bound)
 {
   CORE_ADDR current_frame_addr;
   CORE_ADDR ptr_to_lower_bound;
@@ -76,7 +76,7 @@ f77_get_dynamic_lowerbound (type, lower_bound)
   switch (TYPE_ARRAY_LOWER_BOUND_TYPE (type))
     {
     case BOUND_BY_VALUE_ON_STACK:
-      current_frame_addr = selected_frame->frame;
+      current_frame_addr = get_frame_base (deprecated_selected_frame);
       if (current_frame_addr > 0)
        {
          *lower_bound =
@@ -100,13 +100,13 @@ f77_get_dynamic_lowerbound (type, lower_bound)
       break;
 
     case BOUND_BY_REF_ON_STACK:
-      current_frame_addr = selected_frame->frame;
+      current_frame_addr = get_frame_base (deprecated_selected_frame);
       if (current_frame_addr > 0)
        {
          ptr_to_lower_bound =
-           read_memory_integer (current_frame_addr +
-                                TYPE_ARRAY_LOWER_BOUND_VALUE (type),
-                                4);
+           read_memory_typed_address (current_frame_addr +
+                                      TYPE_ARRAY_LOWER_BOUND_VALUE (type),
+                                      builtin_type_void_data_ptr);
          *lower_bound = read_memory_integer (ptr_to_lower_bound, 4);
        }
       else
@@ -126,9 +126,7 @@ f77_get_dynamic_lowerbound (type, lower_bound)
 }
 
 int
-f77_get_dynamic_upperbound (type, upper_bound)
-     struct type *type;
-     int *upper_bound;
+f77_get_dynamic_upperbound (struct type *type, int *upper_bound)
 {
   CORE_ADDR current_frame_addr = 0;
   CORE_ADDR ptr_to_upper_bound;
@@ -136,7 +134,7 @@ f77_get_dynamic_upperbound (type, upper_bound)
   switch (TYPE_ARRAY_UPPER_BOUND_TYPE (type))
     {
     case BOUND_BY_VALUE_ON_STACK:
-      current_frame_addr = selected_frame->frame;
+      current_frame_addr = get_frame_base (deprecated_selected_frame);
       if (current_frame_addr > 0)
        {
          *upper_bound =
@@ -165,13 +163,13 @@ f77_get_dynamic_upperbound (type, upper_bound)
       break;
 
     case BOUND_BY_REF_ON_STACK:
-      current_frame_addr = selected_frame->frame;
+      current_frame_addr = get_frame_base (deprecated_selected_frame);
       if (current_frame_addr > 0)
        {
          ptr_to_upper_bound =
-           read_memory_integer (current_frame_addr +
-                                TYPE_ARRAY_UPPER_BOUND_VALUE (type),
-                                4);
+           read_memory_typed_address (current_frame_addr +
+                                      TYPE_ARRAY_UPPER_BOUND_VALUE (type),
+                                      builtin_type_void_data_ptr);
          *upper_bound = read_memory_integer (ptr_to_upper_bound, 4);
        }
       else
@@ -193,8 +191,7 @@ f77_get_dynamic_upperbound (type, upper_bound)
 /* Obtain F77 adjustable array dimensions */
 
 static void
-f77_get_dynamic_length_of_aggregate (type)
-     struct type *type;
+f77_get_dynamic_length_of_aggregate (struct type *type)
 {
   int upper_bound = -1;
   int lower_bound = 1;
@@ -232,9 +229,7 @@ f77_get_dynamic_length_of_aggregate (type)
    type "type".  */
 
 static void
-f77_create_arrayprint_offset_tbl (type, stream)
-     struct type *type;
-     GDB_FILE *stream;
+f77_create_arrayprint_offset_tbl (struct type *type, struct ui_file *stream)
 {
   struct type *tmp_type;
   int eltlen;
@@ -277,40 +272,37 @@ f77_create_arrayprint_offset_tbl (type, 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 (nss, ndimensions, type, valaddr, address,
-                  stream, format, deref_ref, recurse, pretty)
-     int nss;
-     int ndimensions;
-     struct type *type;
-     char *valaddr;
-     CORE_ADDR address;
-     GDB_FILE *stream;
-     int format;
-     int deref_ref;
-     int recurse;
-     enum val_prettyprint pretty;
+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,
+                  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) < 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, format, deref_ref, recurse, pretty, elts);
          fprintf_filtered (stream, ") ");
        }
+      if (*elts >= 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) < print_max; 
+          i++, (*elts)++)
        {
          val_print (TYPE_TARGET_TYPE (type),
                     valaddr + i * F77_DIM_OFFSET (ndimensions),
@@ -321,7 +313,7 @@ f77_print_array_1 (nss, ndimensions, type, valaddr, address,
          if (i != (F77_DIM_SIZE (nss) - 1))
            fprintf_filtered (stream, ", ");
 
-         if (i == print_max - 1)
+         if ((*elts == print_max - 1) && (i != (F77_DIM_SIZE (nss) - 1)))
            fprintf_filtered (stream, "...");
        }
     }
@@ -331,18 +323,12 @@ f77_print_array_1 (nss, ndimensions, type, valaddr, address,
    stuff and then immediately call f77_print_array_1() */
 
 static void
-f77_print_array (type, valaddr, address, stream, format, deref_ref, recurse,
-                pretty)
-     struct type *type;
-     char *valaddr;
-     CORE_ADDR address;
-     GDB_FILE *stream;
-     int format;
-     int deref_ref;
-     int recurse;
-     enum val_prettyprint pretty;
+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)
 {
   int ndimensions;
+  int elts = 0;
 
   ndimensions = calc_f77_array_dims (type);
 
@@ -357,7 +343,7 @@ f77_print_array (type, valaddr, address, stream, format, deref_ref, recurse,
   f77_create_arrayprint_offset_tbl (type, stream);
 
   f77_print_array_1 (1, ndimensions, type, valaddr, address, stream, format,
-                    deref_ref, recurse, pretty);
+                    deref_ref, recurse, pretty, &elts);
 }
 \f
 
@@ -375,19 +361,11 @@ f77_print_array (type, valaddr, address, stream, format, deref_ref, recurse,
    The PRETTY parameter controls prettyprinting.  */
 
 int
-f_val_print (type, valaddr, embedded_offset, address, stream, format, deref_ref, recurse,
-            pretty)
-     struct type *type;
-     char *valaddr;
-     int embedded_offset;
-     CORE_ADDR address;
-     GDB_FILE *stream;
-     int format;
-     int deref_ref;
-     int recurse;
-     enum val_prettyprint pretty;
+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)
 {
-  register unsigned int i = 0; /* Number of characters printed */
+  unsigned int i = 0;  /* Number of characters printed */
   struct type *elttype;
   LONGEST val;
   CORE_ADDR addr;
@@ -406,11 +384,7 @@ f_val_print (type, valaddr, embedded_offset, address, stream, format, deref_ref,
                       deref_ref, recurse, pretty);
       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')
        {
@@ -431,7 +405,7 @@ f_val_print (type, valaddr, embedded_offset, address, stream, format, deref_ref,
            }
 
          if (addressprint && format != 's')
-           fprintf_filtered (stream, "0x%x", addr);
+           print_address_numeric (addr, 1, stream);
 
          /* For a pointer to char or unsigned char, also print the string
             pointed to, unless pointer is null.  */
@@ -441,9 +415,47 @@ f_val_print (type, valaddr, embedded_offset, address, stream, format, deref_ref,
              && addr != 0)
            i = val_print_string (addr, -1, TYPE_LENGTH (elttype), stream);
 
-         /* Return number of characters printed, plus one for the
-            terminating null if we have "reached the end".  */
-         return (i + (print_max && i != print_max));
+         /* 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;
+
+    case TYPE_CODE_REF:
+      elttype = check_typedef (TYPE_TARGET_TYPE (type));
+      if (addressprint)
+       {
+         CORE_ADDR addr
+           = extract_typed_address (valaddr + embedded_offset, type);
+         fprintf_filtered (stream, "@");
+         print_address_numeric (addr, 1, stream);
+         if (deref_ref)
+           fputs_filtered (": ", stream);
+       }
+      /* De-reference the reference.  */
+      if (deref_ref)
+       {
+         if (TYPE_CODE (elttype) != TYPE_CODE_UNDEF)
+           {
+             struct value *deref_val =
+             value_at
+             (TYPE_TARGET_TYPE (type),
+              unpack_pointer (lookup_pointer_type (builtin_type_void),
+                              valaddr + embedded_offset),
+              NULL);
+             val_print (VALUE_TYPE (deref_val),
+                        VALUE_CONTENTS (deref_val),
+                        0,
+                        VALUE_ADDRESS (deref_val),
+                        stream,
+                        format,
+                        deref_ref,
+                        recurse,
+                        pretty);
+           }
+         else
+           fputs_filtered ("???", stream);
        }
       break;
 
@@ -564,7 +576,7 @@ f_val_print (type, valaddr, embedded_offset, address, stream, format, deref_ref,
       fputs_filtered ("(", stream);
       print_floating (valaddr, type, stream);
       fputs_filtered (",", stream);
-      print_floating (valaddr, type, stream);
+      print_floating (valaddr + TYPE_LENGTH (type), type, stream);
       fputs_filtered (")", stream);
       break;
 
@@ -583,8 +595,7 @@ f_val_print (type, valaddr, embedded_offset, address, stream, format, deref_ref,
 }
 
 static void
-list_all_visible_commons (funname)
-     char *funname;
+list_all_visible_commons (char *funname)
 {
   SAVED_F77_COMMON_PTR tmp;
 
@@ -594,7 +605,7 @@ list_all_visible_commons (funname)
 
   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;
@@ -606,14 +617,12 @@ list_all_visible_commons (funname)
    given name */
 
 static void
-info_common_command (comname, from_tty)
-     char *comname;
-     int from_tty;
+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 
@@ -621,7 +630,7 @@ info_common_command (comname, from_tty)
      first make sure that it is visible and if so, let 
      us display its contents */
 
-  fi = selected_frame;
+  fi = deprecated_selected_frame;
 
   if (fi == NULL)
     error ("No frame selected");
@@ -629,7 +638,7 @@ info_common_command (comname, from_tty)
   /* 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
@@ -646,22 +655,22 @@ info_common_command (comname, 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 = DEPRECATED_SYMBOL_NAME (msymbol);
       else
-       funname = SYMBOL_NAME (func);
+       funname = DEPRECATED_SYMBOL_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 = DEPRECATED_SYMBOL_NAME (msymbol);
     }
 
   /* If comname is NULL, we assume the user wishes to see the 
@@ -677,7 +686,7 @@ info_common_command (comname, from_tty)
 
   if (the_common)
     {
-      if (STREQ (comname, BLANK_COMMON_NAME_LOCAL))
+      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);
@@ -687,7 +696,7 @@ info_common_command (comname, from_tty)
 
       while (entry != NULL)
        {
-         printf_filtered ("%s = ", SYMBOL_NAME (entry->symbol));
+         printf_filtered ("%s = ", DEPRECATED_SYMBOL_NAME (entry->symbol));
          print_variable_value (entry->symbol, fi, gdb_stdout);
          printf_filtered ("\n");
          entry = entry->next;
@@ -703,18 +712,17 @@ info_common_command (comname, from_tty)
 
 #if 0
 static int
-there_is_a_visible_common_named (comname)
-     char *comname;
+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;
+  fi = deprecated_selected_frame;
 
   if (fi == NULL)
     error ("No frame selected");
@@ -744,17 +752,17 @@ there_is_a_visible_common_named (comname)
       if (msymbol != NULL
          && (SYMBOL_VALUE_ADDRESS (msymbol)
              > BLOCK_START (SYMBOL_BLOCK_VALUE (func))))
-       funname = SYMBOL_NAME (msymbol);
+       funname = DEPRECATED_SYMBOL_NAME (msymbol);
       else
-       funname = SYMBOL_NAME (func);
+       funname = DEPRECATED_SYMBOL_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 = DEPRECATED_SYMBOL_NAME (msymbol);
     }
 
   the_common = find_common_for_function (comname, funname);
@@ -764,7 +772,7 @@ there_is_a_visible_common_named (comname)
 #endif
 
 void
-_initialize_f_valprint ()
+_initialize_f_valprint (void)
 {
   add_info ("common", info_common_command,
            "Print out the values contained in a Fortran COMMON block.");
This page took 0.030087 seconds and 4 git commands to generate.