[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