> 
> 2020-04-03  Martin Liska  <mli...@suse.cz>
> 
>       * coverage.c (get_coverage_counts): Skip sanity check for TOP N counters
>       as they have variable number of counters.
>       * gcov-dump.c (main): Add new option -r.
>       (print_usage): Likewise.
>       (tag_counters): All new raw format.
>       * gcov-io.h (struct gcov_kvp): New.
>       (GCOV_TOPN_VALUES): Remove.
>       (GCOV_TOPN_VALUES_COUNTERS): Likewise.
>       (GCOV_TOPN_MEM_COUNTERS): New.
>       (GCOV_TOPN_DISK_COUNTERS): Likewise.
>       (GCOV_TOPN_MAXIMUM_TRACKED_VALUES): Likewise.
>       * ipa-profile.c (ipa_profile_generate_summary): Use
>       GCOV_TOPN_MAXIMUM_TRACKED_VALUES.
>       (ipa_profile_write_edge_summary): Likewise.
>       (ipa_profile_read_edge_summary): Likewise.
>       (ipa_profile): Remove usage of GCOV_TOPN_VALUES.
>       * profile.c (sort_hist_values): Sort variable number
>       of counters.
>       (compute_value_histograms): Special case for TOP N counters
>       that have dynamic number of key-value pairs.
>       * value-prof.c (dump_histogram_value): Dump variable number
>       of key-value pairs.
>       (stream_in_histogram_value): Stream in variable number
>       of key-value pairs for TOP N counter.
>       (get_nth_most_common_value): Deal with variable number
>       of key-value pairs.
>       (dump_ic_profile): Use GCOV_TOPN_MAXIMUM_TRACKED_VALUES
>       for loop iteration.
>       (gimple_find_values_to_profile): Set GCOV_TOPN_MEM_COUNTERS
>       to n_counters.
>       * doc/gcov-dump.texi: Document new -r option.
> 
> libgcc/ChangeLog:
> 
> 2020-04-03  Martin Liska  <mli...@suse.cz>
> 
>       * libgcov-driver.c (prune_topn_counter): Remove.
>       (prune_counters): Likewise.
>       (merge_one_data): Special case TOP N counters
>       as they have variable length.
>       (write_top_counters): New.
>       (write_one_data): Special case TOP N.
>       (dump_one_gcov): Do not prune TOP N counters.
>       * libgcov-merge.c (merge_topn_values_set): Remove.
>       (__gcov_merge_topn): Use gcov_topn_add_value.
>       * libgcov-profiler.c (__gcov_topn_values_profiler_body):
>       Likewise here.
>       * libgcov.h (gcov_counter_add): New.
>       (gcov_counter_set_if_null): Likewise.
>       (gcov_topn_add_value): New.
> ---
>  gcc/coverage.c            |   7 ++-
>  gcc/doc/gcov-dump.texi    |   5 ++
>  gcc/gcov-dump.c           |  14 ++++-
>  gcc/gcov-io.h             |  22 ++++++--
>  gcc/ipa-profile.c         |  11 ++--
>  gcc/profile.c             |  70 +++++++++++++----------
>  gcc/value-prof.c          |  59 ++++++++++++-------
>  libgcc/libgcov-driver.c   | 116 ++++++++++++++++++--------------------
>  libgcc/libgcov-merge.c    | 103 +++++++--------------------------
>  libgcc/libgcov-profiler.c |  40 +------------
>  libgcc/libgcov.h          |  87 ++++++++++++++++++++++++++++
>  11 files changed, 285 insertions(+), 249 deletions(-)
> 
> 

The patch looks good (and is OK for mainline).  I am bit concerned about
two things.
 1) I think we should add support to pre-allocate memory pool so we hide
 the problem with instrumenting malloc (I think with big enough memory
 pool the Firefox malloc issue should disappear since we populate the
 counters used to profile malloc before we run out of it).
 I think this can be done by adding comdat symbol so one can specify
 size of the pool at compile time.
 2) This seems like bit too big hammer for profiling values for division
 etc.  We will see how perfromance will go - in worst case I guess we
 could put back the original counter TOPN counter and use it for those
 cases.

Thanks for working on this!
Honza

Reply via email to