This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Add flag to optionally ignore ELF interposition


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]