aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJan Hubicka <hubicka@ucw.cz>2014-06-26 20:50:24 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2014-06-26 18:50:24 +0000
commite288a46ccc3f824c1fde7a34d92a265659a05ee5 (patch)
tree6629c6fbf16d67b6b1ae6de297c37f51a25cd8d9 /gcc
parent6a7424669d61d9697fcce29813f70578211af4fd (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/common.opt4
-rw-r--r--gcc/doc/invoke.texi17
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/interposition.c12
-rw-r--r--gcc/varasm.c3
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);
}