summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2013-05-08 11:00:55 +0000
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2013-05-08 11:00:55 +0000
commit48bbff00c4453854d00398d7cbb1a1b08369f1b1 (patch)
treedde67024cbc57a0af68b122cd0ddd8d4020977b8
parent992a05af85e156af889dc50d6b41edae8f10486a (diff)
downloadgcc-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/ChangeLog9
-rw-r--r--gcc/lto-symtab.c45
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))