[gcc r15-3699] testsuite/gcc.dg/pr84877.c: Add machinery to stabilize stack aligmnent
Hans-Peter Nilsson
hp@gcc.gnu.org
Thu Sep 19 02:23:39 GMT 2024
https://gcc.gnu.org/g:b1ea710b1bcdda233f96538c5404228d2b244e01
commit r15-3699-gb1ea710b1bcdda233f96538c5404228d2b244e01
Author: Hans-Peter Nilsson <hp@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;
More information about the Gcc-cvs
mailing list