diff options
author | Andreas Krebbel <krebbel@linux.ibm.com> | 2020-12-03 17:04:11 +0100 |
---|---|---|
committer | Andreas Krebbel <krebbel@linux.ibm.com> | 2020-12-03 17:04:17 +0100 |
commit | 65af6bc9f87bc6b329fb7a16e3f736dd0a042bf5 (patch) | |
tree | f40c2b131e94a2569c553d0c3f7745229d8d2a37 | |
parent | 62fb1b9e0da44a15b0434def20724f989d61e27b (diff) | |
download | gcc-65af6bc9f87bc6b329fb7a16e3f736dd0a042bf5.zip gcc-65af6bc9f87bc6b329fb7a16e3f736dd0a042bf5.tar.gz gcc-65af6bc9f87bc6b329fb7a16e3f736dd0a042bf5.tar.bz2 |
IBM Z: Fix mode in probe_stack pattern
The probe pattern uses Pmode but the middle-end wants to emit a
word_mode probe check. This - as usual - breaks on Z with -m31
-mzarch were word_mode doesn't match Pmode.
gcc/ChangeLog:
* config/s390/s390.md ("@probe_stack2<mode>"): Change mode
iterator to W.
gcc/testsuite/ChangeLog:
* gcc.target/s390/stack-clash-4.c: New test.
-rw-r--r-- | gcc/config/s390/s390.md | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/s390/stack-clash-4.c | 10 |
2 files changed, 13 insertions, 3 deletions
diff --git a/gcc/config/s390/s390.md b/gcc/config/s390/s390.md index d4cfbdf..d6d8965 100644 --- a/gcc/config/s390/s390.md +++ b/gcc/config/s390/s390.md @@ -11116,8 +11116,8 @@ (define_expand "@probe_stack2<mode>" [(set (reg:CCZ CC_REGNUM) - (compare:CCZ (reg:P 0) - (match_operand 0 "memory_operand"))) + (compare:CCZ (reg:W 0) + (match_operand:W 0 "memory_operand"))) (unspec_volatile [(const_int 0)] UNSPECV_BLOCKAGE)] "") @@ -11125,7 +11125,7 @@ [(match_operand 0 "memory_operand")] "" { - emit_insn (gen_probe_stack2 (Pmode, operands[0])); + emit_insn (gen_probe_stack2 (word_mode, operands[0])); DONE; }) diff --git a/gcc/testsuite/gcc.target/s390/stack-clash-4.c b/gcc/testsuite/gcc.target/s390/stack-clash-4.c new file mode 100644 index 0000000..619d99d --- /dev/null +++ b/gcc/testsuite/gcc.target/s390/stack-clash-4.c @@ -0,0 +1,10 @@ +/* { dg-do compile } */ +/* { dg-options "-O1 -m31 -mzarch -fstack-clash-protection" } */ + +extern void c(char*); + +void +a() { + char *b = __builtin_alloca(3); + c(b); +} |