Index: gcc/gcc/tree-profile.c |
diff --git a/gcc/gcc/tree-profile.c b/gcc/gcc/tree-profile.c |
index 4467668a8858632e7af13b0f5081987d1d38bfb9..e974329a4880e439a85d0f6f84eeba9cbfad8386 100644 |
--- a/gcc/gcc/tree-profile.c |
+++ b/gcc/gcc/tree-profile.c |
@@ -1,6 +1,6 @@ |
/* Calculate branch probabilities, and basic block execution counts. |
Copyright (C) 1990, 1991, 1992, 1993, 1994, 1996, 1997, 1998, 1999, |
- 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 |
+ 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2010 |
Free Software Foundation, Inc. |
Contributed by James E. Wilson, UC Berkeley/Cygnus Support; |
based on some ideas from Dain Samples of UC Berkeley. |
@@ -73,27 +73,27 @@ tree_init_ic_make_global_vars (void) |
tree gcov_type_ptr; |
ptr_void = build_pointer_type (void_type_node); |
- |
- ic_void_ptr_var |
- = build_decl (VAR_DECL, |
- get_identifier ("__gcov_indirect_call_callee"), |
+ |
+ ic_void_ptr_var |
+ = build_decl (UNKNOWN_LOCATION, VAR_DECL, |
+ get_identifier ("__gcov_indirect_call_callee"), |
ptr_void); |
TREE_STATIC (ic_void_ptr_var) = 1; |
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 |
- = build_decl (VAR_DECL, |
- get_identifier ("__gcov_indirect_call_counters"), |
+ ic_gcov_type_ptr_var |
+ = build_decl (UNKNOWN_LOCATION, VAR_DECL, |
+ get_identifier ("__gcov_indirect_call_counters"), |
gcov_type_ptr); |
TREE_STATIC (ic_gcov_type_ptr_var) = 1; |
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 |
@@ -139,7 +139,7 @@ tree_init_edge_profiler (void) |
one_value_profiler_fn_type); |
tree_init_ic_make_global_vars (); |
- |
+ |
/* void (*) (gcov_type *, gcov_type, void *, void *) */ |
ic_profiler_fn_type |
= build_function_type_list (void_type_node, |
@@ -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); |
} |
} |
@@ -176,8 +184,8 @@ add_abnormal_goto_call_edges (gimple_stmt_iterator gsi) |
make_abnormal_goto_edges (gimple_bb (stmt), true); |
} |
-/* Output instructions as GIMPLE trees to increment the edge |
- execution count, and insert them on E. We rely on |
+/* Output instructions as GIMPLE trees to increment the edge |
+ execution count, and insert them on E. We rely on |
gsi_insert_on_edge to preserve the order. */ |
static void |
@@ -208,12 +216,14 @@ static tree |
prepare_instrumented_value (gimple_stmt_iterator *gsi, histogram_value value) |
{ |
tree val = value->hvalue.value; |
+ if (POINTER_TYPE_P (TREE_TYPE (val))) |
+ val = fold_convert (sizetype, val); |
return force_gimple_operand_gsi (gsi, fold_convert (gcov_type_node, val), |
true, NULL_TREE, true, GSI_SAME_STMT); |
} |
-/* Output instructions as GIMPLE trees to increment the interval histogram |
- counter. VALUE is the expression whose value is profiled. TAG is the |
+/* Output instructions as GIMPLE trees to increment the interval histogram |
+ counter. VALUE is the expression whose value is profiled. TAG is the |
tag of the section for counters, BASE is offset of the counter position. */ |
static void |
@@ -228,7 +238,7 @@ tree_gen_interval_profiler (histogram_value value, unsigned tag, unsigned base) |
value->hdata.intvl.int_start); |
tree steps = build_int_cst_type (unsigned_type_node, |
value->hdata.intvl.steps); |
- |
+ |
ref_ptr = force_gimple_operand_gsi (&gsi, |
build_addr (ref, current_function_decl), |
true, NULL_TREE, true, GSI_SAME_STMT); |
@@ -239,8 +249,8 @@ tree_gen_interval_profiler (histogram_value value, unsigned tag, unsigned base) |
add_abnormal_goto_call_edges (gsi); |
} |
-/* Output instructions as GIMPLE trees to increment the power of two histogram |
- counter. VALUE is the expression whose value is profiled. TAG is the tag |
+/* Output instructions as GIMPLE trees to increment the power of two histogram |
+ counter. VALUE is the expression whose value is profiled. TAG is the tag |
of the section for counters, BASE is offset of the counter position. */ |
static void |
@@ -251,7 +261,7 @@ tree_gen_pow2_profiler (histogram_value value, unsigned tag, unsigned base) |
tree ref_ptr = tree_coverage_counter_addr (tag, base); |
gimple call; |
tree val; |
- |
+ |
ref_ptr = force_gimple_operand_gsi (&gsi, ref_ptr, |
true, NULL_TREE, true, GSI_SAME_STMT); |
val = prepare_instrumented_value (&gsi, value); |
@@ -272,7 +282,7 @@ tree_gen_one_value_profiler (histogram_value value, unsigned tag, unsigned base) |
tree ref_ptr = tree_coverage_counter_addr (tag, base); |
gimple call; |
tree val; |
- |
+ |
ref_ptr = force_gimple_operand_gsi (&gsi, ref_ptr, |
true, NULL_TREE, true, GSI_SAME_STMT); |
val = prepare_instrumented_value (&gsi, value); |
@@ -283,7 +293,7 @@ tree_gen_one_value_profiler (histogram_value value, unsigned tag, unsigned base) |
/* Output instructions as GIMPLE trees for code to find the most |
- common called function in indirect call. |
+ common called function in indirect call. |
VALUE is the call expression whose indirect callee is profiled. |
TAG is the tag of the section for counters, BASE is offset of the |
counter position. */ |
@@ -301,8 +311,8 @@ tree_gen_ic_profiler (histogram_value value, unsigned tag, unsigned base) |
true, NULL_TREE, true, GSI_SAME_STMT); |
/* Insert code: |
- |
- __gcov_indirect_call_counters = get_relevant_counter_ptr (); |
+ |
+ __gcov_indirect_call_counters = get_relevant_counter_ptr (); |
__gcov_indirect_call_callee = (void *) indirect call argument; |
*/ |
@@ -335,9 +345,9 @@ tree_gen_ic_func_profiler (void) |
if (!c_node->needed) |
return; |
- |
+ |
tree_init_edge_profiler (); |
- |
+ |
FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs) |
{ |
tree void0; |
@@ -346,7 +356,7 @@ tree_gen_ic_func_profiler (void) |
gsi = gsi_start_bb (bb); |
cur_func = force_gimple_operand_gsi (&gsi, |
- build_addr (current_function_decl, |
+ build_addr (current_function_decl, |
current_function_decl), |
true, NULL_TREE, |
true, GSI_SAME_STMT); |
@@ -371,7 +381,7 @@ tree_gen_ic_func_profiler (void) |
} |
} |
-/* Output instructions as GIMPLE trees for code to find the most common value |
+/* Output instructions as GIMPLE trees for code to find the most common value |
of a difference between two evaluations of an expression. |
VALUE is the expression whose value is profiled. TAG is the tag of the |
section for counters, BASE is offset of the counter position. */ |
@@ -388,8 +398,8 @@ tree_gen_const_delta_profiler (histogram_value value ATTRIBUTE_UNUSED, |
gcc_unreachable (); |
} |
-/* Output instructions as GIMPLE trees to increment the average histogram |
- counter. VALUE is the expression whose value is profiled. TAG is the |
+/* Output instructions as GIMPLE trees to increment the average histogram |
+ counter. VALUE is the expression whose value is profiled. TAG is the |
tag of the section for counters, BASE is offset of the counter position. */ |
static void |
@@ -400,7 +410,7 @@ tree_gen_average_profiler (histogram_value value, unsigned tag, unsigned base) |
tree ref_ptr = tree_coverage_counter_addr (tag, base); |
gimple call; |
tree val; |
- |
+ |
ref_ptr = force_gimple_operand_gsi (&gsi, ref_ptr, |
true, NULL_TREE, |
true, GSI_SAME_STMT); |
@@ -410,8 +420,8 @@ tree_gen_average_profiler (histogram_value value, unsigned tag, unsigned base) |
add_abnormal_goto_call_edges (gsi); |
} |
-/* Output instructions as GIMPLE trees to increment the ior histogram |
- counter. VALUE is the expression whose value is profiled. TAG is the |
+/* Output instructions as GIMPLE trees to increment the ior histogram |
+ counter. VALUE is the expression whose value is profiled. TAG is the |
tag of the section for counters, BASE is offset of the counter position. */ |
static void |
@@ -422,7 +432,7 @@ tree_gen_ior_profiler (histogram_value value, unsigned tag, unsigned base) |
tree ref_ptr = tree_coverage_counter_addr (tag, base); |
gimple call; |
tree val; |
- |
+ |
ref_ptr = force_gimple_operand_gsi (&gsi, ref_ptr, |
true, NULL_TREE, true, GSI_SAME_STMT); |
val = prepare_instrumented_value (&gsi, value); |
@@ -463,7 +473,7 @@ tree_profiling (void) |
branch_prob (); |
- if (! flag_branch_probabilities |
+ if (! flag_branch_probabilities |
&& flag_profile_values) |
tree_gen_ic_func_profiler (); |
@@ -480,7 +490,7 @@ tree_profiling (void) |
return 0; |
} |
-struct gimple_opt_pass pass_tree_profile = |
+struct gimple_opt_pass pass_tree_profile = |
{ |
{ |
GIMPLE_PASS, |
@@ -492,7 +502,7 @@ struct gimple_opt_pass pass_tree_profile = |
0, /* static_pass_number */ |
TV_BRANCH_PROB, /* tv_id */ |
PROP_gimple_leh | PROP_cfg, /* properties_required */ |
- PROP_gimple_leh | PROP_cfg, /* properties_provided */ |
+ 0, /* properties_provided */ |
0, /* properties_destroyed */ |
0, /* todo_flags_start */ |
TODO_verify_stmts | TODO_dump_func /* todo_flags_finish */ |