reload1.c (copy_eh_notes): New function.
authorAndrew Haley <aph@cambridge.redhat.com>
Tue, 8 May 2001 14:14:11 +0000 (14:14 +0000)
committerAndrew Haley <aph@gcc.gnu.org>
Tue, 8 May 2001 14:14:11 +0000 (14:14 +0000)
2001-05-03  Andrew Haley  <aph@cambridge.redhat.com>

        * reload1.c (copy_eh_notes): New function.
        (emit_input_reload_insns): Call it.
        (emit_output_reload_insns): Call it.

From-SVN: r41918

gcc/ChangeLog
gcc/reload1.c

index 9986959..a5e6fd2 100644 (file)
@@ -1,3 +1,9 @@
+2001-05-03  Andrew Haley  <aph@cambridge.redhat.com>
+
+       * reload1.c (copy_eh_notes): New function.
+       (emit_input_reload_insns): Call it.
+       (emit_output_reload_insns): Call it.
+
 2001-05-07  Zack Weinberg  <zackw@stanford.edu>
 
        * config.gcc (i[34567]86-*-sco3.2v4*, i[34567]86-*-sco*):
index f12e8f4..dbf99d6 100644 (file)
@@ -454,6 +454,7 @@ static void move2add_note_store             PARAMS ((rtx, rtx, void *));
 #ifdef AUTO_INC_DEC
 static void add_auto_inc_notes         PARAMS ((rtx, rtx));
 #endif
+static void copy_eh_notes              PARAMS ((rtx, rtx));
 static HOST_WIDE_INT sext_for_mode     PARAMS ((enum machine_mode,
                                                 HOST_WIDE_INT));
 static void failed_reload              PARAMS ((rtx, int));
@@ -6571,10 +6572,13 @@ emit_input_reload_insns (chain, rl, old, j)
                  rl->when_needed);
     }
 
+  if (flag_non_call_exceptions)
+    copy_eh_notes (insn, get_insns ());
+
   /* End this sequence.  */
   *where = get_insns ();
   end_sequence ();
-
+                                
   /* Update reload_override_in so that delete_address_reloads_1
      can see the actual register usage.  */
   if (oldequiv_reg)
@@ -6789,6 +6793,9 @@ emit_output_reload_insns (chain, rl, j)
   else
     output_reload_insns[rl->opnum] = get_insns ();
 
+  if (flag_non_call_exceptions)
+    copy_eh_notes (insn, get_insns ());
+
   end_sequence ();
 }
 
@@ -9437,3 +9444,23 @@ add_auto_inc_notes (insn, x)
     }
 }
 #endif
+
+/* Copy EH notes from an insn to its reloads.  */
+static void
+copy_eh_notes (insn, x)
+     rtx insn;
+     rtx x;
+{
+  rtx eh_note = find_reg_note (insn, REG_EH_REGION, NULL_RTX);
+  if (eh_note)
+    {
+      for (; x != 0; x = NEXT_INSN (x))
+       {
+         if (may_trap_p (PATTERN (x)))
+           REG_NOTES (x) 
+             = gen_rtx_EXPR_LIST (REG_EH_REGION, XEXP (eh_note, 0),
+                                  REG_NOTES (x));
+       }
+    }
+}
+