On Tue, 4 Feb 2014, Richard Biener wrote: > 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.
That would be additionally Index: gcc/lto/lto.c =================================================================== *** gcc/lto/lto.c (revision 207455) --- gcc/lto/lto.c (working copy) *************** lto_fixup_prevailing_decls (tree t) *** 2597,2603 **** enum tree_code code = TREE_CODE (t); bool fixed = false; ! gcc_checking_assert (code != CONSTRUCTOR && code != TREE_BINFO); LTO_NO_PREVAIL (TREE_TYPE (t)); if (CODE_CONTAINS_STRUCT (code, TS_COMMON)) LTO_NO_PREVAIL (TREE_CHAIN (t)); --- 2598,2604 ---- enum tree_code code = TREE_CODE (t); bool fixed = false; ! 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)); *************** lto_fixup_prevailing_decls (tree t) *** 2659,2664 **** --- 2660,2672 ---- for (i = TREE_OPERAND_LENGTH (t) - 1; i >= 0; --i) LTO_SET_PREVAIL (TREE_OPERAND (t, i)); } + else if (TREE_CODE (t) == CONSTRUCTOR) + { + int i; + tree val; + FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (t), i, val) + LTO_SET_PREVAIL (val); + } else { switch (code) > 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 (); > } > -- Richard Biener <rguent...@suse.de> SUSE / SUSE Labs SUSE LINUX Products GmbH - Nuernberg - AG Nuernberg - HRB 16746 GF: Jeff Hawn, Jennifer Guild, Felix Imend"orffer