Commit 71b14428 by Wilco Dijkstra Committed by Jeff Law

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
parent 8ba109ce
2018-11-30 Wilco Dijkstra <wdijkstr@arm.com>
PR middle-end/64242
* builtins.c (expand_builtin_longjmp): Use a temporary when restoring
the frame pointer.
(expand_builtin_nonlocal_goto): Likewise.
2018-11-30 David Malcolm <dmalcolm@redhat.com>
* diagnostic-core.h (emit_diagnostic): New decl.
......@@ -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. */
......
2018-11-30 Wilco Dijkstra <wdijkstr@arm.com>
PR middle-end/64242
* gcc.c-torture/execute/pr64242.c: New test.
2018-11-30 David Malcolm <dmalcolm@redhat.com>
* g++.dg/parse/missing-parens-fixit.C: New test.
......
/* { dg-require-effective-target indirect_jumps } */
extern void abort (void);
__attribute ((noinline)) void
broken_longjmp(void *p)
{
void *buf[5];
__builtin_memcpy (buf, p, 5 * sizeof (void*));
/* Corrupts stack pointer... */
__builtin_longjmp (buf, 1);
}
volatile int x = 0;
volatile void *p;
int
main (void)
{
void *buf[5];
p = __builtin_alloca (x);
if (!__builtin_setjmp (buf))
broken_longjmp (buf);
/* Fails if stack pointer corrupted. */
if (p != __builtin_alloca (x))
abort();
return 0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment