aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Mitchell <mark@codesourcery.com>2000-01-02 04:04:05 +0000
committerMark Mitchell <mmitchel@gcc.gnu.org>2000-01-02 04:04:05 +0000
commit07b7a812fd2ee579c95189586fa8ab7f5bd856aa (patch)
tree74aec9dfb31654044a72c613403e66f30f2b28f5
parent5e1677bcb0a88632d3f9ad495bf64748ec000a1e (diff)
downloadgcc-07b7a812fd2ee579c95189586fa8ab7f5bd856aa.zip
gcc-07b7a812fd2ee579c95189586fa8ab7f5bd856aa.tar.gz
gcc-07b7a812fd2ee579c95189586fa8ab7f5bd856aa.tar.bz2
cp-tree.h (skip_rtti_stuff): Adjust prototype.
* cp-tree.h (skip_rtti_stuff): Adjust prototype. * class.c (skip_rtti_stuff): Reorganize parameters and return value. (modify_one_vtable): Adjust. (fixup_vtable_deltas1): Likewise. (override_one_vtable): Likewise. * search.c (get_abstract_virtuals_1): Likewise. (get_pure_virtuals): Likewise. (expand_upcast_fixups): Likewise. * tree.c (debug_binfo): Likewise. From-SVN: r31163
-rw-r--r--gcc/cp/ChangeLog10
-rw-r--r--gcc/cp/class.c51
-rw-r--r--gcc/cp/cp-tree.h2
-rw-r--r--gcc/cp/search.c12
-rw-r--r--gcc/cp/tree.c4
5 files changed, 48 insertions, 31 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index eb51cc2..d1762d6 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,15 @@
2000-01-01 Mark Mitchell <mark@codesourcery.com>
+ * cp-tree.h (skip_rtti_stuff): Adjust prototype.
+ * class.c (skip_rtti_stuff): Reorganize parameters and return value.
+ (modify_one_vtable): Adjust.
+ (fixup_vtable_deltas1): Likewise.
+ (override_one_vtable): Likewise.
+ * search.c (get_abstract_virtuals_1): Likewise.
+ (get_pure_virtuals): Likewise.
+ (expand_upcast_fixups): Likewise.
+ * tree.c (debug_binfo): Likewise.
+
* class.c (build_vtable): Don't return a value. Don't rebuild
vtables for bases that have already been handled.
(prepare_fresh_vtable): Don't rebuild vtables for bases that have
diff --git a/gcc/cp/class.c b/gcc/cp/class.c
index dfe1a15..fe5d296 100644
--- a/gcc/cp/class.c
+++ b/gcc/cp/class.c
@@ -2384,39 +2384,48 @@ get_class_offset (context, t, binfo, fndecl)
return offset;
}
-/* Skip RTTI information at the front of the virtual list. */
+/* Return the BINFO_VIRTUALS list for BINFO, without the RTTI stuff at
+ the front. If non-NULL, N is set to the number of entries
+ skipped. */
-unsigned HOST_WIDE_INT
-skip_rtti_stuff (virtuals, t)
- tree *virtuals, t;
+tree
+skip_rtti_stuff (binfo, t, n)
+ tree binfo;
+ tree t;
+ unsigned HOST_WIDE_INT *n;
{
- int n;
+ tree virtuals;
if (CLASSTYPE_COM_INTERFACE (t))
return 0;
- n = 0;
- if (*virtuals)
+ if (n)
+ *n = 0;
+ virtuals = BINFO_VIRTUALS (binfo);
+ if (virtuals)
{
/* We always reserve a slot for the offset/tdesc entry. */
- ++n;
- *virtuals = TREE_CHAIN (*virtuals);
+ if (n)
+ ++*n;
+ virtuals = TREE_CHAIN (virtuals);
}
- if (flag_vtable_thunks && *virtuals)
+ if (flag_vtable_thunks && virtuals)
{
/* The second slot is reserved for the tdesc pointer when thunks
are used. */
- ++n;
- *virtuals = TREE_CHAIN (*virtuals);
+ if (n)
+ ++*n;
+ virtuals = TREE_CHAIN (virtuals);
}
- return n;
+
+ return virtuals;
}
static void
modify_one_vtable (binfo, t, fndecl)
tree binfo, t, fndecl;
{
- tree virtuals = BINFO_VIRTUALS (binfo);
+ tree virtuals;
unsigned HOST_WIDE_INT n;
/* update rtti entry */
@@ -2430,7 +2439,7 @@ modify_one_vtable (binfo, t, fndecl)
if (fndecl == NULL_TREE)
return;
- n = skip_rtti_stuff (&virtuals, BINFO_TYPE (binfo));
+ virtuals = skip_rtti_stuff (binfo, BINFO_TYPE (binfo), &n);
while (virtuals)
{
@@ -2519,10 +2528,10 @@ static void
fixup_vtable_deltas1 (binfo, t)
tree binfo, t;
{
- tree virtuals = BINFO_VIRTUALS (binfo);
+ tree virtuals;
unsigned HOST_WIDE_INT n;
- n = skip_rtti_stuff (&virtuals, BINFO_TYPE (binfo));
+ virtuals = skip_rtti_stuff (binfo, BINFO_TYPE (binfo), &n);
while (virtuals)
{
@@ -2677,8 +2686,8 @@ static void
override_one_vtable (binfo, old, t)
tree binfo, old, t;
{
- tree virtuals = BINFO_VIRTUALS (binfo);
- tree old_virtuals = BINFO_VIRTUALS (old);
+ tree virtuals;
+ tree old_virtuals;
enum { REUSE_NEW, REUSE_OLD, UNDECIDED, NEITHER } choose = UNDECIDED;
/* If we have already committed to modifying it, then don't try and
@@ -2686,8 +2695,8 @@ override_one_vtable (binfo, old, t)
if (BINFO_NEW_VTABLE_MARKED (binfo))
choose = NEITHER;
- skip_rtti_stuff (&virtuals, BINFO_TYPE (binfo));
- skip_rtti_stuff (&old_virtuals, BINFO_TYPE (binfo));
+ virtuals = skip_rtti_stuff (binfo, BINFO_TYPE (binfo), NULL);
+ old_virtuals = skip_rtti_stuff (old, BINFO_TYPE (binfo), NULL);
while (virtuals)
{
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index 9f7f685..24ff231 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -3394,7 +3394,7 @@ extern void push_lang_context PROTO((tree));
extern void pop_lang_context PROTO((void));
extern tree instantiate_type PROTO((tree, tree, int));
extern void print_class_statistics PROTO((void));
-extern unsigned HOST_WIDE_INT skip_rtti_stuff PROTO((tree *, tree));
+extern tree skip_rtti_stuff PROTO((tree, tree, unsigned HOST_WIDE_INT *));
extern void build_self_reference PROTO((void));
extern void warn_hidden PROTO((tree));
extern tree get_enclosing_class PROTO((tree));
diff --git a/gcc/cp/search.c b/gcc/cp/search.c
index 798099a..d6269e3 100644
--- a/gcc/cp/search.c
+++ b/gcc/cp/search.c
@@ -2129,9 +2129,9 @@ get_abstract_virtuals_1 (binfo, do_self, abstract_virtuals)
/* Should we use something besides CLASSTYPE_VFIELDS? */
if (do_self && CLASSTYPE_VFIELDS (BINFO_TYPE (binfo)))
{
- tree virtuals = BINFO_VIRTUALS (binfo);
+ tree virtuals;
- skip_rtti_stuff (&virtuals, BINFO_TYPE (binfo));
+ virtuals = skip_rtti_stuff (binfo, BINFO_TYPE (binfo), NULL);
while (virtuals)
{
@@ -2160,9 +2160,9 @@ get_pure_virtuals (type)
for (vbases = CLASSTYPE_VBASECLASSES (type); vbases; vbases = TREE_CHAIN (vbases))
{
- tree virtuals = BINFO_VIRTUALS (vbases);
+ tree virtuals;
- skip_rtti_stuff (&virtuals, BINFO_TYPE (vbases));
+ virtuals = skip_rtti_stuff (vbases, BINFO_TYPE (vbases), NULL);
while (virtuals)
{
@@ -2598,7 +2598,7 @@ expand_upcast_fixups (binfo, addr, orig_addr, vbase, vbase_addr, t,
vbase_offsets)
tree binfo, addr, orig_addr, vbase, vbase_addr, t, *vbase_offsets;
{
- tree virtuals = BINFO_VIRTUALS (binfo);
+ tree virtuals;
tree vc;
tree delta;
unsigned HOST_WIDE_INT n;
@@ -2613,7 +2613,7 @@ expand_upcast_fixups (binfo, addr, orig_addr, vbase, vbase_addr, t,
*vbase_offsets = delta;
}
- n = skip_rtti_stuff (&virtuals, BINFO_TYPE (binfo));
+ virtuals = skip_rtti_stuff (binfo, BINFO_TYPE (binfo), &n);
while (virtuals)
{
diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c
index ce26ec9..f5e2474 100644
--- a/gcc/cp/tree.c
+++ b/gcc/cp/tree.c
@@ -1165,9 +1165,7 @@ debug_binfo (elem)
else
fprintf (stderr, "no vtable decl yet\n");
fprintf (stderr, "virtuals:\n");
- virtuals = BINFO_VIRTUALS (elem);
-
- n = skip_rtti_stuff (&virtuals, BINFO_TYPE (elem));
+ virtuals = skip_rtti_stuff (elem, BINFO_TYPE (elem), &n);
while (virtuals)
{