> 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.
Not yet, with the feedback about possibly turning this into an attribute I was thinking if perhaps fake visibility (default with no semantic interposition) would do the job better. But because i did not get any YES replies to that proposal, I do not know of good name of those and it seems that mixing the concepts may be actually a trouble, I will go with this patch and the attribute incrementally. Honza > > 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); > > } > >