aboutsummaryrefslogtreecommitdiff
path: root/gcc/varasm.c
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2021-11-18 18:42:35 +0100
committerJan Hubicka <jh@suse.cz>2021-11-18 18:42:35 +0100
commit75ac95f6647367783c4d65f6f686867ca425cb61 (patch)
tree36c8c6e5f54c9e2fff395cf1a072416ac33b9fcc /gcc/varasm.c
parentc331a75d49b6043399f5ccce72a02ccf3b0ddc56 (diff)
downloadgcc-75ac95f6647367783c4d65f6f686867ca425cb61.zip
gcc-75ac95f6647367783c4d65f6f686867ca425cb61.tar.gz
gcc-75ac95f6647367783c4d65f6f686867ca425cb61.tar.bz2
Turn -fsemantic-interposition to optimization flag
Turn flag_semantic_interposition to optimization option so it can be enabled with per-function granuality. This is done by adding the flag among visibility flags into the symbol table. gcc/ChangeLog: 2021-11-18 Jan Hubicka <hubicka@ucw.cz> * cgraph.c (cgraph_node::get_availability): Update call of decl_replaceable_p. (cgraph_node::verify_node): Verify that semantic_interposition flag is set correclty. * cgraph.h: (symtab_node): Add semantic_interposition flag. * cgraphclones.c (set_new_clone_decl_and_node_flags): Clear semantic_interposition flag. * cgraphunit.c (cgraph_node::finalize_function): Set semantic_interposition flag. (cgraph_node::add_new_function): Likewise. (varpool_node::finalize_decl): Likewise. (cgraph_node::create_wrapper): Likewise. * common.opt (fsemantic-interposition): Turn to optimization node. * lto-cgraph.c (lto_output_node): Stream semantic_interposition. (lto_output_varpool_node): Likewise. (input_overwrite_node): Likewise. (input_varpool_node): Likewise. * symtab.c (symtab_node::dump_base): Dump new flag. * varasm.c (decl_replaceable_p): Add semantic_interposition_p parameter. * varasm.h (decl_replaceable_p): Update declaration. * varpool.c (varpool_node::ctor_useable_for_folding_p): Use semantic_interposition flag. (varpool_node::get_availability): Likewise. (varpool_node::create_alias): Copy semantic_interposition flag. gcc/cp/ChangeLog: 2021-11-18 Jan Hubicka <hubicka@ucw.cz> * decl.c (finish_function): Update use of decl_replaceable_p. gcc/lto/ChangeLog: 2021-11-18 Jan Hubicka <hubicka@ucw.cz> * lto-partition.c (promote_symbol): Clear semantic_interposition flag. gcc/testsuite/ChangeLog: 2021-11-18 Jan Hubicka <hubicka@ucw.cz> * gcc.dg/lto/semantic-interposition-1_0.c: New test. * gcc.dg/lto/semantic-interposition-1_1.c: New test.
Diffstat (limited to 'gcc/varasm.c')
-rw-r--r--gcc/varasm.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/gcc/varasm.c b/gcc/varasm.c
index 09316c6..8c7aba2 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -7625,6 +7625,8 @@ decl_binds_to_current_def_p (const_tree decl)
at link-time with an entirely different definition, provided that the
replacement has the same type. For example, functions declared
with __attribute__((weak)) on most systems are replaceable.
+ If SEMANTIC_INTERPOSITION_P is false allow interposition only on
+ symbols explicitly declared weak.
COMDAT functions are not replaceable, since all definitions of the
function must be equivalent. It is important that COMDAT functions
@@ -7632,12 +7634,12 @@ decl_binds_to_current_def_p (const_tree decl)
instantiations is not penalized. */
bool
-decl_replaceable_p (tree decl)
+decl_replaceable_p (tree decl, bool semantic_interposition_p)
{
gcc_assert (DECL_P (decl));
if (!TREE_PUBLIC (decl) || DECL_COMDAT (decl))
return false;
- if (!flag_semantic_interposition
+ if (!semantic_interposition_p
&& !DECL_WEAK (decl))
return false;
return !decl_binds_to_current_def_p (decl);