]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR lto/59723 (ICE: in lto_output_tree, at lto-streamer-out.c:1390 when compiling...
authorRichard Biener <rguenther@suse.de>
Tue, 4 Feb 2014 14:53:24 +0000 (14:53 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 4 Feb 2014 14:53:24 +0000 (14:53 +0000)
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

gcc/ChangeLog
gcc/lto-streamer-in.c
gcc/lto-streamer-out.c
gcc/lto/ChangeLog
gcc/lto/lto.c

index 98f38c2fb95ba46c8573e533da9cf0af3adbc8ef..99a153bda842c2c35cf45878dc3acbd4c2144637 100644 (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
index df32a6b846adf02e9db34d9ff2de9de8359e4527..68d3cdac41f5ee499bfbc4d54b581f0a34d0b580 100644 (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 ();
     }
index 5d6aed51845ff684de96eeb6a781a8ee3a31f9b6..94d2aa73dddd391fd99f84a8ecbfcc7ac322af9a 100644 (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);
index a0c1be1a008293de42ca938d357d385814fb3899..437e97e99f828fbc25000f64210a95d3c66f3eeb 100644 (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
 
index c15f21283721310ae20de33460d82f2b61aa9b76..a769f25a21488192568cbd997e4efaf287e8c8bb 100644 (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)