The following avoids recursing for popping SCCs.

LTO bootstrapped and tested on x86_64-unknown-linux-gnu, applied.

Richard.

2014-08-06  Richard Biener  <rguent...@suse.de>

        PR lto/62034
        * lto-streamer-in.c (lto_input_tree_1): Assert we do not read
        SCCs here.
        (lto_input_tree): Pop SCCs here.

Index: gcc/lto-streamer-in.c
===================================================================
--- gcc/lto-streamer-in.c       (revision 213660)
+++ gcc/lto-streamer-in.c       (working copy)
@@ -1324,15 +1324,7 @@ lto_input_tree_1 (struct lto_input_block
       streamer_tree_cache_append (data_in->reader_cache, result, hash);
     }
   else if (tag == LTO_tree_scc)
-    {
-      unsigned len, entry_len;
-
-      /* Input and skip the SCC.  */
-      lto_input_scc (ib, data_in, &len, &entry_len);
-
-      /* Recurse.  */
-      return lto_input_tree (ib, data_in);
-    }
+    gcc_unreachable ();
   else
     {
       /* Otherwise, materialize a new node from IB.  */
@@ -1345,7 +1337,15 @@ lto_input_tree_1 (struct lto_input_block
 tree
 lto_input_tree (struct lto_input_block *ib, struct data_in *data_in)
 {
-  return lto_input_tree_1 (ib, data_in, streamer_read_record_start (ib), 0);
+  enum LTO_tags tag;
+
+  /* Input and skip SCCs.  */
+  while ((tag = streamer_read_record_start (ib)) == LTO_tree_scc)
+    {
+      unsigned len, entry_len;
+      lto_input_scc (ib, data_in, &len, &entry_len);
+    }
+  return lto_input_tree_1 (ib, data_in, tag, 0);
 }
 
 

Reply via email to