OSDN Git Service

* flow.c (find_basic_blocks): Handle cfg issues for rethrows and
authorlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 28 Nov 1997 03:10:10 +0000 (03:10 +0000)
committerlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 28 Nov 1997 03:10:10 +0000 (03:10 +0000)
        nested exceptions correctly.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@16812 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/flow.c

index da98037..3587eb5 100644 (file)
@@ -1,5 +1,8 @@
 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.
 
index ed66ce7..27409de 100644 (file)
@@ -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);