From 9abeb1031adb5d55b6c95485669331eb6594db22 Mon Sep 17 00:00:00 2001 From: Andrew MacLeod Date: Sun, 8 Nov 1998 10:44:50 +0000 Subject: [PATCH] except.c (expand_fixup_region_end): Make sure outer context labels are not issued in an inner context during cleanups. * 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 | 5 +++++ gcc/except.c | 22 ++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 57c383703837..c67c4c6c7a5b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +Thu Nov 5 07:57:45 EST 1998 Andrew MacLeod + + * 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. diff --git a/gcc/except.c b/gcc/except.c index 3ed0c915eb62..ccd5a6b629a1 100644 --- a/gcc/except.c +++ b/gcc/except.c @@ -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 -- 2.47.2