aboutsummaryrefslogtreecommitdiff
path: root/gcc/varpool.c
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2010-05-22 16:48:40 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2010-05-22 14:48:40 +0000
commit9f90e80a1823bfb50fdbdac0eae44205fc436e56 (patch)
treec6700f8a244d310bf2e05c428d125caeecbd1ffe /gcc/varpool.c
parenta2c9fe42531a2ef2259e4128c50632b2df37202b (diff)
downloadgcc-9f90e80a1823bfb50fdbdac0eae44205fc436e56.zip
gcc-9f90e80a1823bfb50fdbdac0eae44205fc436e56.tar.gz
gcc-9f90e80a1823bfb50fdbdac0eae44205fc436e56.tar.bz2
decl2.c (maybe_emit_vtables): Produce same comdat group when outputting comdat vtables.
* 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. From-SVN: r159699
Diffstat (limited to 'gcc/varpool.c')
-rw-r--r--gcc/varpool.c25
1 files changed, 23 insertions, 2 deletions
diff --git a/gcc/varpool.c b/gcc/varpool.c
index 7185c85..73d39f3 100644
--- a/gcc/varpool.c
+++ b/gcc/varpool.c
@@ -194,6 +194,19 @@ varpool_remove_node (struct varpool_node *node)
gcc_assert (varpool_nodes_queue == node);
varpool_nodes_queue = node->next_needed;
}
+ if (node->same_comdat_group)
+ {
+ struct varpool_node *prev;
+ for (prev = node->same_comdat_group;
+ prev->same_comdat_group != node;
+ prev = prev->same_comdat_group)
+ ;
+ if (node->same_comdat_group == prev)
+ prev->same_comdat_group = NULL;
+ else
+ prev->same_comdat_group = node->same_comdat_group;
+ node->same_comdat_group = NULL;
+ }
ipa_remove_all_references (&node->ref_list);
ipa_remove_all_refering (&node->ref_list);
ggc_free (node);
@@ -416,8 +429,9 @@ varpool_analyze_pending_decls (void)
timevar_push (TV_VARPOOL);
while (varpool_first_unanalyzed_node)
{
- tree decl = varpool_first_unanalyzed_node->decl;
- bool analyzed = varpool_first_unanalyzed_node->analyzed;
+ struct varpool_node *node = varpool_first_unanalyzed_node, *next;
+ tree decl = node->decl;
+ bool analyzed = node->analyzed;
varpool_first_unanalyzed_node->analyzed = true;
@@ -435,6 +449,13 @@ varpool_analyze_pending_decls (void)
}
if (DECL_INITIAL (decl))
record_references_in_initializer (decl, analyzed);
+ if (node->same_comdat_group)
+ {
+ for (next = node->same_comdat_group;
+ next != node;
+ next = next->same_comdat_group)
+ varpool_mark_needed_node (next);
+ }
changed = true;
}
timevar_pop (TV_VARPOOL);