]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
except.c (expand_fixup_region_end): Make sure outer context labels are not issued...
authorAndrew MacLeod <amacleod@cygnus.com>
Sun, 8 Nov 1998 10:44:50 +0000 (10:44 +0000)
committerJason Merrill <jason@gcc.gnu.org>
Sun, 8 Nov 1998 10:44:50 +0000 (05:44 -0500)
* except.c (expand_fixup_region_end): Make sure outer context labels
are not issued in an inner context during cleanups.

From-SVN: r23568

gcc/ChangeLog
gcc/except.c

index 57c38370383726cc823dd13618b90c30bb5ca29a..c67c4c6c7a5bff8539df1aade94609dfcf691af9 100644 (file)
@@ -1,3 +1,8 @@
+Thu Nov  5 07:57:45 EST 1998  Andrew MacLeod  <amacleod@cygnus.com>
+
+       * except.c (expand_fixup_region_end): Make sure outer context labels
+       are not issued in an inner context during cleanups.
+
 Sun Nov  1 11:04:32 1998  Jeffrey A Law  (law@cygnus.com)
 
        * i386/linux.h (CPP_PREDEFINES): Bring back -Di386 for the last time.
index 3ed0c915eb629b70d877bbab9f47ab1346400adb..ccd5a6b629a1622bd321b659fc7bf50236af734b 100644 (file)
@@ -1462,6 +1462,7 @@ expand_fixup_region_end (cleanup)
      tree cleanup;
 {
   struct eh_node *node;
+  int dont_issue;
 
   if (! doing_eh (0) || exceptions_via_longjmp)
     return;
@@ -1474,10 +1475,31 @@ expand_fixup_region_end (cleanup)
   if (node == 0)
     abort ();
 
+  /* If the outer context label has not been issued yet, we don't want
+     to issue it as a part of this region, unless this is the
+     correct region for the outer context. If we did, then the label for
+     the outer context will be WITHIN the begin/end labels, 
+     and we could get an infinte loop when it tried to rethrow, or just
+     generally incorrect execution following a throw. */
+
+  dont_issue = ((INSN_UID (node->entry->outer_context) == 0) 
+            && (ehstack.top->entry != node->entry));
+
   ehstack.top->entry->outer_context = node->entry->outer_context;
 
+  /* Since we are rethrowing to the OUTER region, we know we don't need
+     a jump around sequence for this region, so we'll pretend the outer 
+     context label has been issued by setting INSN_UID to 1, then clearing
+     it again afterwards. */
+
+  if (dont_issue)
+    INSN_UID (node->entry->outer_context) = 1;
+
   /* Just rethrow.  size_zero_node is just a NOP.  */
   expand_eh_region_end (size_zero_node);
+
+  if (dont_issue)
+    INSN_UID (node->entry->outer_context) = 0;
 }
 
 /* If we are using the setjmp/longjmp EH codegen method, we emit a