diff options
author | Martin Liska <mliska@suse.cz> | 2019-07-03 14:42:02 +0200 |
---|---|---|
committer | Martin Liska <marxin@gcc.gnu.org> | 2019-07-03 12:42:02 +0000 |
commit | 1b309ca5edddd6bf8051993876df5f123394bc79 (patch) | |
tree | 403bccc3950ad5d8c2f3b4fd08e0d79ed37327c2 /libgcc/libgcov-merge.c | |
parent | e157be919b83177d57666234cd19f6b042140ac1 (diff) | |
download | gcc-1b309ca5edddd6bf8051993876df5f123394bc79.zip gcc-1b309ca5edddd6bf8051993876df5f123394bc79.tar.gz gcc-1b309ca5edddd6bf8051993876df5f123394bc79.tar.bz2 |
Support N values in libgcov for single value counter type.
2019-07-03 Martin Liska <mliska@suse.cz>
* gcc.dg/tree-prof/val-prof-2.c: Update scanned pattern
as we do now better.
2019-07-03 Martin Liska <mliska@suse.cz>
* libgcov-merge.c (merge_single_value_set): Support N values.
* libgcov-profiler.c (__gcov_one_value_profiler_body): Likewise.
From-SVN: r273004
Diffstat (limited to 'libgcc/libgcov-merge.c')
-rw-r--r-- | libgcc/libgcov-merge.c | 48 |
1 files changed, 26 insertions, 22 deletions
diff --git a/libgcc/libgcov-merge.c b/libgcc/libgcov-merge.c index f778cc4..8436700 100644 --- a/libgcc/libgcov-merge.c +++ b/libgcc/libgcov-merge.c @@ -89,49 +89,53 @@ __gcov_merge_time_profile (gcov_type *counters, unsigned n_counters) static void merge_single_value_set (gcov_type *counters) { - unsigned j; - gcov_type value, counter; - /* First value is number of total executions of the profiler. */ gcov_type all = gcov_get_counter_ignore_scaling (-1); counters[0] += all; ++counters; + /* Read all part values. */ + gcov_type read_counters[2 * GCOV_DISK_SINGLE_VALUES]; + for (unsigned i = 0; i < GCOV_DISK_SINGLE_VALUES; i++) { - value = gcov_get_counter_target (); - counter = gcov_get_counter_ignore_scaling (-1); + read_counters[2 * i] = gcov_get_counter_target (); + read_counters[2 * i + 1] = gcov_get_counter_ignore_scaling (-1); + } - if (counter == -1) - { - counters[1] = -1; - /* We can't return as we need to read all counters. */ - continue; - } - else if (counter == 0 || counters[1] == -1) - { - /* We can't return as we need to read all counters. */ - continue; - } + if (read_counters[1] == -1) + { + counters[1] = -1; + return; + } + + for (unsigned i = 0; i < GCOV_DISK_SINGLE_VALUES; i++) + { + if (read_counters[2 * i + 1] == 0) + return; + unsigned j; for (j = 0; j < GCOV_DISK_SINGLE_VALUES; j++) { - if (counters[2 * j] == value) + if (counters[2 * j] == read_counters[2 * i]) { - counters[2 * j + 1] += counter; + counters[2 * j + 1] += read_counters[2 * i + 1]; break; } else if (counters[2 * j + 1] == 0) { - counters[2 * j] = value; - counters[2 * j + 1] = counter; + counters[2 * j] += read_counters[2 * i]; + counters[2 * j + 1] += read_counters[2 * i + 1]; break; } } - /* We haven't found a free slot for the value, mark overflow. */ + /* We haven't found a slot, bail out. */ if (j == GCOV_DISK_SINGLE_VALUES) - counters[1] = -1; + { + counters[1] = -1; + return; + } } } |