Message ID | 20240905154452.9B4052044A@pchp3.se.axis.com |
---|---|
State | New |
Headers | show |
Series | testsuite/gcc.dg/pr84877.c: Add machinery to stabilize stack aligmnent | expand |
Ping... > From: Hans-Peter Nilsson <hp@axis.com> > Date: Thu, 5 Sep 2024 17:44:52 +0200 > > Tested adding 0..more-than-four environment variables, > running cris-sim+cris-elf. I also checked that foo stays > the same generated code regardless of the new code: this is > not obviously true as foo is "just" noinline, not __noipa__. > > Ok to commit? > > -- >8 -- > This test awkwardly "blinks"; xfails and xpasses apparently > randomly for cris-elf using the "gdb simulator". On > inspection, I see that the stack address depends on the > number of environment variables, deliberately passed to the > simulator, each adding the size of a pointer. > > This test is IMHO important enough not to be just skipped > just because it blinks (fixing the actual problem is a > different task). > > I guess a random non-16 stack-alignment could happen for > other targets as well, so let's try and add a generic > machinery to "stabilize" the test as failing, by allocating > a dynamic amount to make sure it's misaligned. The most > target-dependent item here is an offset between the incoming > stack-pointer value (within main in the added framework) and > outgoing (within "xmain" as called from main when setting up > the p0 parameter). I know there are other wonderful stack > shapes, but such targets would fall under the "complicated > situations"-label and are no worse off than before. > > * gcc.dg/pr84877.c: Try to make the test result consistent by > misaligning the stack. > --- > gcc/testsuite/gcc.dg/pr84877.c | 26 ++++++++++++++++++++++++++ > 1 file changed, 26 insertions(+) > > diff --git a/gcc/testsuite/gcc.dg/pr84877.c b/gcc/testsuite/gcc.dg/pr84877.c > index e82991f42dd4..2f2e29578df9 100644 > --- a/gcc/testsuite/gcc.dg/pr84877.c > +++ b/gcc/testsuite/gcc.dg/pr84877.c > @@ -3,6 +3,32 @@ > > #include <inttypes.h> > > +#ifdef __CRIS__ > +#define OUTGOING_SP_OFFSET (-sizeof (void *)) > +/* Suggestion: append #elif defined(__<TARGET-IDENTIFIER>__) after this comment, > + either defining OUTGOING_SP_OFFSET to whatever the pertinent amount is at -O2, > + if that makes your target consistently fail this test, or define > + DO_NOT_TAMPER for more complicated situations. Either way, compile with > + -DDO_NO_TAMPER to avoid any meddling. */ > +#endif > + > +#if defined (OUTGOING_SP_OFFSET) && !defined (DO_NOT_TAMPER) > +extern int xmain () __attribute__ ((__noipa__)); > +int main () > +{ > + uintptr_t misalignment > + = (OUTGOING_SP_OFFSET > + + (15 & (uintptr_t) __builtin_stack_address ())); > + /* Allocate a minimal amount if the stack was accidentally aligned. */ > + void *q = __builtin_alloca (misalignment == 0); > + xmain (); > + /* Fake use to avoid the "allocation" being optimized out. */ > + asm volatile ("" : : "rm" (q)); > + return 0; > +} > +#define main xmain > +#endif > + > struct U { > int M0; > int M1; > -- > 2.30.2 >
diff --git a/gcc/testsuite/gcc.dg/pr84877.c b/gcc/testsuite/gcc.dg/pr84877.c index e82991f42dd4..2f2e29578df9 100644 --- a/gcc/testsuite/gcc.dg/pr84877.c +++ b/gcc/testsuite/gcc.dg/pr84877.c @@ -3,6 +3,32 @@ #include <inttypes.h> +#ifdef __CRIS__ +#define OUTGOING_SP_OFFSET (-sizeof (void *)) +/* Suggestion: append #elif defined(__<TARGET-IDENTIFIER>__) after this comment, + either defining OUTGOING_SP_OFFSET to whatever the pertinent amount is at -O2, + if that makes your target consistently fail this test, or define + DO_NOT_TAMPER for more complicated situations. Either way, compile with + -DDO_NO_TAMPER to avoid any meddling. */ +#endif + +#if defined (OUTGOING_SP_OFFSET) && !defined (DO_NOT_TAMPER) +extern int xmain () __attribute__ ((__noipa__)); +int main () +{ + uintptr_t misalignment + = (OUTGOING_SP_OFFSET + + (15 & (uintptr_t) __builtin_stack_address ())); + /* Allocate a minimal amount if the stack was accidentally aligned. */ + void *q = __builtin_alloca (misalignment == 0); + xmain (); + /* Fake use to avoid the "allocation" being optimized out. */ + asm volatile ("" : : "rm" (q)); + return 0; +} +#define main xmain +#endif + struct U { int M0; int M1;