aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@codesourcery.com>2004-07-20 13:46:43 +0000
committerNathan Sidwell <nathan@gcc.gnu.org>2004-07-20 13:46:43 +0000
commitbcb1079efdac63d99e39284fe69c070eac8a5bf2 (patch)
treee31689fea107893a0dd14fdbbf6fbd860fad82b9 /gcc
parentfa743e8cda25ba09a4731a3443df9e0e56e87581 (diff)
downloadgcc-bcb1079efdac63d99e39284fe69c070eac8a5bf2.zip
gcc-bcb1079efdac63d99e39284fe69c070eac8a5bf2.tar.gz
gcc-bcb1079efdac63d99e39284fe69c070eac8a5bf2.tar.bz2
cp-tree.h (struct lang_type_class): Remove vfields field.
* cp-tree.h (struct lang_type_class): Remove vfields field. (CLASSTYPE_VFIELDS): Remove. (SET_BINFO_NEW_VTABLE_MARKED): Adjust. * class.c (determine_primary_base): Remove CLASSTYPE_VFIELDS handling. (dfs_modify_vtables): Use TYPE_CONTAINS_VPTR_P. (finish_struct_1): Remove CLASSTYPE_VFIELDS handling. * init.c (dfs_initialize_vtbl_ptrs): Use TYPE_CONTAINS_VPTR_P. From-SVN: r84950
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog11
-rw-r--r--gcc/cp/class.c52
-rw-r--r--gcc/cp/cp-tree.h15
-rw-r--r--gcc/cp/init.c2
4 files changed, 21 insertions, 59 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 5ff48d0..fd997b0 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,16 @@
2004-07-20 Nathan Sidwell <nathan@codesourcery.com>
+ * cp-tree.h (struct lang_type_class): Remove vfields field.
+ (CLASSTYPE_VFIELDS): Remove.
+ (SET_BINFO_NEW_VTABLE_MARKED): Adjust.
+ * class.c (determine_primary_base): Remove CLASSTYPE_VFIELDS
+ handling.
+ (dfs_modify_vtables): Use TYPE_CONTAINS_VPTR_P.
+ (finish_struct_1): Remove CLASSTYPE_VFIELDS handling.
+ * init.c (dfs_initialize_vtbl_ptrs): Use TYPE_CONTAINS_VPTR_P.
+
+2004-07-20 Nathan Sidwell <nathan@codesourcery.com>
+
* cp-tree.h (DEF_VEC_P(tree)): Remove here.
(BINFO_SUBVTT_INDEX, BINFO_VPTR_INDEX, BINFO_PRIMARY_BASE_OF):
Moved to common.
diff --git a/gcc/cp/class.c b/gcc/cp/class.c
index 70374eb..169dd91 100644
--- a/gcc/cp/class.c
+++ b/gcc/cp/class.c
@@ -1282,25 +1282,7 @@ determine_primary_base (tree t)
continue;
if (!CLASSTYPE_HAS_PRIMARY_BASE_P (t))
- {
- set_primary_base (t, base_binfo);
- CLASSTYPE_VFIELDS (t) = copy_list (CLASSTYPE_VFIELDS (basetype));
- }
- else
- {
- tree vfields;
-
- /* Only add unique vfields, and flatten them out as we go. */
- for (vfields = CLASSTYPE_VFIELDS (basetype);
- vfields;
- vfields = TREE_CHAIN (vfields))
- if (VF_BINFO_VALUE (vfields) == NULL_TREE
- || ! BINFO_VIRTUAL_P (VF_BINFO_VALUE (vfields)))
- CLASSTYPE_VFIELDS (t)
- = tree_cons (base_binfo,
- VF_BASETYPE_VALUE (vfields),
- CLASSTYPE_VFIELDS (t));
- }
+ set_primary_base (t, base_binfo);
}
}
@@ -1382,11 +1364,7 @@ determine_primary_base (tree t)
/* If we've got a primary base, use it. */
if (candidate)
- {
- set_primary_base (t, candidate);
- CLASSTYPE_VFIELDS (t)
- = copy_list (CLASSTYPE_VFIELDS (BINFO_TYPE (candidate)));
- }
+ set_primary_base (t, candidate);
}
/* Mark the primary base classes at this point. */
@@ -2193,15 +2171,18 @@ update_vtable_entry_for_fn (tree t, tree binfo, tree fn, tree* virtuals,
static tree
dfs_modify_vtables (tree binfo, void* data)
{
+ tree t = (tree) data;
+
if (/* There's no need to modify the vtable for a non-virtual
primary base; we're not going to use that vtable anyhow.
We do still need to do this for virtual primary bases, as they
could become non-primary in a construction vtable. */
(!BINFO_PRIMARY_P (binfo) || BINFO_VIRTUAL_P (binfo))
/* Similarly, a base without a vtable needs no modification. */
- && CLASSTYPE_VFIELDS (BINFO_TYPE (binfo)))
+ && TYPE_CONTAINS_VPTR_P (BINFO_TYPE (binfo))
+ /* Don't do the primary vtable, if it's new. */
+ && (BINFO_TYPE (binfo) != t || CLASSTYPE_HAS_PRIMARY_BASE_P (t)))
{
- tree t = (tree) data;
tree virtuals;
tree old_virtuals;
unsigned ix;
@@ -4963,12 +4944,6 @@ finish_struct_1 (tree t)
virtuals = modify_all_vtables (t, nreverse (virtuals));
- /* If we created a new vtbl pointer for this class, add it to the
- list. */
- if (TYPE_VFIELD (t) && !CLASSTYPE_HAS_PRIMARY_BASE_P (t))
- CLASSTYPE_VFIELDS (t)
- = chainon (CLASSTYPE_VFIELDS (t), build_tree_list (NULL_TREE, t));
-
/* If necessary, create the primary vtable for this class. */
if (virtuals || TYPE_CONTAINS_VPTR_P (t))
{
@@ -5046,19 +5021,6 @@ finish_struct_1 (tree t)
DECL_SORTED_FIELDS (TYPE_MAIN_DECL (t)) = field_vec;
}
- if (TYPE_HAS_CONSTRUCTOR (t))
- {
- tree vfields = CLASSTYPE_VFIELDS (t);
-
- for (vfields = CLASSTYPE_VFIELDS (t);
- vfields; vfields = TREE_CHAIN (vfields))
- /* Mark the fact that constructor for T could affect anybody
- inheriting from T who wants to initialize vtables for
- VFIELDS's type. */
- if (VF_BINFO_VALUE (vfields))
- TREE_ADDRESSABLE (vfields) = 1;
- }
-
/* Make the rtl for any new vtables we have created, and unmark
the base types we marked. */
finish_vtbls (t);
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index b3867bb..60217c4 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -1003,7 +1003,6 @@ struct lang_type_class GTY(())
unsigned dummy : 9;
tree primary_base;
- tree vfields;
tree vcall_indices;
tree vtables;
tree typeinfo_var;
@@ -1386,9 +1385,8 @@ struct lang_type GTY(())
#define SET_BINFO_NEW_VTABLE_MARKED(B) \
(BINFO_NEW_VTABLE_MARKED (B) = 1, \
my_friendly_assert (!BINFO_PRIMARY_P (B) \
- || BINFO_VIRTUAL_P (B), 20000517), \
- my_friendly_assert (CLASSTYPE_VFIELDS (BINFO_TYPE (B)) != NULL_TREE, \
- 20000517))
+ || BINFO_VIRTUAL_P (B), 20000517), \
+ my_friendly_assert (TYPE_VFIELD (BINFO_TYPE (B)), 20000517))
/* Nonzero if this BINFO is a primary base class. */
@@ -1433,15 +1431,6 @@ struct lang_type GTY(())
/* Accessor macros for the vfield slots in structures. */
-/* List of virtual table fields that this type contains (both the primary
- and secondaries). The TREE_VALUE is the class type where the vtable
- field was introduced. For a vtable field inherited from the primary
- base, or introduced by this class, the TREE_PURPOSE is NULL. For
- other vtable fields (those from non-primary bases), the
- TREE_PURPOSE is the BINFO of the base through which the vtable was
- inherited. */
-#define CLASSTYPE_VFIELDS(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->vfields)
-
/* Get the BINFO that introduced this vtable into the hierarchy (will
be NULL for those created at this level, or from a primary
hierarchy). */
diff --git a/gcc/cp/init.c b/gcc/cp/init.c
index 99df1b6..776b996 100644
--- a/gcc/cp/init.c
+++ b/gcc/cp/init.c
@@ -102,7 +102,7 @@ static tree
dfs_initialize_vtbl_ptrs (tree binfo, void *data)
{
if ((!BINFO_PRIMARY_P (binfo) || BINFO_VIRTUAL_P (binfo))
- && CLASSTYPE_VFIELDS (BINFO_TYPE (binfo)))
+ && TYPE_CONTAINS_VPTR_P (BINFO_TYPE (binfo)))
{
tree base_ptr = TREE_VALUE ((tree) data);