diff options
author | Andrew MacLeod <amacleod@cygnus.com> | 1998-11-05 05:34:01 +0000 |
---|---|---|
committer | Andrew Macleod <amacleod@gcc.gnu.org> | 1998-11-05 05:34:01 +0000 |
commit | b37f006bf09e6f219c27810c2910ec8a95fa7043 (patch) | |
tree | 7f5a66e9719a548fa337cf27d1b6e87b9494cd7b /gcc/except.c | |
parent | 6c61c2bba11355ba204a14ea196235d5eeeb1e1e (diff) | |
download | gcc-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.c | 22 |
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 |