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