2002-11-26 Andrew Cagney <ac131313@redhat.com>
[deliverable/binutils-gdb.git] / gdb / p-valprint.c
index b18e7cf0daf6e09ecfa3fc59bd337b2f6729e845..a99d4e989723de67e9aeb3c0e0d36fddc706219f 100644 (file)
@@ -1,5 +1,5 @@
 /* Support for printing Pascal values for GDB, the GNU debugger.
-   Copyright 2000
+   Copyright 2000, 2001
    Free Software Foundation, Inc.
 
    This file is part of GDB.
@@ -21,7 +21,7 @@
 /* This file is derived from c-valprint.c */
 
 #include "defs.h"
-#include "obstack.h"
+#include "gdb_obstack.h"
 #include "symtab.h"
 #include "gdbtypes.h"
 #include "expression.h"
 #include "gdbcore.h"
 #include "demangle.h"
 #include "valprint.h"
+#include "typeprint.h"
 #include "language.h"
 #include "target.h"
 #include "annotate.h"
 #include "p-lang.h"
+#include "cp-abi.h"
 \f
 
 
 
 
 int
-pascal_val_print (type, valaddr, embedded_offset, address, stream, format, deref_ref, recurse,
-                 pretty)
-     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;
+pascal_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 len;
   struct type *elttype;
   unsigned eltlen;
+  int length_pos, length_size, string_pos;
+  int char_size;
   LONGEST val;
   CORE_ADDR addr;
 
@@ -194,16 +190,17 @@ pascal_val_print (type, valaddr, embedded_offset, address, stream, format, deref
             as GDB does not recognize stabs pascal strings
             Pascal strings are mapped to records
             with lowercase names PM  */
-         /* I don't know what GPC does :( PM */
-         if (TYPE_CODE (elttype) == TYPE_CODE_STRUCT &&
-             TYPE_NFIELDS (elttype) == 2 &&
-             strcmp (TYPE_FIELDS (elttype)[0].name, "length") == 0 &&
-             strcmp (TYPE_FIELDS (elttype)[1].name, "st") == 0 &&
-             addr != 0)
+          if (is_pascal_string_type (elttype, &length_pos, &length_size,
+                                     &string_pos, &char_size, NULL)
+             && addr != 0)
            {
-             char bytelength;
-             read_memory (addr, &bytelength, 1);
-             i = val_print_string (addr + 1, bytelength, 1, stream);
+             ULONGEST string_length;
+              void *buffer;
+              buffer = xmalloc (length_size);
+              read_memory (addr + length_pos, buffer, length_size);
+             string_length = extract_unsigned_integer (buffer, length_size);
+              xfree (buffer);
+              i = val_print_string (addr + string_pos, string_length, char_size, stream);
            }
          else if (pascal_object_is_vtbl_member (type))
            {
@@ -212,8 +209,8 @@ pascal_val_print (type, valaddr, embedded_offset, address, stream, format, deref
 
              struct minimal_symbol *msymbol =
              lookup_minimal_symbol_by_pc (vt_address);
-             if ((msymbol != NULL) &&
-                 (vt_address == SYMBOL_VALUE_ADDRESS (msymbol)))
+             if ((msymbol != NULL)
+                 && (vt_address == SYMBOL_VALUE_ADDRESS (msymbol)))
                {
                  fputs_filtered (" <", stream);
                  fputs_filtered (SYMBOL_SOURCE_NAME (msymbol), stream);
@@ -221,7 +218,7 @@ pascal_val_print (type, valaddr, embedded_offset, address, stream, format, deref
                }
              if (vt_address && vtblprint)
                {
-                 value_ptr vt_val;
+                 struct value *vt_val;
                  struct symbol *wsym = (struct symbol *) NULL;
                  struct type *wtype;
                  struct symtab *s;
@@ -286,7 +283,7 @@ pascal_val_print (type, valaddr, embedded_offset, address, stream, format, deref
        {
          if (TYPE_CODE (elttype) != TYPE_CODE_UNDEF)
            {
-             value_ptr deref_val =
+             struct value *deref_val =
              value_at
              (TYPE_TARGET_TYPE (type),
               unpack_pointer (lookup_pointer_type (builtin_type_void),
@@ -322,12 +319,11 @@ pascal_val_print (type, valaddr, embedded_offset, address, stream, format, deref
        }
       else
        {
-         if ((TYPE_NFIELDS (type) == 2) &&
-             (strcmp (TYPE_FIELDS (type)[0].name, "length") == 0) &&
-             (strcmp (TYPE_FIELDS (type)[1].name, "st") == 0))
+          if (is_pascal_string_type (type, &length_pos, &length_size,
+                                     &string_pos, &char_size, NULL))
            {
-             len = (*(valaddr + embedded_offset)) & 0xff;
-             LA_PRINT_STRING (stream, valaddr + embedded_offset + 1, len, /* width ?? */ 0, 0);
+             len = extract_unsigned_integer (valaddr + embedded_offset + length_pos, length_size);
+             LA_PRINT_STRING (stream, valaddr + embedded_offset + string_pos, len, char_size, 0);
            }
          else
            pascal_object_print_value_fields (type, valaddr + embedded_offset, address, stream, format,
@@ -450,7 +446,7 @@ pascal_val_print (type, valaddr, embedded_offset, address, stream, format, deref
     case TYPE_CODE_SET:
       elttype = TYPE_INDEX_TYPE (type);
       CHECK_TYPEDEF (elttype);
-      if (TYPE_FLAGS (elttype) & TYPE_FLAG_STUB)
+      if (TYPE_STUB (elttype))
        {
          fprintf_filtered (stream, "<incomplete type>");
          gdb_flush (stream);
@@ -536,11 +532,8 @@ pascal_val_print (type, valaddr, embedded_offset, address, stream, format, deref
 }
 \f
 int
-pascal_value_print (val, stream, format, pretty)
-     value_ptr val;
-     struct ui_file *stream;
-     int format;
-     enum val_prettyprint pretty;
+pascal_value_print (struct value *val, struct ui_file *stream, int format,
+                   enum val_prettyprint pretty)
 {
   struct type *type = VALUE_TYPE (val);
 
@@ -587,19 +580,17 @@ static int pascal_static_field_print;     /* Controls printing of static fields. */
 static struct obstack dont_print_vb_obstack;
 static struct obstack dont_print_statmem_obstack;
 
-static void
-  pascal_object_print_static_field (struct type *, value_ptr, struct ui_file *, int, int,
-                                   enum val_prettyprint);
+static void pascal_object_print_static_field (struct type *, struct value *,
+                                             struct ui_file *, int, int,
+                                             enum val_prettyprint);
 
 static void
   pascal_object_print_value (struct type *, char *, CORE_ADDR, struct ui_file *,
                             int, int, enum val_prettyprint, struct type **);
 
 void
-pascal_object_print_class_method (valaddr, type, stream)
-     char *valaddr;
-     struct type *type;
-     struct ui_file *stream;
+pascal_object_print_class_method (char *valaddr, struct type *type,
+                                 struct ui_file *stream)
 {
   struct type *domain;
   struct fn_field *f = NULL;
@@ -629,13 +620,11 @@ pascal_object_print_class_method (valaddr, type, stream)
          f = TYPE_FN_FIELDLIST1 (domain, i);
          len2 = TYPE_FN_FIELDLIST_LENGTH (domain, i);
 
+         check_stub_method_group (domain, i);
          for (j = 0; j < len2; j++)
            {
-             QUIT;
              if (TYPE_FN_FIELD_VOFFSET (f, j) == offset)
                {
-                 if (TYPE_FN_FIELD_STUB (f, j))
-                   check_stub_method (domain, i, j);
                  kind = "virtual ";
                  goto common;
                }
@@ -655,15 +644,11 @@ pascal_object_print_class_method (valaddr, type, stream)
          f = TYPE_FN_FIELDLIST1 (domain, i);
          len2 = TYPE_FN_FIELDLIST_LENGTH (domain, i);
 
+         check_stub_method_group (domain, i);
          for (j = 0; j < len2; j++)
            {
-             QUIT;
-             if (TYPE_FN_FIELD_STUB (f, j))
-               check_stub_method (domain, i, j);
              if (STREQ (SYMBOL_NAME (sym), TYPE_FN_FIELD_PHYSNAME (f, j)))
-               {
-                 goto common;
-               }
+               goto common;
            }
        }
     }
@@ -682,7 +667,7 @@ common:
       else
        {
          fputs_filtered (demangled_name, stream);
-         free (demangled_name);
+         xfree (demangled_name);
        }
     }
   else
@@ -701,8 +686,7 @@ const char pascal_vtbl_ptr_name[] =
    "pointer to virtual function".  */
 
 int
-pascal_object_is_vtbl_ptr_type (type)
-     struct type *type;
+pascal_object_is_vtbl_ptr_type (struct type *type)
 {
   char *typename = type_name_no_tag (type);
 
@@ -714,8 +698,7 @@ pascal_object_is_vtbl_ptr_type (type)
    "pointer to virtual function table".  */
 
 int
-pascal_object_is_vtbl_member (type)
-     struct type *type;
+pascal_object_is_vtbl_member (struct type *type)
 {
   if (TYPE_CODE (type) == TYPE_CODE_PTR)
     {
@@ -745,17 +728,12 @@ pascal_object_is_vtbl_member (type)
    should not print, or zero if called from top level.  */
 
 void
-pascal_object_print_value_fields (type, valaddr, address, stream, format, recurse, pretty,
-                                 dont_print_vb, dont_print_statmem)
-     struct type *type;
-     char *valaddr;
-     CORE_ADDR address;
-     struct ui_file *stream;
-     int format;
-     int recurse;
-     enum val_prettyprint pretty;
-     struct type **dont_print_vb;
-     int dont_print_statmem;
+pascal_object_print_value_fields (struct type *type, char *valaddr,
+                                 CORE_ADDR address, struct ui_file *stream,
+                                 int format, int recurse,
+                                 enum val_prettyprint pretty,
+                                 struct type **dont_print_vb,
+                                 int dont_print_statmem)
 {
   int i, len, n_baseclasses;
   struct obstack tmp_obstack;
@@ -851,7 +829,7 @@ pascal_object_print_value_fields (type, valaddr, address, stream, format, recurs
 
          if (!TYPE_FIELD_STATIC (type, i) && TYPE_FIELD_PACKED (type, i))
            {
-             value_ptr v;
+             struct value *v;
 
              /* Bitfields require special handling, especially due to byte
                 order problems.  */
@@ -876,8 +854,8 @@ pascal_object_print_value_fields (type, valaddr, address, stream, format, recurs
                }
              else if (TYPE_FIELD_STATIC (type, i))
                {
-                 /* value_ptr v = value_static_field (type, i); v4.17 specific */
-                 value_ptr v;
+                 /* struct value *v = value_static_field (type, i); v4.17 specific */
+                 struct value *v;
                  v = value_from_longest (TYPE_FIELD_TYPE (type, i),
                                   unpack_field_as_long (type, valaddr, i));
 
@@ -924,16 +902,10 @@ pascal_object_print_value_fields (type, valaddr, address, stream, format, recurs
    baseclasses.  */
 
 void
-pascal_object_print_value (type, valaddr, address, stream, format, recurse, pretty,
-                          dont_print_vb)
-     struct type *type;
-     char *valaddr;
-     CORE_ADDR address;
-     struct ui_file *stream;
-     int format;
-     int recurse;
-     enum val_prettyprint pretty;
-     struct type **dont_print_vb;
+pascal_object_print_value (struct type *type, char *valaddr, CORE_ADDR address,
+                          struct ui_file *stream, int format, int recurse,
+                          enum val_prettyprint pretty,
+                          struct type **dont_print_vb)
 {
   struct obstack tmp_obstack;
   struct type **last_dont_print
@@ -992,6 +964,7 @@ pascal_object_print_value (type, valaddr, address, stream, format, recurse, pret
 
       if (boffset != -1 && (boffset < 0 || boffset >= TYPE_LENGTH (type)))
        {
+         /* FIXME (alloc): not safe is baseclass is really really big. */
          base_valaddr = (char *) alloca (TYPE_LENGTH (baseclass));
          if (target_read_memory (address + boffset, base_valaddr,
                                  TYPE_LENGTH (baseclass)) != 0)
@@ -1034,13 +1007,9 @@ pascal_object_print_value (type, valaddr, address, stream, format, recurse, pret
    have the same meanings as in c_val_print.  */
 
 static void
-pascal_object_print_static_field (type, val, stream, format, recurse, pretty)
-     struct type *type;
-     value_ptr val;
-     struct ui_file *stream;
-     int format;
-     int recurse;
-     enum val_prettyprint pretty;
+pascal_object_print_static_field (struct type *type, struct value *val,
+                                 struct ui_file *stream, int format,
+                                 int recurse, enum val_prettyprint pretty)
 {
   if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
     {
@@ -1075,11 +1044,8 @@ pascal_object_print_static_field (type, val, stream, format, recurse, pretty)
 }
 
 void
-pascal_object_print_class_member (valaddr, domain, stream, prefix)
-     char *valaddr;
-     struct type *domain;
-     struct ui_file *stream;
-     char *prefix;
+pascal_object_print_class_member (char *valaddr, struct type *domain,
+                                 struct ui_file *stream, char *prefix)
 {
 
   /* VAL is a byte offset into the structure type DOMAIN.
@@ -1131,7 +1097,7 @@ pascal_object_print_class_member (valaddr, domain, stream, prefix)
 
 
 void
-_initialize_pascal_valprint ()
+_initialize_pascal_valprint (void)
 {
   add_show_from_set
     (add_set_cmd ("pascal_static-members", class_support, var_boolean,
This page took 0.041587 seconds and 4 git commands to generate.