summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/except.c15
-rw-r--r--gcc/except.h5
3 files changed, 24 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index af4de0a4047..a1369c8b5dc 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+Fri Nov 21 12:18:51 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * except.h: Add outer_context_label_stack.
+ * except.c: Likewise.
+ (expand_start_all_catch): Push the outer_context for the try block
+ onto outer_context_label_stack.
+ (expand_end_all_catch): Use it and pop it.
+
Fri Nov 21 10:13:11 1997 Robert Lipe (robertl@dgii.com)
* i386/sco5.h (HAVE_ATEXIT): Revert last change.
diff --git a/gcc/except.c b/gcc/except.c
index a74578ea4c7..05d66dbe6d2 100644
--- a/gcc/except.c
+++ b/gcc/except.c
@@ -483,12 +483,15 @@ static tree protect_list;
/* Keeps track of the label to resume to should one want to resume
normal control flow out of a handler (instead of, say, returning to
- the caller of the current function or exiting the program). Also
- used as the context of a throw to rethrow an exception to the outer
- exception region. */
+ the caller of the current function or exiting the program). */
struct label_node *caught_return_label_stack = NULL;
+/* Keeps track of the label used as the context of a throw to rethrow an
+ exception to the outer exception region. */
+
+struct label_node *outer_context_label_stack = NULL;
+
/* A random data area for the front end's own use. */
struct label_node *false_label_stack = NULL;
@@ -1254,6 +1257,9 @@ expand_start_all_catch ()
if (! doing_eh (1))
return;
+ push_label_entry (&outer_context_label_stack,
+ ehstack.top->entry->outer_context, NULL_TREE);
+
/* End the try block. */
expand_eh_region_end (integer_zero_node);
@@ -1372,7 +1378,7 @@ expand_end_all_catch ()
thrown from) so that the outer EH region can then try to process
the exception. */
- expand_internal_throw (DECL_RTL (top_label_entry (&caught_return_label_stack)));
+ expand_internal_throw (outer_context_label_stack->u.rlabel);
}
/* Now we have the complete catch sequence. */
@@ -1382,6 +1388,7 @@ expand_end_all_catch ()
/* This level of catch blocks is done, so set up the successful
catch jump label for the next layer of catch blocks. */
pop_label_entry (&caught_return_label_stack);
+ pop_label_entry (&outer_context_label_stack);
/* Add the new sequence of catches to the main one for this function. */
push_to_sequence (catch_clauses);
diff --git a/gcc/except.h b/gcc/except.h
index 5a65100d4aa..ac46fa4478f 100644
--- a/gcc/except.h
+++ b/gcc/except.h
@@ -227,6 +227,11 @@ extern void check_exception_handler_labels PROTO((void));
extern struct label_node *caught_return_label_stack;
+/* Keeps track of the label used as the context of a throw to rethrow an
+ exception to the outer exception region. */
+
+extern struct label_node *outer_context_label_stack;
+
/* A random area used for purposes elsewhere. */
extern struct label_node *false_label_stack;