modernc.org/ccgo/v3@v3.16.14/lib/testdata/gcc-9.1.0/gcc/testsuite/gcc.c-torture/execute/pr64242.c (about)

     1  /* { dg-require-effective-target indirect_jumps } */
     2  
     3  extern void abort (void);
     4  
     5  __attribute ((noinline)) void
     6  broken_longjmp (void *p)
     7  {
     8    void *buf[5];
     9    __builtin_memcpy (buf, p, 5 * sizeof (void*));
    10    /* Corrupts stack pointer...  */
    11    __builtin_longjmp (buf, 1);
    12  }
    13  
    14  __attribute ((noipa)) __UINTPTR_TYPE__
    15  foo (void *p)
    16  {
    17    return (__UINTPTR_TYPE__) p;
    18  }
    19  
    20  __attribute ((noipa)) void
    21  bar (void *p)
    22  {
    23    asm volatile ("" : : "r" (p));
    24  }
    25  
    26  volatile int x = 0;
    27  void *volatile p;
    28  void *volatile q;
    29  
    30  int
    31  main ()
    32  {
    33    void *buf[5];
    34    struct __attribute__((aligned (32))) S { int a[4]; } s;
    35    bar (&s);
    36    p = __builtin_alloca (x);
    37    if (!__builtin_setjmp (buf))
    38      broken_longjmp (buf);
    39  
    40    /* Fails if stack pointer corrupted.  */
    41    q = __builtin_alloca (x);
    42    if (foo (p) < foo (q))
    43      {
    44        if (foo (q) - foo (p) >= 1024)
    45  	abort ();
    46      }
    47    else if (foo (p) - foo (q) >= 1024)
    48      abort ();
    49  
    50    return 0;
    51  }