diff options
author | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-05-22 14:48:40 +0000 |
---|---|---|
committer | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-05-22 14:48:40 +0000 |
commit | 933b10c65ef30c7ad6d743a451953289b00a4215 (patch) | |
tree | c6700f8a244d310bf2e05c428d125caeecbd1ffe /gcc/ipa.c | |
parent | 240a46818514dd43ddb46b9e5630eacb75ca96ba (diff) | |
download | gcc-933b10c65ef30c7ad6d743a451953289b00a4215.tar.gz |
* decl2.c (maybe_emit_vtables): Produce same comdat group when outputting
comdat vtables.
(cxx_callgraph_analyze_expr): Remove code marking vtables needed.
* cgraph.h (struct varpool_node): Add same_comdat_group.
* lto-cgrpah.c (lto_output_varpool_node): Output same_comdat_group
pointer.
(output_varpool): Update call of lto_output_varpool_node.
(input_varpool): Read same_comdat_group pointer.
(input_varpool_1): Fixup same_comdat_group pointer.
* ipa.c (cgraph_remove_unreachable_nodes): WHen one of same comdat
group is needed, all are.
* varpool.c (varpool_remove_node): Remove node from same comdat group
linklist too.
(varpool_analyze_pending_decls): Walk same comdat groups.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@159699 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ipa.c')
-rw-r--r-- | gcc/ipa.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/gcc/ipa.c b/gcc/ipa.c index c8b0d7b385d..319a3f1b8bb 100644 --- a/gcc/ipa.c +++ b/gcc/ipa.c @@ -334,6 +334,21 @@ cgraph_remove_unreachable_nodes (bool before_inlining_p, FILE *file) first_varpool = (struct varpool_node *)first_varpool->aux; vnode->aux = NULL; process_references (&vnode->ref_list, &first, &first_varpool, before_inlining_p); + /* If any function in a comdat group is reachable, force + all other functions in the same comdat group to be + also reachable. */ + if (vnode->same_comdat_group) + { + struct varpool_node *next; + for (next = vnode->same_comdat_group; + next != vnode; + next = next->same_comdat_group) + if (!next->needed) + { + varpool_mark_needed_node (next); + enqueue_varpool_node (next, &first_varpool); + } + } } } |