From: Andreas Krebbel Date: Thu, 9 Aug 2018 07:06:23 +0000 (+0000) Subject: S/390: Fix PR84332 ICE with stack clash protection X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=0b06c9a6da753ceb79b0eb6cc8c265e14fcd20d3;p=gcc.git S/390: Fix PR84332 ICE with stack clash protection Our implementation of the stack probe requires the probe interval to be used as displacement in an address operand. The maximum probe interval currently is 64k. This would exceed short displacements. Trim that value down to 4k if that happens. This might result in too many probes being generated only on the oldest supported machine level z900. gcc/ChangeLog: 2018-08-09 Andreas Krebbel PR target/84332 * config/s390/s390.c (s390_option_override_internal): Reduce the stack-clash-protection-probe-interval param if it would be too big for z900. gcc/testsuite/ChangeLog: 2018-08-09 Andreas Krebbel PR target/84332 * gcc.target/s390/pr84332.c: New testcase. From-SVN: r263441 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e8f65c97911..e2ae04db139 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2018-08-09 Andreas Krebbel + + PR target/84332 + * config/s390/s390.c (s390_option_override_internal): Reduce the + stack-clash-protection-probe-interval param if it would be too big + for z900. + 2018-08-08 Andreas Schwab PR target/46179 diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c index d533a3fcb4e..d5511d01192 100644 --- a/gcc/config/s390/s390.c +++ b/gcc/config/s390/s390.c @@ -14983,6 +14983,17 @@ s390_option_override_internal (struct gcc_options *opts, else if (opts->x_s390_stack_guard) error ("-mstack-guard implies use of -mstack-size"); + /* Our implementation of the stack probe requires the probe interval + to be used as displacement in an address operand. The maximum + probe interval currently is 64k. This would exceed short + displacements. Trim that value down to 4k if that happens. This + might result in too many probes being generated only on the + oldest supported machine level z900. */ + if (!DISP_IN_RANGE ((1 << PARAM_VALUE (PARAM_STACK_CLASH_PROTECTION_PROBE_INTERVAL)))) + set_param_value ("stack-clash-protection-probe-interval", 12, + opts->x_param_values, + opts_set->x_param_values); + #ifdef TARGET_DEFAULT_LONG_DOUBLE_128 if (!TARGET_LONG_DOUBLE_128_P (opts_set->x_target_flags)) opts->x_target_flags |= MASK_LONG_DOUBLE_128; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 779b50f98ed..592e3ecf2ab 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-08-09 Andreas Krebbel + + PR target/84332 + * gcc.target/s390/pr84332.c: New testcase. + 2018-08-08 Andreas Schwab PR target/46179 diff --git a/gcc/testsuite/gcc.target/s390/pr84332.c b/gcc/testsuite/gcc.target/s390/pr84332.c new file mode 100644 index 00000000000..3dec99f62c7 --- /dev/null +++ b/gcc/testsuite/gcc.target/s390/pr84332.c @@ -0,0 +1,9 @@ +/* { dg-do compile } */ +/* { dg-options "-march=z900 -fstack-clash-protection --param stack-clash-protection-probe-interval=16" } */ + +struct b +{ + char a[65536]; +}; + +void c (void) { struct b d; }