From: Sergei Trofimovich <siarh...@google.com> Before the change gcc did not stream correctly TOPN counters if counters belonged to a non-local shared object.
As a result zero-section optimization generated TOPN sections in a form not recognizable by '__gcov_merge_topn'. The problem happens because in a case of multiple shared objects '__gcov_merge_topn' function is present in address space multiple times (once per each object). The fix is to never rely on function address and predicate on TOPN counter types. libgcc/ChangeLog: PR gcov-profile/96913 * libgcov-driver.c (write_one_data): Avoid function pointer comparison in TOP streaming decision. (backported commit 4ecf368f4b4223fb2df4f3887429dfbb48852e38) --- libgcc/libgcov-driver.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libgcc/libgcov-driver.c b/libgcc/libgcov-driver.c index fb320738e1e..37438883d37 100644 --- a/libgcc/libgcov-driver.c +++ b/libgcc/libgcov-driver.c @@ -242,7 +242,7 @@ prune_counters (struct gcov_info *gi) if (gi->merge[j] == NULL) continue; - if (gi->merge[j] == __gcov_merge_topn) + if (j == GCOV_COUNTER_V_TOPN || j == GCOV_COUNTER_V_INDIR) { gcc_assert (!(ci->num % GCOV_TOPN_VALUES_COUNTERS)); for (unsigned k = 0; k < (ci->num / GCOV_TOPN_VALUES_COUNTERS); -- 2.28.0