re PR middle-end/64242 (Longjmp expansion incorrect)
authorJakub Jelinek <jakub@redhat.com>
Mon, 3 Dec 2018 20:57:14 +0000 (21:57 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 3 Dec 2018 20:57:14 +0000 (21:57 +0100)
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.

From-SVN: r266766

gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/pr64242.c

index afe837f..f6bd456 100644 (file)
@@ -1,3 +1,14 @@
+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__.
index 72dab57..46a7b23 100644 (file)
@@ -3,7 +3,7 @@
 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*));
@@ -11,20 +11,41 @@ broken_longjmp(void *p)
   __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;
 }