mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-03 15:47:36 +00:00
gcov: support GCC 12.1 and newer compilers
commit 977ef30a7d
upstream.
Starting with GCC 12.1, the created .gcda format can't be read by gcov
tool. There are 2 significant changes to the .gcda file format that
need to be supported:
a) [gcov: Use system IO buffering]
(23eb66d1d46a34cb28c4acbdf8a1deb80a7c5a05) changed that all sizes in
the format are in bytes and not in words (4B)
b) [gcov: make profile merging smarter]
(72e0c742bd01f8e7e6dcca64042b9ad7e75979de) add a new checksum to the
file header.
Tested with GCC 7.5, 10.4, 12.2 and the current master.
Link: https://lkml.kernel.org/r/624bda92-f307-30e9-9aaa-8cc678b2dfb2@suse.cz
Signed-off-by: Martin Liska <mliska@suse.cz>
Tested-by: Peter Oberparleiter <oberpar@linux.ibm.com>
Reviewed-by: Peter Oberparleiter <oberpar@linux.ibm.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
8418c1672c
commit
7c359e2849
1 changed files with 16 additions and 2 deletions
|
@ -30,6 +30,13 @@
|
|||
|
||||
#define GCOV_TAG_FUNCTION_LENGTH 3
|
||||
|
||||
/* Since GCC 12.1 sizes are in BYTES and not in WORDS (4B). */
|
||||
#if (__GNUC__ >= 12)
|
||||
#define GCOV_UNIT_SIZE 4
|
||||
#else
|
||||
#define GCOV_UNIT_SIZE 1
|
||||
#endif
|
||||
|
||||
static struct gcov_info *gcov_info_head;
|
||||
|
||||
/**
|
||||
|
@ -383,12 +390,18 @@ size_t convert_to_gcda(char *buffer, struct gcov_info *info)
|
|||
pos += store_gcov_u32(buffer, pos, info->version);
|
||||
pos += store_gcov_u32(buffer, pos, info->stamp);
|
||||
|
||||
#if (__GNUC__ >= 12)
|
||||
/* Use zero as checksum of the compilation unit. */
|
||||
pos += store_gcov_u32(buffer, pos, 0);
|
||||
#endif
|
||||
|
||||
for (fi_idx = 0; fi_idx < info->n_functions; fi_idx++) {
|
||||
fi_ptr = info->functions[fi_idx];
|
||||
|
||||
/* Function record. */
|
||||
pos += store_gcov_u32(buffer, pos, GCOV_TAG_FUNCTION);
|
||||
pos += store_gcov_u32(buffer, pos, GCOV_TAG_FUNCTION_LENGTH);
|
||||
pos += store_gcov_u32(buffer, pos,
|
||||
GCOV_TAG_FUNCTION_LENGTH * GCOV_UNIT_SIZE);
|
||||
pos += store_gcov_u32(buffer, pos, fi_ptr->ident);
|
||||
pos += store_gcov_u32(buffer, pos, fi_ptr->lineno_checksum);
|
||||
pos += store_gcov_u32(buffer, pos, fi_ptr->cfg_checksum);
|
||||
|
@ -402,7 +415,8 @@ size_t convert_to_gcda(char *buffer, struct gcov_info *info)
|
|||
/* Counter record. */
|
||||
pos += store_gcov_u32(buffer, pos,
|
||||
GCOV_TAG_FOR_COUNTER(ct_idx));
|
||||
pos += store_gcov_u32(buffer, pos, ci_ptr->num * 2);
|
||||
pos += store_gcov_u32(buffer, pos,
|
||||
ci_ptr->num * 2 * GCOV_UNIT_SIZE);
|
||||
|
||||
for (cv_idx = 0; cv_idx < ci_ptr->num; cv_idx++) {
|
||||
pos += store_gcov_u64(buffer, pos,
|
||||
|
|
Loading…
Reference in a new issue