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 32 typedef long gcov_type; 33 #else 34 typedef 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.*/ 41 struct gcov_info; 42 43 /* Interface to access gcov_info data */ 44 const char *gcov_info_filename(struct gcov_info *info); 45 unsigned int gcov_info_version(struct gcov_info *info); 46 struct gcov_info *gcov_info_next(struct gcov_info *info); 47 void gcov_info_link(struct gcov_info *info); 48 void gcov_info_unlink(struct gcov_info *prev, struct gcov_info *info); 49 50 /* Base interface. */ 51 enum gcov_action { 52 GCOV_ADD, 53 GCOV_REMOVE, 54 }; 55 56 void gcov_event(enum gcov_action action, struct gcov_info *info); 57 void gcov_enable_events(void); 58 59 /* Iterator control. */ 60 struct seq_file; 61 struct gcov_iterator; 62 63 struct gcov_iterator *gcov_iter_new(struct gcov_info *info); 64 void gcov_iter_free(struct gcov_iterator *iter); 65 void gcov_iter_start(struct gcov_iterator *iter); 66 int gcov_iter_next(struct gcov_iterator *iter); 67 int gcov_iter_write(struct gcov_iterator *iter, struct seq_file *seq); 68 struct gcov_info *gcov_iter_get_info(struct gcov_iterator *iter); 69 70 /* gcov_info control. */ 71 void gcov_info_reset(struct gcov_info *info); 72 int gcov_info_is_compatible(struct gcov_info *info1, struct gcov_info *info2); 73 void gcov_info_add(struct gcov_info *dest, struct gcov_info *source); 74 struct gcov_info *gcov_info_dup(struct gcov_info *info); 75 void gcov_info_free(struct gcov_info *info); 76 77 struct gcov_link { 78 enum { 79 OBJ_TREE, 80 SRC_TREE, 81 } dir; 82 const char *ext; 83 }; 84 extern const struct gcov_link gcov_link[]; 85 86 #endif /* GCOV_H */ 87