From 630b1e3a187dc843958e8966345da6191226b8e2 Mon Sep 17 00:00:00 2001 From: Tamar Christina Date: Mon, 1 Oct 2018 13:02:21 +0000 Subject: [PATCH] Allow setting of stack-clash via configure options. This patch defines a configure option to allow the setting of the default guard size via configure flags when building the target. The new flag is: * --with-stack-clash-protection-guard-size= The patch defines a new macro DEFAULT_STK_CLASH_GUARD_SIZE which targets need to use explicitly is they want to support this configure flag and values that users may have set. gcc/ PR target/86486 * configure.ac: Add stack-clash-protection-guard-size. * doc/install.texi: Document it. * config.in (DEFAULT_STK_CLASH_GUARD_SIZE): New. * params.def: Update comment for guard-size. (PARAM_STACK_CLASH_PROTECTION_GUARD_SIZE, PARAM_STACK_CLASH_PROTECTION_PROBE_INTERVAL): Update description. * configure: Regenerate. From-SVN: r264752 --- gcc/ChangeLog | 11 +++++++++++ gcc/config.in | 7 +++++++ gcc/configure | 36 ++++++++++++++++++++++++++++++++++-- gcc/configure.ac | 23 +++++++++++++++++++++++ gcc/doc/install.texi | 5 +++++ gcc/params.def | 5 +++-- 6 files changed, 83 insertions(+), 4 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a379cc4777a..4d6ee32846d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2018-10-01 Tamar Christina + + PR target/86486 + * configure.ac: Add stack-clash-protection-guard-size. + * doc/install.texi: Document it. + * config.in (DEFAULT_STK_CLASH_GUARD_SIZE): New. + * params.def: Update comment for guard-size. + (PARAM_STACK_CLASH_PROTECTION_GUARD_SIZE, + PARAM_STACK_CLASH_PROTECTION_PROBE_INTERVAL): Update description. + * configure: Regenerate. + 2018-10-01 Tamar Christina PR target/86486 diff --git a/gcc/config.in b/gcc/config.in index 4db8aa1ea15..d7c3fbfd9b2 100644 --- a/gcc/config.in +++ b/gcc/config.in @@ -55,6 +55,13 @@ #endif +/* Define to larger than zero set to the default stack clash protector size as + a power of two in bytes. */ +#ifndef USED_FOR_TARGET +#undef DEFAULT_STK_CLASH_GUARD_SIZE +#endif + + /* Define if you want to use __cxa_atexit, rather than atexit, to register C++ destructors for local statics and global objects. This is essential for fully standards-compliant handling of destructors, but requires diff --git a/gcc/configure b/gcc/configure index 9fb0eb57a8a..3e33a69628b 100755 --- a/gcc/configure +++ b/gcc/configure @@ -906,6 +906,7 @@ enable_valgrind_annotations with_stabs enable_multilib enable_multiarch +with_stack_clash_protection_guard_size enable___cxa_atexit enable_decimal_float enable_fixed_point @@ -1727,6 +1728,9 @@ Optional Packages: --with-gnu-as arrange to work with GNU as --with-as arrange to use the specified as (full pathname) --with-stabs arrange to use stabs instead of host debug format + --with-stack-clash-protection-guard-size=size + Set the default stack clash protection guard size + for specific targets as a power of two in bytes. --with-dwarf2 force the default debug format to be DWARF 2 --with-specs=SPECS add SPECS to driver command-line processing --with-pkgversion=PKG Use PKG in the version string in place of "GCC" @@ -7439,6 +7443,34 @@ $as_echo "$enable_multiarch$ma_msg_suffix" >&6; } +# default stack clash protection guard size as power of twos in bytes. +# Please keep these in sync with params.def. +stk_clash_min=12 +stk_clash_max=30 + +# Keep the default value when the option is not used to 0, this allows us to +# distinguish between the cases where the user specifially set a value via +# configure and when the normal default value is used. + +# Check whether --with-stack-clash-protection-guard-size was given. +if test "${with_stack_clash_protection_guard_size+set}" = set; then : + withval=$with_stack_clash_protection_guard_size; DEFAULT_STK_CLASH_GUARD_SIZE="$with_stack_clash_protection_guard_size" +else + DEFAULT_STK_CLASH_GUARD_SIZE=0 +fi + +if test $DEFAULT_STK_CLASH_GUARD_SIZE -ne 0 \ + && (test $DEFAULT_STK_CLASH_GUARD_SIZE -lt $stk_clash_min \ + || test $DEFAULT_STK_CLASH_GUARD_SIZE -gt $stk_clash_max); then + as_fn_error "Invalid value $DEFAULT_STK_CLASH_GUARD_SIZE for --with-stack-clash-protection-guard-size. Must be between $stk_clash_min and $stk_clash_max." "$LINENO" 5 +fi + + +cat >>confdefs.h <<_ACEOF +#define DEFAULT_STK_CLASH_GUARD_SIZE $DEFAULT_STK_CLASH_GUARD_SIZE +_ACEOF + + # Enable __cxa_atexit for C++. # Check whether --enable-__cxa_atexit was given. if test "${enable___cxa_atexit+set}" = set; then : @@ -18463,7 +18495,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 18466 "configure" +#line 18498 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -18569,7 +18601,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 18572 "configure" +#line 18604 "configure" #include "confdefs.h" #if HAVE_DLFCN_H diff --git a/gcc/configure.ac b/gcc/configure.ac index ca51cdf751b..ff6444a0f9b 100644 --- a/gcc/configure.ac +++ b/gcc/configure.ac @@ -811,6 +811,29 @@ AC_MSG_RESULT($enable_multiarch$ma_msg_suffix) AC_SUBST(with_cpu) AC_SUBST(with_float) +# default stack clash protection guard size as power of twos in bytes. +# Please keep these in sync with params.def. +stk_clash_min=12 +stk_clash_max=30 + +# Keep the default value when the option is not used to 0, this allows us to +# distinguish between the cases where the user specifially set a value via +# configure and when the normal default value is used. +AC_ARG_WITH(stack-clash-protection-guard-size, +[AS_HELP_STRING([--with-stack-clash-protection-guard-size=size], +[Set the default stack clash protection guard size for specific targets as a power of two in bytes.])], +[DEFAULT_STK_CLASH_GUARD_SIZE="$with_stack_clash_protection_guard_size"], [DEFAULT_STK_CLASH_GUARD_SIZE=0]) +if test $DEFAULT_STK_CLASH_GUARD_SIZE -ne 0 \ + && (test $DEFAULT_STK_CLASH_GUARD_SIZE -lt $stk_clash_min \ + || test $DEFAULT_STK_CLASH_GUARD_SIZE -gt $stk_clash_max); then + AC_MSG_ERROR(m4_normalize([ + Invalid value $DEFAULT_STK_CLASH_GUARD_SIZE for --with-stack-clash-protection-guard-size. \ + Must be between $stk_clash_min and $stk_clash_max.])) +fi + +AC_DEFINE_UNQUOTED(DEFAULT_STK_CLASH_GUARD_SIZE, $DEFAULT_STK_CLASH_GUARD_SIZE, + [Define to larger than zero set the default stack clash protector size.]) + # Enable __cxa_atexit for C++. AC_ARG_ENABLE(__cxa_atexit, [AS_HELP_STRING([--enable-__cxa_atexit], [enable __cxa_atexit for C++])], diff --git a/gcc/doc/install.texi b/gcc/doc/install.texi index 61ab97ee370..93022517b31 100644 --- a/gcc/doc/install.texi +++ b/gcc/doc/install.texi @@ -1414,6 +1414,11 @@ These features are extensions to the traditional SVR4-based MIPS ABIs and require support from GNU binutils and the runtime C library. +@item --with-stack-clash-protection-guard-size=@var{size} +On certain targets this option sets the default stack clash protection guard +size as a power of two in bytes. On AArch64 @var{size} is required to be either +12 (4KB) or 16 (64KB). + @item --enable-__cxa_atexit Define if you want to use __cxa_atexit, rather than atexit, to register C++ destructors for local statics and global objects. diff --git a/gcc/params.def b/gcc/params.def index 9f0697327d4..4a5f2042dac 100644 --- a/gcc/params.def +++ b/gcc/params.def @@ -213,14 +213,15 @@ DEFPARAM(PARAM_STACK_FRAME_GROWTH, "Maximal stack frame growth due to inlining (in percent).", 1000, 0, 0) +/* Keep these up to date with those in configure.ac. */ DEFPARAM(PARAM_STACK_CLASH_PROTECTION_GUARD_SIZE, "stack-clash-protection-guard-size", - "Size of the stack guard expressed as a power of two.", + "Size of the stack guard expressed as a power of two in bytes.", 12, 12, 30) DEFPARAM(PARAM_STACK_CLASH_PROTECTION_PROBE_INTERVAL, "stack-clash-protection-probe-interval", - "Interval in which to probe the stack expressed as a power of two.", + "Interval in which to probe the stack expressed as a power of two in bytes.", 12, 10, 16) /* The GCSE optimization will be disabled if it would require -- 2.30.2