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!) 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); }