aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAndreas Krebbel <krebbel@linux.ibm.com>2020-12-07 09:42:39 +0100
committerAndreas Krebbel <krebbel@linux.ibm.com>2020-12-07 09:48:30 +0100
commitbf615bf65a0035cac3d4ac229e6413aad3b1d44a (patch)
tree254a30305afa6e0dc2396c6a5b5f2fea8fc7ad2d /gcc
parentad9c120a019ba4222bb062017da2db9711652dc3 (diff)
downloadgcc-bf615bf65a0035cac3d4ac229e6413aad3b1d44a.zip
gcc-bf615bf65a0035cac3d4ac229e6413aad3b1d44a.tar.gz
gcc-bf615bf65a0035cac3d4ac229e6413aad3b1d44a.tar.bz2
IBM Z: Change Pmode to word_mode for stack probes
In s390.c we are still using Pmode for the stack probes. This breaks with -m31 -mzarch where Pmode != word_mode. The patch also adds a new target check to s390.exp which allows us to implement zarch specific checks in the testcases. gcc/ChangeLog: * config/s390/s390.c (s390_emit_stack_probe): Change Pmode to word_mode. gcc/testsuite/ChangeLog: * gcc.target/s390/s390.exp: New target check s390_zarch. * gcc.target/s390/stack-clash-1.c: Use s390_zarch instead of lp64. * gcc.target/s390/stack-clash-2.c: Likewise. * gcc.target/s390/stack-clash-3.c: Likewise. * gcc.target/s390/stack-clash-5.c: New test.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/config/s390/s390.c2
-rw-r--r--gcc/testsuite/gcc.target/s390/s390.exp7
-rw-r--r--gcc/testsuite/gcc.target/s390/stack-clash-1.c4
-rw-r--r--gcc/testsuite/gcc.target/s390/stack-clash-2.c4
-rw-r--r--gcc/testsuite/gcc.target/s390/stack-clash-3.c4
-rw-r--r--gcc/testsuite/gcc.target/s390/stack-clash-5.c10
6 files changed, 24 insertions, 7 deletions
diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c
index fb48102..2f83988 100644
--- a/gcc/config/s390/s390.c
+++ b/gcc/config/s390/s390.c
@@ -11082,7 +11082,7 @@ s390_prologue_plus_offset (rtx target, rtx reg, rtx offset, bool frame_related_p
static void
s390_emit_stack_probe (rtx addr)
{
- rtx mem = gen_rtx_MEM (Pmode, addr);
+ rtx mem = gen_rtx_MEM (word_mode, addr);
MEM_VOLATILE_P (mem) = 1;
emit_insn (gen_probe_stack (mem));
}
diff --git a/gcc/testsuite/gcc.target/s390/s390.exp b/gcc/testsuite/gcc.target/s390/s390.exp
index 00e0555..d76d80d 100644
--- a/gcc/testsuite/gcc.target/s390/s390.exp
+++ b/gcc/testsuite/gcc.target/s390/s390.exp
@@ -202,6 +202,13 @@ proc check_effective_target_s390_z14_hw { } {
}
}] "-march=z14 -m64 -mzarch" ] } { return 0 } else { return 1 }
}
+# Return 1 if the default compiler options enable z/Architecture mode
+proc check_effective_target_s390_zarch { } {
+ return [check_no_compiler_messages s390_zarch object {
+ int dummy[sizeof (int __attribute__((__mode__(__word__)))) == 8
+ ? 1 : -1];
+ }]
+}
# If a testcase doesn't have special options, use these.
global DEFAULT_CFLAGS
diff --git a/gcc/testsuite/gcc.target/s390/stack-clash-1.c b/gcc/testsuite/gcc.target/s390/stack-clash-1.c
index 3d29cab..45221c4 100644
--- a/gcc/testsuite/gcc.target/s390/stack-clash-1.c
+++ b/gcc/testsuite/gcc.target/s390/stack-clash-1.c
@@ -13,5 +13,5 @@ void large_stack() {
/* We use a compare for the stack probe. There needs to be one inside
a loop and another for the remaining bytes. */
-/* { dg-final { scan-assembler-times "cg\t" 2 { target lp64 } } } */
-/* { dg-final { scan-assembler-times "c\t" 2 { target { ! lp64 } } } } */
+/* { dg-final { scan-assembler-times "cg\t" 2 { target s390_zarch } } } */
+/* { dg-final { scan-assembler-times "c\t" 2 { target { ! s390_zarch } } } } */
diff --git a/gcc/testsuite/gcc.target/s390/stack-clash-2.c b/gcc/testsuite/gcc.target/s390/stack-clash-2.c
index e554ad5..20f645d 100644
--- a/gcc/testsuite/gcc.target/s390/stack-clash-2.c
+++ b/gcc/testsuite/gcc.target/s390/stack-clash-2.c
@@ -13,5 +13,5 @@ foo ()
/* For alloca a common code routine emits the probes. Make sure the
"probe_stack" expander is used in that case. We want to use mem
compares instead of stores. */
-/* { dg-final { scan-assembler-times "cg\t" 5 { target lp64 } } } */
-/* { dg-final { scan-assembler-times "c\t" 5 { target { ! lp64 } } } } */
+/* { dg-final { scan-assembler-times "cg\t" 5 { target s390_zarch } } } */
+/* { dg-final { scan-assembler-times "c\t" 5 { target { ! s390_zarch } } } } */
diff --git a/gcc/testsuite/gcc.target/s390/stack-clash-3.c b/gcc/testsuite/gcc.target/s390/stack-clash-3.c
index 929d3fb..12a2d34 100644
--- a/gcc/testsuite/gcc.target/s390/stack-clash-3.c
+++ b/gcc/testsuite/gcc.target/s390/stack-clash-3.c
@@ -13,5 +13,5 @@ foo ()
/* For alloca a common code routine emits the probes. Make sure the
"probe_stack" expander is used in that case. We want to use mem
compares instead of stores. */
-/* { dg-final { scan-assembler-times "cg\t" 5 { target lp64 } } } */
-/* { dg-final { scan-assembler-times "c\t" 5 { target { ! lp64 } } } } */
+/* { dg-final { scan-assembler-times "cg\t" 5 { target s390_zarch } } } */
+/* { dg-final { scan-assembler-times "c\t" 5 { target { ! s390_zarch } } } } */
diff --git a/gcc/testsuite/gcc.target/s390/stack-clash-5.c b/gcc/testsuite/gcc.target/s390/stack-clash-5.c
new file mode 100644
index 0000000..81e202e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/s390/stack-clash-5.c
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-O1 -m31 -mzarch -fstack-clash-protection" } */
+
+extern void bar (char*);
+
+void
+foo() {
+ char a[4000];
+ bar (a) ;
+}