From: Jakub Jelinek Date: Mon, 3 Dec 2018 20:57:14 +0000 (+0100) Subject: re PR middle-end/64242 (Longjmp expansion incorrect) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=413eb4c65c69c8bf7204ef824b1c6722067c61ee;p=gcc.git re PR middle-end/64242 (Longjmp expansion incorrect) 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 --- diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index afe837fc4fc..f6bd4566c9e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,14 @@ +2018-12-03 Jakub Jelinek + + 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 * g++.dg/cpp1y/lambda-generic-83856.C: Use __SIZE_TYPE__. diff --git a/gcc/testsuite/gcc.c-torture/execute/pr64242.c b/gcc/testsuite/gcc.c-torture/execute/pr64242.c index 72dab570920..46a7b23d28d 100644 --- a/gcc/testsuite/gcc.c-torture/execute/pr64242.c +++ b/gcc/testsuite/gcc.c-torture/execute/pr64242.c @@ -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; }