From: Andrew Pinski Date: Tue, 25 Aug 2020 06:17:52 +0000 (+0800) Subject: MIPS: Fix __builtin_longjmp (PR 64242) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=68e605c93d57c17f07edd50f7e1c80f9216befd2;p=gcc.git MIPS: Fix __builtin_longjmp (PR 64242) The problem here is mips has its own builtin_longjmp pattern and it was not fixed when expand_builtin_longjmp was fixed. We need to read the new fp and gp before restoring the stack as the buffer might be a local variable. 2020-08-25 Andrew Pinski gcc/ChangeLog: PR middle-end/64242 * config/mips/mips.md (builtin_longjmp): Restore the frame pointer and stack pointer and gp. --- diff --git a/gcc/config/mips/mips.md b/gcc/config/mips/mips.md index 6383a31a5e3..2e75a720fa9 100644 --- a/gcc/config/mips/mips.md +++ b/gcc/config/mips/mips.md @@ -6562,9 +6562,19 @@ /* This bit is similar to expand_builtin_longjmp except that it restores $gp as well. */ - mips_emit_move (hard_frame_pointer_rtx, fp); mips_emit_move (pv, lab); + /* Restore the frame pointer and stack pointer and gp. We must use a + temporary since the setjmp buffer may be a local. */ + fp = copy_to_reg (fp); + gpv = copy_to_reg (gpv); emit_stack_restore (SAVE_NONLOCAL, stack); + + /* Ensure the frame pointer move is not optimized. */ + emit_insn (gen_blockage ()); + emit_clobber (hard_frame_pointer_rtx); + emit_clobber (frame_pointer_rtx); + emit_clobber (gp); + mips_emit_move (hard_frame_pointer_rtx, fp); mips_emit_move (gp, gpv); emit_use (hard_frame_pointer_rtx); emit_use (stack_pointer_rtx);