aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2013-09-02 23:44:35 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2013-09-02 21:44:35 +0000
commit8e4c9a109a46268407e01b8433892fcd7d2d8942 (patch)
tree317deda59d23dfd5d2381e6b2955d8f2f7bb28ff /gcc
parentc91061e6b0e1a5ce9484decc9aa208ce00a9af57 (diff)
downloadgcc-8e4c9a109a46268407e01b8433892fcd7d2d8942.zip
gcc-8e4c9a109a46268407e01b8433892fcd7d2d8942.tar.gz
gcc-8e4c9a109a46268407e01b8433892fcd7d2d8942.tar.bz2
lto-symtab.c (lto_symtab_merge_symbols): Add comments; merge duplicated nodes for assembler names.
* lto-symtab.c (lto_symtab_merge_symbols): Add comments; merge duplicated nodes for assembler names. * symtab.c (symtab_unregister_node): Do not attempt to unlink hard registers from assembler name hash. From-SVN: r202186
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/lto-symtab.c20
-rw-r--r--gcc/symtab.c3
3 files changed, 28 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 359b9d8..4c9554a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,12 @@
2013-09-02 Jan Hubicka <jh@suse.cz>
+ * lto-symtab.c (lto_symtab_merge_symbols): Add comments; merge
+ duplicated nodes for assembler names.
+ * symtab.c (symtab_unregister_node): Do not attempt to unlink
+ hard registers from assembler name hash.
+
+2013-09-02 Jan Hubicka <jh@suse.cz>
+
* ipa-split.c (execute_split_functions): Split externally visible
functions called once.
diff --git a/gcc/lto-symtab.c b/gcc/lto-symtab.c
index 83026ef..76e9440 100644
--- a/gcc/lto-symtab.c
+++ b/gcc/lto-symtab.c
@@ -586,6 +586,9 @@ lto_symtab_merge_symbols (void)
FOR_EACH_SYMBOL (node)
{
cgraph_node *cnode, *cnode2;
+ varpool_node *vnode;
+ symtab_node node2;
+
if (!node->symbol.analyzed && node->symbol.alias_target)
{
symtab_node tgt = symtab_node_for_asm (node->symbol.alias_target);
@@ -594,22 +597,37 @@ lto_symtab_merge_symbols (void)
symtab_resolve_alias (node, tgt);
}
node->symbol.aux = NULL;
-
+
if (!(cnode = dyn_cast <cgraph_node> (node))
|| !cnode->clone_of
|| cnode->clone_of->symbol.decl != cnode->symbol.decl)
{
+ /* Builtins are not merged via decl merging. It is however
+ possible that tree merging unified the declaration. We
+ do not want duplicate entries in symbol table. */
if (cnode && DECL_BUILT_IN (node->symbol.decl)
&& (cnode2 = cgraph_get_node (node->symbol.decl))
&& cnode2 != cnode)
lto_cgraph_replace_node (cnode2, cnode);
+ /* The user defined assembler variables are also not unified by their
+ symbol name (since it is irrelevant), but we need to unify symbol
+ nodes if tree merging occured. */
+ if ((vnode = dyn_cast <varpool_node> (node))
+ && DECL_HARD_REGISTER (vnode->symbol.decl)
+ && (node2 = symtab_get_node (vnode->symbol.decl))
+ && node2 != node)
+ lto_varpool_replace_node (dyn_cast <varpool_node> (node2),
+ vnode);
+
+
/* Abstract functions may have duplicated cgraph nodes attached;
remove them. */
else if (cnode && DECL_ABSTRACT (cnode->symbol.decl)
&& (cnode2 = cgraph_get_node (node->symbol.decl))
&& cnode2 != cnode)
cgraph_remove_node (cnode2);
+
symtab_insert_node_to_hashtable ((symtab_node)node);
}
}
diff --git a/gcc/symtab.c b/gcc/symtab.c
index bfbc03b..253ba98 100644
--- a/gcc/symtab.c
+++ b/gcc/symtab.c
@@ -283,7 +283,8 @@ symtab_unregister_node (symtab_node node)
else
*slot = replacement_node;
}
- unlink_from_assembler_name_hash (node, false);
+ if (!is_a <varpool_node> (node) || !DECL_HARD_REGISTER (node->symbol.decl))
+ unlink_from_assembler_name_hash (node, false);
}
/* Return symbol table node associated with DECL, if any,