162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *  Profiling infrastructure declarations.
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci *  This file is based on gcc-internal definitions. Data structures are
662306a36Sopenharmony_ci *  defined to be compatible with gcc counterparts. For a better
762306a36Sopenharmony_ci *  understanding, refer to gcc source: gcc/gcov-io.h.
862306a36Sopenharmony_ci *
962306a36Sopenharmony_ci *    Copyright IBM Corp. 2009
1062306a36Sopenharmony_ci *    Author(s): Peter Oberparleiter <oberpar@linux.vnet.ibm.com>
1162306a36Sopenharmony_ci *
1262306a36Sopenharmony_ci *    Uses gcc-internal data definitions.
1362306a36Sopenharmony_ci */
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#ifndef GCOV_H
1662306a36Sopenharmony_ci#define GCOV_H GCOV_H
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci#include <linux/module.h>
1962306a36Sopenharmony_ci#include <linux/types.h>
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci/*
2262306a36Sopenharmony_ci * Profiling data types used for gcc 3.4 and above - these are defined by
2362306a36Sopenharmony_ci * gcc and need to be kept as close to the original definition as possible to
2462306a36Sopenharmony_ci * remain compatible.
2562306a36Sopenharmony_ci */
2662306a36Sopenharmony_ci#define GCOV_DATA_MAGIC		((unsigned int) 0x67636461)
2762306a36Sopenharmony_ci#define GCOV_TAG_FUNCTION	((unsigned int) 0x01000000)
2862306a36Sopenharmony_ci#define GCOV_TAG_COUNTER_BASE	((unsigned int) 0x01a10000)
2962306a36Sopenharmony_ci#define GCOV_TAG_FOR_COUNTER(count)					\
3062306a36Sopenharmony_ci	(GCOV_TAG_COUNTER_BASE + ((unsigned int) (count) << 17))
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci#if BITS_PER_LONG >= 64
3362306a36Sopenharmony_citypedef long gcov_type;
3462306a36Sopenharmony_ci#else
3562306a36Sopenharmony_citypedef long long gcov_type;
3662306a36Sopenharmony_ci#endif
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci/* Opaque gcov_info. The gcov structures can change as for example in gcc 4.7 so
3962306a36Sopenharmony_ci * we cannot use full definition here and they need to be placed in gcc specific
4062306a36Sopenharmony_ci * implementation of gcov. This also means no direct access to the members in
4162306a36Sopenharmony_ci * generic code and usage of the interface below.*/
4262306a36Sopenharmony_cistruct gcov_info;
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci/* Interface to access gcov_info data  */
4562306a36Sopenharmony_ciconst char *gcov_info_filename(struct gcov_info *info);
4662306a36Sopenharmony_ciunsigned int gcov_info_version(struct gcov_info *info);
4762306a36Sopenharmony_cistruct gcov_info *gcov_info_next(struct gcov_info *info);
4862306a36Sopenharmony_civoid gcov_info_link(struct gcov_info *info);
4962306a36Sopenharmony_civoid gcov_info_unlink(struct gcov_info *prev, struct gcov_info *info);
5062306a36Sopenharmony_cibool gcov_info_within_module(struct gcov_info *info, struct module *mod);
5162306a36Sopenharmony_cisize_t convert_to_gcda(char *buffer, struct gcov_info *info);
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci/* Base interface. */
5462306a36Sopenharmony_cienum gcov_action {
5562306a36Sopenharmony_ci	GCOV_ADD,
5662306a36Sopenharmony_ci	GCOV_REMOVE,
5762306a36Sopenharmony_ci};
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_civoid gcov_event(enum gcov_action action, struct gcov_info *info);
6062306a36Sopenharmony_civoid gcov_enable_events(void);
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci/* writing helpers */
6362306a36Sopenharmony_cisize_t store_gcov_u32(void *buffer, size_t off, u32 v);
6462306a36Sopenharmony_cisize_t store_gcov_u64(void *buffer, size_t off, u64 v);
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ci/* gcov_info control. */
6762306a36Sopenharmony_civoid gcov_info_reset(struct gcov_info *info);
6862306a36Sopenharmony_ciint gcov_info_is_compatible(struct gcov_info *info1, struct gcov_info *info2);
6962306a36Sopenharmony_civoid gcov_info_add(struct gcov_info *dest, struct gcov_info *source);
7062306a36Sopenharmony_cistruct gcov_info *gcov_info_dup(struct gcov_info *info);
7162306a36Sopenharmony_civoid gcov_info_free(struct gcov_info *info);
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_cistruct gcov_link {
7462306a36Sopenharmony_ci	enum {
7562306a36Sopenharmony_ci		OBJ_TREE,
7662306a36Sopenharmony_ci		SRC_TREE,
7762306a36Sopenharmony_ci	} dir;
7862306a36Sopenharmony_ci	const char *ext;
7962306a36Sopenharmony_ci};
8062306a36Sopenharmony_ciextern const struct gcov_link gcov_link[];
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ciextern int gcov_events_enabled;
8362306a36Sopenharmony_ciextern struct mutex gcov_lock;
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ci#endif /* GCOV_H */
86