[Skiboot] [PATCH 4/5] extract-gcov: Fix tag lengths

Reza Arbab arbab at linux.ibm.com
Sat Mar 15 04:25:14 AEDT 2025


Starting with GCC 12, gcov cannot parse the .gcda files we generate:

  $ powerpc64le-linux-gcov-dump platforms/qemu/qemu.gcda
  platforms/qemu/qemu.gcda:data:magic `adcg':version `B23*' (swapped endianness)
  platforms/qemu/qemu.gcda:stamp 1742688024
  platforms/qemu/qemu.gcda:checksum 2623079854
  platforms/qemu/qemu.gcda:  01000000:   3:FUNCTION ident=1191288390, lineno_checksum=0xdb12f55c, cfg_checksum=0xf9e50e8f
  platforms/qemu/qemu.gcda:tag `46db12f5' is incorrectly nested
  platforms/qemu/qemu.gcda:    46db12f5:1559880974:UNKNOWN

This is due to gcc commit 23eb66d1d46a ("gcov: Use system IO
buffering"), where the length field of tags in the file changed to
represent total bytes, not a count of words.

Change what we write accordingly.

Signed-off-by: Reza Arbab <arbab at linux.ibm.com>
---
 extract-gcov.c | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/extract-gcov.c b/extract-gcov.c
index c48cd6fbd0a1..2acc51df91de 100644
--- a/extract-gcov.c
+++ b/extract-gcov.c
@@ -97,8 +97,15 @@ static size_t write_u64(int fd, u64 v)
 #define GCOV_TAG_FOR_COUNTER(count)                                     \
         (GCOV_TAG_COUNTER_BASE + ((unsigned int) (count) << 17))
 
-// gcc 4.7/4.8 specific
-#define GCOV_TAG_FUNCTION_LENGTH        3
+#define GCOV_WORD_SIZE			4
+
+#if TARGET__GNUC__ >= 12
+#define GCOV_TAG_FUNCTION_LENGTH	(3 * GCOV_WORD_SIZE)
+#define GCOV_TAG_COUNTER_LENGTH(num)	((num) * 2 * GCOV_WORD_SIZE)
+#else
+#define GCOV_TAG_FUNCTION_LENGTH	3
+#define GCOV_TAG_COUNTER_LENGTH(num)	((num) * 2)
+#endif
 
 size_t skiboot_dump_size = 0x240000;
 
@@ -163,7 +170,7 @@ static void write_gcda(char *addr, struct gcov_info* gi)
 				continue;
 
 			write_u32(fd, (GCOV_TAG_FOR_COUNTER(ctr)));
-			write_u32(fd, be32toh(ctr_info->num)*2);
+			write_u32(fd, GCOV_TAG_COUNTER_LENGTH(be32toh(ctr_info->num)));
 			printf(" ctr %d gcov_ctr_info->num %u\n",
 			    ctr, be32toh(ctr_info->num));
 
-- 
2.43.5



More information about the Skiboot mailing list