From: Jan Hubicka Date: Thu, 26 Jun 2014 18:50:24 +0000 (+0200) Subject: invoke.texi (-fsemantic-interposition): Document. X-Git-Tag: releases/gcc-5.1.0~6628 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e288a46ccc3f824c1fde7a34d92a265659a05ee5;p=thirdparty%2Fgcc.git invoke.texi (-fsemantic-interposition): Document. * doc/invoke.texi (-fsemantic-interposition): Document. * common.opt (fsemantic-interposition): New flag. * varasm.c (decl_replaceable_p): Use it. * gcc.dg/tree-ssa/interposition.c: New testcase. From-SVN: r212049 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 78e00e9640e7..2fecad45baab 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2014-06-26 Jan Hubicka + + * doc/invoke.texi (-fsemantic-interposition): Document. + * common.opt (fsemantic-interposition): New flag. + * varasm.c (decl_replaceable_p): Use it. + 2014-06-26 Bill Schmidt PR target/61542 diff --git a/gcc/common.opt b/gcc/common.opt index de13e01755cc..d515dca5ff5a 100644 --- a/gcc/common.opt +++ b/gcc/common.opt @@ -1855,6 +1855,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 diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index bb557a2207e1..4df5f8113b53 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -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 -fssa-phiopt -fstack-protector @gol -fstack-protector-all -fstack-protector-strong -fstrict-aliasing @gol @@ -7738,6 +7739,22 @@ This option has no effect unless one of @option{-fselective-scheduling} or 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, diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b64487b500a2..3d0c9ae61430 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2014-06-26 Jan Hubicka + + * gcc.dg/tree-ssa/interposition.c: New testcase. + 2014-06-26 Paolo Carlini PR c++/56633 diff --git a/gcc/testsuite/gcc.dg/tree-ssa/interposition.c b/gcc/testsuite/gcc.dg/tree-ssa/interposition.c new file mode 100644 index 000000000000..8c89150fc709 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/interposition.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-O1 -fno-semantic-interposition -fdump-tree-optimized -fPIC" } */ +int t(void) +{ + return 1; +} +int q(void) +{ + return t(); +} +/* { dg-final { scan-tree-dump-times "return 1" 2 "optimized"} } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/varasm.c b/gcc/varasm.c index 7be56f1e1eef..aea5a2550602 100644 --- a/gcc/varasm.c +++ b/gcc/varasm.c @@ -6830,6 +6830,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); }