On Tue, 4 Feb 2014, Dominique Dhumieres wrote: > Richard, > > With your patch at http://gcc.gnu.org/ml/gcc-patches/2014-02/msg00144.html > I get multiple ICEs when testing with > check-gfortran RUNTESTFLAGS="--target_board=unix'{-m32/-flto,-m64/-flto}'" > > They are of the kind > > lto1: internal compiler error: in mentions_vars_p, at lto/lto.c:972 > > Note that the Aldy's patch at > http://gcc.gnu.org/ml/gcc-patches/2014-01/msg01384.html > fixed all the ICE in the same tests.
Yep, I'm collecting more fixes - see below for what I have. Aldy's fix is simply wrong (as is the namelist-decl-ref handling in the LTO code). With the patch below we can still hit an ICE in lto_fixup_prevailing_decls as we seem to arrive with a CONSTRUCTOR here. I'm waiting for Micha to show up to tell me if that's simply because CONSTRUCTOR isn't handled in the code (yet) or if there is a deeper reason. Richard. 2014-02-04 Richard Biener <rguent...@suse.de> PR lto/59723 * lto-streamer-out.c (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. Index: gcc/lto-streamer-out.c =================================================================== *** gcc/lto-streamer-out.c (revision 207455) --- gcc/lto-streamer-out.c (working copy) *************** lto_output_tree_ref (struct output_block *** 255,273 **** 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; ! } case NAMESPACE_DECL: streamer_write_record_start (ob, LTO_namespace_decl_ref); --- 261,269 ---- break; case NAMELIST_DECL: ! 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); Index: gcc/lto/lto.c =================================================================== *** gcc/lto/lto.c (revision 207455) --- gcc/lto/lto.c (working copy) *************** mentions_vars_p (tree t) *** 926,931 **** --- 926,932 ---- case RESULT_DECL: case IMPORTED_DECL: case NAMESPACE_DECL: + case NAMELIST_DECL: return mentions_vars_p_decl_common (t); case VAR_DECL: Index: gcc/lto-streamer-in.c =================================================================== *** gcc/lto-streamer-in.c (revision 207455) --- gcc/lto-streamer-in.c (working copy) *************** lto_input_tree_ref (struct lto_input_blo *** 244,275 **** case LTO_imported_decl_ref: case LTO_label_decl_ref: case LTO_translation_unit_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 (); } --- 244,254 ---- 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; default: gcc_unreachable (); }