diff options
author | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-05-27 22:50:41 +0000 |
---|---|---|
committer | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-05-27 22:50:41 +0000 |
commit | e4bbf4c11869851e0e70d761bbca79fa79a69366 (patch) | |
tree | 9b52f4570bb28084ba650786b833a780a6ea3ad1 /gcc/except.c | |
parent | 0c304c96a918159ce8b5f2f07c98a8815d9e4643 (diff) | |
download | gcc-e4bbf4c11869851e0e70d761bbca79fa79a69366.tar.gz |
* except.c (can_throw_internal_1, can_throw_external_1): Add
"is_resx" argument.
(can_throw_external, can_throw_internal): Bring into sync wrt
dealing resx.
* except.h (can_throw_internal_1, can_throw_external_1): Update
prototype.
* tree-eh.c (tree_can_throw_internal, tree_can_throw_external):
Deal properly with resx.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@100282 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/except.c')
-rw-r--r-- | gcc/except.c | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/gcc/except.c b/gcc/except.c index 9f1bfe926af..78594122e5d 100644 --- a/gcc/except.c +++ b/gcc/except.c @@ -2539,7 +2539,7 @@ reachable_handlers (rtx insn) within the function. */ bool -can_throw_internal_1 (int region_number) +can_throw_internal_1 (int region_number, bool is_resx) { struct eh_region *region; tree type_thrown; @@ -2547,7 +2547,9 @@ can_throw_internal_1 (int region_number) region = cfun->eh->region_array[region_number]; type_thrown = NULL_TREE; - if (region->type == ERT_THROW) + if (is_resx) + region = region->outer; + else if (region->type == ERT_THROW) { type_thrown = region->u.throw.type; region = region->outer; @@ -2579,7 +2581,7 @@ can_throw_internal (rtx insn) if (JUMP_P (insn) && GET_CODE (PATTERN (insn)) == RESX && XINT (PATTERN (insn), 0) > 0) - return can_throw_internal_1 (XINT (PATTERN (insn), 0)); + return can_throw_internal_1 (XINT (PATTERN (insn), 0), true); if (NONJUMP_INSN_P (insn) && GET_CODE (PATTERN (insn)) == SEQUENCE) @@ -2590,14 +2592,14 @@ can_throw_internal (rtx insn) if (!note || INTVAL (XEXP (note, 0)) <= 0) return false; - return can_throw_internal_1 (INTVAL (XEXP (note, 0))); + return can_throw_internal_1 (INTVAL (XEXP (note, 0)), false); } /* Determine if the given INSN can throw an exception that is visible outside the function. */ bool -can_throw_external_1 (int region_number) +can_throw_external_1 (int region_number, bool is_resx) { struct eh_region *region; tree type_thrown; @@ -2605,7 +2607,9 @@ can_throw_external_1 (int region_number) region = cfun->eh->region_array[region_number]; type_thrown = NULL_TREE; - if (region->type == ERT_THROW) + if (is_resx) + region = region->outer; + else if (region->type == ERT_THROW) { type_thrown = region->u.throw.type; region = region->outer; @@ -2628,6 +2632,11 @@ can_throw_external (rtx insn) if (! INSN_P (insn)) return false; + if (JUMP_P (insn) + && GET_CODE (PATTERN (insn)) == RESX + && XINT (PATTERN (insn), 0) > 0) + return can_throw_external_1 (XINT (PATTERN (insn), 0), true); + if (NONJUMP_INSN_P (insn) && GET_CODE (PATTERN (insn)) == SEQUENCE) insn = XVECEXP (PATTERN (insn), 0, 0); @@ -2647,7 +2656,7 @@ can_throw_external (rtx insn) if (INTVAL (XEXP (note, 0)) <= 0) return false; - return can_throw_external_1 (INTVAL (XEXP (note, 0))); + return can_throw_external_1 (INTVAL (XEXP (note, 0)), false); } /* Set TREE_NOTHROW and cfun->all_throwers_are_sibcalls. */ |