re PR debug/77931 (PASS->FAIL: gdb.cp/namespace.exp: print ina)
authorRichard Biener <rguenther@suse.de>
Tue, 11 Oct 2016 12:52:44 +0000 (12:52 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 11 Oct 2016 12:52:44 +0000 (12:52 +0000)
2016-10-11  Richard Biener  <rguenther@suse.de>

PR debug/77931
* gimple-low.c (lower_gimple_bind): Handle arbitrary common
sub-chains of BLOCK_VARS and gimple_bind_vars.

From-SVN: r240991

gcc/ChangeLog
gcc/gimple-low.c

index 1a9cb5a..03c5fa5 100644 (file)
@@ -1,3 +1,9 @@
+2016-10-11  Richard Biener  <rguenther@suse.de>
+
+       PR debug/77931
+       * gimple-low.c (lower_gimple_bind): Handle arbitrary common
+       sub-chains of BLOCK_VARS and gimple_bind_vars.
+
 2016-10-11  Venkataramanan Kumar  <Venkataramanan.kumar@amd.com>
 
        * config/i386/znver1.md : Fix imov/imovx load type reservations.
index 8e98762..64752b6 100644 (file)
@@ -420,18 +420,21 @@ lower_gimple_bind (gimple_stmt_iterator *gsi, struct lower_data *data)
   /* Scrap DECL_CHAIN up to BLOCK_VARS to ease GC after we no longer
      need gimple_bind_vars.  */
   tree next;
-  tree end = NULL_TREE;
+  /* BLOCK_VARS and gimple_bind_vars share a common sub-chain.  Find
+     it by marking all BLOCK_VARS.  */
   if (gimple_bind_block (stmt))
-    end = BLOCK_VARS (gimple_bind_block (stmt));
-  for (tree var = gimple_bind_vars (stmt); var != end; var = next)
+    for (tree t = BLOCK_VARS (gimple_bind_block (stmt)); t; t = DECL_CHAIN (t))
+      TREE_VISITED (t) = 1;
+  for (tree var = gimple_bind_vars (stmt);
+       var && ! TREE_VISITED (var); var = next)
     {
-      /* Ugh, something is violating the constraint that BLOCK_VARS
-         is a sub-chain of gimple_bind_vars.  */
-      if (! var)
-       break;
       next = DECL_CHAIN (var);
       DECL_CHAIN (var) = NULL_TREE;
     }
+  /* Unmark BLOCK_VARS.  */
+  if (gimple_bind_block (stmt))
+    for (tree t = BLOCK_VARS (gimple_bind_block (stmt)); t; t = DECL_CHAIN (t))
+      TREE_VISITED (t) = 0;
 
   lower_sequence (gimple_bind_body_ptr (stmt), data);