On Tue, May 20, 2014 at 1:04 PM, Jan Hubicka <[email protected]> wrote:
> Hi,
> as disucssed some time ago, our assumption that every symbol of shared
> library can
> be interposed at runtime is expensive and prevents a lot of useful
> optimizations,
> including inlining or IPA propagation.
>
> While this is useful feature, it is rather incommon to use it for bigger C++
> projects, like firefox and at least clang seems to ignore the ELF
> interposition
> rules and always inline/propagate. This patch adds flag to control the
> behaviour.
> Symbols explicitly delcared WEAK are still considered as interposable.
>
> Bootstrapped/regtested x86_64-linux, will commit it tomorrow if there are
> no complains. (Feedback is welcome!)
Did this patch ever go in? I am running in a case where I would like
to use this option to improve some C++ library speed.
Thanks,
Andrew
>
> Honza
>
> * doc/invoke.texi (-fsemantic-interposition): New flag.
> * common.opt (fsemantic-interposition): Use it.
> * varasm.c (decl_replaceable_p): Use it.
> Index: doc/invoke.texi
> ===================================================================
> --- doc/invoke.texi (revision 210653)
> +++ doc/invoke.texi (working copy)
> @@ -411,6 +411,7 @@ Objective-C and Objective-C++ Dialects}.
> -fschedule-insns -fschedule-insns2 -fsection-anchors @gol
> -fselective-scheduling -fselective-scheduling2 @gol
> -fsel-sched-pipelining -fsel-sched-pipelining-outer-loops @gol
> +-fsemantic-interposition @gol
> -fshrink-wrap -fsignaling-nans -fsingle-precision-constant @gol
> -fsplit-ivs-in-unroller -fsplit-wide-types -fstack-protector @gol
> -fstack-protector-all -fstack-protector-strong -fstrict-aliasing @gol
> @@ -7709,6 +7710,22 @@ This option has no effect unless one of
> When pipelining loops during selective scheduling, also pipeline outer loops.
> This option has no effect unless @option{-fsel-sched-pipelining} is turned
> on.
>
> +@item -fsemantic-interposition
> +@opindex fsemantic-interposition
> +Some object formats, like ELF, allow interposing of symbols by dynamic
> linker.
> +This means that for symbols exported from the DSO compiler can not perform
> +inter-procedural propagation, inlining and other optimizations in
> anticipation
> +that the function or variable in question may change. While this feature is
> +useful, for example, to rewrite memory allocation functions by a debugging
> +implementation, it is expensive in the terms of code quality.
> +With @option{-fno-semantic-inteposition} compiler assumest that if
> interposition
> +happens for functions the overwritting function will have
> +precisely same semantics (and side effects). Similarly if interposition
> happens
> +for variables, the constructor of the variable will be the same. The flag
> +has no effect for functions explicitly declared inline, where
> +interposition changing semantic is never allowed and for symbols explicitly
> +declared weak.
> +
> @item -fshrink-wrap
> @opindex fshrink-wrap
> Emit function prologues only before parts of the function that need it,
> Index: common.opt
> ===================================================================
> --- common.opt (revision 210653)
> +++ common.opt (working copy)
> @@ -1854,6 +1854,10 @@ fsel-sched-reschedule-pipelined
> Common Report Var(flag_sel_sched_reschedule_pipelined) Init(0) Optimization
> Reschedule pipelined regions without pipelining
>
> +fsemantic-interposition
> +Common Report 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
> ; of stalled insns into the ready list.
> fsched-stalled-insns
> Index: varasm.c
> ===================================================================
> --- varasm.c (revision 210654)
> +++ varasm.c (working copy)
> @@ -6870,6 +6870,9 @@ decl_replaceable_p (tree decl)
> gcc_assert (DECL_P (decl));
> if (!TREE_PUBLIC (decl) || DECL_COMDAT (decl))
> return false;
> + if (!flag_semantic_interposition
> + && !DECL_WEAK (decl))
> + return false;
> return !decl_binds_to_current_def_p (decl);
> }
>