diff options
author | mmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-05-20 00:35:24 +0000 |
---|---|---|
committer | mmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-05-20 00:35:24 +0000 |
commit | b92c85dcf12a7c7474590b5d3b085c3b875ca36f (patch) | |
tree | acfb4573f234684042fcc91f25abdf25bb73a6f5 /gcc/except.c | |
parent | 4fd56d8b8fb4d39073d436f7613331d04a6dae06 (diff) | |
download | gcc-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.c | 16 |
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); |