On Tue, May 20, 2014 at 1:04 PM, Jan Hubicka <hubi...@ucw.cz> 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); > } >