Hi, so the only point of removing this is the fact that builds would be not reproducible with indir-call-topn-profile? I still kind of thing it may be useful to track multiple most common values, so I would be in favour of keeping it just updating the documentation of indir-call-topn-profile that it is currently incomplete and does not lead to reproducible builds and does not handle speculation...
Honza > > gcc/ChangeLog: > > 2019-06-04 Martin Liska <mli...@suse.cz> > > * doc/invoke.texi: Remove param. > * gcov-counter.def (GCOV_COUNTER_ICALL_TOPNV): > Remove. > * gcov-io.h (GCOV_ICALL_TOPN_VAL): Likewise. > (GCOV_ICALL_TOPN_NCOUNTS): Likewise. > * params.def (PARAM_INDIR_CALL_TOPN_PROFILE): Likewise. > * profile.c (instrument_values): Remove > HIST_TYPE_INDIR_CALL_TOPN. > * tree-profile.c (init_ic_make_global_vars): > Always build __gcov_indirect_call only. > (gimple_init_gcov_profiler): Remove usage > of PARAM_INDIR_CALL_TOPN_PROFILE. > (gimple_gen_ic_profiler): Likewise. > * value-prof.c (dump_histogram_value): Likewise. > (stream_in_histogram_value): Likewise. > (gimple_indirect_call_to_profile): Likewise. > (gimple_find_values_to_profile): Likewise. > * value-prof.h (enum hist_type): Likewise. > > libgcc/ChangeLog: > > 2019-06-04 Martin Liska <mli...@suse.cz> > > * Makefile.in: Remove usage of > _gcov_merge_icall_topn. > * libgcov-driver.c (gcov_sort_n_vals): Remove. > (gcov_sort_icall_topn_counter): Likewise. > (gcov_sort_topn_counter_arrays): Likewise. > (dump_one_gcov): Remove call to gcov_sort_topn_counter_arrays. > * libgcov-merge.c (__gcov_merge_icall_topn): Remove. > * libgcov-profiler.c (__gcov_topn_value_profiler_body): > Likewise. > (GCOV_ICALL_COUNTER_CLEAR_THRESHOLD): Remove. > (struct indirect_call_tuple): Remove. > (__gcov_indirect_call_topn_profiler): Remove. > * libgcov-util.c (__gcov_icall_topn_counter_op): Remove. > * libgcov.h (gcov_sort_n_vals): Remove. > (L_gcov_merge_icall_topn): Likewise. > (__gcov_merge_icall_topn): Likewise. > (__gcov_indirect_call_topn_profiler): Likewise. > --- > gcc/doc/invoke.texi | 3 - > gcc/gcov-counter.def | 3 - > gcc/gcov-io.h | 6 -- > gcc/params.def | 8 --- > gcc/profile.c | 1 - > gcc/tree-profile.c | 14 +--- > gcc/value-prof.c | 32 +-------- > gcc/value-prof.h | 2 - > libgcc/Makefile.in | 5 +- > libgcc/libgcov-driver.c | 80 ----------------------- > libgcc/libgcov-merge.c | 62 ------------------ > libgcc/libgcov-profiler.c | 133 -------------------------------------- > libgcc/libgcov-util.c | 19 ------ > libgcc/libgcov.h | 7 -- > 14 files changed, 5 insertions(+), 370 deletions(-) > > diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi > index 91c9bb89651..50e50e39413 100644 > --- a/gcc/doc/invoke.texi > +++ b/gcc/doc/invoke.texi > @@ -12140,9 +12140,6 @@ will not try to thread through its block. > Maximum number of nested calls to search for control dependencies > during uninitialized variable analysis. > > -@item indir-call-topn-profile > -Track top N target addresses in indirect-call profile. > - > @item max-once-peeled-insns > The maximum number of insns of a peeled loop that rolls only once. > > diff --git a/gcc/gcov-counter.def b/gcc/gcov-counter.def > index 3a0e620987a..b0596c8dc6b 100644 > --- a/gcc/gcov-counter.def > +++ b/gcc/gcov-counter.def > @@ -49,6 +49,3 @@ DEF_GCOV_COUNTER(GCOV_COUNTER_IOR, "ior", _ior) > > /* Time profile collecting first run of a function */ > DEF_GCOV_COUNTER(GCOV_TIME_PROFILER, "time_profiler", _time_profile) > - > -/* Top N value tracking for indirect calls. */ > -DEF_GCOV_COUNTER(GCOV_COUNTER_ICALL_TOPNV, "indirect_call_topn", _icall_topn) > diff --git a/gcc/gcov-io.h b/gcc/gcov-io.h > index 9edb2923982..69c9a73dba8 100644 > --- a/gcc/gcov-io.h > +++ b/gcc/gcov-io.h > @@ -266,12 +266,6 @@ GCOV_COUNTERS > #define GCOV_N_VALUE_COUNTERS \ > (GCOV_LAST_VALUE_COUNTER - GCOV_FIRST_VALUE_COUNTER + 1) > > -/* The number of hottest callees to be tracked. */ > -#define GCOV_ICALL_TOPN_VAL 2 > - > -/* The number of counter entries per icall callsite. */ > -#define GCOV_ICALL_TOPN_NCOUNTS (1 + GCOV_ICALL_TOPN_VAL * 4) > - > /* Convert a counter index to a tag. */ > #define GCOV_TAG_FOR_COUNTER(COUNT) \ > (GCOV_TAG_COUNTER_BASE + ((gcov_unsigned_t)(COUNT) << 17)) > diff --git a/gcc/params.def b/gcc/params.def > index 6b7f7eb5bae..b4a4e4a4190 100644 > --- a/gcc/params.def > +++ b/gcc/params.def > @@ -992,14 +992,6 @@ DEFPARAM (PARAM_PROFILE_FUNC_INTERNAL_ID, > "Use internal function id in profile lookup.", > 0, 0, 1) > > -/* When the parameter is 1, track the most frequent N target > - addresses in indirect-call profile. This disables > - indirect_call_profiler_v3 which tracks single target. */ > -DEFPARAM (PARAM_INDIR_CALL_TOPN_PROFILE, > - "indir-call-topn-profile", > - "Track top N target addresses in indirect-call profile.", > - 0, 0, 1) > - > /* Avoid SLP vectorization of large basic blocks. */ > DEFPARAM (PARAM_SLP_MAX_INSNS_IN_BB, > "slp-max-insns-in-bb", > diff --git a/gcc/profile.c b/gcc/profile.c > index a1dba1ac8fb..9aff9ef2b21 100644 > --- a/gcc/profile.c > +++ b/gcc/profile.c > @@ -172,7 +172,6 @@ instrument_values (histogram_values values) > break; > > case HIST_TYPE_INDIR_CALL: > - case HIST_TYPE_INDIR_CALL_TOPN: > gimple_gen_ic_profiler (hist, t, 0); > break; > > diff --git a/gcc/tree-profile.c b/gcc/tree-profile.c > index 9b6f351a3d6..f2cf4047579 100644 > --- a/gcc/tree-profile.c > +++ b/gcc/tree-profile.c > @@ -101,11 +101,7 @@ init_ic_make_global_vars (void) > > ic_tuple_var > = build_decl (UNKNOWN_LOCATION, VAR_DECL, > - get_identifier ( > - (PARAM_VALUE (PARAM_INDIR_CALL_TOPN_PROFILE) ? > - "__gcov_indirect_call_topn" : > - "__gcov_indirect_call")), > - tuple_type); > + get_identifier ("__gcov_indirect_call"), tuple_type); > TREE_PUBLIC (ic_tuple_var) = 1; > DECL_ARTIFICIAL (ic_tuple_var) = 1; > DECL_INITIAL (ic_tuple_var) = NULL; > @@ -187,8 +183,6 @@ gimple_init_gcov_profiler (void) > ptr_type_node, > NULL_TREE); > profiler_fn_name = "__gcov_indirect_call_profiler_v3"; > - if (PARAM_VALUE (PARAM_INDIR_CALL_TOPN_PROFILE)) > - profiler_fn_name = "__gcov_indirect_call_topn_profiler"; > > tree_indirect_call_profiler_fn > = build_fn_decl (profiler_fn_name, ic_profiler_fn_type); > @@ -376,12 +370,6 @@ gimple_gen_ic_profiler (histogram_value value, unsigned > tag, unsigned base) > gimple_stmt_iterator gsi = gsi_for_stmt (stmt); > tree ref_ptr = tree_coverage_counter_addr (tag, base); > > - if ( (PARAM_VALUE (PARAM_INDIR_CALL_TOPN_PROFILE) && > - tag == GCOV_COUNTER_V_INDIR) || > - (!PARAM_VALUE (PARAM_INDIR_CALL_TOPN_PROFILE) && > - tag == GCOV_COUNTER_ICALL_TOPNV)) > - return; > - > ref_ptr = force_gimple_operand_gsi (&gsi, ref_ptr, > true, NULL_TREE, true, GSI_SAME_STMT); > > diff --git a/gcc/value-prof.c b/gcc/value-prof.c > index d34d2ab7685..1e14e532070 100644 > --- a/gcc/value-prof.c > +++ b/gcc/value-prof.c > @@ -316,22 +316,6 @@ dump_histogram_value (FILE *dump_file, histogram_value > hist) > } > fprintf (dump_file, ".\n"); > break; > - case HIST_TYPE_INDIR_CALL_TOPN: > - fprintf (dump_file, "Indirect call topn "); > - if (hist->hvalue.counters) > - { > - int i; > - > - fprintf (dump_file, "accu:%" PRId64, hist->hvalue.counters[0]); > - for (i = 1; i < (GCOV_ICALL_TOPN_VAL << 2); i += 2) > - { > - fprintf (dump_file, " target:%" PRId64 " value:%" PRId64, > - (int64_t) hist->hvalue.counters[i], > - (int64_t) hist->hvalue.counters[i+1]); > - } > - } > - fprintf (dump_file, ".\n"); > - break; > case HIST_TYPE_MAX: > gcc_unreachable (); > } > @@ -416,10 +400,6 @@ stream_in_histogram_value (struct lto_input_block *ib, > gimple *stmt) > ncounters = 1; > break; > > - case HIST_TYPE_INDIR_CALL_TOPN: > - ncounters = (GCOV_ICALL_TOPN_VAL << 2) + 1; > - break; > - > case HIST_TYPE_MAX: > gcc_unreachable (); > } > @@ -1865,12 +1845,8 @@ gimple_indirect_call_to_profile (gimple *stmt, > histogram_values *values) > > values->reserve (3); > > - values->quick_push (gimple_alloc_histogram_value ( > - cfun, > - PARAM_VALUE (PARAM_INDIR_CALL_TOPN_PROFILE) ? > - HIST_TYPE_INDIR_CALL_TOPN : > - HIST_TYPE_INDIR_CALL, > - stmt, callee)); > + values->quick_push (gimple_alloc_histogram_value (cfun, > HIST_TYPE_INDIR_CALL, > + stmt, callee)); > > return; > } > @@ -1971,10 +1947,6 @@ gimple_find_values_to_profile (histogram_values > *values) > hist->n_counters = 1; > break; > > - case HIST_TYPE_INDIR_CALL_TOPN: > - hist->n_counters = GCOV_ICALL_TOPN_NCOUNTS; > - break; > - > default: > gcc_unreachable (); > } > diff --git a/gcc/value-prof.h b/gcc/value-prof.h > index 1251fa95e31..a54024b48de 100644 > --- a/gcc/value-prof.h > +++ b/gcc/value-prof.h > @@ -33,8 +33,6 @@ enum hist_type > HIST_TYPE_AVERAGE, /* Compute average value (sum of all values). */ > HIST_TYPE_IOR, /* Used to compute expected alignment. */ > HIST_TYPE_TIME_PROFILE, /* Used for time profile */ > - HIST_TYPE_INDIR_CALL_TOPN, /* Tries to identify the top N most frequently > - called functions in indirect call. */ > HIST_TYPE_MAX > }; > > diff --git a/libgcc/Makefile.in b/libgcc/Makefile.in > index ea390a5bbea..fb77881145e 100644 > --- a/libgcc/Makefile.in > +++ b/libgcc/Makefile.in > @@ -888,7 +888,7 @@ include $(iterator) > # Build libgcov components. > > LIBGCOV_MERGE = _gcov_merge_add _gcov_merge_single \ > - _gcov_merge_ior _gcov_merge_time_profile _gcov_merge_icall_topn > + _gcov_merge_ior _gcov_merge_time_profile > LIBGCOV_PROFILER = _gcov_interval_profiler \ > _gcov_interval_profiler_atomic \ > _gcov_pow2_profiler \ > @@ -900,8 +900,7 @@ LIBGCOV_PROFILER = _gcov_interval_profiler > \ > _gcov_ior_profiler \ > _gcov_ior_profiler_atomic \ > _gcov_indirect_call_profiler_v3 \ > - _gcov_time_profiler \ > - _gcov_indirect_call_topn_profiler > + _gcov_time_profiler > LIBGCOV_INTERFACE = _gcov_dump _gcov_flush _gcov_fork > \ > _gcov_execl _gcov_execlp \ > _gcov_execle _gcov_execv _gcov_execvp _gcov_execve _gcov_reset > diff --git a/libgcc/libgcov-driver.c b/libgcc/libgcov-driver.c > index 5dc51df914f..f03868e34bb 100644 > --- a/libgcc/libgcov-driver.c > +++ b/libgcc/libgcov-driver.c > @@ -415,84 +415,6 @@ merge_summary (int run_counted, struct gcov_summary > *summary, > } > } > > -/* Sort N entries in VALUE_ARRAY in descending order. > - Each entry in VALUE_ARRAY has two values. The sorting > - is based on the second value. */ > - > -GCOV_LINKAGE void > -gcov_sort_n_vals (gcov_type *value_array, int n) > -{ > - int j, k; > - > - for (j = 2; j < n; j += 2) > - { > - gcov_type cur_ent[2]; > - > - cur_ent[0] = value_array[j]; > - cur_ent[1] = value_array[j + 1]; > - k = j - 2; > - while (k >= 0 && value_array[k + 1] < cur_ent[1]) > - { > - value_array[k + 2] = value_array[k]; > - value_array[k + 3] = value_array[k+1]; > - k -= 2; > - } > - value_array[k + 2] = cur_ent[0]; > - value_array[k + 3] = cur_ent[1]; > - } > -} > - > -/* Sort the profile counters for all indirect call sites. Counters > - for each call site are allocated in array COUNTERS. */ > - > -static void > -gcov_sort_icall_topn_counter (const struct gcov_ctr_info *counters) > -{ > - int i; > - gcov_type *values; > - int n = counters->num; > - > - gcc_assert (!(n % GCOV_ICALL_TOPN_NCOUNTS)); > - values = counters->values; > - > - for (i = 0; i < n; i += GCOV_ICALL_TOPN_NCOUNTS) > - { > - gcov_type *value_array = &values[i + 1]; > - gcov_sort_n_vals (value_array, GCOV_ICALL_TOPN_NCOUNTS - 1); > - } > -} > - > -/* Sort topn indirect_call profile counters in GI_PTR. */ > - > -static void > -gcov_sort_topn_counter_arrays (const struct gcov_info *gi_ptr) > -{ > - unsigned int i; > - int f_ix; > - const struct gcov_fn_info *gfi_ptr; > - const struct gcov_ctr_info *ci_ptr; > - > - if (!gi_ptr->merge[GCOV_COUNTER_ICALL_TOPNV]) > - return; > - > - for (f_ix = 0; (unsigned)f_ix != gi_ptr->n_functions; f_ix++) > - { > - gfi_ptr = gi_ptr->functions[f_ix]; > - ci_ptr = gfi_ptr->ctrs; > - for (i = 0; i < GCOV_COUNTERS; i++) > - { > - if (!gi_ptr->merge[i]) > - continue; > - if (i == GCOV_COUNTER_ICALL_TOPNV) > - { > - gcov_sort_icall_topn_counter (ci_ptr); > - break; > - } > - ci_ptr++; > - } > - } > -} > - > /* Dump the coverage counts for one gcov_info object. We merge with existing > counts when possible, to avoid growing the .da files ad infinitum. We use > this program's checksum to make sure we only accumulate whole program > @@ -510,8 +432,6 @@ dump_one_gcov (struct gcov_info *gi_ptr, struct > gcov_filename *gf, > > fn_buffer = 0; > > - gcov_sort_topn_counter_arrays (gi_ptr); > - > error = gcov_exit_open_gcda_file (gi_ptr, gf); > if (error == -1) > return; > diff --git a/libgcc/libgcov-merge.c b/libgcc/libgcov-merge.c > index 046ed5718bb..702a69f8349 100644 > --- a/libgcc/libgcov-merge.c > +++ b/libgcc/libgcov-merge.c > @@ -122,66 +122,4 @@ __gcov_merge_single (gcov_type *counters, unsigned > n_counters) > } > #endif /* L_gcov_merge_single */ > > -#ifdef L_gcov_merge_icall_topn > -/* The profile merging function used for merging indirect call counts > - This function is given array COUNTERS of N_COUNTERS old counters and it > - reads the same number of counters from the gcov file. */ > - > -void > -__gcov_merge_icall_topn (gcov_type *counters, unsigned n_counters) > -{ > - unsigned i, j, k, m; > - > - gcc_assert (!(n_counters % GCOV_ICALL_TOPN_NCOUNTS)); > - for (i = 0; i < n_counters; i += GCOV_ICALL_TOPN_NCOUNTS) > - { > - gcov_type *value_array = &counters[i + 1]; > - unsigned tmp_size = 2 * (GCOV_ICALL_TOPN_NCOUNTS - 1); > - gcov_type *tmp_array > - = (gcov_type *) alloca (tmp_size * sizeof (gcov_type)); > - > - for (j = 0; j < tmp_size; j++) > - tmp_array[j] = 0; > - > - for (j = 0; j < GCOV_ICALL_TOPN_NCOUNTS - 1; j += 2) > - { > - tmp_array[j] = value_array[j]; > - tmp_array[j + 1] = value_array [j + 1]; > - } > - > - /* Skip the number_of_eviction entry. */ > - gcov_get_counter (); > - for (k = 0; k < GCOV_ICALL_TOPN_NCOUNTS - 1; k += 2) > - { > - int found = 0; > - gcov_type global_id = gcov_get_counter_target (); > - gcov_type call_count = gcov_get_counter (); > - for (m = 0; m < j; m += 2) > - { > - if (tmp_array[m] == global_id) > - { > - found = 1; > - tmp_array[m + 1] += call_count; > - break; > - } > - } > - if (!found) > - { > - tmp_array[j] = global_id; > - tmp_array[j + 1] = call_count; > - j += 2; > - } > - } > - /* Now sort the temp array */ > - gcov_sort_n_vals (tmp_array, j); > - > - /* Now copy back the top half of the temp array */ > - for (k = 0; k < GCOV_ICALL_TOPN_NCOUNTS - 1; k += 2) > - { > - value_array[k] = tmp_array[k]; > - value_array[k + 1] = tmp_array[k + 1]; > - } > - } > -} > -#endif /* L_gcov_merge_icall_topn */ > #endif /* inhibit_libc */ > diff --git a/libgcc/libgcov-profiler.c b/libgcc/libgcov-profiler.c > index 7116330252b..40f0858a174 100644 > --- a/libgcc/libgcov-profiler.c > +++ b/libgcc/libgcov-profiler.c > @@ -163,139 +163,6 @@ __gcov_one_value_profiler_atomic (gcov_type *counters, > gcov_type value) > } > #endif > > -#ifdef L_gcov_indirect_call_topn_profiler > -/* Tries to keep track the most frequent N values in the counters where > - N is specified by parameter TOPN_VAL. To track top N values, 2*N counter > - entries are used. > - counter[0] --- the accumative count of the number of times one entry in > - in the counters gets evicted/replaced due to limited > capacity. > - When this value reaches a threshold, the bottom N values > are > - cleared. > - counter[1] through counter[2*N] records the top 2*N values collected so > far. > - Each value is represented by two entries: count[2*i+1] is the ith value, > and > - count[2*i+2] is the number of times the value is seen. */ > - > -static void > -__gcov_topn_value_profiler_body (gcov_type *counters, gcov_type value) > -{ > - unsigned i, found = 0, have_zero_count = 0; > - gcov_type *entry; > - gcov_type *lfu_entry = &counters[1]; > - gcov_type *value_array = &counters[1]; > - gcov_type *num_eviction = &counters[0]; > - gcov_unsigned_t topn_val = GCOV_ICALL_TOPN_VAL; > - > - /* There are 2*topn_val values tracked, each value takes two slots in the > - counter array. */ > - for (i = 0; i < (topn_val << 2); i += 2) > - { > - entry = &value_array[i]; > - if (entry[0] == value) > - { > - entry[1]++ ; > - found = 1; > - break; > - } > - else if (entry[1] == 0) > - { > - lfu_entry = entry; > - have_zero_count = 1; > - } > - else if (entry[1] < lfu_entry[1]) > - lfu_entry = entry; > - } > - > - if (found) > - return; > - > - /* lfu_entry is either an empty entry or an entry > - with lowest count, which will be evicted. */ > - lfu_entry[0] = value; > - lfu_entry[1] = 1; > - > -#define GCOV_ICALL_COUNTER_CLEAR_THRESHOLD 3000 > - > - /* Too many evictions -- time to clear bottom entries to > - avoid hot values bumping each other out. */ > - if (!have_zero_count > - && ++*num_eviction >= GCOV_ICALL_COUNTER_CLEAR_THRESHOLD) > - { > - unsigned i, j; > - gcov_type *p, minv; > - gcov_type* tmp_cnts > - = (gcov_type *)alloca (topn_val * sizeof (gcov_type)); > - > - *num_eviction = 0; > - > - for (i = 0; i < topn_val; i++) > - tmp_cnts[i] = 0; > - > - /* Find the largest topn_val values from the group of > - 2*topn_val values and put them into tmp_cnts. */ > - > - for (i = 0; i < 2 * topn_val; i += 2) > - { > - p = 0; > - for (j = 0; j < topn_val; j++) > - { > - if (!p || tmp_cnts[j] < *p) > - p = &tmp_cnts[j]; > - } > - if (value_array[i + 1] > *p) > - *p = value_array[i + 1]; > - } > - > - minv = tmp_cnts[0]; > - for (j = 1; j < topn_val; j++) > - { > - if (tmp_cnts[j] < minv) > - minv = tmp_cnts[j]; > - } > - /* Zero out low value entries. */ > - for (i = 0; i < 2 * topn_val; i += 2) > - { > - if (value_array[i + 1] < minv) > - { > - value_array[i] = 0; > - value_array[i + 1] = 0; > - } > - } > - } > -} > - > -/* These two variables are used to actually track caller and callee. Keep > - them in TLS memory so races are not common (they are written to often). > - The variables are set directly by GCC instrumented code, so declaration > - here must match one in tree-profile.c. */ > - > -#if defined(HAVE_CC_TLS) && !defined (USE_EMUTLS) > -__thread > -#endif > -struct indirect_call_tuple __gcov_indirect_call_topn; > - > -#ifdef TARGET_VTABLE_USES_DESCRIPTORS > -#define VTABLE_USES_DESCRIPTORS 1 > -#else > -#define VTABLE_USES_DESCRIPTORS 0 > -#endif > - > -/* This fucntion is instrumented at function entry to track topn indirect > - calls to CUR_FUNC. */ > - > -void > -__gcov_indirect_call_topn_profiler (gcov_type value, void* cur_func) > -{ > - void *callee_func = __gcov_indirect_call_topn.callee; > - /* If the C++ virtual tables contain function descriptors then one > - function may have multiple descriptors and we need to dereference > - the descriptors to see if they point to the same function. */ > - if (cur_func == callee_func > - || (VTABLE_USES_DESCRIPTORS && callee_func > - && *(void **) cur_func == *(void **) callee_func)) > - __gcov_topn_value_profiler_body (__gcov_indirect_call_topn.counters, > value); > -} > -#endif > - > #ifdef L_gcov_indirect_call_profiler_v3 > > /* These two variables are used to actually track caller and callee. Keep > diff --git a/libgcc/libgcov-util.c b/libgcc/libgcov-util.c > index 6be229b094a..c794132c172 100644 > --- a/libgcc/libgcov-util.c > +++ b/libgcc/libgcov-util.c > @@ -740,25 +740,6 @@ __gcov_single_counter_op (gcov_type *counters, unsigned > n_counters, > } > } > > -/* Performing FN upon indirect-call profile counters. */ > - > -static void > -__gcov_icall_topn_counter_op (gcov_type *counters, unsigned n_counters, > - counter_op_fn fn, void *data1, void *data2) > -{ > - unsigned i; > - > - gcc_assert (!(n_counters % GCOV_ICALL_TOPN_NCOUNTS)); > - for (i = 0; i < n_counters; i += GCOV_ICALL_TOPN_NCOUNTS) > - { > - unsigned j; > - gcov_type *value_array = &counters[i + 1]; > - > - for (j = 0; j < GCOV_ICALL_TOPN_NCOUNTS - 1; j += 2) > - value_array[j + 1] = fn (value_array[j + 1], data1, data2); > - } > -} > - > /* Scaling the counter value V by multiplying *(float*) DATA1. */ > > static gcov_type > diff --git a/libgcc/libgcov.h b/libgcc/libgcov.h > index 993db8fb057..b4f1ec576fc 100644 > --- a/libgcc/libgcov.h > +++ b/libgcc/libgcov.h > @@ -102,7 +102,6 @@ typedef unsigned gcov_type_unsigned __attribute__ ((mode > (QI))); > #define gcov_read_unsigned __gcov_read_unsigned > #define gcov_read_counter __gcov_read_counter > #define gcov_read_summary __gcov_read_summary > -#define gcov_sort_n_vals __gcov_sort_n_vals > > #else /* IN_GCOV_TOOL */ > /* About the host. */ > @@ -130,7 +129,6 @@ typedef unsigned gcov_position_t; > #define L_gcov_merge_single 1 > #define L_gcov_merge_ior 1 > #define L_gcov_merge_time_profile 1 > -#define L_gcov_merge_icall_topn 1 > > extern gcov_type gcov_read_counter_mem (); > extern unsigned gcov_get_merge_weight (); > @@ -267,9 +265,6 @@ extern void __gcov_merge_single (gcov_type *, unsigned) > ATTRIBUTE_HIDDEN; > /* The merge function that just ors the counters together. */ > extern void __gcov_merge_ior (gcov_type *, unsigned) ATTRIBUTE_HIDDEN; > > -/* The merge function is used for topn indirect call counters. */ > -extern void __gcov_merge_icall_topn (gcov_type *, unsigned) ATTRIBUTE_HIDDEN; > - > /* The profiler functions. */ > extern void __gcov_interval_profiler (gcov_type *, gcov_type, int, unsigned); > extern void __gcov_interval_profiler_atomic (gcov_type *, gcov_type, int, > @@ -285,8 +280,6 @@ extern void __gcov_average_profiler (gcov_type *, > gcov_type); > extern void __gcov_average_profiler_atomic (gcov_type *, gcov_type); > extern void __gcov_ior_profiler (gcov_type *, gcov_type); > extern void __gcov_ior_profiler_atomic (gcov_type *, gcov_type); > -extern void __gcov_indirect_call_topn_profiler (gcov_type, void *); > -extern void gcov_sort_n_vals (gcov_type *, int); > > #ifndef inhibit_libc > /* The wrappers around some library functions.. */