On 9/25/20 11:28 PM, Sergei Trofimovich wrote:
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);
Please install the patch, thanks!
Martin