lto-cgraph.c: Include gcov-io.h

* lto-cgraph.c: Include gcov-io.h
	(output_profile_summary): New function.
	(output_cgraph): Use it.
	(input_profile_summary): New function.
	(input_cgraph): Use it.
	* coverage.c (build_ctr_info_value): Use varpool; initalize
	DECL_ASSEMBLER_NAME.
	(create_coverage): Likewise.
	* tree-profile.c (tree_init_ic_make_global_vars): Likewise.
	(tree_init_edge_profiler): Likewise.
	* Makefile.in (lto-cgraph.o): Add dependency on gcov-io.h.

From-SVN: r154100
This commit is contained in:
Jan Hubicka 2009-11-11 20:08:44 +01:00 committed by Jan Hubicka
parent 17e7cb8550
commit 0bc1b77f32
5 changed files with 80 additions and 5 deletions

View File

@ -1,3 +1,17 @@
2009-11-11 Jan Hubicka <jh@suse.cz>
* lto-cgraph.c: Include gcov-io.h
(output_profile_summary): New function.
(output_cgraph): Use it.
(input_profile_summary): New function.
(input_cgraph): Use it.
* coverage.c (build_ctr_info_value): Use varpool; initalize
DECL_ASSEMBLER_NAME.
(create_coverage): Likewise.
* tree-profile.c (tree_init_ic_make_global_vars): Likewise.
(tree_init_edge_profiler): Likewise.
* Makefile.in (lto-cgraph.o): Add dependency on gcov-io.h.
2009-11-11 Kai Tietz <kai.tietz@onevision.com>
* config/i386/cygming.h (HANDLE_PRAGMA_PUSH_POP_MACRO):

View File

@ -2199,7 +2199,7 @@ lto-cgraph.o: lto-cgraph.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
$(TM_H) $(TOPLEV_H) $(EXPR_H) $(FLAGS_H) $(PARAMS_H) input.h \
$(VARRAY_H) $(HASHTAB_H) langhooks.h $(BASIC_BLOCK_H) \
$(TREE_FLOW_H) $(CGRAPH_H) $(FUNCTION_H) $(GGC_H) $(DIAGNOSTIC_H) \
except.h $(TIMEVAR_H) output.h pointer-set.h $(LTO_STREAMER_H)
except.h $(TIMEVAR_H) output.h pointer-set.h $(LTO_STREAMER_H) $(GCOV_IO_H)
lto-streamer-in.o: lto-streamer-in.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
$(TM_H) $(TOPLEV_H) $(EXPR_H) $(FLAGS_H) $(PARAMS_H) input.h $(VARRAY_H) \
$(HASHTAB_H) $(BASIC_BLOCK_H) $(TREE_FLOW_H) $(TREE_PASS_H) $(CGRAPH_H) \

View File

@ -776,7 +776,7 @@ build_ctr_info_value (unsigned int counter, tree type)
TREE_TYPE (tree_ctr_tables[counter]) = array_type;
DECL_SIZE (tree_ctr_tables[counter]) = TYPE_SIZE (array_type);
DECL_SIZE_UNIT (tree_ctr_tables[counter]) = TYPE_SIZE_UNIT (array_type);
assemble_variable (tree_ctr_tables[counter], 0, 0, 0);
varpool_finalize_decl (tree_ctr_tables[counter]);
value = tree_cons (fields,
build1 (ADDR_EXPR, TREE_TYPE (fields),
@ -795,6 +795,7 @@ build_ctr_info_value (unsigned int counter, tree type)
TREE_PUBLIC (fn) = 1;
DECL_ARTIFICIAL (fn) = 1;
TREE_NOTHROW (fn) = 1;
DECL_ASSEMBLER_NAME (fn); /* Initialize assembler name so we can stream out. */
value = tree_cons (fields,
build1 (ADDR_EXPR, TREE_TYPE (fields), fn),
value);
@ -971,7 +972,7 @@ create_coverage (void)
DECL_INITIAL (gcov_info) = t;
/* Build structure. */
assemble_variable (gcov_info, 0, 0, 0);
varpool_finalize_decl (gcov_info);
/* Build a decl for __gcov_init. */
t = build_pointer_type (TREE_TYPE (gcov_info));
@ -980,6 +981,7 @@ create_coverage (void)
FUNCTION_DECL, get_identifier ("__gcov_init"), t);
TREE_PUBLIC (t) = 1;
DECL_EXTERNAL (t) = 1;
DECL_ASSEMBLER_NAME (t); /* Initialize assembler name so we can stream out. */
gcov_init = t;
/* Generate a call to __gcov_init(&gcov_info). */

View File

@ -45,6 +45,7 @@ along with GCC; see the file COPYING3. If not see
#include "output.h"
#include "pointer-set.h"
#include "lto-streamer.h"
#include "gcov-io.h"
/* Create a new cgraph encoder. */
@ -307,6 +308,24 @@ lto_output_node (struct lto_simple_output_block *ob, struct cgraph_node *node,
lto_output_uleb128_stream (ob->main_stream, node->global.inlined);
}
/* Stream out profile_summary to OB. */
static void
output_profile_summary (struct lto_simple_output_block *ob)
{
if (profile_info)
{
/* We do not output num, it is not terribly useful. */
gcc_assert (profile_info->runs);
lto_output_uleb128_stream (ob->main_stream, profile_info->runs);
lto_output_sleb128_stream (ob->main_stream, profile_info->sum_all);
lto_output_sleb128_stream (ob->main_stream, profile_info->run_max);
lto_output_sleb128_stream (ob->main_stream, profile_info->sum_max);
}
else
lto_output_uleb128_stream (ob->main_stream, 0);
}
/* Output the part of the cgraph in SET. */
@ -324,6 +343,8 @@ output_cgraph (cgraph_node_set set)
ob = lto_create_simple_output_block (LTO_section_cgraph);
output_profile_summary (ob);
/* An encoder for cgraph nodes should have been created by
ipa_write_summaries_1. */
gcc_assert (ob->decl_state->cgraph_node_encoder);
@ -642,6 +663,35 @@ input_cgraph_1 (struct lto_file_decl_data *file_data,
VEC_free (cgraph_node_ptr, heap, nodes);
}
static struct gcov_ctr_summary lto_gcov_summary;
/* Input profile_info from IB. */
static void
input_profile_summary (struct lto_input_block *ib)
{
unsigned int runs = lto_input_uleb128 (ib);
if (runs)
{
if (!profile_info)
{
profile_info = &lto_gcov_summary;
lto_gcov_summary.runs = runs;
lto_gcov_summary.sum_all = lto_input_sleb128 (ib);
lto_gcov_summary.run_max = lto_input_sleb128 (ib);
lto_gcov_summary.sum_max = lto_input_sleb128 (ib);
}
/* We can support this by scaling all counts to nearest common multiple
of all different runs, but it is perhaps not worth the effort. */
else if (profile_info->runs != runs
|| profile_info->sum_all != lto_input_sleb128 (ib)
|| profile_info->run_max != lto_input_sleb128 (ib)
|| profile_info->sum_max != lto_input_sleb128 (ib))
sorry ("Combining units with different profiles is not supported.");
/* We allow some units to have profile and other to not have one. This will
just make unprofiled units to be size optimized that is sane. */
}
}
/* Input and merge the cgraph from each of the .o files passed to
lto1. */
@ -662,6 +712,7 @@ input_cgraph (void)
ib = lto_create_simple_input_block (file_data, LTO_section_cgraph,
&data, &len);
input_profile_summary (ib);
file_data->cgraph_node_encoder = lto_cgraph_encoder_new ();
input_cgraph_1 (file_data, ib);
lto_destroy_simple_input_block (file_data, LTO_section_cgraph,

View File

@ -82,7 +82,7 @@ tree_init_ic_make_global_vars (void)
TREE_PUBLIC (ic_void_ptr_var) = 0;
DECL_ARTIFICIAL (ic_void_ptr_var) = 1;
DECL_INITIAL (ic_void_ptr_var) = NULL;
assemble_variable (ic_void_ptr_var, 0, 0, 0);
varpool_finalize_decl (ic_void_ptr_var);
gcov_type_ptr = build_pointer_type (get_gcov_type ());
ic_gcov_type_ptr_var
@ -93,7 +93,7 @@ tree_init_ic_make_global_vars (void)
TREE_PUBLIC (ic_gcov_type_ptr_var) = 0;
DECL_ARTIFICIAL (ic_gcov_type_ptr_var) = 1;
DECL_INITIAL (ic_gcov_type_ptr_var) = NULL;
assemble_variable (ic_gcov_type_ptr_var, 0, 0, 0);
varpool_finalize_decl (ic_gcov_type_ptr_var);
}
static void
@ -159,6 +159,14 @@ tree_init_edge_profiler (void)
tree_ior_profiler_fn
= build_fn_decl ("__gcov_ior_profiler",
average_profiler_fn_type);
/* LTO streamer needs assembler names. Because we create these decls
late, we need to initialize them by hand. */
DECL_ASSEMBLER_NAME (tree_interval_profiler_fn);
DECL_ASSEMBLER_NAME (tree_pow2_profiler_fn);
DECL_ASSEMBLER_NAME (tree_one_value_profiler_fn);
DECL_ASSEMBLER_NAME (tree_indirect_call_profiler_fn);
DECL_ASSEMBLER_NAME (tree_average_profiler_fn);
DECL_ASSEMBLER_NAME (tree_ior_profiler_fn);
}
}