aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMark Mitchell <mark@codesourcery.com>2000-05-16 23:51:18 +0000
committerMark Mitchell <mmitchel@gcc.gnu.org>2000-05-16 23:51:18 +0000
commiteaef69ce27a08681af09e8a8b36bb110fe1e8568 (patch)
tree2513cfd0aae166479bdc6c06fe739de00f47d50d /gcc
parent13fa202991ba0b58b062e222d92a8f0d2fc886ac (diff)
downloadgcc-eaef69ce27a08681af09e8a8b36bb110fe1e8568.zip
gcc-eaef69ce27a08681af09e8a8b36bb110fe1e8568.tar.gz
gcc-eaef69ce27a08681af09e8a8b36bb110fe1e8568.tar.bz2
cp-treeh (BINFO_NEW_VTABLE_MARKED): Update documentation.
* cp-treeh (BINFO_NEW_VTABLE_MARKED): Update documentation. * init.c (dfs_vtable_path_unmark): Remove. * search.c (marked_new_vtable_p): Likewise. (unmarked_new_vtable_p): Likewise. (dfs_search_slot_nonempty_p): Likewise. (dfs_mark): Likewise. (dfs_vtable_path_unmark): Likewise. (dfs_find_vbases): Don't set BINFO_NEW_VTABLE_MARKED. (dfs_int_vbase_pointers): Don't clear BINFO_VTABLE_PATH_MARKED. (dfs_init_vbase_pointers): Remove special-case new ABI code. (dfs_clear_vbase_slots): Don't clear BINFO_NEW_VTABLE_MARKED. (init_vbase_pointers): Simplify. (expand_indirect_vtbls_init): Likewise. From-SVN: r33948
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog14
-rw-r--r--gcc/cp/cp-tree.h8
-rw-r--r--gcc/cp/search.c67
3 files changed, 28 insertions, 61 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 569a90a..1400181 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,19 @@
2000-05-16 Mark Mitchell <mark@codesourcery.com>
+ * cp-treeh (BINFO_NEW_VTABLE_MARKED): Update documentation.
+ * init.c (dfs_vtable_path_unmark): Remove.
+ * search.c (marked_new_vtable_p): Likewise.
+ (unmarked_new_vtable_p): Likewise.
+ (dfs_search_slot_nonempty_p): Likewise.
+ (dfs_mark): Likewise.
+ (dfs_vtable_path_unmark): Likewise.
+ (dfs_find_vbases): Don't set BINFO_NEW_VTABLE_MARKED.
+ (dfs_int_vbase_pointers): Don't clear BINFO_VTABLE_PATH_MARKED.
+ (dfs_init_vbase_pointers): Remove special-case new ABI code.
+ (dfs_clear_vbase_slots): Don't clear BINFO_NEW_VTABLE_MARKED.
+ (init_vbase_pointers): Simplify.
+ (expand_indirect_vtbls_init): Likewise.
+
* class.c (copy_virtuals): New function.
(build_primary_table): Use it.
(build_secondary_vtable): Likewise.
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index 7961eb3..fc5cf2c 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -1740,8 +1740,11 @@ struct lang_type
#define SET_BINFO_VTABLE_PATH_MARKED(NODE) (TREE_VIA_VIRTUAL(NODE)?SET_CLASSTYPE_MARKED3(BINFO_TYPE(NODE)):(TREE_LANG_FLAG_3(NODE)=1))
#define CLEAR_BINFO_VTABLE_PATH_MARKED(NODE) (TREE_VIA_VIRTUAL(NODE)?CLEAR_CLASSTYPE_MARKED3(BINFO_TYPE(NODE)):(TREE_LANG_FLAG_3(NODE)=0))
-/* Nonzero means B (a BINFO) needs a new vtable. B is part of the
- hierarchy dominated by C. */
+/* Nonzero means B (a BINFO) has its own vtable. Under the old ABI,
+ secondary vtables are sometimes shared. Any copies will not have
+ this flag set.
+
+ B is part of the hierarchy dominated by C. */
#define BINFO_NEW_VTABLE_MARKED(B, C) \
(TREE_LANG_FLAG_4 (CANONICAL_BINFO (B, C)))
#define SET_BINFO_NEW_VTABLE_MARKED(B, C) \
@@ -4351,7 +4354,6 @@ extern tree dfs_walk_real PARAMS ((tree,
tree (*) (tree, void *),
void *));
extern tree dfs_unmark PARAMS ((tree, void *));
-extern tree dfs_vtable_path_unmark PARAMS ((tree, void *));
extern tree markedp PARAMS ((tree, void *));
extern tree unmarkedp PARAMS ((tree, void *));
extern tree dfs_skip_nonprimary_vbases_unmarkedp PARAMS ((tree, void *));
diff --git a/gcc/cp/search.c b/gcc/cp/search.c
index 69d0739..b296ea5 100644
--- a/gcc/cp/search.c
+++ b/gcc/cp/search.c
@@ -104,8 +104,6 @@ static void expand_upcast_fixups
static void fixup_virtual_upcast_offsets
PARAMS ((tree, tree, int, int, tree, tree, tree, tree,
tree *));
-static tree marked_new_vtablep PARAMS ((tree, void *));
-static tree unmarked_new_vtablep PARAMS ((tree, void *));
static tree marked_pushdecls_p PARAMS ((tree, void *));
static tree unmarked_pushdecls_p PARAMS ((tree, void *));
static tree dfs_debug_unmarkedp PARAMS ((tree, void *));
@@ -2442,26 +2440,6 @@ unmarked_vtable_pathp (binfo, data)
return !BINFO_VTABLE_PATH_MARKED (binfo) ? binfo : NULL_TREE;
}
-static tree
-marked_new_vtablep (binfo, data)
- tree binfo;
- void *data;
-{
- struct vbase_info *vi = (struct vbase_info *) data;
-
- return BINFO_NEW_VTABLE_MARKED (binfo, vi->type) ? binfo : NULL_TREE;
-}
-
-static tree
-unmarked_new_vtablep (binfo, data)
- tree binfo;
- void *data;
-{
- struct vbase_info *vi = (struct vbase_info *) data;
-
- return !BINFO_NEW_VTABLE_MARKED (binfo, vi->type) ? binfo : NULL_TREE;
-}
-
static tree
marked_pushdecls_p (binfo, data)
tree binfo;
@@ -2480,21 +2458,10 @@ unmarked_pushdecls_p (binfo, data)
&& !BINFO_PUSHDECLS_MARKED (binfo)) ? binfo : NULL_TREE;
}
-#if 0
-static int dfs_search_slot_nonempty_p (binfo) tree binfo;
-{ return CLASSTYPE_SEARCH_SLOT (BINFO_TYPE (binfo)) != 0; }
-#endif
-
/* The worker functions for `dfs_walk'. These do not need to
test anything (vis a vis marking) if they are paired with
a predicate function (above). */
-#if 0
-static void
-dfs_mark (binfo) tree binfo;
-{ SET_BINFO_MARKED (binfo); }
-#endif
-
tree
dfs_unmark (binfo, data)
tree binfo;
@@ -2504,17 +2471,6 @@ dfs_unmark (binfo, data)
return NULL_TREE;
}
-/* Clear BINFO_VTABLE_PATH_MARKED. */
-
-tree
-dfs_vtable_path_unmark (binfo, data)
- tree binfo;
- void *data ATTRIBUTE_UNUSED;
-{
- CLEAR_BINFO_VTABLE_PATH_MARKED (binfo);
- return NULL_TREE;
-}
-
/* Attach to the type of the virtual base class, the pointer to the
virtual base class. */
@@ -2545,7 +2501,6 @@ dfs_find_vbases (binfo, data)
}
}
SET_BINFO_VTABLE_PATH_MARKED (binfo);
- SET_BINFO_NEW_VTABLE_MARKED (binfo, vi->type);
return NULL_TREE;
}
@@ -2560,8 +2515,6 @@ dfs_init_vbase_pointers (binfo, data)
tree fields;
tree this_vbase_ptr;
- CLEAR_BINFO_VTABLE_PATH_MARKED (binfo);
-
if (BINFO_INHERITANCE_CHAIN (binfo))
{
this_vbase_ptr = TREE_CHAIN (BINFO_INHERITANCE_CHAIN (binfo));
@@ -2578,10 +2531,6 @@ dfs_init_vbase_pointers (binfo, data)
/* We're going to iterate through all the pointers to virtual
base-classes. They come at the beginning of the class. */
fields = TYPE_FIELDS (type);
- if (fields == TYPE_VFIELD (type))
- /* If the first field is the vtbl pointer (as happens in the new
- ABI), skip it. */
- fields = TREE_CHAIN (fields);
if (fields == NULL_TREE
|| DECL_NAME (fields) == NULL_TREE
@@ -2614,14 +2563,12 @@ dfs_init_vbase_pointers (binfo, data)
static tree
dfs_clear_vbase_slots (binfo, data)
tree binfo;
- void *data;
+ void *data ATTRIBUTE_UNUSED;
{
tree type = BINFO_TYPE (binfo);
- struct vbase_info *vi = (struct vbase_info *) data;
CLASSTYPE_SEARCH_SLOT (type) = 0;
CLEAR_BINFO_VTABLE_PATH_MARKED (binfo);
- CLEAR_BINFO_NEW_VTABLE_MARKED (binfo, vi->type);
return NULL_TREE;
}
@@ -2630,6 +2577,8 @@ init_vbase_pointers (type, decl_ptr)
tree type;
tree decl_ptr;
{
+ my_friendly_assert (!vbase_offsets_in_vtable_p (), 20000516);
+
if (TYPE_USES_VIRTUAL_BASECLASSES (type))
{
struct vbase_info vi;
@@ -2653,7 +2602,7 @@ init_vbase_pointers (type, decl_ptr)
marked_vtable_pathp,
&vi);
- dfs_walk (binfo, dfs_clear_vbase_slots, marked_new_vtablep, &vi);
+ dfs_walk (binfo, dfs_clear_vbase_slots, marked_vtable_pathp, NULL);
flag_this_is_variable = old_flag;
return vi.inits;
}
@@ -2950,7 +2899,9 @@ expand_indirect_vtbls_init (binfo, decl_ptr)
tree binfo;
tree decl_ptr;
{
- tree type = BINFO_TYPE (binfo);
+ tree type;
+
+ type = BINFO_TYPE (binfo);
/* This function executes during the finish_function() segment,
AFTER the auto variables and temporary stack space has been marked
@@ -2971,9 +2922,9 @@ expand_indirect_vtbls_init (binfo, decl_ptr)
vi.decl_ptr = decl_ptr;
vi.vbase_types = vbases;
- dfs_walk (binfo, dfs_find_vbases, unmarked_new_vtablep, &vi);
+ dfs_walk (binfo, dfs_find_vbases, NULL, &vi);
fixup_all_virtual_upcast_offsets (type, vi.decl_ptr);
- dfs_walk (binfo, dfs_clear_vbase_slots, marked_new_vtablep, &vi);
+ dfs_walk (binfo, dfs_clear_vbase_slots, marked_vtable_pathp, &vi);
}
}