summaryrefslogtreecommitdiff
path: root/gcc/reload1.c
diff options
context:
space:
mode:
authoraph <aph@138bc75d-0d04-0410-961f-82ee72b054a4>2001-05-08 14:14:11 +0000
committeraph <aph@138bc75d-0d04-0410-961f-82ee72b054a4>2001-05-08 14:14:11 +0000
commitd8c23d3f61e660c90d233892708c097922e15558 (patch)
treea3b6d81f05e3be694e8761ce32c76aef86864348 /gcc/reload1.c
parentb2b8161f2d3753d82e994177c31e8e6c6ff16ca2 (diff)
downloadgcc-d8c23d3f61e660c90d233892708c097922e15558.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@41918 138bc75d-0d04-0410-961f-82ee72b054a4
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 f12e8f45617..dbf99d62dac 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));
+ }
+ }
+}
+