gcov: fix TOPN streaming from shared libraries

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.

(cherry picked from commit 4ecf368f4b)
This commit is contained in:
Sergei Trofimovich 2020-09-06 12:13:54 +01:00
parent f97ef0b2df
commit b843d57c57
1 changed files with 1 additions and 1 deletions

View File

@ -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);