* arm-tdep.c: Include "observer.h".
[deliverable/binutils-gdb.git] / gdb / gnu-v3-abi.c
index 7e4cb23028a0f1c732380b0641ffe8dc860d52f9..0b80571194ba4fa328ab8b829fabb58b52fb5094 100644 (file)
@@ -1,7 +1,7 @@
 /* Abstraction of GNU v3 abi.
    Contributed by Jim Blandy <jimb@redhat.com>
 
-   Copyright (C) 2001, 2002, 2003, 2005, 2006, 2007, 2008, 2009
+   Copyright (C) 2001, 2002, 2003, 2005, 2006, 2007, 2008, 2009, 2010, 2011
    Free Software Foundation, Inc.
 
    This file is part of GDB.
@@ -26,6 +26,7 @@
 #include "demangle.h"
 #include "objfiles.h"
 #include "valprint.h"
+#include "c-lang.h"
 
 #include "gdb_assert.h"
 #include "gdb_string.h"
@@ -264,7 +265,8 @@ gnuv3_get_vtable (struct gdbarch *gdbarch,
   /* Correct it to point at the start of the virtual table, rather
      than the address point.  */
   return value_at_lazy (vtable_type,
-                       vtable_address - vtable_address_point_offset (gdbarch));
+                       vtable_address
+                       - vtable_address_point_offset (gdbarch));
 }
 
 
@@ -321,7 +323,7 @@ gnuv3_rtti_type (struct value *value,
   class_name = vtable_symbol_name + 11;
 
   /* Try to look up the class name as a type name.  */
-  /* FIXME: chastain/2003-11-26: block=NULL is bogus.  See pr gdb/1465. */
+  /* FIXME: chastain/2003-11-26: block=NULL is bogus.  See pr gdb/1465.  */
   run_time_type = cp_lookup_rtti_type (class_name, NULL);
   if (run_time_type == NULL)
     return NULL;
@@ -406,7 +408,8 @@ gnuv3_virtual_fn_field (struct value **value_p,
    The result is the offset of the baseclass value relative
    to (the address of)(ARG) + OFFSET.
 
-   -1 is returned on error. */
+   -1 is returned on error.  */
+
 static int
 gnuv3_baseclass_offset (struct type *type, int index, const bfd_byte *valaddr,
                        CORE_ADDR address)
@@ -456,10 +459,8 @@ gnuv3_find_method_in (struct type *domain, CORE_ADDR voffset,
                      LONGEST adjustment)
 {
   int i;
-  const char *physname;
 
   /* Search this class first.  */
-  physname = NULL;
   if (adjustment == 0)
     {
       int len;
@@ -587,15 +588,25 @@ gnuv3_print_method_ptr (const gdb_byte *contents,
        {
          char *demangled_name = cplus_demangle (physname,
                                                 DMGL_ANSI | DMGL_PARAMS);
-         if (demangled_name != NULL)
+
+         fprintf_filtered (stream, "&virtual ");
+         if (demangled_name == NULL)
+           fputs_filtered (physname, stream);
+         else
            {
-             fprintf_filtered (stream, "&virtual ");
              fputs_filtered (demangled_name, stream);
              xfree (demangled_name);
-             return;
            }
+         return;
        }
     }
+  else if (ptr_value != 0)
+    {
+      /* Found a non-virtual function: print out the type.  */
+      fputs_filtered ("(", stream);
+      c_print_type (type, "", stream, -1, 0);
+      fputs_filtered (") ", stream);
+    }
 
   /* We didn't find it; print the raw data.  */
   if (vbit)
@@ -618,8 +629,8 @@ gnuv3_print_method_ptr (const gdb_byte *contents,
 static int
 gnuv3_method_ptr_size (struct type *type)
 {
-  struct type *domain_type = check_typedef (TYPE_DOMAIN_TYPE (type));
-  struct gdbarch *gdbarch = get_type_arch (domain_type);
+  struct gdbarch *gdbarch = get_type_arch (type);
+
   return 2 * TYPE_LENGTH (builtin_type (gdbarch)->builtin_data_ptr);
 }
 
@@ -629,8 +640,7 @@ static void
 gnuv3_make_method_ptr (struct type *type, gdb_byte *contents,
                       CORE_ADDR value, int is_virtual)
 {
-  struct type *domain_type = check_typedef (TYPE_DOMAIN_TYPE (type));
-  struct gdbarch *gdbarch = get_type_arch (domain_type);
+  struct gdbarch *gdbarch = get_type_arch (type);
   int size = TYPE_LENGTH (builtin_type (gdbarch)->builtin_data_ptr);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
 
@@ -702,6 +712,7 @@ gnuv3_method_ptr_to_value (struct value **this_p, struct value *method_ptr)
   if (vbit)
     {
       LONGEST voffset;
+
       voffset = ptr_value / TYPE_LENGTH (vtable_ptrdiff_type (gdbarch));
       return gnuv3_get_virtual_fn (gdbarch, value_ind (*this_p),
                                   method_type, voffset);
@@ -816,7 +827,8 @@ gnuv3_pass_by_reference (struct type *type)
           a reference to this class, then it is a copy constructor.  */
        if (TYPE_NFIELDS (fieldtype) == 2
            && TYPE_CODE (TYPE_FIELD_TYPE (fieldtype, 1)) == TYPE_CODE_REF
-           && check_typedef (TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (fieldtype, 1))) == type)
+           && check_typedef (TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (fieldtype,
+                                                                1))) == type)
          return 1;
       }
 
@@ -826,9 +838,10 @@ gnuv3_pass_by_reference (struct type *type)
      by reference, so does this class.  Similarly for members, which
      are constructed whenever this class is.  We do not need to worry
      about recursive loops here, since we are only looking at members
-     of complete class type.  */
+     of complete class type.  Also ignore any static members.  */
   for (fieldnum = 0; fieldnum < TYPE_NFIELDS (type); fieldnum++)
-    if (gnuv3_pass_by_reference (TYPE_FIELD_TYPE (type, fieldnum)))
+    if (! field_is_static (&TYPE_FIELD (type, fieldnum))
+        && gnuv3_pass_by_reference (TYPE_FIELD_TYPE (type, fieldnum)))
       return 1;
 
   return 0;
@@ -837,7 +850,8 @@ gnuv3_pass_by_reference (struct type *type)
 static void
 init_gnuv3_ops (void)
 {
-  vtable_type_gdbarch_data = gdbarch_data_register_post_init (build_gdb_vtable_type);
+  vtable_type_gdbarch_data
+    = gdbarch_data_register_post_init (build_gdb_vtable_type);
 
   gnu_v3_abi_ops.shortname = "gnu-v3";
   gnu_v3_abi_ops.longname = "GNU G++ Version 3 ABI";
This page took 0.025186 seconds and 4 git commands to generate.