/* 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_ */
