diff options
author | Martin Jambor <mjambor@suse.cz> | 2011-01-05 15:55:27 +0100 |
---|---|---|
committer | H.J. Lu <hjl@gcc.gnu.org> | 2011-01-05 06:55:27 -0800 |
commit | 644e637fcad77383a8f5711901f7e629e8a71e5f (patch) | |
tree | 931cb4aa88c60a118294f0aa4726fb0a40cbccd9 /gcc/lto-cgraph.c | |
parent | 7bd111573699079b760f18e81439cd7dc5268cca (diff) | |
download | gcc-644e637fcad77383a8f5711901f7e629e8a71e5f.zip gcc-644e637fcad77383a8f5711901f7e629e8a71e5f.tar.gz gcc-644e637fcad77383a8f5711901f7e629e8a71e5f.tar.bz2 |
re PR lto/47162 (LTO is broken)
Fix PR lto/47162.
2011-01-05 Martin Jambor <mjambor@suse.cz>
PR lto/47162
* lto-cgraph.c (output_cgraph_opt_summary_p): Also check for thunk
deltas on streamed outgoing edges.
(output_node_opt_summary): Output info for outgoing edges only when
the node is in new parameter set.
(output_cgraph_opt_summary): New parameter set, passed to the two
aforementioned functions. Update its forward declaration and its
callee too.
From-SVN: r168515
Diffstat (limited to 'gcc/lto-cgraph.c')
-rw-r--r-- | gcc/lto-cgraph.c | 53 |
1 files changed, 36 insertions, 17 deletions
diff --git a/gcc/lto-cgraph.c b/gcc/lto-cgraph.c index b069602..6ca7abc 100644 --- a/gcc/lto-cgraph.c +++ b/gcc/lto-cgraph.c @@ -46,7 +46,7 @@ along with GCC; see the file COPYING3. If not see #include "gcov-io.h" static void output_varpool (cgraph_node_set, varpool_node_set); -static void output_cgraph_opt_summary (void); +static void output_cgraph_opt_summary (cgraph_node_set set); static void input_cgraph_opt_summary (VEC (cgraph_node_ptr, heap) * nodes); @@ -861,7 +861,7 @@ output_cgraph (cgraph_node_set set, varpool_node_set vset) static bool asm_nodes_output = false; if (flag_wpa) - output_cgraph_opt_summary (); + output_cgraph_opt_summary (set); ob = lto_create_simple_output_block (LTO_section_cgraph); @@ -1596,13 +1596,26 @@ input_cgraph (void) /* True when we need optimization summary for NODE. */ static int -output_cgraph_opt_summary_p (struct cgraph_node *node) +output_cgraph_opt_summary_p (struct cgraph_node *node, cgraph_node_set set) { - if (!node->clone_of) - return false; - return (node->clone.tree_map - || node->clone.args_to_skip - || node->clone.combined_args_to_skip); + struct cgraph_edge *e; + + if (cgraph_node_in_set_p (node, set)) + { + for (e = node->callees; e; e = e->next_callee) + if (e->indirect_info + && e->indirect_info->thunk_delta != 0) + return true; + + for (e = node->indirect_calls; e; e = e->next_callee) + if (e->indirect_info->thunk_delta != 0) + return true; + } + + return (node->clone_of + && (node->clone.tree_map + || node->clone.args_to_skip + || node->clone.combined_args_to_skip)); } /* Output optimization summary for EDGE to OB. */ @@ -1621,7 +1634,8 @@ output_edge_opt_summary (struct output_block *ob, static void output_node_opt_summary (struct output_block *ob, - struct cgraph_node *node) + struct cgraph_node *node, + cgraph_node_set set) { unsigned int index; bitmap_iterator bi; @@ -1659,17 +1673,21 @@ output_node_opt_summary (struct output_block *ob, bp_pack_value (&bp, map->ref_p, 1); lto_output_bitpack (&bp); } - for (e = node->callees; e; e = e->next_callee) - output_edge_opt_summary (ob, e); - for (e = node->indirect_calls; e; e = e->next_callee) - output_edge_opt_summary (ob, e); + + if (cgraph_node_in_set_p (node, set)) + { + for (e = node->callees; e; e = e->next_callee) + output_edge_opt_summary (ob, e); + for (e = node->indirect_calls; e; e = e->next_callee) + output_edge_opt_summary (ob, e); + } } /* Output optimization summaries stored in callgraph. At the moment it is the clone info structure. */ static void -output_cgraph_opt_summary (void) +output_cgraph_opt_summary (cgraph_node_set set) { struct cgraph_node *node; int i, n_nodes; @@ -1681,16 +1699,17 @@ output_cgraph_opt_summary (void) encoder = ob->decl_state->cgraph_node_encoder; n_nodes = lto_cgraph_encoder_size (encoder); for (i = 0; i < n_nodes; i++) - if (output_cgraph_opt_summary_p (lto_cgraph_encoder_deref (encoder, i))) + if (output_cgraph_opt_summary_p (lto_cgraph_encoder_deref (encoder, i), + set)) count++; lto_output_uleb128_stream (ob->main_stream, count); for (i = 0; i < n_nodes; i++) { node = lto_cgraph_encoder_deref (encoder, i); - if (output_cgraph_opt_summary_p (node)) + if (output_cgraph_opt_summary_p (node, set)) { lto_output_uleb128_stream (ob->main_stream, i); - output_node_opt_summary (ob, node); + output_node_opt_summary (ob, node, set); } } produce_asm (ob, NULL); |