diff options
author | Jason Merrill <jason@yorick.cygnus.com> | 1997-11-21 20:20:41 +0000 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 1997-11-21 15:20:41 -0500 |
commit | 1418bb67a30a99421a337cbaba61fbef05671aad (patch) | |
tree | e0b28242320986cc0a3463296fcca0e4271b4a52 /gcc | |
parent | e9295d5321e849975db7c792862b6315d8d1a74a (diff) | |
download | gcc-1418bb67a30a99421a337cbaba61fbef05671aad.zip gcc-1418bb67a30a99421a337cbaba61fbef05671aad.tar.gz gcc-1418bb67a30a99421a337cbaba61fbef05671aad.tar.bz2 |
except.h: Add outer_context_label_stack.
* 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.
From-SVN: r16645
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/except.c | 15 | ||||
-rw-r--r-- | gcc/except.h | 5 |
3 files changed, 24 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index af4de0a..a1369c8 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 a74578e..05d66db 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 5a65100..ac46fa4 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; |