return build4 (ARRAY_REF, gcov_type_node, tree_ctr_tables[counter],
build_int_cst (NULL_TREE, no), NULL, NULL);
}
+
+/* Generate a tree to access the address of COUNTER NO. */
+
+tree
+tree_coverage_counter_addr (unsigned counter, unsigned no)
+{
+ tree gcov_type_node = get_gcov_type ();
+
+ gcc_assert (no < fn_n_ctrs[counter] - fn_b_ctrs[counter]);
+ no += prg_n_ctrs[counter] + fn_b_ctrs[counter];
+
+ /* "no" here is an array index, scaled to bytes later. */
+ return build_fold_addr_expr (build4 (ARRAY_REF, gcov_type_node,
+ tree_ctr_tables[counter],
+ build_int_cst (NULL_TREE, no),
+ NULL, NULL));
+}
\f
/* Generate a checksum for a string. CHKSUM is the current
checksum. */
stmt2 = build_gimple_modify_stmt (gcov_type_tmp_var,
build2 (PLUS_EXPR, gcov_type_node,
gcov_type_tmp_var, one));
- stmt3 = build_gimple_modify_stmt (ref, gcov_type_tmp_var);
+ stmt3 = build_gimple_modify_stmt (unshare_expr (ref), gcov_type_tmp_var);
bsi_insert_on_edge (e, stmt1);
bsi_insert_on_edge (e, stmt2);
bsi_insert_on_edge (e, stmt3);
{
tree stmt = value->hvalue.stmt;
block_stmt_iterator bsi = bsi_for_stmt (stmt);
- tree ref = tree_coverage_counter_ref (tag, base), ref_ptr;
+ tree ref_ptr = tree_coverage_counter_addr (tag, base);
tree call, val;
- ref_ptr = force_gimple_operand_bsi (&bsi,
- build_addr (ref, current_function_decl),
+ ref_ptr = force_gimple_operand_bsi (&bsi, ref_ptr,
true, NULL_TREE, true, BSI_SAME_STMT);
val = prepare_instrumented_value (&bsi, value);
call = build_call_expr (tree_pow2_profiler_fn, 2, ref_ptr, val);
{
tree stmt = value->hvalue.stmt;
block_stmt_iterator bsi = bsi_for_stmt (stmt);
- tree ref = tree_coverage_counter_ref (tag, base), ref_ptr;
+ tree ref_ptr = tree_coverage_counter_addr (tag, base);
tree call, val;
- ref_ptr = force_gimple_operand_bsi (&bsi,
- build_addr (ref, current_function_decl),
+ ref_ptr = force_gimple_operand_bsi (&bsi, ref_ptr,
true, NULL_TREE, true, BSI_SAME_STMT);
val = prepare_instrumented_value (&bsi, value);
call = build_call_expr (tree_one_value_profiler_fn, 2, ref_ptr, val);
tree tmp1, stmt1, stmt2, stmt3;
tree stmt = value->hvalue.stmt;
block_stmt_iterator bsi = bsi_for_stmt (stmt);
- tree ref = tree_coverage_counter_ref (tag, base), ref_ptr;
+ tree ref_ptr = tree_coverage_counter_addr (tag, base);
- ref_ptr = force_gimple_operand_bsi (&bsi,
- build_addr (ref, current_function_decl),
+ ref_ptr = force_gimple_operand_bsi (&bsi, ref_ptr,
true, NULL_TREE, true, BSI_SAME_STMT);
/* Insert code:
{
tree stmt = value->hvalue.stmt;
block_stmt_iterator bsi = bsi_for_stmt (stmt);
- tree ref = tree_coverage_counter_ref (tag, base), ref_ptr;
+ tree ref_ptr = tree_coverage_counter_addr (tag, base);
tree call, val;
- ref_ptr = force_gimple_operand_bsi (&bsi,
- build_addr (ref, current_function_decl),
+ ref_ptr = force_gimple_operand_bsi (&bsi, ref_ptr,
true, NULL_TREE,
true, BSI_SAME_STMT);
val = prepare_instrumented_value (&bsi, value);
{
tree stmt = value->hvalue.stmt;
block_stmt_iterator bsi = bsi_for_stmt (stmt);
- tree ref = tree_coverage_counter_ref (tag, base), ref_ptr;
+ tree ref_ptr = tree_coverage_counter_addr (tag, base);
tree call, val;
- ref_ptr = force_gimple_operand_bsi (&bsi,
- build_addr (ref, current_function_decl),
+ ref_ptr = force_gimple_operand_bsi (&bsi, ref_ptr,
true, NULL_TREE, true, BSI_SAME_STMT);
val = prepare_instrumented_value (&bsi, value);
call = build_call_expr (tree_ior_profiler_fn, 2, ref_ptr, val);