On 2021-06-06, Andrew Pinski wrote:
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

What assumption?

Vague linkage function definitions already support IPO/inlining.

For a large non-vague linkage function, presumably GCC will not inline
it into the call sites in the same TU, users can keep using LD_PRELOAD
to interpose that single symbol.

Even if the non-vague function is small and inlined, users can use LD_PRELOAD to
interpose both the callee and callers.

You cannot do such interposition for Windows.
macOS two-level namespace requires explicit `ld -flat_interpose` for such 
definition interposition.
Users are free to add noinline or -fsemantic-interposition.


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

Reply via email to