The GCC/GCOV version over 12 has slight format change of the gcno and gcda. Make some adaption in the gcov dump function to fix the code coverage report. Mainly two places change: 1. Added the checksum in the struct gcov_info. This fix the crash in qemu_x86, and mps2_an385 when run with --coverage. 2. Adjust the GCOV_TAG_FUNCTION_LENGTH accroding to gcov-io.h. It's length unit is caculated by bytes now. Fixes #50255. Fixes #50257. Signed-off-by: Enjia Mai <enjia.mai@intel.com>
120 lines
3.9 KiB
C
120 lines
3.9 KiB
C
/* Copyright (C) 1996-2018 Free Software Foundation, Inc.
|
|
|
|
This file is part of GCC.
|
|
|
|
GCC is free software; you can redistribute it and/or modify it under
|
|
the terms of the GNU General Public License as published by the Free
|
|
Software Foundation; either version 3, or (at your option) any later
|
|
version.
|
|
|
|
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
for more details.
|
|
|
|
Under Section 7 of GPL version 3, you are granted additional
|
|
permissions described in the GCC Runtime Library Exception, version
|
|
3.1, as published by the Free Software Foundation.
|
|
|
|
You should have received a copy of the GNU General Public License and
|
|
a copy of the GCC Runtime Library Exception along with this program;
|
|
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
|
<http://www.gnu.org/licenses/>. */
|
|
|
|
/**
|
|
* This file has excerpts from gcc libgcc/libgcov.h and gcc/gcov-io.h.
|
|
* Which is governed by section 7 of additional permissions.
|
|
*/
|
|
|
|
|
|
#ifndef _COVERAGE_H_
|
|
#define _COVERAGE_H_
|
|
|
|
#if (__GNUC__ >= 10)
|
|
#define GCOV_COUNTERS 8U
|
|
#elif (__GNUC__ >= 8)
|
|
#define GCOV_COUNTERS 9U
|
|
#else
|
|
#define GCOV_COUNTERS 10U
|
|
#endif
|
|
|
|
/* The GCOV 12 gcno/gcda format has slight change,
|
|
* Please refer to gcov-io.h in the GCC 12 for
|
|
* more details.
|
|
*
|
|
* Following GCC commits introduced these changes:
|
|
* gcc-mirror/gcc@23eb66d
|
|
* gcc-mirror/gcc@72e0c74
|
|
*/
|
|
#if (__GNUC__ >= 12)
|
|
#define GCOV_12_FORMAT
|
|
#endif
|
|
|
|
typedef uint64_t gcov_type;
|
|
|
|
#ifdef GCOV_12_FORMAT
|
|
#define GCOV_TAG_FUNCTION_LENGTH 12
|
|
#else
|
|
#define GCOV_TAG_FUNCTION_LENGTH 3
|
|
#endif
|
|
|
|
#define GCOV_DATA_MAGIC (0x67636461)
|
|
#define GCOV_TAG_FUNCTION (0x01000000)
|
|
#define GCOV_TAG_COUNTER_BASE (0x01a10000)
|
|
#define GCOV_TAG_FOR_COUNTER(count) \
|
|
(GCOV_TAG_COUNTER_BASE + ((uint32_t) (count) << 17))
|
|
|
|
#define FILE_START_INDICATOR '*'
|
|
#define GCOV_DUMP_SEPARATOR '<'
|
|
|
|
/**Information about counters for a single function
|
|
*
|
|
* This data is generated by gcc during compilation and doesn't change
|
|
* at run-time with the exception of the values array.
|
|
*/
|
|
struct gcov_ctr_info {
|
|
unsigned int num; /* number of counter values for this type */
|
|
gcov_type *values; /* array of counter values for this type */
|
|
};
|
|
|
|
/**
|
|
* Profiling meta data per function
|
|
*
|
|
* This data is generated by gcc during compilation and doesn't change
|
|
* at run-time.
|
|
*
|
|
* Information about a single function. This uses the trailing array
|
|
* idiom. The number of counters is determined from the merge pointer
|
|
* array in gcov_info. The key is used to detect which of a set of
|
|
* comdat functions was selected -- it points to the gcov_info object
|
|
* of the object file containing the selected comdat function.
|
|
*/
|
|
struct gcov_fn_info {
|
|
const struct gcov_info *key; /* comdat key */
|
|
unsigned int ident; /* unique ident of function */
|
|
unsigned int lineno_checksum; /* function lineno_checksum */
|
|
unsigned int cfg_checksum; /* function cfg checksum */
|
|
struct gcov_ctr_info ctrs[1]; /* instrumented counters */
|
|
};
|
|
|
|
/** Profiling data per object file
|
|
*
|
|
* This data is generated by gcc during compilation and doesn't change
|
|
* at run-time with the exception of the next pointer.
|
|
*/
|
|
struct gcov_info {
|
|
unsigned int version; /* Gcov version (same as GCC version) */
|
|
struct gcov_info *next; /* List head for a singly-linked list */
|
|
unsigned int stamp; /* Uniquifying time stamp */
|
|
#ifdef GCOV_12_FORMAT
|
|
unsigned int checksum; /* unique object checksum */
|
|
#endif
|
|
const char *filename; /* Name of the associated gcda data file */
|
|
/* merge functions, null for unused*/
|
|
void (*merge[GCOV_COUNTERS])(gcov_type *, unsigned int);
|
|
unsigned int n_functions; /* number of instrumented functions */
|
|
struct gcov_fn_info **functions; /* function information */
|
|
|
|
};
|
|
|
|
#endif /* _COVERAGE_H_ */
|