* linux-low.c: Delete inclusion of ansidecl.h, elf/common.h,
[deliverable/binutils-gdb.git] / gdb / gnu-v2-abi.c
index def29118245cf94e593f7eb92c43d57cf6aa87bc..e577e2e55011095d14aac24dee9284cb1994d397 100644 (file)
@@ -1,6 +1,7 @@
 /* Abstraction of GNU v2 abi.
 
-   Copyright (C) 2001, 2002, 2003, 2005, 2007 Free Software Foundation, Inc.
+   Copyright (C) 2001, 2002, 2003, 2005, 2007, 2008, 2009
+   Free Software Foundation, Inc.
 
    Contributed by Daniel Berlin <dberlin@redhat.com>
 
@@ -88,8 +89,6 @@ gnuv2_virtual_fn_field (struct value **arg1p, struct fn_field * f, int j,
 {
   struct value *arg1 = *arg1p;
   struct type *type1 = check_typedef (value_type (arg1));
-
-
   struct type *entry_type;
   /* First, get the virtual function table pointer.  That comes
      with a strange type, so cast it to type `pointer to long' (which
@@ -98,10 +97,12 @@ gnuv2_virtual_fn_field (struct value **arg1p, struct fn_field * f, int j,
   struct value *entry;
   struct value *vfn;
   struct value *vtbl;
-  struct value *vi = value_from_longest (builtin_type_int,
-                                    (LONGEST) TYPE_FN_FIELD_VOFFSET (f, j));
+  LONGEST vi = (LONGEST) TYPE_FN_FIELD_VOFFSET (f, j);
   struct type *fcontext = TYPE_FN_FIELD_FCONTEXT (f, j);
   struct type *context;
+  struct type *context_vptr_basetype;
+  int context_vptr_fieldno;
+
   if (fcontext == NULL)
     /* We don't have an fcontext (e.g. the program was compiled with
        g++ version 1).  Try to get the vtbl from the TYPE_VPTR_BASETYPE.
@@ -123,13 +124,13 @@ gnuv2_virtual_fn_field (struct value **arg1p, struct fn_field * f, int j,
   /* This type may have been defined before its virtual function table
      was.  If so, fill in the virtual function table entry for the
      type now.  */
-  if (TYPE_VPTR_FIELDNO (context) < 0)
-    fill_in_vptr_fieldno (context);
+  context_vptr_fieldno = get_vptr_fieldno (context, &context_vptr_basetype);
+  /* FIXME: What to do if vptr_fieldno is still -1?  */
 
   /* The virtual function table is now an array of structures
      which have the form { int16 offset, delta; void *pfn; }.  */
-  vtbl = value_primitive_field (arg1, 0, TYPE_VPTR_FIELDNO (context),
-                               TYPE_VPTR_BASETYPE (context));
+  vtbl = value_primitive_field (arg1, 0, context_vptr_fieldno,
+                               context_vptr_basetype);
 
   /* With older versions of g++, the vtbl field pointed to an array
      of structures.  Nowadays it points directly to the structure. */
@@ -149,7 +150,7 @@ gnuv2_virtual_fn_field (struct value **arg1p, struct fn_field * f, int j,
   else
     {
       /* Handle the case where the vtbl field points directly to a structure. */
-      vtbl = value_add (vtbl, vi);
+      vtbl = value_ptradd (vtbl, vi);
       entry = value_ind (vtbl);
     }
 
@@ -192,8 +193,10 @@ gnuv2_value_rtti_type (struct value *v, int *full, int *top, int *using_enc)
   CORE_ADDR vtbl;
   struct minimal_symbol *minsym;
   struct symbol *sym;
-  char *demangled_name;
+  char *demangled_name, *p;
   struct type *btype;
+  struct type *known_type_vptr_basetype;
+  int known_type_vptr_fieldno;
 
   if (full)
     *full = 0;
@@ -214,18 +217,18 @@ gnuv2_value_rtti_type (struct value *v, int *full, int *top, int *using_enc)
      the type info functions, which are always right.  Deal with it
      until then.  */
 
-  /* If the type has no vptr fieldno, try to get it filled in */
-  if (TYPE_VPTR_FIELDNO(known_type) < 0)
-    fill_in_vptr_fieldno(known_type);
+  /* Try to get the vptr basetype, fieldno.  */
+  known_type_vptr_fieldno = get_vptr_fieldno (known_type,
+                                             &known_type_vptr_basetype);
 
-  /* If we still can't find one, give up */
-  if (TYPE_VPTR_FIELDNO(known_type) < 0)
+  /* If we can't find it, give up.  */
+  if (known_type_vptr_fieldno < 0)
     return NULL;
 
   /* Make sure our basetype and known type match, otherwise, cast
      so we can get at the vtable properly.
   */
-  btype = TYPE_VPTR_BASETYPE (known_type);
+  btype = known_type_vptr_basetype;
   CHECK_TYPEDEF (btype);
   if (btype != known_type )
     {
@@ -238,21 +241,23 @@ gnuv2_value_rtti_type (struct value *v, int *full, int *top, int *using_enc)
     we'd waste a bunch of time figuring out we already know the type.
     Besides, we don't care about the type, just the actual pointer
   */
-  if (VALUE_ADDRESS (value_field (v, TYPE_VPTR_FIELDNO (known_type))) == 0)
+  if (value_address (value_field (v, known_type_vptr_fieldno)) == 0)
     return NULL;
 
-  vtbl=value_as_address(value_field(v,TYPE_VPTR_FIELDNO(known_type)));
+  vtbl = value_as_address (value_field (v, known_type_vptr_fieldno));
 
   /* Try to find a symbol that is the vtable */
   minsym=lookup_minimal_symbol_by_pc(vtbl);
   if (minsym==NULL
-      || (demangled_name=DEPRECATED_SYMBOL_NAME (minsym))==NULL
+      || (demangled_name=SYMBOL_LINKAGE_NAME (minsym))==NULL
       || !is_vtable_name (demangled_name))
     return NULL;
 
   /* If we just skip the prefix, we get screwed by namespaces */
   demangled_name=cplus_demangle(demangled_name,DMGL_PARAMS|DMGL_ANSI);
-  *(strchr(demangled_name,' '))=0;
+  p = strchr (demangled_name, ' ');
+  if (p)
+    *p = '\0';
 
   /* Lookup the type for the name */
   /* FIXME: chastain/2003-11-26: block=NULL is bogus.  See pr gdb/1465. */
This page took 0.02587 seconds and 4 git commands to generate.