The 3.0 ABI no longer has vbase pointer fields.
authorNathan Sidwell <nathan@codesourcery.com>
Tue, 31 Jul 2001 16:12:04 +0000 (16:12 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Tue, 31 Jul 2001 16:12:04 +0000 (16:12 +0000)
cp:
The 3.0 ABI no longer has vbase pointer fields.
* cp-tree.h (VBASE_NAME, VBASE_NAME_FORMAT, VBASE_NAME_P,
FORMAT_VBASE_NAME): Remove.
* method.c (do_build_copy_constructor): Adjust.
(do_build_assign_ref): Adjust.
* search.c (lookup_field_r): Adjust.
* typeck.c (build_component_ref): Adjust.

The 3.0 ABI always has a vtable pointer at the start of every
polymorphic class.
* rtti.c (build_headof_sub): Remove.
(build_headof): Adjust.
(get_tinfo_decl_dynamic): No need to check flag_rtti
here. Adjust.
(create_real_tinfo_var): Explain why we need a hidden name.

From-SVN: r44515

gcc/cp/ChangeLog
gcc/cp/cp-tree.h
gcc/cp/method.c
gcc/cp/rtti.c
gcc/cp/search.c
gcc/cp/typeck.c

index ed40395..39689e8 100644 (file)
@@ -1,5 +1,23 @@
 2001-07-31  Nathan Sidwell  <nathan@codesourcery.com>
 
+       The 3.0 ABI no longer has vbase pointer fields.
+       * cp-tree.h (VBASE_NAME, VBASE_NAME_FORMAT, VBASE_NAME_P,
+       FORMAT_VBASE_NAME): Remove.
+       * method.c (do_build_copy_constructor): Adjust.
+       (do_build_assign_ref): Adjust.
+       * search.c (lookup_field_r): Adjust.
+       * typeck.c (build_component_ref): Adjust.
+
+       The 3.0 ABI always has a vtable pointer at the start of every
+       polymorphic class.
+       * rtti.c (build_headof_sub): Remove.
+       (build_headof): Adjust.
+       (get_tinfo_decl_dynamic): No need to check flag_rtti
+       here. Adjust.
+       (create_real_tinfo_var): Explain why we need a hidden name.
+
+2001-07-31  Nathan Sidwell  <nathan@codesourcery.com>
+
        PR c++/3631
        * class.c (update_vtable_entry_for_fn): The fixed adjustment
        of a virtual thunk should be from declaring base.
index d5f10e4..c485c43 100644 (file)
@@ -3140,8 +3140,6 @@ extern varray_type local_classes;
 #define VFIELD_BASE "$vf"
 #define VFIELD_NAME "_vptr$"
 #define VFIELD_NAME_FORMAT "_vptr$%s"
-#define VBASE_NAME "_vb$"
-#define VBASE_NAME_FORMAT "_vb$%s"
 #define STATIC_NAME_FORMAT "_%s$%s"
 #define ANON_AGGRNAME_FORMAT "$_%d"
 
@@ -3162,8 +3160,6 @@ extern varray_type local_classes;
 #define VFIELD_BASE ".vf"
 #define VFIELD_NAME "_vptr."
 #define VFIELD_NAME_FORMAT "_vptr.%s"
-#define VBASE_NAME "_vb."
-#define VBASE_NAME_FORMAT "_vb.%s"
 #define STATIC_NAME_FORMAT "_%s.%s"
 
 #define ANON_AGGRNAME_FORMAT "._%d"
@@ -3197,11 +3193,6 @@ extern varray_type local_classes;
   (!strncmp (IDENTIFIER_POINTER (ID_NODE), VFIELD_NAME, \
            sizeof (VFIELD_NAME) - 1))
 #define VFIELD_NAME_FORMAT "_vptr_%s"
-#define VBASE_NAME "__vb_"
-#define VBASE_NAME_P(ID_NODE) \
-  (!strncmp (IDENTIFIER_POINTER (ID_NODE), VBASE_NAME, \
-            sizeof (VBASE_NAME) - 1))
-#define VBASE_NAME_FORMAT "__vb_%s"
 #define STATIC_NAME_FORMAT "__static_%s_%s"
 
 #define ANON_AGGRNAME_PREFIX "__anon_"
@@ -3244,10 +3235,6 @@ extern varray_type local_classes;
   && IDENTIFIER_POINTER (ID_NODE)[2] == 't' \
   && IDENTIFIER_POINTER (ID_NODE)[3] == JOINER)
 
-#define VBASE_NAME_P(ID_NODE) (IDENTIFIER_POINTER (ID_NODE)[1] == 'v' \
-  && IDENTIFIER_POINTER (ID_NODE)[2] == 'b' \
-  && IDENTIFIER_POINTER (ID_NODE)[3] == JOINER)
-
 #define TEMP_NAME_P(ID_NODE) (!strncmp (IDENTIFIER_POINTER (ID_NODE), AUTO_TEMP_NAME, sizeof (AUTO_TEMP_NAME)-1))
 #define VFIELD_NAME_P(ID_NODE) (!strncmp (IDENTIFIER_POINTER (ID_NODE), VFIELD_NAME, sizeof(VFIELD_NAME)-1))
 
@@ -3261,14 +3248,6 @@ extern varray_type local_classes;
                                  && IDENTIFIER_POINTER (ID_NODE)[1] <= '9')
 #endif /* !defined(NO_DOLLAR_IN_LABEL) || !defined(NO_DOT_IN_LABEL) */
 
-/* Store the vbase pointer field name for type TYPE into pointer BUF.  */
-#define FORMAT_VBASE_NAME(BUF,TYPE) do {                               \
-  char *wbuf = (char *) alloca (TYPE_ASSEMBLER_NAME_LENGTH (TYPE)      \
-                        + sizeof (VBASE_NAME) + 1);                    \
-  sprintf (wbuf, VBASE_NAME_FORMAT, TYPE_ASSEMBLER_NAME_STRING (TYPE));        \
-  (BUF) = wbuf;                                                                \
-} while (0)
-
 /* Returns non-zero iff NODE is a declaration for the global function
    `main'.  */
 #define DECL_MAIN_P(NODE)                              \
index 5b07ae2..03bf455 100644 (file)
@@ -588,8 +588,6 @@ do_build_copy_constructor (fndecl)
            {
              if (VFIELD_NAME_P (DECL_NAME (field)))
                continue;
-             if (VBASE_NAME_P (DECL_NAME (field)))
-               continue;
 
              /* True for duplicate members.  */
              if (IDENTIFIER_CLASS_VALUE (DECL_NAME (field)) != field)
@@ -678,8 +676,6 @@ do_build_assign_ref (fndecl)
            {
              if (VFIELD_NAME_P (DECL_NAME (field)))
                continue;
-             if (VBASE_NAME_P (DECL_NAME (field)))
-               continue;
 
              /* True for duplicate members.  */
              if (IDENTIFIER_CLASS_VALUE (DECL_NAME (field)) != field)
index 20e238f..da1484c 100644 (file)
@@ -41,7 +41,6 @@ Boston, MA 02111-1307, USA.  */
 
 extern struct obstack permanent_obstack;
 
-static tree build_headof_sub PARAMS((tree));
 static tree build_headof PARAMS((tree));
 static tree ifnonnull PARAMS((tree, tree));
 static tree tinfo_name PARAMS((tree));
@@ -82,23 +81,6 @@ init_rtti_processing ()
     build_qualified_type (type_info_type_node, TYPE_QUAL_CONST);
 }
 
-/* Given a pointer to an object with at least one virtual table
-   pointer somewhere, return a pointer to a possible sub-object that
-   has a virtual table pointer in it that is the vtable parent for
-   that sub-object.  */
-
-static tree
-build_headof_sub (exp)
-     tree exp;
-{
-  tree type = TREE_TYPE (TREE_TYPE (exp));
-  tree basetype = CLASSTYPE_RTTI (type);
-  tree binfo = get_binfo (basetype, type, 0);
-
-  exp = convert_pointer_to_real (binfo, exp);
-  return exp;
-}
-
 /* Given the expression EXP of type `class *', return the head of the
    object pointed to by EXP with type cv void*, if the class has any
    virtual functions (TYPE_POLYMORPHIC_P), else just return the
@@ -118,10 +100,6 @@ build_headof (exp)
   if (!TYPE_POLYMORPHIC_P (type))
     return exp;
 
-  /* If we don't have rtti stuff, get to a sub-object that does.  */
-  if (!CLASSTYPE_VFIELDS (TREE_TYPE (TREE_TYPE (exp))))
-    exp = build_headof_sub (exp);
-
   /* We use this a couple of times below, protect it.  */
   exp = save_expr (exp);
 
@@ -204,17 +182,6 @@ get_tinfo_decl_dynamic (exp)
       tree t;
       tree index;
 
-      if (! flag_rtti)
-       error ("taking dynamic typeid of object with -fno-rtti");
-
-      /* If we don't have rtti stuff, get to a sub-object that does.  */
-      if (! CLASSTYPE_VFIELDS (type))
-       {
-         exp = build_unary_op (ADDR_EXPR, exp, 0);
-         exp = build_headof_sub (exp);
-         exp = build_indirect_ref (exp, NULL);
-       }
-
       /* The RTTI information is at index -1.  */
       index = integer_minus_one_node;
       t = build_vfn_ref (exp, index);
@@ -1146,7 +1113,10 @@ create_real_tinfo_var (target_type, name, type, init, non_public)
   tree decl;
   tree hidden_name;
   char hidden[30];
-  
+
+  /* We cannot give this the name NAME, as that already is globally
+     bound to the tinfo_decl we originally created for this type in
+     get_tinfo_decl. */
   sprintf (hidden, "__ti_%d", count++);
   hidden_name = get_identifier (hidden);
   
index 4fac30f..f543f0d 100644 (file)
@@ -1451,15 +1451,6 @@ lookup_field_r (binfo, data)
     }
   else
     {
-      /* If the thing we're looking for is a virtual base class, then
-        we know we've got what we want at this point; there's no way
-        to get an ambiguity.  */
-      if (VBASE_NAME_P (lfi->name))
-       {
-         lfi->rval = nval;
-         return nval;
-       }
-
       if (from_dep_base_p && TREE_CODE (nval) != TYPE_DECL
          /* We need to return a member template class so we can
             define partial specializations.  Is there a better
index 9043111..e38966f 100644 (file)
@@ -2237,16 +2237,7 @@ build_component_ref (datum, component, basetype_path, protect)
              error ("invalid reference to NULL ptr, use ptr-to-member instead");
              return error_mark_node;
            }
-         if (VBASE_NAME_P (DECL_NAME (field)))
-           {
-             /* It doesn't matter which vbase pointer we grab, just
-                find one of them.  */
-             tree binfo = get_binfo (base,
-                                     TREE_TYPE (TREE_TYPE (addr)), 0);
-             addr = convert_pointer_to_real (binfo, addr);
-           }
-         else
-           addr = convert_pointer_to (base, addr);
+         addr = convert_pointer_to (base, addr);
          datum = build_indirect_ref (addr, NULL);
          if (datum == error_mark_node)
            return error_mark_node;