From d49df6269975c05ab212b61bd53920fe43ca0346 Mon Sep 17 00:00:00 2001 From: law Date: Fri, 28 Nov 1997 03:05:02 +0000 Subject: [PATCH] * flow.c (find_basic_blocks): Handle cfg issues for rethrows and nested exceptions correctly. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/egcs_1_00_branch@16811 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 3 +++ gcc/flow.c | 19 ++++++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index acaa173f91b..ea39d3810ea 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,4 +1,7 @@ Thu Nov 27 12:20:19 1997 Jeffrey A Law (law@cygnus.com) + + * flow.c (find_basic_blocks): Handle cfg issues for rethrows and + nested exceptions correctly. * unroll.c (find_splittable_givs): Don't split givs with a dest_reg that was created by loop. diff --git a/gcc/flow.c b/gcc/flow.c index b98008267dc..66374163e8b 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); @@ -569,7 +574,11 @@ find_basic_blocks (f, nonlocal_label_list) associated insns aren't marked dead, so we make the block in question live and create an edge from this insn to the label. This is not strictly - correct, but it is close enough for now. */ + correct, but it is close enough for now. + + We also need to mark the CODE_LABEL as reaching + its exception handler for nested exceptions to + to work. */ for (note = REG_NOTES (insn); note; note = XEXP (note, 1)) @@ -581,6 +590,14 @@ find_basic_blocks (f, nonlocal_label_list) mark_label_ref (gen_rtx (LABEL_REF, VOIDmode, x), insn, 0); + + /* If the CODE_LABEL has an active exception + handler, then make an edge to the exception + handler from this insn. */ + if (active_eh_handler[INSN_UID (x)]) + mark_label_ref (gen_rtx (LABEL_REF, VOIDmode, + active_eh_handler[INSN_UID (x)]), + insn, 0); } } -- 2.11.4.GIT