Viewing file: pr85388-6.c (1.29 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
/* { dg-do run { target { i?86-*-linux* i?86-*-gnu* x86_64-*-linux* } } } */ /* { dg-require-effective-target cet } */ /* { dg-require-effective-target split_stack } */ /* { dg-options "-fsplit-stack -O2 -fcf-protection" } */ /* { dg-options "-fsplit-stack -O2 -mno-accumulate-outgoing-args -fcf-protection" { target { { i?86-*-* x86_64-*-* } && ia32 } } } */
/* A case that used to fail on 32-bit x86 when optimizing and not using -maccumulate-args. The stack adjustment of the alloca got mixed up with the arguments pushed on the stack to the function before the call of alloca. */
#include <stdlib.h>
typedef struct { const char* s; int l; } s;
typedef unsigned long long align16 __attribute__ ((aligned(16)));
s gobats (const void *, int) __attribute__ ((noinline));
s gobats (const void* p __attribute__ ((unused)), int l __attribute__ ((unused))) { s v; v.s = 0; v.l = 0; return v; }
void check_aligned (void *p) __attribute__ ((noinline));
void check_aligned (void *p) { if (((__SIZE_TYPE__) p & 0xf) != 0) abort (); }
void gap (void *) __attribute__ ((noinline));
void gap (void *p) { align16 a; check_aligned (&a); }
int main (int argc, char **argv) { s *space; gobats(0, 16); space = (s *) alloca(sizeof(s) + 1); *space = (s){0, 16}; gap(space); return 0; }
|