lto-streamer-out.c (collect_block_tree_leafs): New helper.
authorRichard Biener <rguenther@suse.de>
Tue, 11 Oct 2016 07:38:08 +0000 (07:38 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 11 Oct 2016 07:38:08 +0000 (07:38 +0000)
2016-10-11  Richard Biener  <rguenther@suse.de>

* lto-streamer-out.c (collect_block_tree_leafs): New helper.
(output_function): Properly stream the whole block tree.
* lto-streamer-in.c (input_function): Likewise.

From-SVN: r240964

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

index f2f1a15675f927552b498991da5d2d719d538093..61d94b801bfb7dd1dc41f90d972cebf5a591f6a5 100644 (file)
@@ -1,3 +1,9 @@
+2016-10-11  Richard Biener  <rguenther@suse.de>
+
+       * lto-streamer-out.c (collect_block_tree_leafs): New helper.
+       (output_function): Properly stream the whole block tree.
+       * lto-streamer-in.c (input_function): Likewise.
+
 2016-10-11  Marek Polacek  <polacek@redhat.com>
 
        * Makefile.in (C_COMMON_OBJS): Add c-family/c-warn.o.
index 5075b5672724276549dd1a0e9f0afdfc13b90ba7..f852bf942078b3de3b02e1210b07afce3f706383 100644 (file)
@@ -1036,6 +1036,9 @@ input_function (tree fn_decl, struct data_in *data_in,
 
   /* Read the tree of lexical scopes for the function.  */
   DECL_INITIAL (fn_decl) = stream_read_tree (ib, data_in);
+  unsigned block_leaf_count = streamer_read_uhwi (ib);
+  while (block_leaf_count--)
+    stream_read_tree (ib, data_in);
 
   if (!streamer_read_uhwi (ib))
     return;
index 2bb0c5042775d107ec9969d5059c39eef72d39c0..22c4140cca8a2eecb66e21662654148bd20778b7 100644 (file)
@@ -2016,6 +2016,18 @@ output_struct_function_base (struct output_block *ob, struct function *fn)
 }
 
 
+/* Collect all leaf BLOCKs beyond ROOT into LEAFS.  */
+
+static void
+collect_block_tree_leafs (tree root, vec<tree> &leafs)
+{
+  for (root = BLOCK_SUBBLOCKS (root); root; root = BLOCK_CHAIN (root))
+    if (! BLOCK_SUBBLOCKS (root))
+      leafs.safe_push (root);
+    else
+      collect_block_tree_leafs (BLOCK_SUBBLOCKS (root), leafs);
+}
+
 /* Output the body of function NODE->DECL.  */
 
 static void
@@ -2048,10 +2060,16 @@ output_function (struct cgraph_node *node)
   streamer_write_chain (ob, DECL_ARGUMENTS (function), true);
 
   /* Output DECL_INITIAL for the function, which contains the tree of
-     lexical scopes.
-     ???  This only streams the outermost block because we do not
-     recurse into BLOCK_SUBBLOCKS but re-build those on stream-in.  */
+     lexical scopes.  */
   stream_write_tree (ob, DECL_INITIAL (function), true);
+  /* As we do not recurse into BLOCK_SUBBLOCKS but only BLOCK_SUPERCONTEXT
+     collect block tree leafs and stream those.  */
+  auto_vec<tree> block_tree_leafs;
+  if (DECL_INITIAL (function))
+    collect_block_tree_leafs (DECL_INITIAL (function), block_tree_leafs);
+  streamer_write_uhwi (ob, block_tree_leafs.length ());
+  for (unsigned i = 0; i < block_tree_leafs.length (); ++i)
+    stream_write_tree (ob, block_tree_leafs[i], true);
 
   /* We also stream abstract functions where we stream only stuff needed for
      debug info.  */