diff options
author | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-05-08 11:00:55 +0000 |
---|---|---|
committer | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-05-08 11:00:55 +0000 |
commit | 48bbff00c4453854d00398d7cbb1a1b08369f1b1 (patch) | |
tree | dde67024cbc57a0af68b122cd0ddd8d4020977b8 | |
parent | 992a05af85e156af889dc50d6b41edae8f10486a (diff) | |
download | gcc-48bbff00c4453854d00398d7cbb1a1b08369f1b1.tar.gz |
PR lto/54095
lto-symtab.c (lto_symtab_symbol_p): New function.
(lto_symtab_resolve_can_prevail_p, lto_symtab_resolve_symbols,
lto_symtab_resolve_symbols, lto_symtab_merge_decls_2,
lto_symtab_merge_decls_1, lto_symtab_merge_cgraph_nodes_1):
Skip static symbols.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@198707 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/lto-symtab.c | 45 |
2 files changed, 40 insertions, 14 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 864c1ae2955..452b1e20232 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2013-05-08 Jan Hubicka <jh@suse.cz> + + PR lto/54095 + lto-symtab.c (lto_symtab_symbol_p): New function. + (lto_symtab_resolve_can_prevail_p, lto_symtab_resolve_symbols, + lto_symtab_resolve_symbols, lto_symtab_merge_decls_2, + lto_symtab_merge_decls_1, lto_symtab_merge_cgraph_nodes_1): + Skip static symbols. + 2013-05-08 Paolo Carlini <paolo.carlini@oracle.com> PR tree-optimization/57200 diff --git a/gcc/lto-symtab.c b/gcc/lto-symtab.c index 2b182ffaedf..b28fe63aa85 100644 --- a/gcc/lto-symtab.c +++ b/gcc/lto-symtab.c @@ -226,12 +226,24 @@ lto_symtab_resolve_replaceable_p (symtab_node e) return false; } +/* Return true, if the symbol E should be resolved by lto-symtab. + Those are all real symbols that are not static (we handle renaming + of static later in partitioning). */ + +static bool +lto_symtab_symbol_p (symtab_node e) +{ + if (!TREE_PUBLIC (e->symbol.decl)) + return false; + return symtab_real_symbol_p (e); +} + /* Return true if the symtab entry E can be the prevailing one. */ static bool lto_symtab_resolve_can_prevail_p (symtab_node e) { - if (!symtab_real_symbol_p (e)) + if (!lto_symtab_symbol_p (e)) return false; /* The C++ frontend ends up neither setting TREE_STATIC nor @@ -261,7 +273,7 @@ lto_symtab_resolve_symbols (symtab_node first) /* Always set e->node so that edges are updated to reflect decl merging. */ for (e = first; e; e = e->symbol.next_sharing_asm_name) - if (symtab_real_symbol_p (e) + if (lto_symtab_symbol_p (e) && (e->symbol.resolution == LDPR_PREVAILING_DEF_IRONLY || e->symbol.resolution == LDPR_PREVAILING_DEF_IRONLY_EXP || e->symbol.resolution == LDPR_PREVAILING_DEF)) @@ -275,7 +287,7 @@ lto_symtab_resolve_symbols (symtab_node first) { /* Assert it's the only one. */ for (e = prevailing->symbol.next_sharing_asm_name; e; e = e->symbol.next_sharing_asm_name) - if (symtab_real_symbol_p (e) + if (lto_symtab_symbol_p (e) && (e->symbol.resolution == LDPR_PREVAILING_DEF_IRONLY || e->symbol.resolution == LDPR_PREVAILING_DEF_IRONLY_EXP || e->symbol.resolution == LDPR_PREVAILING_DEF)) @@ -310,8 +322,7 @@ lto_symtab_resolve_symbols (symtab_node first) /* Do a second round choosing one from the replaceable prevailing decls. */ for (e = first; e; e = e->symbol.next_sharing_asm_name) { - if (!lto_symtab_resolve_can_prevail_p (e) - || !symtab_real_symbol_p (e)) + if (!lto_symtab_resolve_can_prevail_p (e)) continue; /* Choose the first function that can prevail as prevailing. */ @@ -365,11 +376,12 @@ lto_symtab_merge_decls_2 (symtab_node first, bool diagnosed_p) /* Try to merge each entry with the prevailing one. */ for (e = prevailing->symbol.next_sharing_asm_name; e; e = e->symbol.next_sharing_asm_name) - { - if (!lto_symtab_merge (prevailing, e) - && !diagnosed_p) - mismatches.safe_push (e->symbol.decl); - } + if (TREE_PUBLIC (e->symbol.decl)) + { + if (!lto_symtab_merge (prevailing, e) + && !diagnosed_p) + mismatches.safe_push (e->symbol.decl); + } if (mismatches.is_empty ()) return; @@ -411,7 +423,8 @@ lto_symtab_merge_decls_1 (symtab_node first) fprintf (cgraph_dump_file, "Merging nodes for %s. Candidates:\n", symtab_node_asm_name (first)); for (e = first; e; e = e->symbol.next_sharing_asm_name) - dump_symtab_node (cgraph_dump_file, e); + if (TREE_PUBLIC (e->symbol.decl)) + dump_symtab_node (cgraph_dump_file, e); } /* Compute the symbol resolutions. This is a no-op when using the @@ -436,7 +449,8 @@ lto_symtab_merge_decls_1 (symtab_node first) for (e = prevailing->symbol.next_sharing_asm_name; e; e = e->symbol.next_sharing_asm_name) if (!COMPLETE_TYPE_P (TREE_TYPE (prevailing->symbol.decl)) - && COMPLETE_TYPE_P (TREE_TYPE (e->symbol.decl))) + && COMPLETE_TYPE_P (TREE_TYPE (e->symbol.decl)) + && lto_symtab_symbol_p (e)) prevailing = e; } /* For variables prefer the non-builtin if one is available. */ @@ -444,7 +458,8 @@ lto_symtab_merge_decls_1 (symtab_node first) { for (e = first; e; e = e->symbol.next_sharing_asm_name) if (TREE_CODE (e->symbol.decl) == FUNCTION_DECL - && !DECL_BUILT_IN (e->symbol.decl)) + && !DECL_BUILT_IN (e->symbol.decl) + && lto_symtab_symbol_p (e)) { prevailing = e; break; @@ -461,6 +476,8 @@ lto_symtab_merge_decls_1 (symtab_node first) if (TREE_CODE (prevailing->symbol.decl) == TREE_CODE (e->symbol.decl)) continue; + if (!lto_symtab_symbol_p (e)) + continue; switch (TREE_CODE (prevailing->symbol.decl)) { @@ -530,7 +547,7 @@ lto_symtab_merge_cgraph_nodes_1 (symtab_node prevailing) { next = e->symbol.next_sharing_asm_name; - if (!symtab_real_symbol_p (e)) + if (!lto_symtab_symbol_p (e)) continue; cgraph_node *ce = dyn_cast <cgraph_node> (e); if (ce && !DECL_BUILT_IN (e->symbol.decl)) |