aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorThan McIntosh <thanm@google.com>2018-06-20 21:11:23 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2018-06-20 21:11:23 +0000
commit1f3fa525537199158db4373efa9d40344632f5f0 (patch)
tree1803178fb1693ddac061d3dff68dcd8bc7fc3ff3 /gcc
parentd8e7bf49a8c27e168f64edcaf5ea308b21340e73 (diff)
downloadgcc-1f3fa525537199158db4373efa9d40344632f5f0.zip
gcc-1f3fa525537199158db4373efa9d40344632f5f0.tar.gz
gcc-1f3fa525537199158db4373efa9d40344632f5f0.tar.bz2
re PR libgcc/86213 (-fsplit-stack runtime may clobber SSE input param reg)
libgcc/: PR libgcc/86213 * generic-morestack.c (allocate_segment): Move calls to getenv and getpagesize to __morestack_load_mmap. (__morestack_load_mmap) Initialize static_pagesize and use_guard_page here so as to avoid clobbering SSE regs during a __morestack call. gcc/testsuite/: * gcc.dg/split-8.c: New. From-SVN: r261823
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/split-8.c43
2 files changed, 48 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 0343e8e..2e333b4 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2018-06-20 Than McIntosh <thanm@google.com>
+
+ PR libgcc/86213
+ * gcc.dg/split-8.c: New.
+
2018-06-20 Kelvin Nilsen <kelvin@gcc.gnu.org>
* gcc.target/powerpc/builtins-1.c: Adjust dg directives to scan
diff --git a/gcc/testsuite/gcc.dg/split-8.c b/gcc/testsuite/gcc.dg/split-8.c
new file mode 100644
index 0000000..33662e2
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/split-8.c
@@ -0,0 +1,43 @@
+/* { dg-do run } */
+/* { dg-require-effective-target split_stack } */
+/* { dg-options "-fsplit-stack" } */
+
+/* Testcase for PR86213. On the first call to __morestack there is a live
+ value in xmm0, which was being clobbered by a call to getenv(). */
+
+#include <stdlib.h>
+
+double gd[8];
+int z;
+
+double bar(double q) __attribute__ ((noinline));
+double foo(double q) __attribute__ ((noinline));
+int ck(double q) __attribute__ ((noinline));
+int main(int argc, char **argv) __attribute__ ((no_split_stack));
+
+double bar(double q)
+{
+ double d[8];
+ for (unsigned i = 0; i < 8; ++i)
+ d[i] = gd[8-i-1];
+ return q + d[z&3];
+}
+
+double foo(double d)
+{
+ return bar(d);
+}
+
+int ck(double d)
+{
+ if (d != 64.0)
+ abort();
+ return 0;
+}
+
+typedef double (*fp)(double);
+fp g = foo;
+
+int main(int argc, char **argv) {
+ return ck(g(64.0));
+}