aboutsummaryrefslogtreecommitdiff
path: root/gcc/lto-cgraph.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/lto-cgraph.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/lto-cgraph.c')
-rw-r--r--gcc/lto-cgraph.c27
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;
}