diff options
author | Nathan Sidwell <nathan@codesourcery.com> | 2004-07-28 08:50:27 +0000 |
---|---|---|
committer | Nathan Sidwell <nathan@gcc.gnu.org> | 2004-07-28 08:50:27 +0000 |
commit | 0871761b07caa5c85920d72b0bf7b282b1864a1b (patch) | |
tree | 8c3a9ed311c490b90e6c1b88f398eecd97c0e615 | |
parent | c1b763fa9a9a0dba0ccce1493c655179fdaa7d22 (diff) | |
download | gcc-0871761b07caa5c85920d72b0bf7b282b1864a1b.zip gcc-0871761b07caa5c85920d72b0bf7b282b1864a1b.tar.gz gcc-0871761b07caa5c85920d72b0bf7b282b1864a1b.tar.bz2 |
cp-tree.h (struct tree_pair_s): New.
* cp-tree.h (struct tree_pair_s): New.
(typedef tree_pair_p): New.
(DEF_VEC_O(tree_pair_s)): New.
(struct lang_type_class): Make vcall_indices a VEC(tree_pair_s).
(CLASSTYPE_VCALL_INDICES): Update documentation.
* class.c (get_vcall_index): Adjust.
(add_vcall_offset): Adjust.
From-SVN: r85256
-rw-r--r-- | gcc/cp/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/cp/class.c | 28 | ||||
-rw-r--r-- | gcc/cp/cp-tree.h | 25 |
3 files changed, 44 insertions, 19 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 2bc1ce0..f71e01d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,13 @@ +2004-07-28 Nathan Sidwell <nathan@codesourcery.com> + + * cp-tree.h (struct tree_pair_s): New. + (typedef tree_pair_p): New. + (DEF_VEC_O(tree_pair_s)): New. + (struct lang_type_class): Make vcall_indices a VEC(tree_pair_s). + (CLASSTYPE_VCALL_INDICES): Update documentation. + * class.c (get_vcall_index): Adjust. + (add_vcall_offset): Adjust. + 2004-07-27 Kelley Cook <kcook@gcc.gnu.org> * pt.c, typeck.c: Remove spurious carriage returns. diff --git a/gcc/cp/class.c b/gcc/cp/class.c index f30d519..8da2e58 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -1955,17 +1955,19 @@ find_final_overrider (tree derived, tree binfo, tree fn) static tree get_vcall_index (tree fn, tree type) { - tree v; + VEC (tree_pair_s) *indices = CLASSTYPE_VCALL_INDICES (type); + tree_pair_p p; + unsigned ix; - for (v = CLASSTYPE_VCALL_INDICES (type); v; v = TREE_CHAIN (v)) - if ((DECL_DESTRUCTOR_P (fn) && DECL_DESTRUCTOR_P (TREE_PURPOSE (v))) - || same_signature_p (fn, TREE_PURPOSE (v))) - break; + for (ix = 0; VEC_iterate (tree_pair_s, indices, ix, p); ix++) + if ((DECL_DESTRUCTOR_P (fn) && DECL_DESTRUCTOR_P (p->purpose)) + || same_signature_p (fn, p->purpose)) + return p->value; /* There should always be an appropriate index. */ - my_friendly_assert (v, 20021103); + abort (); - return TREE_VALUE (v); + return NULL_TREE; } /* Update an entry in the vtable for BINFO, which is in the hierarchy @@ -7682,10 +7684,14 @@ add_vcall_offset (tree orig_fn, tree binfo, vtbl_init_data *vid) the vtable for the most derived class, remember the vcall offset. */ if (vid->binfo == TYPE_BINFO (vid->derived)) - CLASSTYPE_VCALL_INDICES (vid->derived) - = tree_cons (orig_fn, vid->index, - CLASSTYPE_VCALL_INDICES (vid->derived)); - + { + tree_pair_p elt = VEC_safe_push (tree_pair_s, + CLASSTYPE_VCALL_INDICES (vid->derived), + NULL); + elt->purpose = orig_fn; + elt->value = vid->index; + } + /* The next vcall offset will be found at a more negative offset. */ vid->index = size_binop (MINUS_EXPR, vid->index, diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index e7eed5e..c69320f 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -933,9 +933,18 @@ enum languages { lang_c, lang_cplusplus, lang_java }; != NULL_TREE) /* Gives the visibility specification for a class type. */ -#define CLASSTYPE_VISIBILITY(TYPE) DECL_VISIBILITY (TYPE_NAME (TYPE)) -#define CLASSTYPE_VISIBILITY_SPECIFIED(TYPE) DECL_VISIBILITY_SPECIFIED (TYPE_NAME (TYPE)) +#define CLASSTYPE_VISIBILITY(TYPE) \ + DECL_VISIBILITY (TYPE_NAME (TYPE)) +#define CLASSTYPE_VISIBILITY_SPECIFIED(TYPE) \ + DECL_VISIBILITY_SPECIFIED (TYPE_NAME (TYPE)) +typedef struct tree_pair_s GTY (()) +{ + tree purpose; + tree value; +} tree_pair_s; +typedef tree_pair_s *tree_pair_p; +DEF_VEC_O (tree_pair_s); /* This is a few header flags for 'struct lang_type'. Actually, all but the first are used only for lang_type_class; they @@ -1020,7 +1029,7 @@ struct lang_type_class GTY(()) unsigned dummy : 8; tree primary_base; - tree vcall_indices; + VEC (tree_pair_s) *vcall_indices; tree vtables; tree typeinfo_var; VEC (tree) *vbases; @@ -1432,11 +1441,11 @@ struct lang_type GTY(()) /* Used by various search routines. */ #define IDENTIFIER_MARKED(NODE) TREE_LANG_FLAG_0 (NODE) -/* A TREE_LIST of the vcall indices associated with the class NODE. - The TREE_PURPOSE of each node is a FUNCTION_DECL for a virtual - function. The TREE_VALUE is the index into the virtual table where - the vcall offset for that function is stored, when NODE is a - virtual base. */ +/* A VEC(tree_pair_s) of the vcall indices associated with the class + NODE. The PURPOSE of each element is a FUNCTION_DECL for a virtual + function. The VALUE is the index into the virtual table where the + vcall offset for that function is stored, when NODE is a virtual + base. */ #define CLASSTYPE_VCALL_INDICES(NODE) \ (LANG_TYPE_CLASS_CHECK (NODE)->vcall_indices) |