diff options
author | Than McIntosh <thanm@google.com> | 2018-06-20 21:11:23 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2018-06-20 21:11:23 +0000 |
commit | 1f3fa525537199158db4373efa9d40344632f5f0 (patch) | |
tree | 1803178fb1693ddac061d3dff68dcd8bc7fc3ff3 /gcc | |
parent | d8e7bf49a8c27e168f64edcaf5ea308b21340e73 (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/split-8.c | 43 |
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)); +} |