Viewing file: pr78468.c (1.86 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
/* { dg-do run } */ /* { dg-require-effective-target alloca } */ /* { dg-options "-O2 -fno-inline" } */
/* Test that targets correctly round the size of the outgoing arguments to a multiple of STACK_BOUNDARY. There is a serious alignment bug if aligned alloca does not get aligned! */
__extension__ typedef __UINTPTR_TYPE__ uintptr_t; extern void abort (void);
volatile int xx; volatile int x = 16;
void t1 (int x0, int x1, int x2, int x3, int x4, int x5, int x6, int x7, void *p, int align) { xx = x0 + x1 + x2 + x3 + x4 + x4 + x6 + x7; if ((int)(uintptr_t)p & (align-1)) abort (); }
void t2 (int x0, int x1, int x2, int x3, int x4, int x5, int x6, int x7, void *p, int align, int dummy) { xx = x0 + x1 + x2 + x3 + x4 + x4 + x6 + x7; if ((int)(uintptr_t)p & (align-1)) abort (); }
void t1_a4 (int size) { void *p = __builtin_alloca_with_align (size, 32); t1 (0, 0, 0, 0, 0, 0, 0, 0, p, 4); }
void t2_a4 (int size) { void *p = __builtin_alloca_with_align (size, 32); t2 (0, 0, 0, 0, 0, 0, 0, 0, p, 4, 0); }
void t1_a8 (int size) { void *p = __builtin_alloca_with_align (size, 64); t1 (0, 0, 0, 0, 0, 0, 0, 0, p, 8); }
void t2_a8 (int size) { void *p = __builtin_alloca_with_align (size, 64); t2 (0, 0, 0, 0, 0, 0, 0, 0, p, 8, 0); }
void t1_a16 (int size) { void *p = __builtin_alloca_with_align (size, 128); t1 (0, 0, 0, 0, 0, 0, 0, 0, p, 16); }
void t2_a16 (int size) { void *p = __builtin_alloca_with_align (size, 128); t2 (0, 0, 0, 0, 0, 0, 0, 0, p, 16, 0); }
void t1_a32 (int size) { void *p = __builtin_alloca_with_align (size, 256); t1 (0, 0, 0, 0, 0, 0, 0, 0, p, 32); }
void t2_a32 (int size) { void *p = __builtin_alloca_with_align (size, 256); t2 (0, 0, 0, 0, 0, 0, 0, 0, p, 32, 0); }
int main () { t1_a4 (x); t2_a4 (x); t1_a8 (x); t2_a8 (x); t1_a16 (x); t2_a16 (x); t1_a32 (x); t2_a32 (x); return 0; }
|