Fix value_print, which used to be ostensibly langauge-indepentdent,
authorPer Bothner <per@bothner.com>
Sun, 5 Jun 1994 01:43:40 +0000 (01:43 +0000)
committerPer Bothner <per@bothner.com>
Sun, 5 Jun 1994 01:43:40 +0000 (01:43 +0000)
but would print pointers and arrays in C syntax.  Instead, call
a language-specific function.  See ChangeLog for details.

gdb/ChangeLog
gdb/c-lang.c
gdb/c-lang.h
gdb/c-valprint.c
gdb/ch-lang.c
gdb/ch-lang.h
gdb/ch-valprint.c
gdb/language.c
gdb/language.h
gdb/m2-lang.c

index 4762c0e..25ac157 100644 (file)
@@ -1,3 +1,32 @@
+Sat Jun  4 18:17:03 1994  Per Bothner  (bothner@kalessin.cygnus.com)
+
+       Fix value_print, which used to be ostensibly langauge-indepentdent,
+       but would print pointers and arrays in C syntax.  Instead, call
+       a language-specific function.
+       * language.h (struct language_defn):  New functional field
+       la_value_print.  (LA_VALUE_PRINT):  New macro.
+       * language.c (unk_lang_value_print ):  New stub/dummy function.
+       (unknown_language_defn, auto_language_defn, local_language_defn):
+       Use it.
+       * c-valprint.c (c_value_print):  New function, with code moved from:
+       * valprint.c (value_print):  ... here.  Now just invoke
+       LA_VALUE_PRINT to do language-specific stuff.
+       * valprint.c (value_print_array_elements):  Make non-static.
+       * c-lang.c (c_language_defn, cplus_language_defn):  Add
+       c_value_print in the la_value_print field,
+       * m2-lang.c (m2_language_defn):  Likewise.
+       * ch-lang.c (chill_language_defn):  But here use chill_value_print.
+       * ch-valprint.c (chill_val_print):  Print null pointer as NULL.
+       * ch-valprint.c (chill_value_print):  New function, based on
+       c_value_print, but use Chill "look and feel."
+       * c-lang.h (c_value_print):  New prototype.
+       * ch-lang.h (chill_value_print):  New prototype.
+       * value.h (value_print_array_elements):  New prototype.
+
+       * ch-valprint.c (chill_val_print, case TYPE_CODE_BITSTRING
+       and case TYPE_CODE_SET):  Check that the element type isn't a stub.
+
+
 Fri Jun  3 09:15:00 1994  Jim Kingdon  (kingdon@lioth.cygnus.com)
 
        * main.c: Move entire file except for #ifndef MAIN_OVERRIDE code
index 389c58d..3f694a4 100644 (file)
@@ -404,6 +404,7 @@ const struct language_defn c_language_defn = {
   c_create_fundamental_type,   /* Create fundamental type in this language */
   c_print_type,                        /* Print a type using appropriate syntax */
   c_val_print,                 /* Print a value using appropriate syntax */
+  c_value_print,               /* Print a top-level value */
   &builtin_type_double,                /* longest floating point type */ /*FIXME*/
   {"",     "",    "",  ""},    /* Binary format info */
   {"0%lo",  "0",   "o", ""},   /* Octal format info */
@@ -426,6 +427,7 @@ const struct language_defn cplus_language_defn = {
   c_create_fundamental_type,   /* Create fundamental type in this language */
   c_print_type,                        /* Print a type using appropriate syntax */
   c_val_print,                 /* Print a value using appropriate syntax */
+  c_value_print,               /* Print a top-level value */
   &builtin_type_double,                /* longest floating point type */ /*FIXME*/
   {"",      "",    "",   ""},  /* Binary format info */
   {"0%lo",   "0",   "o",  ""}, /* Octal format info */
index f176060..0ea013d 100644 (file)
@@ -17,6 +17,10 @@ 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., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
+#ifdef __STDC__                /* Forward decls for prototypes */
+struct value;
+#endif
+
 extern int
 c_parse PARAMS ((void));       /* Defined in c-exp.y */
 
@@ -29,3 +33,6 @@ c_print_type PARAMS ((struct type *, char *, GDB_FILE *, int, int));
 extern int
 c_val_print PARAMS ((struct type *, char *, CORE_ADDR, GDB_FILE *, int, int,
                     int, enum val_prettyprint));
+
+extern int
+c_value_print PARAMS ((struct value *, GDB_FILE *, int, enum val_prettyprint));
index cea6889..5960369 100644 (file)
@@ -434,3 +434,64 @@ c_val_print (type, valaddr, address, stream, format, deref_ref, recurse,
   gdb_flush (stream);
   return (0);
 }
+\f
+int
+c_value_print (val, stream, format, pretty)
+     value_ptr val;
+     GDB_FILE *stream;
+     int format;
+     enum val_prettyprint pretty;
+{
+  /* A "repeated" value really contains several values in a row.
+     They are made by the @ operator.
+     Print such values as if they were arrays.  */
+
+  if (VALUE_REPEATED (val))
+    {
+      register unsigned int n = VALUE_REPETITIONS (val);
+      register unsigned int typelen = TYPE_LENGTH (VALUE_TYPE (val));
+      fprintf_filtered (stream, "{");
+      /* Print arrays of characters using string syntax.  */
+      if (typelen == 1 && TYPE_CODE (VALUE_TYPE (val)) == TYPE_CODE_INT
+         && format == 0)
+       LA_PRINT_STRING (stream, VALUE_CONTENTS (val), n, 0);
+      else
+       {
+         value_print_array_elements (val, stream, format, pretty);
+       }
+      fprintf_filtered (stream, "}");
+      return (n * typelen);
+    }
+  else
+    {
+      struct type *type = VALUE_TYPE (val);
+
+      /* If it is a pointer, indicate what it points to.
+
+        Print type also if it is a reference.
+
+         C++: if it is a member pointer, we will take care
+        of that when we print it.  */
+      if (TYPE_CODE (type) == TYPE_CODE_PTR ||
+         TYPE_CODE (type) == TYPE_CODE_REF)
+       {
+         /* Hack:  remove (char *) for char strings.  Their
+            type is indicated by the quoted string anyway. */
+          if (TYPE_CODE (type) == TYPE_CODE_PTR &&
+             TYPE_LENGTH (TYPE_TARGET_TYPE (type)) == sizeof(char) &&
+             TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_INT &&
+             !TYPE_UNSIGNED (TYPE_TARGET_TYPE (type)))
+           {
+               /* Print nothing */
+           }
+         else
+           {
+             fprintf_filtered (stream, "(");
+             type_print (type, "", stream, -1);
+             fprintf_filtered (stream, ") ");
+           }
+       }
+      return (val_print (type, VALUE_CONTENTS (val),
+                        VALUE_ADDRESS (val), stream, format, 1, 0, pretty));
+    }
+}
index f7d9212..b3128fd 100644 (file)
@@ -315,6 +315,7 @@ const struct language_defn chill_language_defn = {
   chill_create_fundamental_type,/* Create fundamental type in this language */
   chill_print_type,            /* Print a type using appropriate syntax */
   chill_val_print,             /* Print a value using appropriate syntax */
+  chill_value_print,           /* Print a top-levl value */
   &builtin_type_chill_real,    /* longest floating point type */
   {"",      "B'",  "",   ""},  /* Binary format info */
   {"O'%lo",  "O'",  "o",  ""}, /* Octal format info */
index 80c753e..0fcb8d6 100644 (file)
@@ -17,6 +17,10 @@ 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., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
+#ifdef __STDC__                /* Forward decls for prototypes */
+struct value;
+#endif
+
 extern int
 chill_parse PARAMS ((void));   /* Defined in ch-exp.y */
 
@@ -31,6 +35,10 @@ chill_val_print PARAMS ((struct type *, char *, CORE_ADDR, GDB_FILE *, int, int,
                         int, enum val_prettyprint));
 
 extern int
+chill_value_print PARAMS ((struct value *, GDB_FILE *,
+                          int, enum val_prettyprint));
+
+extern int
 chill_is_varying_struct PARAMS ((struct type *type));
 
 
index 4eaaa96..00f5565 100644 (file)
@@ -242,6 +242,13 @@ chill_val_print (type, valaddr, address, stream, format, deref_ref, recurse,
        }
       addr = unpack_pointer (type, valaddr);
       elttype = TYPE_TARGET_TYPE (type);
+
+      /* We assume a NULL pointer is all zeros ... */
+      if (addr == 0)
+       {
+         fputs_filtered ("NULL", stream);
+         return 0;
+       }
       
       if (TYPE_CODE (elttype) == TYPE_CODE_FUNC)
        {
@@ -287,8 +294,16 @@ chill_val_print (type, valaddr, address, stream, format, deref_ref, recurse,
 
     case TYPE_CODE_BITSTRING:
     case TYPE_CODE_SET:
+      elttype = TYPE_FIELD_TYPE (type, 0);
+      check_stub_type (elttype);
+      if (TYPE_FLAGS (elttype) & TYPE_FLAG_STUB)
+       {
+         fprintf_filtered (stream, "<incomplete type>");
+         gdb_flush (stream);
+         break;
+       }
       {
-       struct type *range = TYPE_FIELD_TYPE (type, 0);
+       struct type *range = elttype;
        int low_bound = TYPE_LOW_BOUND (range);
        int high_bound = TYPE_HIGH_BOUND (range);
        int i;
@@ -494,3 +509,73 @@ chill_print_value_fields (type, valaddr, stream, format, recurse, pretty,
     }
   fprintf_filtered (stream, "]");
 }
+\f
+int
+chill_value_print (val, stream, format, pretty)
+     value_ptr val;
+     GDB_FILE *stream;
+     int format;
+     enum val_prettyprint pretty;
+{
+  /* A "repeated" value really contains several values in a row.
+     They are made by the @ operator.
+     Print such values as if they were arrays.  */
+
+  if (VALUE_REPEATED (val))
+    {
+      register unsigned int n = VALUE_REPETITIONS (val);
+      register unsigned int typelen = TYPE_LENGTH (VALUE_TYPE (val));
+      fprintf_filtered (stream, "[");
+      /* Print arrays of characters using string syntax.  */
+      if (typelen == 1 && TYPE_CODE (VALUE_TYPE (val)) == TYPE_CODE_INT
+         && format == 0)
+       LA_PRINT_STRING (stream, VALUE_CONTENTS (val), n, 0);
+      else
+       {
+         value_print_array_elements (val, stream, format, pretty);
+       }
+      fprintf_filtered (stream, "]");
+      return (n * typelen);
+    }
+  else
+    {
+      struct type *type = VALUE_TYPE (val);
+
+      /* If it is a pointer, indicate what it points to.
+
+        Print type also if it is a reference.
+
+         C++: if it is a member pointer, we will take care
+        of that when we print it.  */
+      if (TYPE_CODE (type) == TYPE_CODE_PTR ||
+         TYPE_CODE (type) == TYPE_CODE_REF)
+       {
+         char *valaddr = VALUE_CONTENTS (val);
+         CORE_ADDR addr = unpack_pointer (type, valaddr);
+          if (TYPE_CODE (type) != TYPE_CODE_PTR || addr != 0)
+           {
+             int i;
+             char *name = TYPE_NAME (type);
+             if (name)
+               fputs_filtered (name, stream);
+             else if (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_VOID)
+               fputs_filtered ("PTR", stream);
+             else
+               {
+                 fprintf_filtered (stream, "(");
+                 type_print (type, "", stream, -1);
+                 fprintf_filtered (stream, ")");
+               }
+             fprintf_filtered (stream, "(");
+             i = val_print (type, valaddr, VALUE_ADDRESS (val),
+                            stream, format, 1, 0, pretty);
+             fprintf_filtered (stream, ")");
+             return i;
+           }
+       }
+      return (val_print (type, VALUE_CONTENTS (val),
+                        VALUE_ADDRESS (val), stream, format, 1, 0, pretty));
+    }
+}
+
+
index 6347428..4a3b6a0 100644 (file)
@@ -1165,6 +1165,16 @@ unk_lang_val_print (type, valaddr, address, stream, format, deref_ref,
   error ("internal error - unimplemented function unk_lang_val_print called.");
 }
 
+int
+unk_lang_value_print (val, stream, format, pretty)
+     value_ptr val;
+     GDB_FILE *stream;
+     int format;
+     enum val_prettyprint pretty;
+{
+  error ("internal error - unimplemented function unk_lang_value_print called.");
+}
+
 static struct type ** const (unknown_builtin_types[]) = { 0 };
 static const struct op_print unk_op_print_tab[] = {
     {NULL, OP_NULL, PREC_NULL, 0}
@@ -1183,6 +1193,7 @@ const struct language_defn unknown_language_defn = {
   unk_lang_create_fundamental_type,
   unk_lang_print_type,         /* Print a type using appropriate syntax */
   unk_lang_val_print,          /* Print a value using appropriate syntax */
+  unk_lang_value_print,                /* Print a top-level value */
   &builtin_type_error,         /* longest floating point type */
   {"",      "",    "",   ""},  /* Binary format info */
   {"0%lo",   "0",   "o",  ""}, /* Octal format info */
@@ -1206,6 +1217,7 @@ const struct language_defn auto_language_defn = {
   unk_lang_create_fundamental_type,
   unk_lang_print_type,         /* Print a type using appropriate syntax */
   unk_lang_val_print,          /* Print a value using appropriate syntax */
+  unk_lang_value_print,                /* Print a top-level value */
   &builtin_type_error,         /* longest floating point type */
   {"",      "",    "",   ""},  /* Binary format info */
   {"0%lo",   "0",   "o",  ""}, /* Octal format info */
@@ -1228,6 +1240,7 @@ const struct language_defn local_language_defn = {
   unk_lang_create_fundamental_type,
   unk_lang_print_type,         /* Print a type using appropriate syntax */
   unk_lang_val_print,          /* Print a value using appropriate syntax */
+  unk_lang_value_print,                /* Print a top-level value */
   &builtin_type_error,         /* longest floating point type */
   {"",      "",    "",   ""},  /* Binary format info */
   {"0%lo",   "0",   "o",  ""}, /* Octal format info */
index 2198a15..a4ec6fb 100644 (file)
@@ -144,6 +144,11 @@ struct language_defn
   int (*la_val_print) PARAMS ((struct type *, char *,  CORE_ADDR, GDB_FILE *,
                               int, int, int, enum val_prettyprint));
 
+  /* Print a top-level value using syntax appropriate for this language. */
+
+  int (*la_value_print) PARAMS ((struct value *, GDB_FILE *,
+                                int, enum val_prettyprint));
+
   /* Longest floating point type */
 
   struct type **la_longest_float;
@@ -247,6 +252,8 @@ set_language PARAMS ((enum language));
 #define LA_VAL_PRINT(type,valaddr,addr,stream,fmt,deref,recurse,pretty) \
   (current_language->la_val_print(type,valaddr,addr,stream,fmt,deref, \
                                  recurse,pretty))
+#define LA_VALUE_PRINT(val,stream,fmt,pretty) \
+  (current_language->la_value_print(val,stream,fmt,pretty))
 
 /* Return a format string for printf that will print a number in one of
    the local (language-specific) formats.  Result is static and is
index ba4744f..c12b7dd 100644 (file)
@@ -24,6 +24,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include "parser-defs.h"
 #include "language.h"
 #include "m2-lang.h"
+#include "c-lang.h"
 
 /* Print the character C on STREAM as part of the contents of a literal
    string whose delimiter is QUOTER.  Note that that format for printing
@@ -405,6 +406,7 @@ const struct language_defn m2_language_defn = {
   m2_create_fundamental_type,  /* Create fundamental type in this language */
   m2_print_type,               /* Print a type using appropriate syntax */
   m2_val_print,                        /* Print a value using appropriate syntax */
+  c_value_print,               /* Print a top-level value */
   &builtin_type_m2_real,       /* longest floating point type */
   {"",      "",   "",   ""},   /* Binary format info */
   {"%loB",   "",   "o",  "B"}, /* Octal format info */