1/* SPDX-License-Identifier: GPL-2.0 */ 2/* 3 * Profiling infrastructure declarations. 4 * 5 * This file is based on gcc-internal definitions. Data structures are 6 * defined to be compatible with gcc counterparts. For a better 7 * understanding, refer to gcc source: gcc/gcov-io.h. 8 * 9 * Copyright IBM Corp. 2009 10 * Author(s): Peter Oberparleiter <oberpar@linux.vnet.ibm.com> 11 * 12 * Uses gcc-internal data definitions. 13 */ 14 15#ifndef GCOV_H 16#define GCOV_H GCOV_H 17 18#include <linux/types.h> 19 20/* 21 * Profiling data types used for gcc 3.4 and above - these are defined by 22 * gcc and need to be kept as close to the original definition as possible to 23 * remain compatible. 24 */ 25#define GCOV_DATA_MAGIC ((unsigned int) 0x67636461) 26#define GCOV_TAG_FUNCTION ((unsigned int) 0x01000000) 27#define GCOV_TAG_COUNTER_BASE ((unsigned int) 0x01a10000) 28#define GCOV_TAG_FOR_COUNTER(count) \ 29 (GCOV_TAG_COUNTER_BASE + ((unsigned int) (count) << 17)) 30 31#if BITS_PER_LONG >= 64 32typedef long gcov_type; 33#else 34typedef long long gcov_type; 35#endif 36 37/* Opaque gcov_info. The gcov structures can change as for example in gcc 4.7 so 38 * we cannot use full definition here and they need to be placed in gcc specific 39 * implementation of gcov. This also means no direct access to the members in 40 * generic code and usage of the interface below.*/ 41struct gcov_info; 42 43/* Interface to access gcov_info data */ 44const char *gcov_info_filename(struct gcov_info *info); 45unsigned int gcov_info_version(struct gcov_info *info); 46struct gcov_info *gcov_info_next(struct gcov_info *info); 47void gcov_info_link(struct gcov_info *info); 48void gcov_info_unlink(struct gcov_info *prev, struct gcov_info *info); 49 50/* Base interface. */ 51enum gcov_action { 52 GCOV_ADD, 53 GCOV_REMOVE, 54}; 55 56void gcov_event(enum gcov_action action, struct gcov_info *info); 57void gcov_enable_events(void); 58 59/* Iterator control. */ 60struct seq_file; 61struct gcov_iterator; 62 63struct gcov_iterator *gcov_iter_new(struct gcov_info *info); 64void gcov_iter_free(struct gcov_iterator *iter); 65void gcov_iter_start(struct gcov_iterator *iter); 66int gcov_iter_next(struct gcov_iterator *iter); 67int gcov_iter_write(struct gcov_iterator *iter, struct seq_file *seq); 68struct gcov_info *gcov_iter_get_info(struct gcov_iterator *iter); 69 70/* gcov_info control. */ 71void gcov_info_reset(struct gcov_info *info); 72int gcov_info_is_compatible(struct gcov_info *info1, struct gcov_info *info2); 73void gcov_info_add(struct gcov_info *dest, struct gcov_info *source); 74struct gcov_info *gcov_info_dup(struct gcov_info *info); 75void gcov_info_free(struct gcov_info *info); 76 77struct gcov_link { 78 enum { 79 OBJ_TREE, 80 SRC_TREE, 81 } dir; 82 const char *ext; 83}; 84extern const struct gcov_link gcov_link[]; 85 86#endif /* GCOV_H */ 87