* cp-valprint.c (cp_is_vtbl_ptr_type): Handle vtbl field type
authorPeter Schauer <Peter.Schauer@mytum.de>
Sat, 16 Mar 2002 20:53:14 +0000 (20:53 +0000)
committerPeter Schauer <Peter.Schauer@mytum.de>
Sat, 16 Mar 2002 20:53:14 +0000 (20:53 +0000)
for gcc versions after gcc-2.8.1.

gdb/ChangeLog
gdb/cp-valprint.c

index d6e49f856980e0007993f3a649fa0bc058dd4d09..291f092b9085267a6249996fec9676d7664c2221 100644 (file)
@@ -1,3 +1,8 @@
+2002-03-16  Peter Schauer  <pes@regent.e-technik.tu-muenchen.de>
+
+       * cp-valprint.c (cp_is_vtbl_ptr_type): Handle vtbl field type
+       for gcc versions after gcc-2.8.1.
+
 2002-03-16  Peter Schauer  <pes@regent.e-technik.tu-muenchen.de>
 
        * eval.c (evaluate_subexp_standard): Fix setup of ``this'' pointer
index 669203121c8c44cd4a8236470822738f4bff1a78..7ea9f3f94e974e136cb25cf29b4b16c9181d362d 100644 (file)
@@ -1,6 +1,6 @@
 /* Support for printing C++ values for GDB, the GNU debugger.
    Copyright 1986, 1988, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
-   2000, 2001
+   2000, 2001, 2002
    Free Software Foundation, Inc.
 
    This file is part of GDB.
@@ -201,6 +201,8 @@ cp_is_vtbl_ptr_type (struct type *type)
 int
 cp_is_vtbl_member (struct type *type)
 {
+  /* With older versions of g++, the vtbl field pointed to an array
+     of structures.  Nowadays it points directly to the structure. */
   if (TYPE_CODE (type) == TYPE_CODE_PTR)
     {
       type = TYPE_TARGET_TYPE (type);
@@ -215,6 +217,17 @@ cp_is_vtbl_member (struct type *type)
              return cp_is_vtbl_ptr_type (type);
            }
        }
+      else if (TYPE_CODE (type) == TYPE_CODE_STRUCT)  /* if not using thunks */
+       {
+         return cp_is_vtbl_ptr_type (type);
+       }
+      else if (TYPE_CODE (type) == TYPE_CODE_PTR)     /* if using thunks */
+       {
+         /* The type name of the thunk pointer is NULL when using dwarf2.
+            We could test for a pointer to a function, but there is
+            no type info for the virtual table either, so it wont help.  */
+         return cp_is_vtbl_ptr_type (type);
+       }
     }
   return 0;
 }