diff options
author | Andrew Pinski <apinski@marvell.com> | 2020-08-25 14:17:52 +0800 |
---|---|---|
committer | Chenghua Xu <paul.hua.gm@gmail.com> | 2020-08-25 15:39:28 +0800 |
commit | 68e605c93d57c17f07edd50f7e1c80f9216befd2 (patch) | |
tree | 57946cbc9efab3a99a58db0eb275af789013ffd5 | |
parent | 7fe2cec41bb2ccb499b6b6c513e00da1a270370f (diff) | |
download | gcc-68e605c93d57c17f07edd50f7e1c80f9216befd2.zip gcc-68e605c93d57c17f07edd50f7e1c80f9216befd2.tar.gz gcc-68e605c93d57c17f07edd50f7e1c80f9216befd2.tar.bz2 |
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 <apinski@marvell.com>
gcc/ChangeLog:
PR middle-end/64242
* config/mips/mips.md (builtin_longjmp): Restore the frame
pointer and stack pointer and gp.
-rw-r--r-- | gcc/config/mips/mips.md | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/gcc/config/mips/mips.md b/gcc/config/mips/mips.md index 6383a31..2e75a72 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); |