/* Type based alias analysis.
- Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
Contributed by Kenneth Zadeck <zadeck@naturalbridge.com>
This file is part of GCC.
static tree
discover_unique_type (tree type)
{
- struct type_brand_s * brand = xmalloc(sizeof(struct type_brand_s));
+ struct type_brand_s * brand = XNEW (struct type_brand_s);
int i = 0;
splay_tree_node result;
-
+
+ brand->name = get_name_of_type (type);
+
while (1)
- {
- brand->name = get_name_of_type (type);
- brand->seq = i;
- result = splay_tree_lookup (all_canon_types, (splay_tree_key) brand);
- if (result)
- {
- /* Create an alias since this is just the same as
- other_type. */
- tree other_type = (tree) result->value;
- if (lang_hooks.types_compatible_p (type, other_type) == 1)
- {
- free (brand);
- /* Insert this new type as an alias for other_type. */
- splay_tree_insert (type_to_canon_type,
- (splay_tree_key) type,
- (splay_tree_value) other_type);
- return other_type;
- }
- /* Not compatible, look for next instance with same name. */
- }
- else
- {
- /* No more instances, create new one since this is the first
- time we saw this type. */
- brand->seq = i++;
- /* Insert the new brand. */
- splay_tree_insert (all_canon_types,
- (splay_tree_key) brand,
- (splay_tree_value) type);
-
- /* Insert this new type as an alias for itself. */
- splay_tree_insert (type_to_canon_type,
- (splay_tree_key) type,
- (splay_tree_value) type);
-
- /* Insert the uid for reverse lookup; */
- splay_tree_insert (uid_to_canon_type,
- (splay_tree_key) TYPE_UID (type),
- (splay_tree_value) type);
-
- bitmap_set_bit (global_types_seen, TYPE_UID (type));
- return type;
- }
- i++;
- }
- free (brand);
+ {
+ brand->seq = i++;
+ result = splay_tree_lookup (all_canon_types, (splay_tree_key) brand);
+
+ if (result)
+ {
+ /* Create an alias since this is just the same as
+ other_type. */
+ tree other_type = (tree) result->value;
+ if (lang_hooks.types_compatible_p (type, other_type) == 1)
+ {
+ free (brand);
+ /* Insert this new type as an alias for other_type. */
+ splay_tree_insert (type_to_canon_type,
+ (splay_tree_key) type,
+ (splay_tree_value) other_type);
+ return other_type;
+ }
+ /* Not compatible, look for next instance with same name. */
+ }
+ else
+ {
+ /* No more instances, create new one since this is the first
+ time we saw this type. */
+ brand->seq = i++;
+ /* Insert the new brand. */
+ splay_tree_insert (all_canon_types,
+ (splay_tree_key) brand,
+ (splay_tree_value) type);
+
+ /* Insert this new type as an alias for itself. */
+ splay_tree_insert (type_to_canon_type,
+ (splay_tree_key) type,
+ (splay_tree_value) type);
+
+ /* Insert the uid for reverse lookup; */
+ splay_tree_insert (uid_to_canon_type,
+ (splay_tree_key) TYPE_UID (type),
+ (splay_tree_value) type);
+
+ bitmap_set_bit (global_types_seen, TYPE_UID (type));
+ return type;
+ }
+ }
}
/* Return true if TYPE is one of the type classes that we are willing
switch (TREE_CODE (type))
{
case BOOLEAN_TYPE:
- case CHAR_TYPE:
case COMPLEX_TYPE:
case ENUMERAL_TYPE:
case INTEGER_TYPE:
get_canon_type_uid (type, true, false));
}
-/* Return true a modification to a field of type FIELD_TYPE cannot
+/* Return true if a modification to a field of type FIELD_TYPE cannot
clobber a record of RECORD_TYPE. */
bool
if (vnode->externally_visible)
mark_interesting_type (type, FULL_ESCAPE);
- if (TREE_CODE (global) == VAR_DECL)
- {
- if (DECL_INITIAL (global))
- walk_tree (&DECL_INITIAL (global), scan_for_refs,
- NULL, visited_nodes);
- }
- else abort();
+ gcc_assert (TREE_CODE (global) == VAR_DECL);
+
+ if (DECL_INITIAL (global))
+ walk_tree (&DECL_INITIAL (global), scan_for_refs, NULL, visited_nodes);
}
/* This is the main routine for finding the reference patterns for
result = splay_tree_successor (all_canon_types, (splay_tree_key) key);
}
-/* { */
-/* FILE * tmp = dump_file; */
-/* dump_file = stderr; */
if (dump_file)
{
EXECUTE_IF_SET_IN_BITMAP (global_types_seen, 0, i, bi)
fprintf(dump_file, " contained\n");
}
}
-/* dump_file = tmp; */
-/* } */
/* Get rid of uid_to_addressof_up_map and its bitmaps. */
result = splay_tree_min (uid_to_addressof_up_map);