md/raid5: Properly remove excess drives after shrinking a raid5/6
[linux-2.6] / kernel / gcov / gcov.h
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 */