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 }