[PATCH] Add --enable-default-semantic-interposition to GCC configure

Andrew Pinski pinskia@gmail.com
Sun Jun 6 23:18:16 GMT 2021


On Sun, Jun 6, 2021 at 4:13 PM Fangrui Song via Gcc-patches
<gcc-patches@gcc.gnu.org> wrote:
>
> From: Fangrui Song <i@maskray.me>
>
> --enable-default-semantic-interposition=no makes -fPIC default to
> -fno-semantic-interposition which enables interprocedural optimizations
> for default visibility non-vague-linkage function definitions.
>
> The suppression of interprocedural optimizations and inlining for such
> functions is the biggest difference between -fPIE/-fPIC.
> Distributions may want to enable default -fno-semantic-interposition to
> reclaim the lost performance (e.g. CPython is said to be 27% faster;
> Clang is 3% faster).


This breaks assumptions across the board.  If software packages want
to use -fno-semantic-interposition that is one thing.  But distros
should not be changing the default.  This is just like using
-ffast-math :).

Thanks,
Andrew Pinski

>
> gcc/
>
>     PR 100937
>     * common.opt (fsemantic-interposition): Initialize to -1.
>     * configure.ac: Add --enable-default-semantic-interposition. Default
>     to yes.
>     * defaults.h (DEFAULT_FLAG_SEMANTIC_INTERPOSITION): New.
>     * opts.c (finish_options): Update
>     opts->x_flag_semantic_interposition if it is -1.
>     * doc/install.texi: Document --enable-default-semantic-interposition.
>     * config.in: Add template.
>     * configure: Regenerate.
> ---
>  gcc/common.opt       |  2 +-
>  gcc/config.in        |  6 ++++++
>  gcc/configure        | 22 ++++++++++++++++++++--
>  gcc/configure.ac     | 12 ++++++++++++
>  gcc/defaults.h       |  6 ++++++
>  gcc/doc/install.texi |  3 +++
>  gcc/opts.c           |  3 +++
>  7 files changed, 51 insertions(+), 3 deletions(-)
>
> diff --git a/gcc/common.opt b/gcc/common.opt
> index ffb968d90f8..68fcbac96b1 100644
> --- a/gcc/common.opt
> +++ b/gcc/common.opt
> @@ -2480,7 +2480,7 @@ Common Var(flag_sel_sched_reschedule_pipelined) Init(0) Optimization
>  Reschedule pipelined regions without pipelining.
>
>  fsemantic-interposition
> -Common Var(flag_semantic_interposition) Init(1)
> +Common Var(flag_semantic_interposition) Init(-1)
>  Allow interposing function (or variables) by ones with different semantics (or initializer) respectively by dynamic linker.
>
>  ; sched_stalled_insns means that insns can be moved prematurely from the queue
> diff --git a/gcc/config.in b/gcc/config.in
> index e54f59ce0c3..7f1d56c1903 100644
> --- a/gcc/config.in
> +++ b/gcc/config.in
> @@ -125,6 +125,12 @@
>  #endif
>
>
> +/* Define if -fPIC defaults to -fsemantic-interposition */
> +#ifndef USED_FOR_TARGET
> +#undef ENABLE_DEFAULT_SEMANTIC_INTERPOSITION
> +#endif
> +
> +
>  /* Define if your target supports default stack protector and it is enabled.
>     */
>  #ifndef USED_FOR_TARGET
> diff --git a/gcc/configure b/gcc/configure
> index 4a9e4fa08ab..3835b22f6a5 100755
> --- a/gcc/configure
> +++ b/gcc/configure
> @@ -632,6 +632,7 @@ ac_includes_default="\
>  ac_subst_vars='LTLIBOBJS
>  LIBOBJS
>  CET_HOST_FLAGS
> +enable_default_semantic_interposition
>  NO_PIE_FLAG
>  NO_PIE_CFLAGS
>  enable_default_pie
> @@ -1027,6 +1028,7 @@ with_linker_hash_style
>  with_diagnostics_color
>  with_diagnostics_urls
>  enable_default_pie
> +enable_default_semantic_interposition
>  enable_cet
>  enable_s390_excess_float_precision
>  '
> @@ -1787,6 +1789,8 @@ Optional Features:
>    --disable-libquadmath-support
>                            disable libquadmath support for Fortran
>    --enable-default-pie    enable Position Independent Executable as default
> +  --enable-default-semantic-interposition
> +                          enable -fsemantic-interposition as -fPIC default
>    --enable-cet            enable Intel CET in host libraries [default=auto]
>    --enable-s390-excess-float-precision
>                            on s390 targets, evaluate float with double
> @@ -19435,7 +19439,7 @@ else
>    lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
>    lt_status=$lt_dlunknown
>    cat > conftest.$ac_ext <<_LT_EOF
> -#line 19438 "configure"
> +#line 19454 "configure"
>  #include "confdefs.h"
>
>  #if HAVE_DLFCN_H
> @@ -19541,7 +19545,7 @@ else
>    lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
>    lt_status=$lt_dlunknown
>    cat > conftest.$ac_ext <<_LT_EOF
> -#line 19544 "configure"
> +#line 19560 "configure"
>  #include "confdefs.h"
>
>  #if HAVE_DLFCN_H
> @@ -31893,6 +31897,20 @@ if test "$gcc_cv_no_pie" = "yes"; then
>  fi
>
>
> +# Check whether --enable-default-semantic-interposition=no was given.
> +if test "${enable_default_semantic_interposition+set}" = set; then :
> +  enableval=$enable_default_semantic_interposition; enable_default_semantic_interposition=$enableval
> +else
> +  enable_default_semantic_interposition=yes
> +fi
> +
> +if test x$enable_default_semantic_interposition != xno ; then
> +
> +$as_echo "#define ENABLE_DEFAULT_SEMANTIC_INTERPOSITION 1" >>confdefs.h
> +
> +fi
> +
> +
>  # Enable Intel CET on Intel CET enabled host if jit is enabled.
>   # Check whether --enable-cet was given.
>  if test "${enable_cet+set}" = set; then :
> diff --git a/gcc/configure.ac b/gcc/configure.ac
> index d9fc3c219e8..1cdf8b4ce00 100644
> --- a/gcc/configure.ac
> +++ b/gcc/configure.ac
> @@ -7419,6 +7419,18 @@ if test "$gcc_cv_no_pie" = "yes"; then
>  fi
>  AC_SUBST([NO_PIE_FLAG])
>
> +# Check whether --enable-default-semantic-interposition=no was given.
> +AC_ARG_ENABLE(default-semantic-interposition,
> +[AS_HELP_STRING([--enable-default-semantic-interposition],
> +  [enable -fsemantic-interposition as -fPIC default])],
> +enable_default_semantic_interposition=$enableval,
> +enable_default_semantic_interposition=yes)
> +if test x$enable_default_semantic_interposition != xno ; then
> +  AC_DEFINE(ENABLE_DEFAULT_SEMANTIC_INTERPOSITION, 1,
> +      [Define if -fPIC defaults to -fsemantic-interposition.])
> +fi
> +AC_SUBST([enable_default_semantic_interposition])
> +
>  # Enable Intel CET on Intel CET enabled host if jit is enabled.
>  GCC_CET_HOST_FLAGS(CET_HOST_FLAGS)
>  case x$enable_languages in
> diff --git a/gcc/defaults.h b/gcc/defaults.h
> index 91216593e75..548b1f64f17 100644
> --- a/gcc/defaults.h
> +++ b/gcc/defaults.h
> @@ -1249,6 +1249,12 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
>  # define DEFAULT_FLAG_PIE 0
>  #endif
>
> +#ifdef ENABLE_DEFAULT_SEMANTIC_INTERPOSITION
> +# define DEFAULT_FLAG_SEMANTIC_INTERPOSITION 1
> +#else
> +# define DEFAULT_FLAG_SEMANTIC_INTERPOSITION 0
> +#endif
> +
>  #ifndef SWITCHABLE_TARGET
>  #define SWITCHABLE_TARGET 0
>  #endif
> diff --git a/gcc/doc/install.texi b/gcc/doc/install.texi
> index 591ccaacbc1..17e756c7e7a 100644
> --- a/gcc/doc/install.texi
> +++ b/gcc/doc/install.texi
> @@ -1867,6 +1867,9 @@ mips-linux and s390-linux.
>  @item --enable-default-pie
>  Turn on @option{-fPIE} and @option{-pie} by default.
>
> +@item --enable-default-semantic-interposition=no
> +Make @option{-fPIC} default to @option{-fno-semantic-interposition}.
> +
>  @item --enable-secureplt
>  This option enables @option{-msecure-plt} by default for powerpc-linux.
>  @ifnothtml
> diff --git a/gcc/opts.c b/gcc/opts.c
> index a751d95d32b..c6f49af2583 100644
> --- a/gcc/opts.c
> +++ b/gcc/opts.c
> @@ -1068,6 +1068,9 @@ finish_options (struct gcc_options *opts, struct gcc_options *opts_set,
>    if (opts->x_flag_stack_protect == -1)
>      opts->x_flag_stack_protect = DEFAULT_FLAG_SSP;
>
> +  if (opts->x_flag_semantic_interposition == -1)
> +    opts->x_flag_semantic_interposition = DEFAULT_FLAG_SEMANTIC_INTERPOSITION;
> +
>    if (opts->x_optimize == 0)
>      {
>        /* Inlining does not work if not optimizing,
> --
> 2.32.0.rc1.229.g3e70b5a671-goog
>


More information about the Gcc-patches mailing list