summaryrefslogtreecommitdiff
path: root/gcc/except.c
diff options
context:
space:
mode:
authormmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>2001-05-20 00:35:24 +0000
committermmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>2001-05-20 00:35:24 +0000
commitb92c85dcf12a7c7474590b5d3b085c3b875ca36f (patch)
treeacfb4573f234684042fcc91f25abdf25bb73a6f5 /gcc/except.c
parent4fd56d8b8fb4d39073d436f7613331d04a6dae06 (diff)
downloadgcc-b92c85dcf12a7c7474590b5d3b085c3b875ca36f.tar.gz
* except.c (dw2_build_landing_pads): Use word_mode, not Pmode,
as ncessary. (expand_eh_return): Convert between word_mode and Pmode. * unwind-dw2.c (extract_cie_info): Do not assume words and pointers are the same size. (execute_stack_op): Likewise. (execute_cfa_program): Likewise. (uw_frame_state_for): Likewise. (uw_update_context_1): Likewise. * unwind.inc (_Unwind_Reason_Code): Likewise. * config/mips/mips.h (EH_RETURN_DATA_REGNO): Define. (EH_RETURN_STACKADJ_RTX): Likewise. * config/mips/mips.c (compute_frame_size): Make space for saving EH return registers. (mips_expand_epilogue): Handle EH stack adjustments. * config/mips/mips.md (eh_return): New pattern. (eh_set_lr_si): Likewise. (eh_set_lr_di): Likewise. Add splitter to perform EH return after reload. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@42332 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/except.c')
-rw-r--r--gcc/except.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/gcc/except.c b/gcc/except.c
index 48efbf9b8fc..c7493e7d930 100644
--- a/gcc/except.c
+++ b/gcc/except.c
@@ -1897,7 +1897,7 @@ dw2_build_landing_pads ()
emit_move_insn (cfun->eh->exc_ptr,
gen_rtx_REG (Pmode, EH_RETURN_DATA_REGNO (0)));
emit_move_insn (cfun->eh->filter,
- gen_rtx_REG (Pmode, EH_RETURN_DATA_REGNO (1)));
+ gen_rtx_REG (word_mode, EH_RETURN_DATA_REGNO (1)));
seq = get_insns ();
end_sequence ();
@@ -3035,6 +3035,8 @@ expand_eh_return ()
else
#endif
{
+ rtx handler;
+
ra = EH_RETURN_HANDLER_RTX;
if (! ra)
{
@@ -3043,7 +3045,17 @@ expand_eh_return ()
}
emit_move_insn (sa, cfun->eh->ehr_stackadj);
- emit_move_insn (ra, cfun->eh->ehr_handler);
+
+ handler = cfun->eh->ehr_handler;
+ if (GET_MODE (ra) != Pmode)
+ {
+#ifdef POINTERS_EXTEND_UNSIGNED
+ handler = convert_memory_address (GET_MODE (ra), handler);
+#else
+ handler = convert_to_mode (GET_MODE (ra), handler, 0);
+#endif
+ }
+ emit_move_insn (ra, handler);
}
emit_label (around_label);