https://gcc.gnu.org/g:b1ea710b1bcdda233f96538c5404228d2b244e01
commit r15-3699-gb1ea710b1bcdda233f96538c5404228d2b244e01
Author: Hans-Peter Nilsson <h...@axis.com>
Date:   Thu Sep 5 17:02:23 2024 +0200

    testsuite/gcc.dg/pr84877.c: Add machinery to stabilize stack aligmnent
    
    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.

Diff:
---
 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;

Reply via email to