diff options
author | Jan Hubicka <hubicka@ucw.cz> | 2021-11-06 23:36:08 +0100 |
---|---|---|
committer | Jan Hubicka <hubicka@ucw.cz> | 2021-11-06 23:36:08 +0100 |
commit | 6078eb7452aa89cb9aeecac30932b58967389459 (patch) | |
tree | 8b5eb1a8f0131a2b7af6ffd5c866bd7009a1b56c | |
parent | df2135e88a8f78c853b35246ad426b01b6d08378 (diff) | |
download | gcc-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.h | 3 | ||||
-rw-r--r-- | gcc/lto/lto-partition.c | 8 |
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) |