aboutsummaryrefslogtreecommitdiff
path: root/gcc/reload1.c
diff options
context:
space:
mode:
authorAndrew Haley <aph@cambridge.redhat.com>2001-05-08 14:14:11 +0000
committerAndrew Haley <aph@gcc.gnu.org>2001-05-08 14:14:11 +0000
commit94bd63e512d48ff89580191b55a95cc39f370bdb (patch)
treea3b6d81f05e3be694e8761ce32c76aef86864348 /gcc/reload1.c
parent352b3f3f2a32c75d2a615d4867ec0dcacced4ce6 (diff)
downloadgcc-94bd63e512d48ff89580191b55a95cc39f370bdb.zip
gcc-94bd63e512d48ff89580191b55a95cc39f370bdb.tar.gz
gcc-94bd63e512d48ff89580191b55a95cc39f370bdb.tar.bz2
reload1.c (copy_eh_notes): New function.
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
Diffstat (limited to 'gcc/reload1.c')
-rw-r--r--gcc/reload1.c29
1 files changed, 28 insertions, 1 deletions
diff --git a/gcc/reload1.c b/gcc/reload1.c
index f12e8f4..dbf99d6 100644
--- a/gcc/reload1.c
+++ b/gcc/reload1.c
@@ -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));
+ }
+ }
+}
+