Hi All, This patch is a cascade update from having to re-spin the configure patch (no# 4 in the series).
This patch enforces that the default guard size for stack-clash protection for AArch64 be 64KB unless the user has overriden it via configure in which case the user value is used as long as that value is within the valid range. It also does some basic validation to ensure that the guard size is only 4KB or 64KB and also enforces that for aarch64 the stack-clash probing interval is equal to the guard size. Bootstrapped Regtested on aarch64-none-linux-gnu and no issues. Target was tested with stack clash on and off by default. Ok for trunk? Thanks, Tamar gcc/ 2018-07-24 Tamar Christina <tamar.christ...@arm.com> PR target/86486 * config/aarch64/aarch64.c (aarch64_override_options_internal): Add validation for stack-clash parameters and set defaults. > -----Original Message----- > From: Tamar Christina <tamar.christ...@arm.com> > Sent: Wednesday, July 11, 2018 12:23 > To: gcc-patches@gcc.gnu.org > Cc: nd <n...@arm.com>; James Greenhalgh <james.greenha...@arm.com>; > Richard Earnshaw <richard.earns...@arm.com>; Marcus Shawcroft > <marcus.shawcr...@arm.com> > Subject: [PATCH][GCC][AArch64] Set default values for stack-clash and do > basic validation in back-end. [Patch (5/6)] > > Hi All, > > This patch enforces that the default guard size for stack-clash protection for > AArch64 be 64KB unless the user has overriden it via configure in which case > the user value is used as long as that value is within the valid range. > > It also does some basic validation to ensure that the guard size is only 4KB > or > 64KB and also enforces that for aarch64 the stack-clash probing interval is > equal to the guard size. > > Bootstrapped Regtested on aarch64-none-linux-gnu and no issues. > Target was tested with stack clash on and off by default. > > Ok for trunk? > > Thanks, > Tamar > > gcc/ > 2018-07-11 Tamar Christina <tamar.christ...@arm.com> > > PR target/86486 > * config/aarch64/aarch64.c (aarch64_override_options_internal): > Add validation for stack-clash parameters. > > --
diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index e2c34cdfc96a1d3f99f7e4834c66a7551464a518..30c62c406e10793fe041d54c73316a6c8d7c229f 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -10916,6 +10916,37 @@ aarch64_override_options_internal (struct gcc_options *opts) opts->x_param_values, global_options_set.x_param_values); + /* If the user hasn't change it via configure then set the default to 64 KB + for the backend. */ + maybe_set_param_value (PARAM_STACK_CLASH_PROTECTION_GUARD_SIZE, + DEFAULT_STK_CLASH_GUARD_SIZE == 0 + ? 16 : DEFAULT_STK_CLASH_GUARD_SIZE, + opts->x_param_values, + global_options_set.x_param_values); + + /* Validate the guard size. */ + int guard_size = PARAM_VALUE (PARAM_STACK_CLASH_PROTECTION_GUARD_SIZE); + if (guard_size != 12 && guard_size != 16) + error ("only values 12 (4 KB) and 16 (64 KB) are supported for guard " + "size. Given value %d (%llu KB) is out of range.\n", + guard_size, (1ULL << guard_size) / 1024ULL); + + /* Enforce that interval is the same size as size so the mid-end does the + right thing. */ + maybe_set_param_value (PARAM_STACK_CLASH_PROTECTION_PROBE_INTERVAL, + guard_size, + opts->x_param_values, + global_options_set.x_param_values); + + /* The maybe_set calls won't update the value if the user has explicitly set + one. Which means we need to validate that probing interval and guard size + are equal. */ + int probe_interval + = PARAM_VALUE (PARAM_STACK_CLASH_PROTECTION_PROBE_INTERVAL); + if (guard_size != probe_interval) + error ("stack clash guard size '%d' must be equal to probing interval " + "'%d'\n", guard_size, probe_interval); + /* Enable sw prefetching at specified optimization level for CPUS that have prefetch. Lower optimization level threshold by 1 when profiling is enabled. */