reorg.c (fill_simple_delay_slots): If an instruction might throw an exception that...
authorMark Mitchell <mark@codesourcery.com>
Fri, 20 Jul 2001 02:38:57 +0000 (02:38 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Fri, 20 Jul 2001 02:38:57 +0000 (02:38 +0000)
* reorg.c (fill_simple_delay_slots): If an instruction might throw
an exception that will be caught within this function, do not fill
its delay slot with any subsequent instruction.

From-SVN: r44171

gcc/ChangeLog
gcc/reorg.c

index 5850d78669060deed3ffb6aca25e93afbb8b1e52..693d0620d29cdaa1c7c9b682ba22ac149ab70c29 100644 (file)
@@ -1,3 +1,9 @@
+2001-07-19  Mark Mitchell  <mark@codesourcery.com>
+
+       * reorg.c (fill_simple_delay_slots): If an instruction might throw
+       an exception that will be caught within this function, do not fill
+       its delay slot with any subsequent instruction.
+
 2001-07-19  Steve Ellcey <sje@cup.hp.com>
 
        * tm.texi (POINTERS_EXTEND_UNSIGNED) Modify definition.
index b521645d62113cdb26d31952c03c52f2aedce1f7..1f26e7e37517d42105988c93f400d840695a67a8 100644 (file)
@@ -2223,6 +2223,27 @@ fill_simple_delay_slots (non_jumps_p)
         fill_eager_delay_slots anyways, it was just deleted.  */
 
       if (slots_filled != slots_to_fill
+         /* If this instruction could throw an exception which is
+            caught in the same function, then it's not safe to fill
+            the delay slot with an instruction from beyond this
+            point.  For example, consider:
+
+               int i = 2;
+
+              try { 
+                 f();
+                i = 3;
+               } catch (...) {}
+              
+               return i;
+
+            Even though `i' is a local variable, we must be sure not
+            to put `i = 3' in the delay slot if `f' might throw an
+            exception.
+
+            Presumably, we should also check to see if we could get
+            back to this function via `setjmp'.  */
+         && !can_throw_internal (insn)
          && (GET_CODE (insn) != JUMP_INSN
              || ((condjump_p (insn) || condjump_in_parallel_p (insn))
                  && ! simplejump_p (insn)