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
32 typedef long gcov_type;
33 #else
34 typedef 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  */
46 struct 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  */
61 struct 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  */
81 struct 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. */
93 enum gcov_action {
94 	GCOV_ADD,
95 	GCOV_REMOVE,
96 };
97 
98 void gcov_event(enum gcov_action action, struct gcov_info *info);
99 void gcov_enable_events(void);
100 
101 /* Iterator control. */
102 struct seq_file;
103 struct gcov_iterator;
104 
105 struct gcov_iterator *gcov_iter_new(struct gcov_info *info);
106 void gcov_iter_free(struct gcov_iterator *iter);
107 void gcov_iter_start(struct gcov_iterator *iter);
108 int gcov_iter_next(struct gcov_iterator *iter);
109 int gcov_iter_write(struct gcov_iterator *iter, struct seq_file *seq);
110 struct gcov_info *gcov_iter_get_info(struct gcov_iterator *iter);
111 
112 /* gcov_info control. */
113 void gcov_info_reset(struct gcov_info *info);
114 int gcov_info_is_compatible(struct gcov_info *info1, struct gcov_info *info2);
115 void gcov_info_add(struct gcov_info *dest, struct gcov_info *source);
116 struct gcov_info *gcov_info_dup(struct gcov_info *info);
117 void gcov_info_free(struct gcov_info *info);
118 
119 struct gcov_link {
120 	enum {
121 		OBJ_TREE,
122 		SRC_TREE,
123 	} dir;
124 	const char *ext;
125 };
126 extern const struct gcov_link gcov_link[];
127 
128 #endif /* GCOV_H */
129