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

Reply via email to