aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorHans-Peter Nilsson <hp@axis.com>2024-09-05 17:02:23 +0200
committerHans-Peter Nilsson <hp@bitrange.com>2024-09-19 04:22:58 +0200
commitb1ea710b1bcdda233f96538c5404228d2b244e01 (patch)
tree46cde55fc4c93ed78870558f37d92cc8ba4e587d /gcc
parent57faabfbb3e58c66d924fced96c0fd2b5b3fc0c7 (diff)
downloadgcc-b1ea710b1bcdda233f96538c5404228d2b244e01.zip
gcc-b1ea710b1bcdda233f96538c5404228d2b244e01.tar.gz
gcc-b1ea710b1bcdda233f96538c5404228d2b244e01.tar.bz2
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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/gcc.dg/pr84877.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/pr84877.c b/gcc/testsuite/gcc.dg/pr84877.c
index e82991f..2f2e295 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;