diff options
author | Jan Hubicka <hubicka@ucw.cz> | 2014-06-26 20:50:24 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2014-06-26 18:50:24 +0000 |
commit | e288a46ccc3f824c1fde7a34d92a265659a05ee5 (patch) | |
tree | 6629c6fbf16d67b6b1ae6de297c37f51a25cd8d9 /gcc | |
parent | 6a7424669d61d9697fcce29813f70578211af4fd (diff) | |
download | gcc-e288a46ccc3f824c1fde7a34d92a265659a05ee5.zip gcc-e288a46ccc3f824c1fde7a34d92a265659a05ee5.tar.gz gcc-e288a46ccc3f824c1fde7a34d92a265659a05ee5.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/common.opt | 4 | ||||
-rw-r--r-- | gcc/doc/invoke.texi | 17 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/interposition.c | 12 | ||||
-rw-r--r-- | gcc/varasm.c | 3 |
6 files changed, 46 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 78e00e9..2fecad4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2014-06-26 Jan Hubicka <hubicka@ucw.cz> + + * doc/invoke.texi (-fsemantic-interposition): Document. + * common.opt (fsemantic-interposition): New flag. + * varasm.c (decl_replaceable_p): Use it. + 2014-06-26 Bill Schmidt <wschmidt@linux.vnet.ibm.com> PR target/61542 diff --git a/gcc/common.opt b/gcc/common.opt index de13e01..d515dca 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 bb557a2..4df5f81 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 b64487b..3d0c9ae 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2014-06-26 Jan Hubicka <hubicka@ucw.cz> + + * gcc.dg/tree-ssa/interposition.c: New testcase. + 2014-06-26 Paolo Carlini <paolo.carlini@oracle.com> 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 0000000..8c89150 --- /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 7be56f1..aea5a25 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); } |