From 07b7a812fd2ee579c95189586fa8ab7f5bd856aa Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Sun, 2 Jan 2000 04:04:05 +0000 Subject: [PATCH] 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 --- gcc/cp/ChangeLog | 10 ++++++++++ gcc/cp/class.c | 51 ++++++++++++++++++++++++++++-------------------- gcc/cp/cp-tree.h | 2 +- gcc/cp/search.c | 12 ++++++------ gcc/cp/tree.c | 4 +--- 5 files changed, 48 insertions(+), 31 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index eb51cc2303f..d1762d63c9e 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,15 @@ 2000-01-01 Mark Mitchell + * 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 dfe1a156586..fe5d29685dd 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 9f7f68515ba..24ff231c605 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 798099a4d9e..d6269e378e4 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 ce26ec98315..f5e24740200 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) {