132 lines
4.3 KiB
C
132 lines
4.3 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__ >= 14)
|
|
#define GCOV_COUNTERS 9U
|
|
#elif (__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 */
|
|
|
|
};
|
|
|
|
/*
|
|
* These functions are in the header for easy access for external interface
|
|
* reporting since they aren't useful without the structs in this header.
|
|
*/
|
|
struct gcov_info *gcov_get_list_head(void);
|
|
size_t gcov_populate_buffer(uint8_t *buffer, struct gcov_info *info);
|
|
size_t gcov_calculate_buff_size(struct gcov_info *info);
|
|
void gcov_reset_all_counts(void);
|
|
|
|
#endif /* _COVERAGE_H_ */
|