diff options
author | Jan Hubicka <jh@suse.cz> | 2013-09-02 23:44:35 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2013-09-02 21:44:35 +0000 |
commit | 8e4c9a109a46268407e01b8433892fcd7d2d8942 (patch) | |
tree | 317deda59d23dfd5d2381e6b2955d8f2f7bb28ff /gcc | |
parent | c91061e6b0e1a5ce9484decc9aa208ce00a9af57 (diff) | |
download | gcc-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/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/lto-symtab.c | 20 | ||||
-rw-r--r-- | gcc/symtab.c | 3 |
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, |