Fix segfault in gcov.c (PR gcov-profile/81561).
authorMartin Liska <mliska@suse.cz>
Tue, 1 Aug 2017 14:06:13 +0000 (16:06 +0200)
committerMartin Liska <marxin@gcc.gnu.org>
Tue, 1 Aug 2017 14:06:13 +0000 (14:06 +0000)
2017-08-01  Martin Liska  <mliska@suse.cz>

PR gcov-profile/81561
* gcov.c (unblock): Make unblocking safe as we need to preserve
index correspondence of blocks and block_lists.

From-SVN: r250780

gcc/ChangeLog
gcc/gcov.c

index 83f9b49ba2c37cd4d35bcf5f6b68f2e491ff9ca6..09e2831eb2e8f84fe8ee8a0160ff5699d7abaf9c 100644 (file)
@@ -1,3 +1,9 @@
+2017-08-01  Martin Liska  <mliska@suse.cz>
+
+       PR gcov-profile/81561
+       * gcov.c (unblock): Make unblocking safe as we need to preserve
+       index correspondence of blocks and block_lists.
+
 2017-08-01  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/81181
index e324cadad82fe0382b085533024807ddf1238c96..c56bac2027831fe6ee0f575c9bfb2795a6635588 100644 (file)
@@ -539,13 +539,13 @@ unblock (const block_t *u, block_vector_t &blocked,
   unsigned index = it - blocked.begin ();
   blocked.erase (it);
 
-  for (block_vector_t::iterator it2 = block_lists[index].begin ();
-       it2 != block_lists[index].end (); it2++)
-    unblock (*it2, blocked, block_lists);
-  for (unsigned j = 0; j < block_lists[index].size (); j++)
-    unblock (u, blocked, block_lists);
+  block_vector_t to_unblock (block_lists[index]);
 
   block_lists.erase (block_lists.begin () + index);
+
+  for (block_vector_t::iterator it = to_unblock.begin ();
+       it != to_unblock.end (); it++)
+    unblock (*it, blocked, block_lists);
 }
 
 /* Find circuit going to block V, PATH is provisional seen cycle.