1/* 2 * Profiling infrastructure declarations. 3 * 4 * This file is based on gcc-internal definitions. Data structures are 5 * defined to be compatible with gcc counterparts. For a better 6 * understanding, refer to gcc source: gcc/gcov-io.h. 7 * 8 * Copyright IBM Corp. 2009 9 * Author(s): Peter Oberparleiter <oberpar@linux.vnet.ibm.com> 10 * 11 * Uses gcc-internal data definitions. 12 */ 13 14#ifndef GCOV_H 15#define GCOV_H GCOV_H 16 17#include <linux/types.h> 18 19/* 20 * Profiling data types used for gcc 3.4 and above - these are defined by 21 * gcc and need to be kept as close to the original definition as possible to 22 * remain compatible. 23 */ 24#define GCOV_COUNTERS 5 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/** 38 * struct gcov_fn_info - profiling meta data per function 39 * @ident: object file-unique function identifier 40 * @checksum: function checksum 41 * @n_ctrs: number of values per counter type belonging to this function 42 * 43 * This data is generated by gcc during compilation and doesn't change 44 * at run-time. 45 */ 46struct gcov_fn_info { 47 unsigned int ident; 48 unsigned int checksum; 49 unsigned int n_ctrs[0]; 50}; 51 52/** 53 * struct gcov_ctr_info - profiling data per counter type 54 * @num: number of counter values for this type 55 * @values: array of counter values for this type 56 * @merge: merge function for counter values of this type (unused) 57 * 58 * This data is generated by gcc during compilation and doesn't change 59 * at run-time with the exception of the values array. 60 */ 61struct gcov_ctr_info { 62 unsigned int num; 63 gcov_type *values; 64 void (*merge)(gcov_type *, unsigned int); 65}; 66 67/** 68 * struct gcov_info - profiling data per object file 69 * @version: gcov version magic indicating the gcc version used for compilation 70 * @next: list head for a singly-linked list 71 * @stamp: time stamp 72 * @filename: name of the associated gcov data file 73 * @n_functions: number of instrumented functions 74 * @functions: function data 75 * @ctr_mask: mask specifying which counter types are active 76 * @counts: counter data per counter type 77 * 78 * This data is generated by gcc during compilation and doesn't change 79 * at run-time with the exception of the next pointer. 80 */ 81struct gcov_info { 82 unsigned int version; 83 struct gcov_info *next; 84 unsigned int stamp; 85 const char *filename; 86 unsigned int n_functions; 87 const struct gcov_fn_info *functions; 88 unsigned int ctr_mask; 89 struct gcov_ctr_info counts[0]; 90}; 91 92/* Base interface. */ 93enum gcov_action { 94 GCOV_ADD, 95 GCOV_REMOVE, 96}; 97 98void gcov_event(enum gcov_action action, struct gcov_info *info); 99void gcov_enable_events(void); 100 101/* Iterator control. */ 102struct seq_file; 103struct gcov_iterator; 104 105struct gcov_iterator *gcov_iter_new(struct gcov_info *info); 106void gcov_iter_free(struct gcov_iterator *iter); 107void gcov_iter_start(struct gcov_iterator *iter); 108int gcov_iter_next(struct gcov_iterator *iter); 109int gcov_iter_write(struct gcov_iterator *iter, struct seq_file *seq); 110struct gcov_info *gcov_iter_get_info(struct gcov_iterator *iter); 111 112/* gcov_info control. */ 113void gcov_info_reset(struct gcov_info *info); 114int gcov_info_is_compatible(struct gcov_info *info1, struct gcov_info *info2); 115void gcov_info_add(struct gcov_info *dest, struct gcov_info *source); 116struct gcov_info *gcov_info_dup(struct gcov_info *info); 117void gcov_info_free(struct gcov_info *info); 118 119struct gcov_link { 120 enum { 121 OBJ_TREE, 122 SRC_TREE, 123 } dir; 124 const char *ext; 125}; 126extern const struct gcov_link gcov_link[]; 127 128#endif /* GCOV_H */ 129