Committed: fix MMIX LTO gcc.dg/torture/stackalign/builtin-return-1.c

Hans-Peter Nilsson hp@bitrange.com
Sat Jun 7 00:04:00 GMT 2014


Apparently LTO improved or at least changed between r210000 and
r211121, such that memory outside the defined space was wrongly read
as "expected" for this test-case, corresponding to the wrongly
presumed stacked parameters.  For a "normal" target this would
correspond to a SEGV.  You'd need the memory-strictness change file (a
sort-of CWEB patch) from
<http://gcc.gnu.org/ml/gcc-patches/2012-10/msg01871.html> to see this
when testing with the mmixware mmix simulator:

Running /home/hp/gcctop/tmp/mbase1/gcc/gcc/testsuite/gcc.dg/torture/stackalign/stackalign.exp ...
FAIL: gcc.dg/torture/stackalign/builtin-return-1.c  -O2 -flto -fuse-linker-plugin -fno-fat-lto-objects  execution test

and in gcc.log:
spawn mmix ./builtin-return-1.exe
         1. 00000000000003ec: 8d10fd20 (LDOI) $16=l[25] = M8[#16809fffffffffe0+32] = 0
  198 instructions, 49 mems, 236 oops; 4 good guesses, 7 bad
  (now at location #00000000000003f0)

(for the default Knuth ABI; but the error for the GNU ABI is similar)

This also annotates as fixed an age-old PR, though test has actually
been passing for some time after "Tue Nov 9 00:36:20 UTC 2004" (yes,
this was CVS time) and up-to-and-including at least r210000.  I wrote
this fix when investigating fallout from the memory-strictness feature
mentioned above, but as this test didn't fail at that time, I didn't
apply it.

Committed.

	PR target/18343
	* gcc.dg/torture/stackalign/builtin-return-1.c (STACK_ARGUMENTS_SIZE):
	New macro, 0 for __MMIX__, default 64.
	(bar): Pass it to __builtin_apply instead of literal 64.

Index: gcc/testsuite/gcc.dg/torture/stackalign/builtin-return-1.c
===================================================================
--- gcc/testsuite/gcc.dg/torture/stackalign/builtin-return-1.c	(revision 211328)
+++ gcc/testsuite/gcc.dg/torture/stackalign/builtin-return-1.c	(working copy)
@@ -5,6 +5,13 @@
 /* This used to fail on SPARC because the (undefined) return
    value of 'bar' was overwriting that of 'foo'.  */

+#ifdef __MMIX__
+/* No parameters on stack for bar.  */
+#define STACK_ARGUMENTS_SIZE 0
+#else
+#define STACK_ARGUMENTS_SIZE 64
+#endif
+
 extern void abort(void);

 int foo(int n)
@@ -14,7 +21,8 @@ int foo(int n)

 int bar(int n)
 {
-  __builtin_return(__builtin_apply((void (*)(void))foo, __builtin_apply_args(), 64));
+  __builtin_return(__builtin_apply((void (*)(void))foo, __builtin_apply_args(),
+				   STACK_ARGUMENTS_SIZE));
 }

 char *g;

brgds, H-P



More information about the Gcc-patches mailing list