Messages in this thread | | | Date | Fri, 14 Oct 2022 11:30:51 +0200 | Subject | Re: [PATCH] gcov: support GCC 12.1 and newer compilers | From | Peter Oberparleiter <> |
| |
On 13.10.2022 09:40, Martin Liška wrote: > Starting with GCC 12.1, there are 2 significant changes to the .gcda > file format that needs 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. > > Signed-off-by: Martin Liska <mliska@suse.cz>
Looks good, thanks! I successfully tested this patch on s390 using GCC 12.2 and 11.2.
Tested-by: Peter Oberparleiter <oberpar@linux.ibm.com> Reviewed-by: Peter Oberparleiter <oberpar@linux.ibm.com>
Andrew, could you add this patch via your tree?
> --- > kernel/gcov/gcc_4_7.c | 18 ++++++++++++++++-- > 1 file changed, 16 insertions(+), 2 deletions(-) > > diff --git a/kernel/gcov/gcc_4_7.c b/kernel/gcov/gcc_4_7.c > index 460c12b7dfea..7971e989e425 100644 > --- a/kernel/gcov/gcc_4_7.c > +++ b/kernel/gcov/gcc_4_7.c > @@ -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,
-- Peter Oberparleiter Linux on IBM Z Development - IBM Germany R&D
| |