daily update
[deliverable/binutils-gdb.git] / gdb / cp-valprint.c
index c19d678a7ce97c9267d7357d5c3f6a2611ed327e..85f673dc80869ec00114e01ca15f39b639aa84c2 100644 (file)
@@ -1,7 +1,8 @@
 /* Support for printing C++ values for GDB, the GNU debugger.
 
    Copyright (C) 1986, 1988, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
-   2000, 2001, 2002, 2003, 2005, 2006, 2007 Free Software Foundation, Inc.
+   2000, 2001, 2002, 2003, 2005, 2006, 2007, 2008
+   Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -83,20 +84,10 @@ static void cp_print_value (struct type *, struct type *, const gdb_byte *,
                            int, CORE_ADDR, struct ui_file *, int, int,
                            enum val_prettyprint, struct type **);
 
-static void cp_print_hpacc_virtual_table_entries (struct type *, int *,
-                                                 struct value *,
-                                                 struct ui_file *, int,
-                                                 int,
-                                                 enum val_prettyprint);
-
 
 /* GCC versions after 2.4.5 use this.  */
 const char vtbl_ptr_name[] = "__vtbl_ptr_type";
 
-/* HP aCC uses different names.  */
-const char hpacc_vtbl_ptr_name[] = "__vfp";
-const char hpacc_vtbl_ptr_type_name[] = "__vftyp";
-
 /* Return truth value for assertion that TYPE is of the type
    "pointer to virtual function".  */
 
@@ -183,14 +174,8 @@ cp_print_value_fields (struct type *type, struct type *real_type,
 
   /* Second, print out data fields */
 
-  /* If there are no data fields, or if the only field is the
-   * vtbl pointer, skip this part */
-  if ((len == n_baseclasses)
-      || ((len - n_baseclasses == 1)
-         && TYPE_HAS_VTABLE (type)
-         && strncmp (TYPE_FIELD_NAME (type, n_baseclasses),
-                     hpacc_vtbl_ptr_name, 5) == 0)
-      || !len)
+  /* If there are no data fields, skip this part */
+  if (len == n_baseclasses || !len)
     fprintf_filtered (stream, "<No data fields>");
   else
     {
@@ -210,12 +195,6 @@ cp_print_value_fields (struct type *type, struct type *real_type,
          if (!static_field_print && TYPE_FIELD_STATIC (type, i))
            continue;
 
-         /* If a vtable pointer appears, we'll print it out later */
-         if (TYPE_HAS_VTABLE (type)
-             && strncmp (TYPE_FIELD_NAME (type, i), hpacc_vtbl_ptr_name,
-                         5) == 0)
-           continue;
-
          if (fields_seen)
            fprintf_filtered (stream, ", ");
          else if (n_baseclasses > 0)
@@ -289,7 +268,8 @@ cp_print_value_fields (struct type *type, struct type *real_type,
                    (TYPE_FIELD_TYPE (type, i), 
                     unpack_field_as_long (type, valaddr + offset, i));
 
-                 common_val_print (v, stream, format, 0, recurse + 1, pretty);
+                 common_val_print (v, stream, format, 0, recurse + 1, pretty,
+                                   current_language);
                }
            }
          else
@@ -313,7 +293,8 @@ cp_print_value_fields (struct type *type, struct type *real_type,
                  val_print (TYPE_FIELD_TYPE (type, i),
                             valaddr, offset + TYPE_FIELD_BITPOS (type, i) / 8,
                             address + TYPE_FIELD_BITPOS (type, i) / 8,
-                            stream, format, 0, recurse + 1, pretty);
+                            stream, format, 0, recurse + 1, pretty,
+                            current_language);
                }
            }
          annotate_field_end ();
@@ -333,84 +314,6 @@ cp_print_value_fields (struct type *type, struct type *real_type,
          print_spaces_filtered (2 * recurse, stream);
        }
     }                          /* if there are data fields */
-  /* Now print out the virtual table pointer if there is one */
-  if (TYPE_HAS_VTABLE (type)
-      && strncmp (TYPE_FIELD_NAME (type, n_baseclasses),
-                 hpacc_vtbl_ptr_name, 5) == 0)
-    {
-      struct value *v;
-      /* First get the virtual table pointer and print it out */
-
-#if 0
-      fputs_filtered ("__vfp = ", stream);
-#endif
-
-      fputs_filtered (", Virtual table at ", stream);
-
-      /* pai: FIXME 32x64 problem? */
-      /* Not sure what the best notation is in the case where there is no
-         baseclass name.  */
-      v = value_from_pointer (lookup_pointer_type (builtin_type_unsigned_long),
-                             *(unsigned long *) (valaddr + offset));
-
-      common_val_print (v, stream, format, 0, recurse + 1, pretty);
-      fields_seen = 1;
-
-      if (vtblprint)
-       {
-         /* Print out function pointers in vtable. */
-
-         /* FIXME: then-clause is for non-RRBC layout of virtual
-          * table.  The RRBC case in the else-clause is yet to be
-          * implemented.  The if (1) below should be changed to a
-          * test for whether the executable we have was compiled
-          * with a version of HP aCC that doesn't have RRBC
-          * support. */
-
-         if (1)
-           {
-             /* no RRBC support; function pointers embedded directly
-                 in vtable */
-
-             int vfuncs = count_virtual_fns (real_type);
-
-             fputs_filtered (" {", stream);
-
-             /* FIXME : doesn't work at present */
-#if 0
-             fprintf_filtered (stream, "%d entr%s: ", vfuncs,
-                               vfuncs == 1 ? "y" : "ies");
-#else
-             fputs_filtered ("not implemented", stream);
-
-
-#endif
-
-             /* recursive function that prints all virtual function entries */
-#if 0
-             cp_print_hpacc_virtual_table_entries (real_type, &vfuncs, v,
-                                                   stream, format, recurse,
-                                                   pretty);
-#endif
-             fputs_filtered ("}", stream);
-           }                   /* non-RRBC case */
-         else
-           {
-             /* FIXME -- see comments above */
-             /* RRBC support present; function pointers are found
-              * by indirection through the class segment entries. */
-
-
-           }                   /* RRBC case */
-       }                       /* if vtblprint */
-
-      if (pretty)
-       {
-         fprintf_filtered (stream, "\n");
-         print_spaces_filtered (2 * recurse, stream);
-       }
-
-    }                          /* if vtable exists */
 
   fprintf_filtered (stream, "}");
 }
@@ -465,50 +368,36 @@ cp_print_value (struct type *type, struct type *real_type,
 
       thisoffset = offset;
       thistype = real_type;
-      if (TYPE_HAS_VTABLE (type) && BASETYPE_VIA_VIRTUAL (type, i))
-       {
-         /* Assume HP/Taligent runtime convention */
-         find_rt_vbase_offset (type, TYPE_BASECLASS (type, i),
-                               valaddr, offset, &boffset, &skip);
-         if (skip >= 0)
-           error (_("Virtual base class offset not found from vtable while"
-                  " printing"));
-         base_valaddr = valaddr;
-       }
-      else
+
+      boffset = baseclass_offset (type, i, valaddr + offset, address);
+      skip = ((boffset == -1) || (boffset + offset) < 0) ? 1 : -1;
+
+      if (BASETYPE_VIA_VIRTUAL (type, i))
        {
-         boffset = baseclass_offset (type, i,
-                                     valaddr + offset,
-                                     address);
-         skip = ((boffset == -1) || (boffset + offset) < 0) ? 1 : -1;
+         /* The virtual base class pointer might have been
+            clobbered by the user program. Make sure that it
+            still points to a valid memory location.  */
 
-         if (BASETYPE_VIA_VIRTUAL (type, i))
+         if (boffset != -1
+             && ((boffset + offset) < 0
+                 || (boffset + offset) >= TYPE_LENGTH (type)))
            {
-             /* The virtual base class pointer might have been
-                clobbered by the user program. Make sure that it
-                still points to a valid memory location.  */
-
-             if (boffset != -1
-                 && ((boffset + offset) < 0
-                     || (boffset + offset) >= TYPE_LENGTH (type)))
-               {
-                 /* FIXME (alloca): unsafe if baseclass is really really large. */
-                 gdb_byte *buf = alloca (TYPE_LENGTH (baseclass));
-                 base_valaddr = buf;
-                 if (target_read_memory (address + boffset, buf,
-                                         TYPE_LENGTH (baseclass)) != 0)
-                   skip = 1;
-                 address = address + boffset;
-                 thisoffset = 0;
-                 boffset = 0;
-                 thistype = baseclass;
-               }
-             else
-               base_valaddr = valaddr;
+             /* FIXME (alloca): unsafe if baseclass is really really large. */
+             gdb_byte *buf = alloca (TYPE_LENGTH (baseclass));
+             base_valaddr = buf;
+             if (target_read_memory (address + boffset, buf,
+                                     TYPE_LENGTH (baseclass)) != 0)
+               skip = 1;
+             address = address + boffset;
+             thisoffset = 0;
+             boffset = 0;
+             thistype = baseclass;
            }
          else
            base_valaddr = valaddr;
        }
+      else
+       base_valaddr = valaddr;
 
       /* now do the printing */
       if (pretty)
@@ -599,7 +488,7 @@ cp_print_static_field (struct type *type,
     }
   val_print (type, value_contents_all (val), 
             value_embedded_offset (val), VALUE_ADDRESS (val),
-            stream, format, 0, recurse, pretty);
+            stream, format, 0, recurse, pretty, current_language);
 }
 
 
@@ -694,75 +583,6 @@ cp_print_class_member (const gdb_byte *valaddr, struct type *domain,
 }
 
 
-/* This function prints out virtual table entries for a class; it
- * recurses on the base classes to find all virtual functions
- * available in a class.
- *
- * pai/1997-05-21 Note: As the name suggests, it's currently
- * implemented for HP aCC runtime only. g++ objects are handled
- * differently and I have made no attempt to fold that logic in
- * here. The runtime layout is different for the two cases.  Also,
- * this currently has only the code for non-RRBC layouts generated by
- * the HP aCC compiler; RRBC code is stubbed out and will have to be
- * added later. */
-
-
-static void
-cp_print_hpacc_virtual_table_entries (struct type *type, int *vfuncs,
-                                     struct value *v, struct ui_file *stream,
-                                     int format, int recurse,
-                                     enum val_prettyprint pretty)
-{
-  int fn, oi;
-
-  /* pai: FIXME this function doesn't work. It should handle a given
-   * virtual function only once (latest redefinition in class hierarchy)
-   */
-
-  /* Recursion on other classes that can share the same vtable */
-  struct type *pbc = primary_base_class (type);
-  if (pbc)
-    cp_print_hpacc_virtual_table_entries (pbc, vfuncs, v, stream, format,
-                                         recurse, pretty);
-
-  /* Now deal with vfuncs declared in this class */
-  for (fn = 0; fn < TYPE_NFN_FIELDS (type); fn++)
-    for (oi = 0; oi < TYPE_FN_FIELDLIST_LENGTH (type, fn); oi++)
-      if (TYPE_FN_FIELD_VIRTUAL_P (TYPE_FN_FIELDLIST1 (type, fn), oi))
-       {
-         char *vf_name;
-         const char *field_physname;
-
-         /* virtual function offset */
-         int vx = (TYPE_FN_FIELD_VOFFSET (TYPE_FN_FIELDLIST1 (type, fn), oi)
-                   - 1);
-
-         /* Get the address of the vfunction entry */
-         struct value *vf = value_copy (v);
-         if (value_lazy (vf))
-           (void) value_fetch_lazy (vf);
-         /* adjust by offset */
-         /* NOTE: cagney/2005-01-02: THIS IS BOGUS.  */
-         value_contents_writeable (vf)[0] += 4 * (HP_ACC_VFUNC_START + vx);
-         vf = value_ind (vf);  /* get the entry */
-         /* make it a pointer */
-         deprecated_set_value_type (vf, value_type (v));
-
-         /* print out the entry */
-         common_val_print (vf, stream, format, 0, recurse + 1, pretty);
-         field_physname
-           = TYPE_FN_FIELD_PHYSNAME (TYPE_FN_FIELDLIST1 (type, fn), oi);
-         /* pai: (temp) FIXME Maybe this should be DMGL_ANSI */
-         vf_name = cplus_demangle (field_physname, DMGL_ARM);
-         fprintf_filtered (stream, " %s", vf_name);
-         xfree (vf_name);
-         if (--(*vfuncs) > 0)
-           fputs_filtered (", ", stream);
-       }
-}
-
-
-
 void
 _initialize_cp_valprint (void)
 {
This page took 0.026619 seconds and 4 git commands to generate.