cp-tree.h (struct lang_type_class): Remove marked flags, add diamond_shaped and repeated_base flags.

* cp-tree.h (struct lang_type_class): Remove marked flags, add
	diamond_shaped and repeated_base flags.  Reorder to keep 8-bit blocks.
	(TYPE_MARKED_P): New.
	(CLASSTYPE_DIAMOND_SHAPED_P, CLASSTYPE_REPEATED_BASE_P): New.
	(CLASSTYPE_MARKED_N, SET_CLASSTYPE_MARKED_N,
	CLEAR_CLASSTYPE_MARKED_N): Remove.
	(CLASSTYPE_MARKED_*, SET_CLASSTYPE_MARKED_*,
	CLEAR_CLASSTYPE_MARKED_*): Remove.
	* decl.c (xref_basetypes): Use TYPE_MARKED_P. Determine diamond
	shaped and repeated base properties.
	* lex.c (cxx_make_type): Don't clear TYPE_ALIAS_SET.
	* rtti.c (dfs_class_hint_mark, dfs_class_hint_unmark,
	class_hint_flags): Remove.
	(get_pseudo_ti_init): Use CLASSTYPE_REPEATED_BASE_P and
	CLASSTYPE_DIAMOND_SHAPED_P.

From-SVN: r87853
This commit is contained in:
Nathan Sidwell 2004-09-22 10:55:21 +00:00 committed by Nathan Sidwell
parent 0e64e323b0
commit 3543e114c6
5 changed files with 75 additions and 114 deletions

View File

@ -1,3 +1,21 @@
2004-09-22 Nathan Sidwell <nathan@codesourcery.com>
* cp-tree.h (struct lang_type_class): Remove marked flags, add
diamond_shaped and repeated_base flags. Reorder to keep 8-bit blocks.
(TYPE_MARKED_P): New.
(CLASSTYPE_DIAMOND_SHAPED_P, CLASSTYPE_REPEATED_BASE_P): New.
(CLASSTYPE_MARKED_N, SET_CLASSTYPE_MARKED_N,
CLEAR_CLASSTYPE_MARKED_N): Remove.
(CLASSTYPE_MARKED_*, SET_CLASSTYPE_MARKED_*,
CLEAR_CLASSTYPE_MARKED_*): Remove.
* decl.c (xref_basetypes): Use TYPE_MARKED_P. Determine diamond
shaped and repeated base properties.
* lex.c (cxx_make_type): Don't clear TYPE_ALIAS_SET.
* rtti.c (dfs_class_hint_mark, dfs_class_hint_unmark,
class_hint_flags): Remove.
(get_pseudo_ti_init): Use CLASSTYPE_REPEATED_BASE_P and
CLASSTYPE_DIAMOND_SHAPED_P.
2004-09-21 Ziemowit Laski <zlaski@apple.com>
* cp-lang.c (LANG_HOOKS_FOLD_OBJ_TYPE_REF): Moved here from

View File

@ -56,7 +56,6 @@ struct diagnostic_context;
ICS_ELLIPSIS_FLAG (in _CONV)
DECL_INITIALIZED_P (in VAR_DECL)
2: IDENTIFIER_OPNAME_P (in IDENTIFIER_NODE)
TYPE_POLYMORPHIC_P (in _TYPE)
ICS_THIS_FLAG (in _CONV)
DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (in VAR_DECL)
STATEMENT_LIST_TRY_BLOCK (in STATEMENT_LIST)
@ -73,6 +72,7 @@ struct diagnostic_context;
DECL_VTABLE_OR_VTT_P (in VAR_DECL)
6: IDENTIFIER_REPO_CHOSEN (in IDENTIFIER_NODE)
DECL_CONSTRUCTION_VTABLE_P (in VAR_DECL)
TYPE_MARKED_P (in _TYPE)
Usage of TYPE_LANG_FLAG_?:
0: TYPE_DEPENDENT_P
@ -1001,22 +1001,23 @@ struct lang_type_class GTY(())
unsigned non_zero_init : 1;
unsigned empty_p : 1;
unsigned marks: 6;
unsigned vec_new_uses_cookie : 1;
unsigned declared_class : 1;
unsigned diamond_shaped : 1;
unsigned repeated_base : 1;
unsigned being_defined : 1;
unsigned redefined : 1;
unsigned debug_requested : 1;
unsigned use_template : 2;
unsigned fields_readonly : 1;
unsigned use_template : 2;
unsigned ptrmemfunc_flag : 1;
unsigned was_anonymous : 1;
unsigned lazy_default_ctor : 1;
unsigned lazy_copy_ctor : 1;
unsigned lazy_assignment_op : 1;
unsigned has_const_init_ref : 1;
unsigned has_complex_init_ref : 1;
unsigned has_complex_assign_ref : 1;
unsigned non_aggregate : 1;
@ -1029,7 +1030,7 @@ struct lang_type_class GTY(())
/* There are some bits left to fill out a 32-bit word. Keep track
of this by updating the size of this bitfield whenever you add or
remove a flag. */
unsigned dummy : 8;
unsigned dummy : 12;
tree primary_base;
VEC (tree_pair_s) *vcall_indices;
@ -1158,6 +1159,19 @@ struct lang_type GTY(())
convenient, don't reprocess any methods that appear in its redefinition. */
#define TYPE_REDEFINED(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->redefined)
/* Mark bits for repeated base checks. */
#define TYPE_MARKED_P(NODE) TREE_LANG_FLAG_6 (TYPE_CHECK (NODE))
/* Non-zero if the class NODE has multiple paths to the same (virtual)
base object. */
#define CLASSTYPE_DIAMOND_SHAPED_P(NODE) \
(LANG_TYPE_CLASS_CHECK(NODE)->diamond_shaped)
/* Non-zero if the class NODE has multiple instances of the same base
type. */
#define CLASSTYPE_REPEATED_BASE_P(NODE) \
(LANG_TYPE_CLASS_CHECK(NODE)->repeated_base)
/* The member function with which the vtable will be emitted:
the first noninline non-pure-virtual member function. NULL_TREE
if there is no key function or if this is a class template */
@ -1203,47 +1217,6 @@ struct lang_type GTY(())
#define CLASSTYPE_DESTRUCTORS(NODE) \
(VEC_index (tree, CLASSTYPE_METHOD_VEC (NODE), CLASSTYPE_DESTRUCTOR_SLOT))
/* Mark bits for depth-first and breath-first searches. */
/* Get the value of the Nth mark bit. */
#define CLASSTYPE_MARKED_N(NODE, N) \
(((CLASS_TYPE_P (NODE) ? LANG_TYPE_CLASS_CHECK (NODE)->marks \
: ((unsigned) TYPE_ALIAS_SET (NODE))) & (1 << (N))) != 0)
/* Set the Nth mark bit. */
#define SET_CLASSTYPE_MARKED_N(NODE, N) \
(CLASS_TYPE_P (NODE) \
? (void) (LANG_TYPE_CLASS_CHECK (NODE)->marks |= (1 << (N))) \
: (void) (TYPE_ALIAS_SET (NODE) |= (1 << (N))))
/* Clear the Nth mark bit. */
#define CLEAR_CLASSTYPE_MARKED_N(NODE, N) \
(CLASS_TYPE_P (NODE) \
? (void) (LANG_TYPE_CLASS_CHECK (NODE)->marks &= ~(1 << (N))) \
: (void) (TYPE_ALIAS_SET (NODE) &= ~(1 << (N))))
/* Get the value of the mark bits. */
#define CLASSTYPE_MARKED(NODE) CLASSTYPE_MARKED_N (NODE, 0)
#define CLASSTYPE_MARKED2(NODE) CLASSTYPE_MARKED_N (NODE, 1)
#define CLASSTYPE_MARKED3(NODE) CLASSTYPE_MARKED_N (NODE, 2)
#define CLASSTYPE_MARKED4(NODE) CLASSTYPE_MARKED_N (NODE, 3)
#define CLASSTYPE_MARKED5(NODE) CLASSTYPE_MARKED_N (NODE, 4)
#define CLASSTYPE_MARKED6(NODE) CLASSTYPE_MARKED_N (NODE, 5)
/* Macros to modify the above flags */
#define SET_CLASSTYPE_MARKED(NODE) SET_CLASSTYPE_MARKED_N (NODE, 0)
#define CLEAR_CLASSTYPE_MARKED(NODE) CLEAR_CLASSTYPE_MARKED_N (NODE, 0)
#define SET_CLASSTYPE_MARKED2(NODE) SET_CLASSTYPE_MARKED_N (NODE, 1)
#define CLEAR_CLASSTYPE_MARKED2(NODE) CLEAR_CLASSTYPE_MARKED_N (NODE, 1)
#define SET_CLASSTYPE_MARKED3(NODE) SET_CLASSTYPE_MARKED_N (NODE, 2)
#define CLEAR_CLASSTYPE_MARKED3(NODE) CLEAR_CLASSTYPE_MARKED_N (NODE, 2)
#define SET_CLASSTYPE_MARKED4(NODE) SET_CLASSTYPE_MARKED_N (NODE, 3)
#define CLEAR_CLASSTYPE_MARKED4(NODE) CLEAR_CLASSTYPE_MARKED_N (NODE, 3)
#define SET_CLASSTYPE_MARKED5(NODE) SET_CLASSTYPE_MARKED_N (NODE, 4)
#define CLEAR_CLASSTYPE_MARKED5(NODE) CLEAR_CLASSTYPE_MARKED_N (NODE, 4)
#define SET_CLASSTYPE_MARKED6(NODE) SET_CLASSTYPE_MARKED_N (NODE, 5)
#define CLEAR_CLASSTYPE_MARKED6(NODE) CLEAR_CLASSTYPE_MARKED_N (NODE, 5)
/* A dictionary of the nested user-defined-types (class-types, or enums)
found within this class. This table includes nested member class
templates. */

View File

@ -9228,7 +9228,7 @@ xref_basetypes (tree ref, tree base_list)
}
}
SET_CLASSTYPE_MARKED (ref);
TYPE_MARKED_P (ref) = 1;
/* The binfo slot should be empty, unless this is an (ill-formed)
redefinition. */
@ -9286,7 +9286,7 @@ xref_basetypes (tree ref, tree base_list)
continue;
}
if (CLASSTYPE_MARKED (basetype))
if (TYPE_MARKED_P (basetype))
{
if (basetype == ref)
error ("recursive type `%T' undefined", basetype);
@ -9294,7 +9294,7 @@ xref_basetypes (tree ref, tree base_list)
error ("duplicate base type `%T' invalid", basetype);
continue;
}
SET_CLASSTYPE_MARKED (basetype);
TYPE_MARKED_P (basetype) = 1;
if (TYPE_FOR_JAVA (basetype) && (current_lang_depth () == 0))
TYPE_FOR_JAVA (ref) = 1;
@ -9313,6 +9313,10 @@ xref_basetypes (tree ref, tree base_list)
|= TYPE_HAS_ARRAY_NEW_OPERATOR (basetype);
TYPE_GETS_DELETE (ref) |= TYPE_GETS_DELETE (basetype);
TYPE_HAS_CONVERSION (ref) |= TYPE_HAS_CONVERSION (basetype);
CLASSTYPE_DIAMOND_SHAPED_P (ref)
|= CLASSTYPE_DIAMOND_SHAPED_P (basetype);
CLASSTYPE_REPEATED_BASE_P (ref)
|= CLASSTYPE_REPEATED_BASE_P (basetype);
}
base_binfo = copy_binfo (base_binfo, basetype, ref,
@ -9324,10 +9328,36 @@ xref_basetypes (tree ref, tree base_list)
BINFO_BASE_ACCESS_APPEND (binfo, access);
}
if (VEC_space (tree, CLASSTYPE_VBASECLASSES (ref), 1))
/* If we have space in the vbase vector, we must have shared at
least one of them, and are therefore diamond shaped. */
CLASSTYPE_DIAMOND_SHAPED_P (ref) = 1;
/* Unmark all the types. */
for (i = 0; BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
CLEAR_CLASSTYPE_MARKED (BINFO_TYPE (base_binfo));
CLEAR_CLASSTYPE_MARKED (ref);
TYPE_MARKED_P (BINFO_TYPE (base_binfo)) = 0;
TYPE_MARKED_P (ref) = 0;
/* Now see if we have a repeated base type. */
if (!CLASSTYPE_REPEATED_BASE_P (ref))
{
for (base_binfo = binfo; base_binfo;
base_binfo = TREE_CHAIN (base_binfo))
{
if (TYPE_MARKED_P (BINFO_TYPE (base_binfo)))
{
CLASSTYPE_REPEATED_BASE_P (ref) = 1;
break;
}
TYPE_MARKED_P (BINFO_TYPE (base_binfo)) = 1;
}
for (base_binfo = binfo; base_binfo;
base_binfo = TREE_CHAIN (base_binfo))
if (TYPE_MARKED_P (BINFO_TYPE (base_binfo)))
TYPE_MARKED_P (BINFO_TYPE (base_binfo)) = 0;
else
break;
}
}

View File

@ -782,11 +782,6 @@ cxx_make_type (enum tree_code code)
SET_CLASSTYPE_INTERFACE_UNKNOWN_X (t, finfo->interface_unknown);
CLASSTYPE_INTERFACE_ONLY (t) = finfo->interface_only;
}
else
/* We use TYPE_ALIAS_SET for the CLASSTYPE_MARKED bits. But,
TYPE_ALIAS_SET is initialized to -1 by default, so we must
clear it here. */
TYPE_ALIAS_SET (t) = 0;
return t;
}

View File

@ -89,9 +89,6 @@ static int qualifier_flags (tree);
static bool target_incomplete_p (tree);
static tree tinfo_base_init (tree, tree);
static tree generic_initializer (tree, tree);
static tree dfs_class_hint_mark (tree, void *);
static tree dfs_class_hint_unmark (tree, void *);
static int class_hint_flags (tree);
static tree class_initializer (tree, tree, tree);
static tree create_pseudo_type_info (const char *, int, ...);
static tree get_pseudo_ti_init (tree, tree);
@ -924,59 +921,6 @@ ptm_initializer (tree desc, tree target)
return init;
}
/* Check base BINFO to set hint flags in *DATA, which is really an int.
We use CLASSTYPE_MARKED to tag types we've found as non-virtual bases and
CLASSTYPE_MARKED2 to tag those which are virtual bases. Remember it is
possible for a type to be both a virtual and non-virtual base. */
static tree
dfs_class_hint_mark (tree binfo, void *data)
{
tree basetype = BINFO_TYPE (binfo);
int *hint = (int *) data;
if (BINFO_VIRTUAL_P (binfo))
{
if (CLASSTYPE_MARKED (basetype))
*hint |= 1;
if (CLASSTYPE_MARKED2 (basetype))
*hint |= 2;
SET_CLASSTYPE_MARKED2 (basetype);
}
else
{
if (CLASSTYPE_MARKED (basetype) || CLASSTYPE_MARKED2 (basetype))
*hint |= 1;
SET_CLASSTYPE_MARKED (basetype);
}
return NULL_TREE;
}
/* Clear the base's dfs marks, after searching for duplicate bases. */
static tree
dfs_class_hint_unmark (tree binfo, void *data ATTRIBUTE_UNUSED)
{
tree basetype = BINFO_TYPE (binfo);
CLEAR_CLASSTYPE_MARKED (basetype);
CLEAR_CLASSTYPE_MARKED2 (basetype);
return NULL_TREE;
}
/* Determine the hint flags describing the features of a class's hierarchy. */
static int
class_hint_flags (tree type)
{
int hint_flags = 0;
dfs_walk (TYPE_BINFO (type), dfs_class_hint_mark, NULL, &hint_flags);
dfs_walk (TYPE_BINFO (type), dfs_class_hint_unmark, NULL, NULL);
return hint_flags;
}
/* Return the CONSTRUCTOR expr for a type_info of class TYPE.
DESC provides information about the particular __class_type_info derivation,
which adds hint flags and TRAIL initializers to the type_info base. */
@ -1058,7 +1002,8 @@ get_pseudo_ti_init (tree type, tree var_desc)
}
else
{
int hint = class_hint_flags (type);
int hint = ((CLASSTYPE_REPEATED_BASE_P (type) << 0)
| (CLASSTYPE_DIAMOND_SHAPED_P (type) << 1));
tree binfo = TYPE_BINFO (type);
int nbases = BINFO_N_BASE_BINFOS (binfo);
VEC (tree) *base_accesses = BINFO_BASE_ACCESSES (binfo);