* Makefile.in (i386nbsd-tdep.o): Add $(arch_utils_h),
[deliverable/binutils-gdb.git] / gdb / cp-valprint.c
index 567e0abed358d0a0b5a2c37d04d1331f69611cd6..b7922dab879200324cf543a5f779024d800a8dc4 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.
@@ -21,7 +21,7 @@
    Boston, MA 02111-1307, USA.  */
 
 #include "defs.h"
-#include "obstack.h"
+#include "gdb_obstack.h"
 #include "symtab.h"
 #include "gdbtypes.h"
 #include "expression.h"
@@ -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;
 }
@@ -570,6 +583,7 @@ cp_print_value (struct type *type, struct type *real_type, char *valaddr,
                  && ((boffset + offset) < 0
                      || (boffset + offset) >= TYPE_LENGTH (type)))
                {
+                 /* FIXME (alloca): unsafe if baseclass is really really large. */
                  base_valaddr = (char *) alloca (TYPE_LENGTH (baseclass));
                  if (target_read_memory (address + offset + boffset, base_valaddr,
                                          TYPE_LENGTH (baseclass)) != 0)
This page took 0.025717 seconds and 4 git commands to generate.