diff options
author | Mark Mitchell <mark@codesourcery.com> | 2000-01-02 04:04:05 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 2000-01-02 04:04:05 +0000 |
commit | 07b7a812fd2ee579c95189586fa8ab7f5bd856aa (patch) | |
tree | 74aec9dfb31654044a72c613403e66f30f2b28f5 | |
parent | 5e1677bcb0a88632d3f9ad495bf64748ec000a1e (diff) | |
download | gcc-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/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/cp/class.c | 51 | ||||
-rw-r--r-- | gcc/cp/cp-tree.h | 2 | ||||
-rw-r--r-- | gcc/cp/search.c | 12 | ||||
-rw-r--r-- | gcc/cp/tree.c | 4 |
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) { |