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

     1  /* { dg-options "-fno-inline" } */
     2  /* Check that stack alignment is not affected by variables not placed
     3     on the stack.  */
     4  
     5  #include <assert.h>
     6  
     7  #define ALIGNMENT 64
     8  
     9  unsigned test(unsigned n, unsigned p)
    10  {
    11    static struct { char __attribute__((__aligned__(ALIGNMENT))) c; } s;
    12    unsigned x;
    13  
    14    assert(__alignof__(s) == ALIGNMENT);
    15    asm ("" : "=g" (x), "+m" (s) : "0" (&x));
    16  
    17    return n ? test(n - 1, x) : (x ^ p);
    18  }
    19  
    20  unsigned test2(unsigned n, unsigned p)
    21  {
    22    static struct { char c; } s;
    23    unsigned x;
    24  
    25    assert(__alignof__(s) != ALIGNMENT);
    26    asm ("" : "=g" (x), "+m" (s) : "0" (&x));
    27  
    28    return n ? test2(n - 1, x) : (x ^ p);
    29  }
    30  
    31  int main (int argc, char *argv[] __attribute__((unused)))
    32  {
    33    unsigned int x, y;
    34  
    35    x = test(argc, 0);
    36    x |= test(argc + 1, 0);
    37    x |= test(argc + 2, 0);
    38  
    39    y = test2(argc, 0);
    40    y |= test2(argc + 1, 0);
    41    y |= test2(argc + 2, 0);
    42  
    43    return (x & (ALIGNMENT - 1)) == 0 && (y & (ALIGNMENT - 1)) != 0 ? 1 : 0;
    44  }