aboutsummaryrefslogtreecommitdiff
path: root/gcc/ipa.c
diff options
context:
space:
mode:
authorJan Hubicka <hubicka@ucw.cz>2014-02-05 00:26:36 +0100
committerJan Hubicka <hubicka@gcc.gnu.org>2014-02-04 23:26:36 +0000
commitd665f8dde6f4d6c68635cbef972ef7ce085a359b (patch)
treebbf5ad857d73a9614797d6f9dbe1e05f2d043715 /gcc/ipa.c
parent6a071860bfd406eaad6b5c8ad68b1632ed1c9de6 (diff)
downloadgcc-d665f8dde6f4d6c68635cbef972ef7ce085a359b.zip
gcc-d665f8dde6f4d6c68635cbef972ef7ce085a359b.tar.gz
gcc-d665f8dde6f4d6c68635cbef972ef7ce085a359b.tar.bz2
ipa.c (function_and_variable_visibility): Decompose DECL_ONE_ONLY groups when we know they are controlled by LTO.
* ipa.c (function_and_variable_visibility): Decompose DECL_ONE_ONLY groups when we know they are controlled by LTO. * varasm.c (default_binds_local_p_1): If object is in other partition, it will be resolved locally. * lto-partition.c (get_symbol_class): Only unforced DECL_ONE_ONLY needs duplicating, not generic COMDAT. From-SVN: r207489
Diffstat (limited to 'gcc/ipa.c')
-rw-r--r--gcc/ipa.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/gcc/ipa.c b/gcc/ipa.c
index a7e4d76..be75cba 100644
--- a/gcc/ipa.c
+++ b/gcc/ipa.c
@@ -1002,6 +1002,36 @@ function_and_variable_visibility (bool whole_program)
if (DECL_EXTERNAL (decl_node->decl))
DECL_EXTERNAL (node->decl) = 1;
}
+
+ /* If whole comdat group is used only within LTO code, we can dissolve it,
+ we handle the unification ourselves.
+ We keep COMDAT and weak so visibility out of DSO does not change.
+ Later we may bring the symbols static if they are not exported. */
+ if (DECL_ONE_ONLY (node->decl)
+ && (node->resolution == LDPR_PREVAILING_DEF_IRONLY
+ || node->resolution == LDPR_PREVAILING_DEF_IRONLY_EXP))
+ {
+ symtab_node *next = node;
+
+ if (node->same_comdat_group)
+ for (next = node->same_comdat_group;
+ next != node;
+ next = next->same_comdat_group)
+ if (next->externally_visible
+ && (next->resolution != LDPR_PREVAILING_DEF_IRONLY
+ && next->resolution != LDPR_PREVAILING_DEF_IRONLY_EXP))
+ break;
+ if (node == next)
+ {
+ if (node->same_comdat_group)
+ for (next = node->same_comdat_group;
+ next != node;
+ next = next->same_comdat_group)
+ DECL_COMDAT_GROUP (next->decl) = NULL;
+ DECL_COMDAT_GROUP (node->decl) = NULL;
+ symtab_dissolve_same_comdat_group_list (node);
+ }
+ }
}
FOR_EACH_DEFINED_FUNCTION (node)
{