+2018-12-03 Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/64242
+ * gcc.c-torture/execute/pr64242.c (foo, bar): New functions.
+ (p): Make it void *volatile instead of volatile void *.
+ (q): New variable.
+ (main): Add a dummy 32-byte aligned variable and escape its address.
+ Don't require that the two __builtin_alloca (0) calls return the
+ same address, just require that their difference is smaller than
+ 1024 bytes.
+
2018-12-03 Marek Polacek <polacek@redhat.com>
* g++.dg/cpp1y/lambda-generic-83856.C: Use __SIZE_TYPE__.
extern void abort (void);
__attribute ((noinline)) void
-broken_longjmp(void *p)
+broken_longjmp (void *p)
{
void *buf[5];
__builtin_memcpy (buf, p, 5 * sizeof (void*));
__builtin_longjmp (buf, 1);
}
+__attribute ((noipa)) __UINTPTR_TYPE__
+foo (void *p)
+{
+ return (__UINTPTR_TYPE__) p;
+}
+
+__attribute ((noipa)) void
+bar (void *p)
+{
+ asm volatile ("" : : "r" (p));
+}
+
volatile int x = 0;
-volatile void *p;
+void *volatile p;
+void *volatile q;
+
int
-main (void)
+main ()
{
void *buf[5];
+ struct __attribute__((aligned (32))) S { int a[4]; } s;
+ bar (&s);
p = __builtin_alloca (x);
-
if (!__builtin_setjmp (buf))
broken_longjmp (buf);
/* Fails if stack pointer corrupted. */
- if (p != __builtin_alloca (x))
- abort();
+ q = __builtin_alloca (x);
+ if (foo (p) < foo (q))
+ {
+ if (foo (q) - foo (p) >= 1024)
+ abort ();
+ }
+ else if (foo (p) - foo (q) >= 1024)
+ abort ();
return 0;
}