aboutsummaryrefslogtreecommitdiff
path: root/gcc/except.c
diff options
context:
space:
mode:
authorAndrew MacLeod <amacleod@cygnus.com>1998-11-05 05:34:01 +0000
committerAndrew Macleod <amacleod@gcc.gnu.org>1998-11-05 05:34:01 +0000
commitb37f006bf09e6f219c27810c2910ec8a95fa7043 (patch)
tree7f5a66e9719a548fa337cf27d1b6e87b9494cd7b /gcc/except.c
parent6c61c2bba11355ba204a14ea196235d5eeeb1e1e (diff)
downloadgcc-b37f006bf09e6f219c27810c2910ec8a95fa7043.zip
gcc-b37f006bf09e6f219c27810c2910ec8a95fa7043.tar.gz
gcc-b37f006bf09e6f219c27810c2910ec8a95fa7043.tar.bz2
except.c (expand_fixup_region_end): Make sure outer context labels are not issued in an inner context during cleanups.
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. From-SVN: r23538
Diffstat (limited to 'gcc/except.c')
-rw-r--r--gcc/except.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/gcc/except.c b/gcc/except.c
index d07d6bf..6fa37f0 100644
--- a/gcc/except.c
+++ b/gcc/except.c
@@ -1476,6 +1476,7 @@ expand_fixup_region_end (cleanup)
tree cleanup;
{
struct eh_node *node;
+ int dont_issue;
if (! doing_eh (0) || exceptions_via_longjmp)
return;
@@ -1488,10 +1489,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