mangle.c (conv_type_names): Holds IDENTIFIER_NODEs only.

* mangle.c (conv_type_names): Holds IDENTIFIER_NODEs only.
	(hash_type): Use TYPE_UID of the identifier's type.
	(compare_type): Adjust.
	(mangle_conv_op_name_for_type): Store identifier nodes only, use
	TYPE_UID has hash value.

From-SVN: r74538
This commit is contained in:
Nathan Sidwell 2003-12-11 15:35:37 +00:00
parent c1fb3625ae
commit c1eb7f5ccd
2 changed files with 36 additions and 25 deletions

View file

@ -1,3 +1,11 @@
2003-12-11 Nathan Sidwell <nathan@codesourcery.com>
* mangle.c (conv_type_names): Holds IDENTIFIER_NODEs only.
(hash_type): Use TYPE_UID of the identifier's type.
(compare_type): Adjust.
(mangle_conv_op_name_for_type): Store identifier nodes only, use
TYPE_UID has hash value.
2003-12-10 Mark Mitchell <mark@codesourcery.com>
* cp-tree.h (DECL_CONV_FN_P): Check that DECL_NAME is non-NULL.
@ -7,11 +15,11 @@
PR c/13134
* decl.c (duplicate_decls): Copy visibility flag when appropriate.
2003-12-09 Giovanni Bajo <giovannibajo@gcc.gnu.org>
* init.c (build_new_1): Deal with an OVERLOAD set when
looking up for _Jv_AllocObject.
* except.c (build_throw): Likewise for _Jv_Throw.
2003-12-09 Giovanni Bajo <giovannibajo@gcc.gnu.org>
* init.c (build_new_1): Deal with an OVERLOAD set when
looking up for _Jv_AllocObject.
* except.c (build_throw): Likewise for _Jv_Throw.
2003-12-08 Jason Merrill <jason@redhat.com>

View file

@ -2602,8 +2602,8 @@ mangle_thunk (tree fn_decl, const int this_adjusting, tree fixed_offset,
}
/* This hash table maps TYPEs to the IDENTIFIER for a conversion
operator to TYPE. The nodes are TREE_LISTs whose TREE_PURPOSE is
the TYPE and whose TREE_VALUE is the IDENTIFIER. */
operator to TYPE. The nodes are IDENTIFIERs whose TREE_TYPE is the
TYPE. */
static GTY ((param_is (union tree_node))) htab_t conv_type_names;
@ -2612,7 +2612,7 @@ static GTY ((param_is (union tree_node))) htab_t conv_type_names;
static hashval_t
hash_type (const void *val)
{
return htab_hash_pointer (TREE_PURPOSE ((tree) val));
return (hashval_t) TYPE_UID (TREE_TYPE ((tree) val));
}
/* Compare VAL1 (a node in the table) with VAL2 (a TYPE). */
@ -2620,7 +2620,7 @@ hash_type (const void *val)
static int
compare_type (const void *val1, const void *val2)
{
return TREE_PURPOSE ((tree) val1) == (tree) val2;
return TREE_TYPE ((tree) val1) == (tree) val2;
}
/* Return an identifier for the mangled unqualified name for a
@ -2632,29 +2632,32 @@ mangle_conv_op_name_for_type (const tree type)
{
void **slot;
tree identifier;
char buffer[64];
if (conv_type_names == NULL)
conv_type_names = htab_create_ggc (31, &hash_type, &compare_type, NULL);
slot = htab_find_slot_with_hash (conv_type_names, type,
htab_hash_pointer (type), INSERT);
if (*slot)
return TREE_VALUE ((tree) *slot);
(hashval_t) TYPE_UID (type), INSERT);
identifier = (tree)*slot;
if (!identifier)
{
char buffer[64];
/* Create a unique name corresponding to TYPE. */
sprintf (buffer, "operator %lu",
(unsigned long) htab_elements (conv_type_names));
identifier = get_identifier (buffer);
*slot = identifier;
/* Create a unique name corresponding to TYPE. */
sprintf (buffer, "operator %lu",
(unsigned long) htab_elements (conv_type_names));
identifier = get_identifier (buffer);
*slot = build_tree_list (type, identifier);
/* Hang TYPE off the identifier so it can be found easily later
when performing conversions. */
TREE_TYPE (identifier) = type;
/* Set bits on the identifier so we know later it's a conversion. */
IDENTIFIER_OPNAME_P (identifier) = 1;
IDENTIFIER_TYPENAME_P (identifier) = 1;
}
/* Set bits on the identifier so we know later it's a conversion. */
IDENTIFIER_OPNAME_P (identifier) = 1;
IDENTIFIER_TYPENAME_P (identifier) = 1;
/* Hang TYPE off the identifier so it can be found easily later when
performing conversions. */
TREE_TYPE (identifier) = type;
return identifier;
}