From d40b21eebc9d41c3cb9ccbdf6338968436550621 Mon Sep 17 00:00:00 2001 From: Martin Liska Date: Tue, 26 Jan 2021 12:44:34 +0100 Subject: [PATCH] libgcov: improve profile reproducibility libgcc/ChangeLog: PR gcov-profile/98739 * libgcov.h (gcov_topn_add_value): Do not train when we have a merged profile with a negative number of total value. --- libgcc/libgcov.h | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/libgcc/libgcov.h b/libgcc/libgcov.h index df08e882dd7..ddc688509bd 100644 --- a/libgcc/libgcov.h +++ b/libgcc/libgcov.h @@ -443,7 +443,13 @@ gcov_topn_add_value (gcov_type *counters, gcov_type value, gcov_type count, int use_atomic, int increment_total) { if (increment_total) - gcov_counter_add (&counters[0], 1, use_atomic); + { + /* In the multi-threaded mode, we can have an already merged profile + with a negative total value. In that case, we should bail out. */ + if (counters[0] < 0) + return 0; + gcov_counter_add (&counters[0], 1, use_atomic); + } struct gcov_kvp *prev_node = NULL; struct gcov_kvp *minimal_node = NULL;