diff --git a/SingleSource/Regression/C++/dyn_stack_alloc_realign.cpp b/SingleSource/Regression/C++/dyn_stack_alloc_realign.cpp new file mode 100644 --- /dev/null +++ b/SingleSource/Regression/C++/dyn_stack_alloc_realign.cpp @@ -0,0 +1,71 @@ +#include + +int +check_int (int *i, int align) +{ + *i = 20; + if ((((size_t) i) & (align - 1)) != 0) + { + printf ("\nUnalign address (%d): %p!\n", align, i); + abort (); + } + return *i; +} + +#ifndef ALIGNMENT +#define ALIGNMENT 64 +#endif + +typedef int aligned __attribute__((aligned(ALIGNMENT))); + +int global; + +void +bar (char *p, int size) +{ + __builtin_strncpy (p, "good", size); +} + +class Base {}; + +struct A : virtual public Base +{ + A() {} +}; + +struct B {}; + +void +foo (int size) +#if __cplusplus <= 201402L +throw (B,A) // { dg-warning "deprecated" "" { target { c++11 && { ! c++17 } } } } +#endif +{ + __attribute__((__aligned__(64))) int a; + char *p = (char*) __builtin_alloca (size + 1); + aligned i; + + asm volatile ("nop"::"S"(405):); + asm volatile ("nop"::"b"(405):); + bar (p, size); + if (__builtin_strncmp (p, "good", size) != 0) + { + p[size] = '\0'; + printf ("Failed: %s != good\n", p); + abort (); + } + + if (check_int (&i, __alignof__(i)) != i) + abort (); + + asm volatile ("movl %0, %1"::"r"(size), "m"(a):); + throw A(); +} + +int +main() +{ + try { foo (5); } + catch (A& a) { } + return 0; +}