On Tue, 4 Feb 2014, Dominique Dhumieres wrote: > With the petches (an a minor fix in gcc/lto/lto.c) the remaining failures > are > > FAIL: gfortran.dg/debug/pr35154-dwarf2.f -gdwarf-2 scan-assembler > (DW_AT_name: "label"|"label[^\n]*"[^\n]*DW_AT_name) > FAIL: gfortran.dg/debug/pr35154-dwarf2.f -gdwarf-2 -g3 scan-assembler > (DW_AT_name: "label"|"label[^\n]*"[^\n]*DW_AT_name) > FAIL: gfortran.dg/bind_c_array_params_2.f90 -O scan-assembler-times > myBindC 1 > FAIL: gfortran.dg/bind_c_vars.f90 -O0 (test for excess errors) > FAIL: gfortran.dg/bind_c_vars.f90 -O1 (test for excess errors) > FAIL: gfortran.dg/bind_c_vars.f90 -O2 (test for excess errors) > FAIL: gfortran.dg/bind_c_vars.f90 -O3 -fomit-frame-pointer (test for excess > errors) > FAIL: gfortran.dg/bind_c_vars.f90 -O3 -fomit-frame-pointer -funroll-loops > (test for excess errors) > FAIL: gfortran.dg/bind_c_vars.f90 -O3 -fomit-frame-pointer > -funroll-all-loops -finline-functions (test for excess errors) > FAIL: gfortran.dg/bind_c_vars.f90 -O3 -g (test for excess errors) > FAIL: gfortran.dg/bind_c_vars.f90 -Os (test for excess errors) > FAIL: gfortran.dg/namelist_14.f90 -O3 -g (internal compiler error) > FAIL: gfortran.dg/namelist_14.f90 -O3 -g (test for excess errors) > FAIL: gfortran.dg/namelist_51.f90 -O3 -g (test for excess errors) > FAIL: gfortran.dg/namelist_69.f90 -O3 -g (internal compiler error) > FAIL: gfortran.dg/namelist_69.f90 -O3 -g (test for excess errors) > FAIL: gfortran.dg/namelist_70.f90 -O3 -g (internal compiler error) > FAIL: gfortran.dg/namelist_70.f90 -O3 -g (test for excess errors) > FAIL: gfortran.dg/pr48636-2.f90 -O scan-ipa-dump cp "Creating a > specialized node of bar/[0-9]*\\." > FAIL: gfortran.dg/pr52835.f90 -O scan-tree-dump optimized "bar " > FAIL: gfortran.dg/pr53787.f90 -O scan-ipa-dump cp "Creating a specialized > node of init" > FAIL: gfortran.dg/pr53787.f90 -O scan-ipa-dump-times cp "Aggregate > replacements" 2 > > The ICEs are > > /opt/gcc/work/gcc/testsuite/gfortran.dg/namelist_14.f90:96:0: internal > compiler error: in force_decl_die, at dwarf2out.c:20211 > > The excess error for gfortran.dg/namelist_51.f90 is > > warning: invalid DWARF generated by the compiler: DIE 0x000001f0 has multiple > AT_calling_convention attributes in > '/var/folders/8q/sh_swgz96r7f5vnn08f7fxr00000gn/T//ccub2YMQ.ltrans0.ltrans.o'. > > Note that if the test is compiled with -g only, I get an ICE > > lto1: internal compiler error: in add_AT_specification, at dwarf2out.c:4096 > > I have looked to the scan errors for bind_c_array_params_2.f90: > > myBindC appears twice > > call _myBindC > .ascii > "_main\0\0\0\0\0\0\0\0\0\0\0\0\274\0\0\0_myBindC\0\0\2\0\0\0\0\0\0\0\0\0\356\0\0\0__gfortran_set_options > ... > > and for pr48636-2.f90 where "Creating a specialized node of bar" > is replaced with "Creating a specialized node of __foo_MOD_bar". > > Such failures are quite easy to fix, but I wonder if they worth the effort.
The dwarf2out.c ICEs are fixed with the tree_is_indexable hunk. Bootstrapped and tested on x86_64-unknown-linux-gnu, SPEC 2k6 -flto -g built and gfortran.dg tested with -flto, applied to trunk. Richard. 2014-02-04 Richard Biener <rguent...@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. 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 (); } Index: gcc/lto-streamer-out.c =================================================================== *** gcc/lto-streamer-out.c (revision 207455) --- gcc/lto-streamer-out.c (working copy) *************** tree_is_indexable (tree t) *** 139,145 **** 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) && decl_function_context (t)) return false; else if (TREE_CODE (t) == DEBUG_EXPR_DECL) --- 139,146 ---- 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) == NAMELIST_DECL) && decl_function_context (t)) return false; else if (TREE_CODE (t) == DEBUG_EXPR_DECL) *************** 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); --- 256,264 ---- 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: *************** 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) + { + unsigned i; + tree val; + FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (t), i, val) + LTO_SET_PREVAIL (val); + } else { switch (code)