Fix for PR 18470:
authorMark Alexander <marka@cygnus>
Mon, 21 Dec 1998 21:34:39 +0000 (21:34 +0000)
committerMark Alexander <marka@cygnus>
Mon, 21 Dec 1998 21:34:39 +0000 (21:34 +0000)
* value.c (value_virtual_fn_field): Handle the situation where
vtbl is a pointer to a structure instead of a pointer to an array.

gdb/ChangeLog
gdb/values.c

index f10a472..171e489 100644 (file)
@@ -1,3 +1,13 @@
+Mon Dec 21 13:30:34 1998  Mark Alexander  <marka@cygnus.com>
+
+       * value.c (value_virtual_fn_field): Handle the situation where
+       vtbl is a pointer to a structure instead of a pointer to an array.
+
+Mon Dec 21 10:38:11 1998  Andrew Cagney  <cagney@chook>
+
+       * mips-tdep.c: (MIPS_DEFAULT_FPU_TYPE): Default to
+       MIPS_FPU_DOUBLE.
+
 1998-12-17  J.T. Conklin  <jtc@redbacknetworks.com>
 
        * blockframe.c (get_frame_saved_regs): If the saved_regs_addr ptr
index db6f204..9ddf159 100644 (file)
@@ -910,15 +910,31 @@ value_virtual_fn_field (arg1p, f, j, type, offset)
 
   /* The virtual function table is now an array of structures
      which have the form { int16 offset, delta; void *pfn; }.  */
-  vtbl = value_ind (value_primitive_field (arg1, 0, 
-                                          TYPE_VPTR_FIELDNO (context),
-                                          TYPE_VPTR_BASETYPE (context)));
-
-  /* Index into the virtual function table.  This is hard-coded because
-     looking up a field is not cheap, and it may be important to save
-     time, e.g. if the user has set a conditional breakpoint calling
-     a virtual function.  */
-  entry = value_subscript (vtbl, vi);
+  vtbl = value_primitive_field (arg1, 0, TYPE_VPTR_FIELDNO (context),
+                                        TYPE_VPTR_BASETYPE (context));
+
+  /* With older versions of g++, the vtbl field pointed to an array
+     of structures.  Nowadays it points directly to the structure. */
+  if (TYPE_CODE (VALUE_TYPE (vtbl)) == TYPE_CODE_PTR
+      && TYPE_CODE (TYPE_TARGET_TYPE (VALUE_TYPE (vtbl))) == TYPE_CODE_ARRAY)
+    {
+      /* Handle the case where the vtbl field points to an
+         array of structures. */
+      vtbl = value_ind (vtbl);
+
+      /* Index into the virtual function table.  This is hard-coded because
+        looking up a field is not cheap, and it may be important to save
+        time, e.g. if the user has set a conditional breakpoint calling
+        a virtual function.  */
+      entry = value_subscript (vtbl, vi);
+    }
+  else
+    {
+      /* Handle the case where the vtbl field points directly to a structure. */
+      vtbl = value_add (vtbl, vi);
+      entry = value_ind (vtbl);
+    }
+
   entry_type = check_typedef (VALUE_TYPE (entry));
 
   if (TYPE_CODE (entry_type) == TYPE_CODE_STRUCT)