re PR lto/59723 (ICE: in lto_output_tree, at lto-streamer-out.c:1390 when compiling some Fortran tests with -flto)

2014-02-04  Richard Biener  <rguenther@suse.de>

	PR lto/59723
	* lto-streamer-out.c (tree_is_indexable): Force NAMELIST_DECLs
	in function context local.
	(lto_output_tree_ref): Do not write trees from lto_output_tree_ref.
	* lto-streamer-in.c (lto_input_tree_ref): Handle LTO_namelist_decl_ref
	similar to LTO_imported_decl_ref.

	lto/
	* lto.c (mentions_vars_p): Handle NAMELIST_DECL.
	(lto_fixup_prevailing_decls): Handle fixing up CONSTRUCTOR values.

From-SVN: r207471
This commit is contained in:
Richard Biener 2014-02-04 14:53:24 +00:00 committed by Richard Biener
parent 3e247e586c
commit c39276b8d6
5 changed files with 30 additions and 37 deletions

View File

@ -1,3 +1,12 @@
2014-02-04 Richard Biener <rguenther@suse.de>
PR lto/59723
* lto-streamer-out.c (tree_is_indexable): Force NAMELIST_DECLs
in function context local.
(lto_output_tree_ref): Do not write trees from lto_output_tree_ref.
* lto-streamer-in.c (lto_input_tree_ref): Handle LTO_namelist_decl_ref
similar to LTO_imported_decl_ref.
2014-02-04 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/60002

View File

@ -244,32 +244,11 @@ lto_input_tree_ref (struct lto_input_block *ib, struct data_in *data_in,
case LTO_imported_decl_ref:
case LTO_label_decl_ref:
case LTO_translation_unit_decl_ref:
case LTO_namelist_decl_ref:
ix_u = streamer_read_uhwi (ib);
result = lto_file_decl_data_get_var_decl (data_in->file_data, ix_u);
break;
case LTO_namelist_decl_ref:
{
tree tmp;
vec<constructor_elt, va_gc> *nml_decls = NULL;
unsigned i, n;
result = make_node (NAMELIST_DECL);
TREE_TYPE (result) = void_type_node;
DECL_NAME (result) = stream_read_tree (ib, data_in);
n = streamer_read_uhwi (ib);
for (i = 0; i < n; i++)
{
ix_u = streamer_read_uhwi (ib);
tmp = lto_file_decl_data_get_var_decl (data_in->file_data, ix_u);
gcc_assert (tmp != NULL_TREE);
CONSTRUCTOR_APPEND_ELT (nml_decls, NULL_TREE, tmp);
}
NAMELIST_DECL_ASSOCIATED_DECL (result) = build_constructor (NULL_TREE,
nml_decls);
break;
}
default:
gcc_unreachable ();
}

View File

@ -139,7 +139,8 @@ tree_is_indexable (tree t)
return variably_modified_type_p (TREE_TYPE (DECL_CONTEXT (t)), NULL_TREE);
else if (((TREE_CODE (t) == VAR_DECL && !TREE_STATIC (t))
|| TREE_CODE (t) == TYPE_DECL
|| TREE_CODE (t) == CONST_DECL)
|| TREE_CODE (t) == CONST_DECL
|| TREE_CODE (t) == NAMELIST_DECL)
&& decl_function_context (t))
return false;
else if (TREE_CODE (t) == DEBUG_EXPR_DECL)
@ -255,19 +256,9 @@ lto_output_tree_ref (struct output_block *ob, tree expr)
break;
case NAMELIST_DECL:
{
unsigned i;
tree value, tmp;
streamer_write_record_start (ob, LTO_namelist_decl_ref);
stream_write_tree (ob, DECL_NAME (expr), true);
tmp = NAMELIST_DECL_ASSOCIATED_DECL (expr);
gcc_assert (tmp != NULL_TREE);
streamer_write_uhwi (ob, CONSTRUCTOR_ELTS (tmp)->length());
FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (tmp), i, value)
lto_output_var_decl_index (ob->decl_state, ob->main_stream, value);
break;
}
streamer_write_record_start (ob, LTO_namelist_decl_ref);
lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
break;
case NAMESPACE_DECL:
streamer_write_record_start (ob, LTO_namespace_decl_ref);

View File

@ -1,3 +1,9 @@
2014-02-04 Richard Biener <rguenther@suse.de>
PR lto/59723
* lto.c (mentions_vars_p): Handle NAMELIST_DECL.
(lto_fixup_prevailing_decls): Handle fixing up CONSTRUCTOR values.
2014-02-04 Jan Hubicka <hubicka@ucw.cz>
Markus Trippelsdorf

View File

@ -926,6 +926,7 @@ mentions_vars_p (tree t)
case RESULT_DECL:
case IMPORTED_DECL:
case NAMESPACE_DECL:
case NAMELIST_DECL:
return mentions_vars_p_decl_common (t);
case VAR_DECL:
@ -2597,7 +2598,7 @@ lto_fixup_prevailing_decls (tree t)
enum tree_code code = TREE_CODE (t);
bool fixed = false;
gcc_checking_assert (code != CONSTRUCTOR && code != TREE_BINFO);
gcc_checking_assert (code != TREE_BINFO);
LTO_NO_PREVAIL (TREE_TYPE (t));
if (CODE_CONTAINS_STRUCT (code, TS_COMMON))
LTO_NO_PREVAIL (TREE_CHAIN (t));
@ -2659,6 +2660,13 @@ lto_fixup_prevailing_decls (tree t)
for (i = TREE_OPERAND_LENGTH (t) - 1; i >= 0; --i)
LTO_SET_PREVAIL (TREE_OPERAND (t, i));
}
else if (TREE_CODE (t) == CONSTRUCTOR)
{
unsigned i;
tree val;
FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (t), i, val)
LTO_SET_PREVAIL (val);
}
else
{
switch (code)