From 644e637fcad77383a8f5711901f7e629e8a71e5f Mon Sep 17 00:00:00 2001 From: Martin Jambor Date: Wed, 5 Jan 2011 15:55:27 +0100 Subject: [PATCH] re PR lto/47162 (LTO is broken) Fix PR lto/47162. 2011-01-05 Martin Jambor 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 --- gcc/ChangeLog | 11 +++++++++++ gcc/lto-cgraph.c | 53 ++++++++++++++++++++++++++++++++++++----------------- 2 files changed, 47 insertions(+), 17 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1a072a5..7b7e7ad 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2011-01-05 Martin Jambor + + 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. + 2011-01-05 Tom Tromey * c-parser.c (c_parser_omp_atomic): Pass location of assignment 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); -- 2.7.4