Stop sharing binfos for indirect virtual bases.
authorJason Merrill <jason@yorick.cygnus.com>
Thu, 27 Aug 1998 01:41:17 +0000 (01:41 +0000)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 27 Aug 1998 01:41:17 +0000 (21:41 -0400)
* tree.c (propagate_binfo_offsets): Unshare vbases, too.
(layout_basetypes): Likewise.
(unshare_base_binfos): Copy vbases, too.
* cp-tree.h (BINFO_VIA_PUBLIC, BINFO_BASEINIT_MARKED,
BINFO_VBASE_INIT_MARKED): Remove obsolete macros.
(BINFO_PUSHDECLS_MARKED, SET_BINFO_PUSHDECLS_MARKED,
CLEAR_BINFO_PUSHDECLS_MARKED): New macros.
* search.c (lookup_field, lookup_fnfields, lookup_member): Remove
reference to BINFO_VIA_PUBLIC.
(marked_pushdecls_p, unmarked_pushdecls_p): New fns.
(push_class_decls): Use them.
(dfs_pushdecls): Use SET_BINFO_PUSHDECLS_MARKED.
(dfs_compress_decls): Use CLEAR_BINFO_PUSHDECLS_MARKED.

From-SVN: r22017

gcc/cp/ChangeLog
gcc/cp/cp-tree.h
gcc/cp/search.c
gcc/cp/tree.c

index 636fc12c76c81e8758d87a1041ec2733c63264c8..0f546a2730c996f39efa243a05407ee221f7d5d2 100644 (file)
@@ -1,3 +1,20 @@
+1998-08-27  Jason Merrill  <jason@yorick.cygnus.com>
+
+       Stop sharing binfos for indirect virtual bases.
+       * tree.c (propagate_binfo_offsets): Unshare vbases, too.
+       (layout_basetypes): Likewise.
+       (unshare_base_binfos): Copy vbases, too.
+       * cp-tree.h (BINFO_VIA_PUBLIC, BINFO_BASEINIT_MARKED,
+       BINFO_VBASE_INIT_MARKED): Remove obsolete macros.
+       (BINFO_PUSHDECLS_MARKED, SET_BINFO_PUSHDECLS_MARKED,
+       CLEAR_BINFO_PUSHDECLS_MARKED): New macros.
+       * search.c (lookup_field, lookup_fnfields, lookup_member): Remove
+       reference to BINFO_VIA_PUBLIC.
+       (marked_pushdecls_p, unmarked_pushdecls_p): New fns.
+       (push_class_decls): Use them.
+       (dfs_pushdecls): Use SET_BINFO_PUSHDECLS_MARKED.
+       (dfs_compress_decls): Use CLEAR_BINFO_PUSHDECLS_MARKED.
+
 1998-08-27  Mark Mitchell  <mark@markmitchell.com>
 
        * decl.c (build_enumerator): Set DECL_CONTEXT for the
index bf91f830c8d59440340b43b1f4f58bfccf1bc172..85d983cca3ae4e77cde7f3b812e0ab7036174f4e 100644 (file)
@@ -42,17 +42,18 @@ Boston, MA 02111-1307, USA.  */
       TYPE_USES_COMPLEX_INHERITANCE (in _TYPE).
       C_DECLARED_LABEL_FLAG.
    2: IDENTIFIER_OPNAME_P.
+      BINFO_VBASE_MARKED.
       BINFO_FIELDS_MARKED.
       TYPE_VIRTUAL_P.
       PARM_DECL_EXPR (in SAVE_EXPR).
    3: TYPE_USES_VIRTUAL_BASECLASSES (in a class TYPE).
       BINFO_VTABLE_PATH_MARKED.
+      BINFO_PUSHDECLS_MARKED.
       (TREE_REFERENCE_EXPR) (in NON_LVALUE_EXPR) (commented-out).
    4: BINFO_NEW_VTABLE_MARKED.
       TREE_HAS_CONSTRUCTOR (in INDIRECT_REF, SAVE_EXPR, CONSTRUCTOR,
           or FIELD_DECL).
-   5: BINFO_VIA_PUBLIC.
-      BINFO_VBASE_INIT_MARKED.
+   5: Not used.
    6: Not used.
 
    Usage of TYPE_LANG_FLAG_?:
@@ -965,10 +966,6 @@ struct lang_type
 \f
 /* Additional macros for inheritance information.  */
 
-/* When following an binfo-specific chain, this is the cumulative
-   via-public flag.  */
-#define BINFO_VIA_PUBLIC(NODE) TREE_LANG_FLAG_5 (NODE)
-
 #ifdef MI_MATRIX
 /* When building a matrix to determine by a single lookup
    whether one class is derived from another or not,
@@ -985,12 +982,6 @@ struct lang_type
 #define SET_BINFO_MARKED(NODE) (TREE_VIA_VIRTUAL(NODE)?SET_CLASSTYPE_MARKED(BINFO_TYPE(NODE)):(TREE_LANG_FLAG_0(NODE)=1))
 #define CLEAR_BINFO_MARKED(NODE) (TREE_VIA_VIRTUAL(NODE)?CLEAR_CLASSTYPE_MARKED(BINFO_TYPE(NODE)):(TREE_LANG_FLAG_0(NODE)=0))
 
-/* Nonzero means marked in building initialization list.  */
-#define BINFO_BASEINIT_MARKED(NODE) CLASSTYPE_MARKED2 (BINFO_TYPE (NODE))
-/* Modifier macros */
-#define SET_BINFO_BASEINIT_MARKED(NODE) SET_CLASSTYPE_MARKED2 (BINFO_TYPE (NODE))
-#define CLEAR_BINFO_BASEINIT_MARKED(NODE) CLEAR_CLASSTYPE_MARKED2 (BINFO_TYPE (NODE))
-
 /* Nonzero means marked in search through virtual inheritance hierarchy.  */
 #define BINFO_VBASE_MARKED(NODE) CLASSTYPE_MARKED2 (BINFO_TYPE (NODE))
 /* Modifier macros */
@@ -1015,11 +1006,10 @@ struct lang_type
 #define SET_BINFO_NEW_VTABLE_MARKED(NODE) (TREE_VIA_VIRTUAL(NODE)?SET_CLASSTYPE_MARKED4(BINFO_TYPE(NODE)):(TREE_LANG_FLAG_4(NODE)=1))
 #define CLEAR_BINFO_NEW_VTABLE_MARKED(NODE) (TREE_VIA_VIRTUAL(NODE)?CLEAR_CLASSTYPE_MARKED4(BINFO_TYPE(NODE)):(TREE_LANG_FLAG_4(NODE)=0))
 
-/* Nonzero means this class has initialized its virtual baseclasses.  */
-#define BINFO_VBASE_INIT_MARKED(NODE) \
-  (TREE_VIA_VIRTUAL(NODE)?CLASSTYPE_MARKED5(BINFO_TYPE(NODE)):TREE_LANG_FLAG_5(NODE))
-#define SET_BINFO_VBASE_INIT_MARKED(NODE) (TREE_VIA_VIRTUAL(NODE)?SET_CLASSTYPE_MARKED5(BINFO_TYPE(NODE)):(TREE_LANG_FLAG_5(NODE)=1))
-#define CLEAR_BINFO_VBASE_INIT_MARKED(NODE) (TREE_VIA_VIRTUAL(NODE)?CLEAR_CLASSTYPE_MARKED5(BINFO_TYPE(NODE)):(TREE_LANG_FLAG_5(NODE)=0))
+/* Nonzero means this class has done dfs_pushdecls.  */
+#define BINFO_PUSHDECLS_MARKED(NODE) BINFO_VTABLE_PATH_MARKED (NODE)
+#define SET_BINFO_PUSHDECLS_MARKED(NODE) SET_BINFO_VTABLE_PATH_MARKED (NODE)
+#define CLEAR_BINFO_PUSHDECLS_MARKED(NODE) CLEAR_BINFO_VTABLE_PATH_MARKED (NODE)
 \f
 /* Accessor macros for the vfield slots in structures.  */
 
index 4a1733c4dd7fc23c87124d31ffb0c64636deb1d7..1d0f1c34920e986f24ca60fc7536c085e29a1967 100644 (file)
@@ -1223,7 +1223,6 @@ lookup_field (xbasetype, name, protect, want_type)
     {
       type = xbasetype;
       basetype_path = TYPE_BINFO (type);
-      BINFO_VIA_PUBLIC (basetype_path) = 1;
       BINFO_INHERITANCE_CHAIN (basetype_path) = NULL_TREE;
     }
   else
@@ -1852,7 +1851,6 @@ lookup_fnfields (basetype_path, name, complain)
     {
       basetype_chain = CLASSTYPE_BINFO_AS_LIST (type);
       TREE_VIA_PUBLIC (basetype_chain) = 1;
-      BINFO_VIA_PUBLIC (basetype_path) = 1;
       BINFO_INHERITANCE_CHAIN (basetype_path) = NULL_TREE;
     }
   else
@@ -2018,7 +2016,6 @@ lookup_member (xbasetype, name, protect, want_type)
   else if (IS_AGGR_TYPE_CODE (TREE_CODE (xbasetype)))
     {
       basetype_path = TYPE_BINFO (xbasetype);
-      BINFO_VIA_PUBLIC (basetype_path) = 1;
       BINFO_INHERITANCE_CHAIN (basetype_path) = NULL_TREE;
     }
   else
@@ -2652,6 +2649,10 @@ static int marked_new_vtablep (binfo) tree binfo;
 { return BINFO_NEW_VTABLE_MARKED (binfo); }
 static int unmarked_new_vtablep (binfo) tree binfo;
 { return BINFO_NEW_VTABLE_MARKED (binfo) == 0; }
+static int marked_pushdecls_p (binfo) tree binfo;
+{ return BINFO_PUSHDECLS_MARKED (binfo); }
+static int unmarked_pushdecls_p (binfo) tree binfo;
+{ return BINFO_PUSHDECLS_MARKED (binfo) == 0; }
 
 #if 0
 static int dfs_search_slot_nonempty_p (binfo) tree binfo;
@@ -3611,7 +3612,10 @@ dfs_pushdecls (binfo)
          methods++;
        }
     }
-  SET_BINFO_MARKED (binfo);
+
+  /* We can't just use BINFO_MARKED because envelope_add_decl uses
+     DERIVED_FROM_P, which calls get_base_distance.  */
+  SET_BINFO_PUSHDECLS_MARKED (binfo);
 }
 
 /* Consolidate unique (by name) member functions.  */
@@ -3653,7 +3657,7 @@ dfs_compress_decls (binfo)
            }
        }
     }
-  CLEAR_BINFO_MARKED (binfo);
+  CLEAR_BINFO_PUSHDECLS_MARKED (binfo);
 }
 
 /* When entering the scope of a class, we cache all of the
@@ -3671,11 +3675,11 @@ push_class_decls (type)
   search_stack = push_search_level (search_stack, &search_obstack);
 
   /* Push class fields into CLASS_VALUE scope, and mark.  */
-  dfs_walk (TYPE_BINFO (type), dfs_pushdecls, unmarkedp);
+  dfs_walk (TYPE_BINFO (type), dfs_pushdecls, unmarked_pushdecls_p);
 
   /* Compress fields which have only a single entry
      by a given name, and unmark.  */
-  dfs_walk (TYPE_BINFO (type), dfs_compress_decls, markedp);
+  dfs_walk (TYPE_BINFO (type), dfs_compress_decls, marked_pushdecls_p);
 
   /* Open up all the closed envelopes and push the contained decls into
      class scope.  */
index fbd8542a029c95d5dfc58099cca2a6be0819022e..6f33ec86d10b029b1110d340e500da4890424490 100644 (file)
@@ -584,7 +584,10 @@ propagate_binfo_offsets (binfo, offset)
       tree base_binfo = TREE_VEC_ELT (binfos, i);
 
       if (TREE_VIA_VIRTUAL (base_binfo))
-       i += 1;
+       {
+         i += 1;
+         unshare_base_binfos (base_binfo);
+       }         
       else
        {
          int j;
@@ -639,16 +642,16 @@ unshare_base_binfos (base_binfo)
           j >= 0; j--)
        {
          tree base_base_binfo = TREE_VEC_ELT (base_binfos, j);
-         if (! TREE_VIA_VIRTUAL (base_base_binfo))
-           TREE_VEC_ELT (base_binfos, j)
-             = make_binfo (BINFO_OFFSET (base_base_binfo),
-                           base_base_binfo,
-                           BINFO_VTABLE (base_base_binfo),
-                           BINFO_VIRTUALS (base_base_binfo),
-                           chain);
+         TREE_VEC_ELT (base_binfos, j)
+           = make_binfo (BINFO_OFFSET (base_base_binfo),
+                         base_base_binfo,
+                         BINFO_VTABLE (base_base_binfo),
+                         BINFO_VIRTUALS (base_base_binfo),
+                         chain);
          chain = TREE_VEC_ELT (base_binfos, j);
          TREE_VIA_PUBLIC (chain) = TREE_VIA_PUBLIC (base_base_binfo);
          TREE_VIA_PROTECTED (chain) = TREE_VIA_PROTECTED (base_base_binfo);
+         TREE_VIA_VIRTUAL (chain) = TREE_VIA_VIRTUAL (base_base_binfo);
          BINFO_INHERITANCE_CHAIN (chain) = base_binfo;
        }
 
@@ -754,14 +757,16 @@ layout_basetypes (rec, max)
       tree field = TYPE_FIELDS (rec);
 
       if (TREE_VIA_VIRTUAL (base_binfo))
-       continue;
-
-      my_friendly_assert (TREE_TYPE (field) == basetype, 23897);
-      BINFO_OFFSET (base_binfo)
-       = size_int (CEIL (TREE_INT_CST_LOW (DECL_FIELD_BITPOS (field)),
-                         BITS_PER_UNIT));
-      unshare_base_binfos (base_binfo);
-      TYPE_FIELDS (rec) = TREE_CHAIN (field);
+       unshare_base_binfos (base_binfo);
+      else
+       {
+         my_friendly_assert (TREE_TYPE (field) == basetype, 23897);
+         BINFO_OFFSET (base_binfo)
+           = size_int (CEIL (TREE_INT_CST_LOW (DECL_FIELD_BITPOS (field)),
+                             BITS_PER_UNIT));
+         unshare_base_binfos (base_binfo);
+         TYPE_FIELDS (rec) = TREE_CHAIN (field);
+       }
     }
 
   for (vbase_types = CLASSTYPE_VBASECLASSES (rec); vbase_types;