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-Tag: basepoints/gcc-10~4832 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0b06c9a6da753ceb79b0eb6cc8c265e14fcd20d3;p=thirdparty%2Fgcc.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 e8f65c97911d..e2ae04db139c 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 d533a3fcb4e1..d5511d01192d 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 779b50f98ed3..592e3ecf2abe 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 000000000000..3dec99f62c70 --- /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; }