HI Alexandre, Thanks for the review. Attached is the updated patch and new changelog below:
Thanks, Tamar gcc/ 2018-07-25 Tamar Christina <tamar.christ...@arm.com> 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. > -----Original Message----- > From: Alexandre Oliva <ol...@gnu.org> > Sent: Tuesday, July 24, 2018 20:24 > To: Tamar Christina <tamar.christ...@arm.com> > Cc: Joseph Myers <jos...@codesourcery.com>; Jeff Law > <l...@redhat.com>; gcc-patches@gcc.gnu.org; nd <n...@arm.com>; > bonz...@gnu.org; d...@redhat.com; nero...@gcc.gnu.org; > ralf.wildenh...@gmx.de > Subject: Re: [PATCH][GCC][front-end][build-machinery][opt-framework] > Allow setting of stack-clash via configure options. [Patch (4/6)] > > Hello, Christina, > > On Jul 24, 2018, Tamar Christina <tamar.christ...@arm.com> wrote: > > > gcc/ > > 2018-07-24 Tamar Christina <tamar.christ...@arm.com> > > > 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. > > * configure: Regenerate. > > The configury bits look almost good to me. > > I wish the help message, comments and docs expressed somehow that the > given power of two expresses a size in bytes, rather than in kilobytes, bits > or > any other unit that might be reasonably assumed to express stack sizes. I'm > afraid I don't know the best way to accomplish that in a few words. > > > +stk_clash_default=12 > > This seems to be left-over from an earlier patch, as it is now unused AFAICT. > > Thanks, > > -- > Alexandre Oliva, freedom fighter https://FSFLA.org/blogs/lxo > Be the change, be Free! FSF Latin America board member > GNU Toolchain Engineer Free Software Evangelist
diff --git a/gcc/config.in b/gcc/config.in index 2856e72d627df537a301a6c7ab6b5bbb75f6b43f..32118ef1f94cece06a1d870416c3a1705716d21b 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 60d373982fd38fe51c285e2b02941754d1b833d6..77ed62d199b272dfe39de156771dfb774184dd7d 100755 --- a/gcc/configure +++ b/gcc/configure @@ -905,6 +905,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 @@ -1724,6 +1725,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" @@ -7436,6 +7440,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 : @@ -18448,7 +18480,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 18451 "configure" +#line 18483 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -18554,7 +18586,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 18557 "configure" +#line 18589 "configure" #include "confdefs.h" #if HAVE_DLFCN_H diff --git a/gcc/configure.ac b/gcc/configure.ac index 010ecd2ccf609ded1f4d2849a2acc13aba43b55b..0bf75e14bf77054d7c5cafd9d686eb0964999227 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 7c5cdc762d3ecca2b37c1ebc8caf99d22ff351b9..8aa7bed0d25081afc859bc3421dc71c68e516cde 100644 --- a/gcc/doc/install.texi +++ b/gcc/doc/install.texi @@ -1410,6 +1410,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 a3906c268814bdc3a813416a60b9f666d1568f0a..762a38ca07b9a3ed5784d64ab3eab9955e0cb246 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