aboutsummaryrefslogtreecommitdiff
path: root/gcc/flow.c
diff options
context:
space:
mode:
authorJeffrey A Law <law@cygnus.com>1997-11-28 03:10:10 +0000
committerJeff Law <law@gcc.gnu.org>1997-11-27 20:10:10 -0700
commit586a5f993abceb8ea62bdd39f2e0875ee11baace (patch)
treefe626edb31fdadc207e3664c4d884ecc148464d3 /gcc/flow.c
parentc2840dfb8acc1944b5adcb49108ab5cd99bed5e4 (diff)
downloadgcc-586a5f993abceb8ea62bdd39f2e0875ee11baace.zip
gcc-586a5f993abceb8ea62bdd39f2e0875ee11baace.tar.gz
gcc-586a5f993abceb8ea62bdd39f2e0875ee11baace.tar.bz2
flow.c (find_basic_blocks): Handle cfg issues for rethrows and nested exceptions correctly.
* flow.c (find_basic_blocks): Handle cfg issues for rethrows and nested exceptions correctly. From-SVN: r16812
Diffstat (limited to 'gcc/flow.c')
-rw-r--r--gcc/flow.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/gcc/flow.c b/gcc/flow.c
index ed66ce7..27409de 100644
--- a/gcc/flow.c
+++ b/gcc/flow.c
@@ -472,10 +472,15 @@ find_basic_blocks (f, nonlocal_label_list)
/* If we encounter a CALL_INSN, note which exception handler it
might pass control to.
+ Because we do rethrows by loading the address of a label into
+ __eh_pc and throwing, we need to treat labels as potentially
+ jumping to exception handlers.
+
If doing asynchronous exceptions, record the active EH handler
for every insn, since most insns can throw. */
else if (eh_note
&& (asynchronous_exceptions
+ || code == CODE_LABEL
|| (GET_CODE (insn) == CALL_INSN
&& ! find_reg_note (insn, REG_RETVAL, NULL_RTX))))
active_eh_handler[INSN_UID (insn)] = XEXP (eh_note, 0);