diff options
author | Jan Hubicka <jh@suse.cz> | 2010-05-22 16:48:40 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2010-05-22 14:48:40 +0000 |
commit | 9f90e80a1823bfb50fdbdac0eae44205fc436e56 (patch) | |
tree | c6700f8a244d310bf2e05c428d125caeecbd1ffe /gcc/lto-cgraph.c | |
parent | a2c9fe42531a2ef2259e4128c50632b2df37202b (diff) | |
download | gcc-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/lto-cgraph.c')
-rw-r--r-- | gcc/lto-cgraph.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/gcc/lto-cgraph.c b/gcc/lto-cgraph.c index 8b0f8e1..f911c3a 100644 --- a/gcc/lto-cgraph.c +++ b/gcc/lto-cgraph.c @@ -565,12 +565,14 @@ lto_output_node (struct lto_simple_output_block *ob, struct cgraph_node *node, static void lto_output_varpool_node (struct lto_simple_output_block *ob, struct varpool_node *node, + lto_varpool_encoder_t varpool_encoder, cgraph_node_set set, varpool_node_set vset) { bool boundary_p = !varpool_node_in_set_p (node, vset) && node->analyzed; struct bitpack_d *bp; struct varpool_node *alias; int count = 0; + int ref; lto_output_var_decl_index (ob->decl_state, ob->main_stream, node->decl); bp = bitpack_create (); @@ -602,6 +604,14 @@ lto_output_varpool_node (struct lto_simple_output_block *ob, struct varpool_node bp_pack_value (bp, count != 0, 1); lto_output_bitpack (ob->main_stream, bp); bitpack_delete (bp); + if (node->same_comdat_group && !boundary_p) + { + ref = lto_varpool_encoder_lookup (varpool_encoder, node->same_comdat_group); + gcc_assert (ref != LCC_NOT_FOUND); + } + else + ref = LCC_NOT_FOUND; + lto_output_sleb128_stream (ob->main_stream, ref); if (count) { @@ -961,6 +971,7 @@ output_varpool (cgraph_node_set set, varpool_node_set vset) for (i = 0; i < len; i++) { lto_output_varpool_node (ob, lto_varpool_encoder_deref (varpool_encoder, i), + varpool_encoder, set, vset); } @@ -1081,6 +1092,7 @@ input_varpool_node (struct lto_file_decl_data *file_data, struct bitpack_d *bp; bool aliases_p; int count; + int ref = LCC_NOT_FOUND; decl_index = lto_input_uleb128 (ib); var_decl = lto_file_decl_data_get_var_decl (file_data, decl_index); @@ -1098,6 +1110,9 @@ input_varpool_node (struct lto_file_decl_data *file_data, if (node->finalized) varpool_mark_needed_node (node); bitpack_delete (bp); + ref = lto_input_sleb128 (ib); + /* Store a reference for now, and fix up later to be a pointer. */ + node->same_comdat_group = (struct varpool_node *) (intptr_t) ref; if (aliases_p) { count = lto_input_uleb128 (ib); @@ -1291,6 +1306,8 @@ input_varpool_1 (struct lto_file_decl_data *file_data, { unsigned HOST_WIDE_INT len; VEC(varpool_node_ptr, heap) *varpool = NULL; + int i; + struct varpool_node *node; len = lto_input_uleb128 (ib); while (len) @@ -1299,6 +1316,16 @@ input_varpool_1 (struct lto_file_decl_data *file_data, input_varpool_node (file_data, ib)); len--; } + for (i = 0; VEC_iterate (varpool_node_ptr, varpool, i, node); i++) + { + int ref = (int) (intptr_t) node->same_comdat_group; + + /* Fixup same_comdat_group from reference to pointer. */ + if (ref != LCC_NOT_FOUND) + node->same_comdat_group = VEC_index (varpool_node_ptr, varpool, ref); + else + node->same_comdat_group = NULL; + } return varpool; } |