aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Hubicka <hubicka@ucw.cz>2021-11-06 23:36:08 +0100
committerJan Hubicka <hubicka@ucw.cz>2021-11-06 23:36:08 +0100
commit6078eb7452aa89cb9aeecac30932b58967389459 (patch)
tree8b5eb1a8f0131a2b7af6ffd5c866bd7009a1b56c
parentdf2135e88a8f78c853b35246ad426b01b6d08378 (diff)
downloadgcc-6078eb7452aa89cb9aeecac30932b58967389459.zip
gcc-6078eb7452aa89cb9aeecac30932b58967389459.tar.gz
gcc-6078eb7452aa89cb9aeecac30932b58967389459.tar.bz2
Fix can_be_discarded_p wrt partitioned functions.
gcc/ChangeLog: * cgraph.h (cgraph_node::can_be_discarded_p): Do not return true on functions from other partition. gcc/lto/ChangeLog: PR ipa/103070 PR ipa/103058 * lto-partition.c (must_not_rename): Update comment. (promote_symbol): Set resolution to LDPR_PREVAILING_DEF_IRONLY.
-rw-r--r--gcc/cgraph.h3
-rw-r--r--gcc/lto/lto-partition.c8
2 files changed, 9 insertions, 2 deletions
diff --git a/gcc/cgraph.h b/gcc/cgraph.h
index 4cdb373..0a1f7c8 100644
--- a/gcc/cgraph.h
+++ b/gcc/cgraph.h
@@ -404,7 +404,8 @@ public:
inline bool
can_be_discarded_p (void)
{
- return (DECL_EXTERNAL (decl)
+ return ((DECL_EXTERNAL (decl)
+ && !in_other_partition)
|| ((get_comdat_group ()
|| DECL_COMMON (decl)
|| (DECL_SECTION_NAME (decl) && DECL_WEAK (decl)))
diff --git a/gcc/lto/lto-partition.c b/gcc/lto/lto-partition.c
index 15761ac..bee4021 100644
--- a/gcc/lto/lto-partition.c
+++ b/gcc/lto/lto-partition.c
@@ -852,7 +852,9 @@ must_not_rename (symtab_node *node, const char *name)
/* Avoid mangling of already mangled clones.
??? should have a flag whether a symbol has a 'private' name already,
since we produce some symbols like that i.e. for global constructors
- that are not really clones. */
+ that are not really clones.
+ ??? it is what unique_name means. We only need to set it when doing
+ private symbols. */
if (node->unique_name)
{
if (dump_file)
@@ -995,6 +997,10 @@ promote_symbol (symtab_node *node)
defined by the non-LTO part. */
privatize_symbol_name (node);
TREE_PUBLIC (node->decl) = 1;
+ /* After privatization the node should not conflict with any other symbol,
+ so it is prevailing. This is important to keep binds_to_current_def_p
+ to work across partitions. */
+ node->resolution = LDPR_PREVAILING_DEF_IRONLY;
DECL_VISIBILITY (node->decl) = VISIBILITY_HIDDEN;
DECL_VISIBILITY_SPECIFIED (node->decl) = true;
if (dump_file)