Commit b03eda0d by Richard Guenther Committed by Richard Biener

lto.c (GIMPLE_REGISTER_TYPE): New define.

2011-12-21  Richard Guenther  <rguenther@suse.de>

	lto/
	* lto.c (GIMPLE_REGISTER_TYPE): New define.
	(LTO_FIXUP_TREE): Use it.
	(uniquify_nodes): Mark new non-prevailing types and avoid
	calling gimple_register_type on others.
	(lto_read_decls): Add comment.

From-SVN: r182591
parent d6e1acf6
2011-12-21 Richard Guenther <rguenther@suse.de>
* lto.c (GIMPLE_REGISTER_TYPE): New define.
(LTO_FIXUP_TREE): Use it.
(uniquify_nodes): Mark new non-prevailing types and avoid
calling gimple_register_type on others.
(lto_read_decls): Add comment.
2011-12-13 Eric Botcazou <ebotcazou@adacore.com> 2011-12-13 Eric Botcazou <ebotcazou@adacore.com>
* lto.h (lto_parse_hex): Delete. * lto.h (lto_parse_hex): Delete.
......
...@@ -306,13 +306,16 @@ remember_with_vars (tree t) ...@@ -306,13 +306,16 @@ remember_with_vars (tree t)
*(tree *) htab_find_slot (tree_with_vars, t, INSERT) = t; *(tree *) htab_find_slot (tree_with_vars, t, INSERT) = t;
} }
#define GIMPLE_REGISTER_TYPE(tt) \
(TREE_VISITED (tt) ? gimple_register_type (tt) : tt)
#define LTO_FIXUP_TREE(tt) \ #define LTO_FIXUP_TREE(tt) \
do \ do \
{ \ { \
if (tt) \ if (tt) \
{ \ { \
if (TYPE_P (tt)) \ if (TYPE_P (tt)) \
(tt) = gimple_register_type (tt); \ (tt) = GIMPLE_REGISTER_TYPE (tt); \
if (VAR_OR_FUNCTION_DECL_P (tt) && TREE_PUBLIC (tt)) \ if (VAR_OR_FUNCTION_DECL_P (tt) && TREE_PUBLIC (tt)) \
remember_with_vars (t); \ remember_with_vars (t); \
} \ } \
...@@ -731,7 +734,14 @@ uniquify_nodes (struct data_in *data_in, unsigned from) ...@@ -731,7 +734,14 @@ uniquify_nodes (struct data_in *data_in, unsigned from)
{ {
tree t = VEC_index (tree, cache->nodes, i); tree t = VEC_index (tree, cache->nodes, i);
if (t && TYPE_P (t)) if (t && TYPE_P (t))
gimple_register_type (t); {
tree newt = gimple_register_type (t);
/* Mark non-prevailing types so we fix them up. No need
to reset that flag afterwards - nothing that refers
to those types is left and they are collected. */
if (newt != t)
TREE_VISITED (t) = 1;
}
} }
/* Second fixup all trees in the new cache entries. */ /* Second fixup all trees in the new cache entries. */
...@@ -749,7 +759,7 @@ uniquify_nodes (struct data_in *data_in, unsigned from) ...@@ -749,7 +759,7 @@ uniquify_nodes (struct data_in *data_in, unsigned from)
continue; continue;
/* Now try to find a canonical variant of T itself. */ /* Now try to find a canonical variant of T itself. */
t = gimple_register_type (t); t = GIMPLE_REGISTER_TYPE (t);
if (t == oldt) if (t == oldt)
{ {
...@@ -771,7 +781,7 @@ uniquify_nodes (struct data_in *data_in, unsigned from) ...@@ -771,7 +781,7 @@ uniquify_nodes (struct data_in *data_in, unsigned from)
} }
/* Query our new main variant. */ /* Query our new main variant. */
mv = gimple_register_type (TYPE_MAIN_VARIANT (t)); mv = GIMPLE_REGISTER_TYPE (TYPE_MAIN_VARIANT (t));
/* If we were the variant leader and we get replaced ourselves drop /* If we were the variant leader and we get replaced ourselves drop
all variants from our list. */ all variants from our list. */
...@@ -901,6 +911,9 @@ lto_read_decls (struct lto_file_decl_data *decl_data, const void *data, ...@@ -901,6 +911,9 @@ lto_read_decls (struct lto_file_decl_data *decl_data, const void *data,
data_in = lto_data_in_create (decl_data, (const char *) data + string_offset, data_in = lto_data_in_create (decl_data, (const char *) data + string_offset,
header->string_size, resolutions); header->string_size, resolutions);
/* We do not uniquify the pre-loaded cache entries, those are middle-end
internal types that should not be merged. */
/* Read the global declarations and types. */ /* Read the global declarations and types. */
while (ib_main.p < ib_main.len) while (ib_main.p < ib_main.len)
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment