From: Jakub Jelinek Date: Mon, 7 Sep 2020 07:54:38 +0000 (+0200) Subject: lto: Stream edge goto_locus [PR94235] X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=fea13fcd0da0353520eb2675ad24c2f296611b85;p=gcc.git lto: Stream edge goto_locus [PR94235] The following patch adds streaming of edge goto_locus (both LOCATION_LOCUS and LOCATION_BLOCK from it), the PR shows a testcase (inappropriate for gcc testsuite) where the lack of streaming of goto_locus results in worse debug info. Earlier version of the patch (without the output_function changes) failed miserably, because on the order mismatch - input_function would first input_cfg, then input_eh_regions and then input_bb (all of which now have locations), while output_function used output_eh_regions, then output_bb and then output_cfg. *_cfg went to a separate stream... Now, is there a reason why the order is different? If the intent is that the cfg could be read separately from the rest of function or vice versa, alternatively we'd need to clear_line_info (); before output_eh_regions and before/after output_cfg to make them independent. 2020-09-07 Jakub Jelinek PR debug/94235 * lto-streamer-out.c (output_cfg): Also stream goto_locus for edges. Use bp_pack_var_len_unsigned instead of streamer_write_uhwi to stream e->dest->index and e->flags. (output_function): Call output_cfg before output_ssa_name, rather than after streaming all bbs. * lto-streamer-in.c (input_cfg): Stream in goto_locus for edges. Use bp_unpack_var_len_unsigned instead of streamer_read_uhwi to stream in dest_index and edge_flags. --- diff --git a/gcc/lto-streamer-in.c b/gcc/lto-streamer-in.c index 783ecc064a9..32289d8d71c 100644 --- a/gcc/lto-streamer-in.c +++ b/gcc/lto-streamer-in.c @@ -780,23 +780,19 @@ input_cfg (class lto_input_block *ib, class data_in *data_in, /* Connect up the CFG. */ for (i = 0; i < edge_count; i++) { - unsigned int dest_index; - unsigned int edge_flags; - basic_block dest; - profile_probability probability; - edge e; - - dest_index = streamer_read_uhwi (ib); - probability = profile_probability::stream_in (ib); - edge_flags = streamer_read_uhwi (ib); - - dest = BASIC_BLOCK_FOR_FN (fn, dest_index); + bitpack_d bp = streamer_read_bitpack (ib); + unsigned int dest_index = bp_unpack_var_len_unsigned (&bp); + unsigned int edge_flags = bp_unpack_var_len_unsigned (&bp); + basic_block dest = BASIC_BLOCK_FOR_FN (fn, dest_index); if (dest == NULL) dest = make_new_block (fn, dest_index); - e = make_edge (bb, dest, edge_flags); - e->probability = probability; + edge e = make_edge (bb, dest, edge_flags); + data_in->location_cache.input_location_and_block (&e->goto_locus, + &bp, ib, data_in); + e->probability = profile_probability::stream_in (ib); + } index = streamer_read_hwi (ib); diff --git a/gcc/lto-streamer-out.c b/gcc/lto-streamer-out.c index b2d58106c49..884ce988e5f 100644 --- a/gcc/lto-streamer-out.c +++ b/gcc/lto-streamer-out.c @@ -2100,9 +2100,11 @@ output_cfg (struct output_block *ob, struct function *fn) streamer_write_uhwi (ob, EDGE_COUNT (bb->succs)); FOR_EACH_EDGE (e, ei, bb->succs) { - streamer_write_uhwi (ob, e->dest->index); + bitpack_d bp = bitpack_create (ob->main_stream); + bp_pack_var_len_unsigned (&bp, e->dest->index); + bp_pack_var_len_unsigned (&bp, e->flags); + stream_output_location_and_block (ob, &bp, e->goto_locus); e->probability.stream_out (ob); - streamer_write_uhwi (ob, e->flags); } } @@ -2418,6 +2420,8 @@ output_function (struct cgraph_node *node) streamer_write_uhwi (ob, 1); output_struct_function_base (ob, fn); + output_cfg (ob, fn); + /* Output all the SSA names used in the function. */ output_ssa_names (ob, fn); @@ -2430,8 +2434,6 @@ output_function (struct cgraph_node *node) /* The terminator for this function. */ streamer_write_record_start (ob, LTO_null); - - output_cfg (ob, fn); } else streamer_write_uhwi (ob, 0);