On Tue, May 28, 2019 at 10:37 AM Wilco Dijkstra <[email protected]> wrote:
>
>
> diff --git a/gcc/testsuite/gcc.c-torture/execute/pr84521.c
> b/gcc/testsuite/gcc.c-torture/execute/pr84521.c
> new file mode 100644
> index
> 0000000000000000000000000000000000000000..995a30223afd1401186c7eaf541f27606aed59b5
> --- /dev/null
> +++ b/gcc/testsuite/gcc.c-torture/execute/pr84521.c
> @@ -0,0 +1,54 @@
> +/* { dg-require-effective-target indirect_jumps } */
> +/* { dg-additional-options "-fomit-frame-pointer -fno-inline" } */
> +
> +extern void abort (void);
> +
> +void
> +broken_longjmp (void *p)
> +{
> + __builtin_longjmp (p, 1);
> +}
> +
> +volatile int x = 256;
> +void *volatile p = (void*)&x;
> +void *volatile p1;
> +
> +void
> +test (void)
> +{
> + void *buf[5];
> + void *volatile q = p;
> +
> + if (!__builtin_setjmp (buf))
> + broken_longjmp (buf);
Is this test valid? Can jmp buffer be allowed on stack?
> + /* Fails if stack pointer corrupted. */
> + if (p != q)
> + abort ();
> +}
> +
> +void
> +test2 (void)
> +{
> + void *volatile q = p;
> + p1 = __builtin_alloca (x);
> + test ();
> +
> + /* Fails if frame pointer corrupted. */
> + if (p != q)
> + abort ();
> +}
> +
> +int
> +main (void)
> +{
> + void *volatile q = p;
> + test ();
> + test2 ();
> + /* Fails if stack pointer corrupted. */
> + if (p != q)
> + abort ();
> +
> + return 0;
> +}
> +
--
H.J.