aboutsummaryrefslogtreecommitdiff
path: root/gcc/builtins.c
diff options
context:
space:
mode:
authorWilco Dijkstra <wdijkstr@arm.com>2018-11-30 23:06:51 +0000
committerJeff Law <law@gcc.gnu.org>2018-11-30 16:06:51 -0700
commit71b144289c1c69a6d8eec9fd1dc64aecaf3ebed6 (patch)
tree47f216c2db4a2bd2b45e9c35a194db10402fcaec /gcc/builtins.c
parent8ba109cecce1cf6598380908a1d6b00e0360b85d (diff)
downloadgcc-71b144289c1c69a6d8eec9fd1dc64aecaf3ebed6.zip
gcc-71b144289c1c69a6d8eec9fd1dc64aecaf3ebed6.tar.gz
gcc-71b144289c1c69a6d8eec9fd1dc64aecaf3ebed6.tar.bz2
re PR middle-end/64242 (Longjmp expansion incorrect)
PR middle-end/64242 * builtins.c (expand_builtin_longjmp): Use a temporary when restoring the frame pointer. (expand_builtin_nonlocal_goto): Likewise. * gcc.c-torture/execute/pr64242.c: New test. From-SVN: r266697
Diffstat (limited to 'gcc/builtins.c')
-rw-r--r--gcc/builtins.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/gcc/builtins.c b/gcc/builtins.c
index 537228c..669e548 100644
--- a/gcc/builtins.c
+++ b/gcc/builtins.c
@@ -1143,8 +1143,11 @@ expand_builtin_longjmp (rtx buf_addr, rtx value)
emit_clobber (gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (VOIDmode)));
emit_clobber (gen_rtx_MEM (BLKmode, hard_frame_pointer_rtx));
- emit_move_insn (hard_frame_pointer_rtx, fp);
+ /* Restore the frame pointer and stack pointer. We must use a
+ temporary since the setjmp buffer may be a local. */
+ fp = copy_to_reg (fp);
emit_stack_restore (SAVE_NONLOCAL, stack);
+ emit_move_insn (hard_frame_pointer_rtx, fp);
emit_use (hard_frame_pointer_rtx);
emit_use (stack_pointer_rtx);
@@ -1287,9 +1290,11 @@ expand_builtin_nonlocal_goto (tree exp)
emit_clobber (gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (VOIDmode)));
emit_clobber (gen_rtx_MEM (BLKmode, hard_frame_pointer_rtx));
- /* Restore frame pointer for containing function. */
- emit_move_insn (hard_frame_pointer_rtx, r_fp);
+ /* Restore the frame pointer and stack pointer. We must use a
+ temporary since the setjmp buffer may be a local. */
+ r_fp = copy_to_reg (r_fp);
emit_stack_restore (SAVE_NONLOCAL, r_sp);
+ emit_move_insn (hard_frame_pointer_rtx, r_fp);
/* USE of hard_frame_pointer_rtx added for consistency;
not clear if really needed. */