]>
Commit | Line | Data |
---|---|---|
ac20de6f | 1 | %pure-parser |
89812fc8 | 2 | %name-prefix "parse_events_" |
46010ab2 | 3 | %parse-param {void *_data} |
ac20de6f ZY |
4 | %parse-param {void *scanner} |
5 | %lex-param {void* scanner} | |
89812fc8 JO |
6 | |
7 | %{ | |
8 | ||
9 | #define YYDEBUG 1 | |
10 | ||
11 | #include <linux/compiler.h> | |
12 | #include <linux/list.h> | |
13 | #include "types.h" | |
14 | #include "util.h" | |
15 | #include "parse-events.h" | |
ac20de6f | 16 | #include "parse-events-bison.h" |
89812fc8 | 17 | |
ac20de6f | 18 | extern int parse_events_lex (YYSTYPE* lvalp, void* scanner); |
89812fc8 JO |
19 | |
20 | #define ABORT_ON(val) \ | |
21 | do { \ | |
22 | if (val) \ | |
23 | YYABORT; \ | |
24 | } while (0) | |
25 | ||
26 | %} | |
27 | ||
90e2b22d | 28 | %token PE_START_EVENTS PE_START_TERMS |
cf3506dc | 29 | %token PE_VALUE PE_VALUE_SYM_HW PE_VALUE_SYM_SW PE_RAW PE_TERM |
89812fc8 JO |
30 | %token PE_NAME |
31 | %token PE_MODIFIER_EVENT PE_MODIFIER_BP | |
32 | %token PE_NAME_CACHE_TYPE PE_NAME_CACHE_OP_RESULT | |
89efb029 | 33 | %token PE_PREFIX_MEM PE_PREFIX_RAW PE_PREFIX_GROUP |
89812fc8 JO |
34 | %token PE_ERROR |
35 | %type <num> PE_VALUE | |
cf3506dc JO |
36 | %type <num> PE_VALUE_SYM_HW |
37 | %type <num> PE_VALUE_SYM_SW | |
89812fc8 | 38 | %type <num> PE_RAW |
8f707d84 | 39 | %type <num> PE_TERM |
89812fc8 JO |
40 | %type <str> PE_NAME |
41 | %type <str> PE_NAME_CACHE_TYPE | |
42 | %type <str> PE_NAME_CACHE_OP_RESULT | |
43 | %type <str> PE_MODIFIER_EVENT | |
44 | %type <str> PE_MODIFIER_BP | |
cf3506dc | 45 | %type <num> value_sym |
8f707d84 JO |
46 | %type <head> event_config |
47 | %type <term> event_term | |
b847cbdc JO |
48 | %type <head> event_pmu |
49 | %type <head> event_legacy_symbol | |
50 | %type <head> event_legacy_cache | |
51 | %type <head> event_legacy_mem | |
52 | %type <head> event_legacy_tracepoint | |
53 | %type <head> event_legacy_numeric | |
54 | %type <head> event_legacy_raw | |
55 | %type <head> event_def | |
89efb029 JO |
56 | %type <head> event |
57 | %type <head> events | |
58 | %type <head> group_def | |
59 | %type <head> group | |
60 | %type <head> groups | |
89812fc8 JO |
61 | |
62 | %union | |
63 | { | |
64 | char *str; | |
b527bab5 | 65 | u64 num; |
8f707d84 JO |
66 | struct list_head *head; |
67 | struct parse_events__term *term; | |
89812fc8 JO |
68 | } |
69 | %% | |
70 | ||
90e2b22d | 71 | start: |
89efb029 | 72 | PE_START_EVENTS start_events |
90e2b22d | 73 | | |
89efb029 JO |
74 | PE_START_TERMS start_terms |
75 | ||
76 | start_events: groups | |
77 | { | |
78 | struct parse_events_data__events *data = _data; | |
79 | ||
80 | parse_events_update_lists($1, &data->list); | |
81 | } | |
82 | ||
83 | groups: | |
84 | groups ',' group | |
85 | { | |
86 | struct list_head *list = $1; | |
87 | struct list_head *group = $3; | |
88 | ||
89 | parse_events_update_lists(group, list); | |
90 | $$ = list; | |
91 | } | |
92 | | | |
93 | groups ',' event | |
94 | { | |
95 | struct list_head *list = $1; | |
96 | struct list_head *event = $3; | |
97 | ||
98 | parse_events_update_lists(event, list); | |
99 | $$ = list; | |
100 | } | |
101 | | | |
102 | group | |
103 | | | |
104 | event | |
105 | ||
106 | group: | |
107 | group_def ':' PE_MODIFIER_EVENT | |
108 | { | |
109 | struct list_head *list = $1; | |
110 | ||
111 | ABORT_ON(parse_events__modifier_group(list, $3)); | |
112 | $$ = list; | |
113 | } | |
114 | | | |
115 | group_def | |
116 | ||
117 | group_def: | |
118 | PE_NAME '{' events '}' | |
119 | { | |
120 | struct list_head *list = $3; | |
121 | ||
122 | parse_events__group($1, list); | |
123 | $$ = list; | |
124 | } | |
125 | | | |
126 | '{' events '}' | |
127 | { | |
128 | struct list_head *list = $2; | |
129 | ||
130 | parse_events__group(NULL, list); | |
131 | $$ = list; | |
132 | } | |
90e2b22d | 133 | |
89812fc8 | 134 | events: |
89efb029 JO |
135 | events ',' event |
136 | { | |
137 | struct list_head *event = $3; | |
138 | struct list_head *list = $1; | |
139 | ||
140 | parse_events_update_lists(event, list); | |
141 | $$ = list; | |
142 | } | |
143 | | | |
144 | event | |
89812fc8 JO |
145 | |
146 | event: | |
147 | event_def PE_MODIFIER_EVENT | |
148 | { | |
89efb029 | 149 | struct list_head *list = $1; |
46010ab2 | 150 | |
5d7be90e JO |
151 | /* |
152 | * Apply modifier on all events added by single event definition | |
153 | * (there could be more events added for multiple tracepoint | |
154 | * definitions via '*?'. | |
155 | */ | |
f5b1135b | 156 | ABORT_ON(parse_events__modifier_event(list, $2, false)); |
89efb029 | 157 | $$ = list; |
89812fc8 JO |
158 | } |
159 | | | |
160 | event_def | |
161 | ||
5f537a26 JO |
162 | event_def: event_pmu | |
163 | event_legacy_symbol | | |
89812fc8 JO |
164 | event_legacy_cache sep_dc | |
165 | event_legacy_mem | | |
166 | event_legacy_tracepoint sep_dc | | |
167 | event_legacy_numeric sep_dc | | |
168 | event_legacy_raw sep_dc | |
169 | ||
5f537a26 JO |
170 | event_pmu: |
171 | PE_NAME '/' event_config '/' | |
172 | { | |
46010ab2 | 173 | struct parse_events_data__events *data = _data; |
b847cbdc JO |
174 | struct list_head *list = NULL; |
175 | ||
46010ab2 | 176 | ABORT_ON(parse_events_add_pmu(&list, &data->idx, $1, $3)); |
5f537a26 | 177 | parse_events__free_terms($3); |
b847cbdc | 178 | $$ = list; |
5f537a26 JO |
179 | } |
180 | ||
cf3506dc JO |
181 | value_sym: |
182 | PE_VALUE_SYM_HW | |
183 | | | |
184 | PE_VALUE_SYM_SW | |
185 | ||
89812fc8 | 186 | event_legacy_symbol: |
cf3506dc | 187 | value_sym '/' event_config '/' |
89812fc8 | 188 | { |
46010ab2 | 189 | struct parse_events_data__events *data = _data; |
b847cbdc | 190 | struct list_head *list = NULL; |
89812fc8 JO |
191 | int type = $1 >> 16; |
192 | int config = $1 & 255; | |
193 | ||
46010ab2 JO |
194 | ABORT_ON(parse_events_add_numeric(&list, &data->idx, |
195 | type, config, $3)); | |
8f707d84 | 196 | parse_events__free_terms($3); |
b847cbdc | 197 | $$ = list; |
8f707d84 JO |
198 | } |
199 | | | |
cf3506dc | 200 | value_sym sep_slash_dc |
8f707d84 | 201 | { |
46010ab2 | 202 | struct parse_events_data__events *data = _data; |
b847cbdc | 203 | struct list_head *list = NULL; |
8f707d84 JO |
204 | int type = $1 >> 16; |
205 | int config = $1 & 255; | |
206 | ||
46010ab2 JO |
207 | ABORT_ON(parse_events_add_numeric(&list, &data->idx, |
208 | type, config, NULL)); | |
b847cbdc | 209 | $$ = list; |
89812fc8 JO |
210 | } |
211 | ||
212 | event_legacy_cache: | |
213 | PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT '-' PE_NAME_CACHE_OP_RESULT | |
214 | { | |
46010ab2 | 215 | struct parse_events_data__events *data = _data; |
b847cbdc JO |
216 | struct list_head *list = NULL; |
217 | ||
46010ab2 | 218 | ABORT_ON(parse_events_add_cache(&list, &data->idx, $1, $3, $5)); |
b847cbdc | 219 | $$ = list; |
89812fc8 JO |
220 | } |
221 | | | |
222 | PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT | |
223 | { | |
46010ab2 | 224 | struct parse_events_data__events *data = _data; |
b847cbdc JO |
225 | struct list_head *list = NULL; |
226 | ||
46010ab2 | 227 | ABORT_ON(parse_events_add_cache(&list, &data->idx, $1, $3, NULL)); |
b847cbdc | 228 | $$ = list; |
89812fc8 JO |
229 | } |
230 | | | |
231 | PE_NAME_CACHE_TYPE | |
232 | { | |
46010ab2 | 233 | struct parse_events_data__events *data = _data; |
b847cbdc JO |
234 | struct list_head *list = NULL; |
235 | ||
46010ab2 | 236 | ABORT_ON(parse_events_add_cache(&list, &data->idx, $1, NULL, NULL)); |
b847cbdc | 237 | $$ = list; |
89812fc8 JO |
238 | } |
239 | ||
240 | event_legacy_mem: | |
241 | PE_PREFIX_MEM PE_VALUE ':' PE_MODIFIER_BP sep_dc | |
242 | { | |
46010ab2 | 243 | struct parse_events_data__events *data = _data; |
b847cbdc JO |
244 | struct list_head *list = NULL; |
245 | ||
46010ab2 JO |
246 | ABORT_ON(parse_events_add_breakpoint(&list, &data->idx, |
247 | (void *) $2, $4)); | |
b847cbdc | 248 | $$ = list; |
89812fc8 JO |
249 | } |
250 | | | |
251 | PE_PREFIX_MEM PE_VALUE sep_dc | |
252 | { | |
46010ab2 | 253 | struct parse_events_data__events *data = _data; |
b847cbdc JO |
254 | struct list_head *list = NULL; |
255 | ||
46010ab2 JO |
256 | ABORT_ON(parse_events_add_breakpoint(&list, &data->idx, |
257 | (void *) $2, NULL)); | |
b847cbdc | 258 | $$ = list; |
89812fc8 JO |
259 | } |
260 | ||
261 | event_legacy_tracepoint: | |
262 | PE_NAME ':' PE_NAME | |
263 | { | |
46010ab2 | 264 | struct parse_events_data__events *data = _data; |
b847cbdc JO |
265 | struct list_head *list = NULL; |
266 | ||
46010ab2 | 267 | ABORT_ON(parse_events_add_tracepoint(&list, &data->idx, $1, $3)); |
b847cbdc | 268 | $$ = list; |
89812fc8 JO |
269 | } |
270 | ||
271 | event_legacy_numeric: | |
272 | PE_VALUE ':' PE_VALUE | |
273 | { | |
46010ab2 | 274 | struct parse_events_data__events *data = _data; |
b847cbdc JO |
275 | struct list_head *list = NULL; |
276 | ||
b527bab5 | 277 | ABORT_ON(parse_events_add_numeric(&list, &data->idx, (u32)$1, $3, NULL)); |
b847cbdc | 278 | $$ = list; |
89812fc8 JO |
279 | } |
280 | ||
281 | event_legacy_raw: | |
282 | PE_RAW | |
283 | { | |
46010ab2 | 284 | struct parse_events_data__events *data = _data; |
b847cbdc JO |
285 | struct list_head *list = NULL; |
286 | ||
46010ab2 JO |
287 | ABORT_ON(parse_events_add_numeric(&list, &data->idx, |
288 | PERF_TYPE_RAW, $1, NULL)); | |
b847cbdc | 289 | $$ = list; |
8f707d84 JO |
290 | } |
291 | ||
89efb029 | 292 | start_terms: event_config |
90e2b22d JO |
293 | { |
294 | struct parse_events_data__terms *data = _data; | |
295 | data->terms = $1; | |
296 | } | |
297 | ||
8f707d84 JO |
298 | event_config: |
299 | event_config ',' event_term | |
300 | { | |
301 | struct list_head *head = $1; | |
302 | struct parse_events__term *term = $3; | |
303 | ||
304 | ABORT_ON(!head); | |
305 | list_add_tail(&term->list, head); | |
306 | $$ = $1; | |
307 | } | |
308 | | | |
309 | event_term | |
310 | { | |
311 | struct list_head *head = malloc(sizeof(*head)); | |
312 | struct parse_events__term *term = $1; | |
313 | ||
314 | ABORT_ON(!head); | |
315 | INIT_LIST_HEAD(head); | |
316 | list_add_tail(&term->list, head); | |
317 | $$ = head; | |
318 | } | |
319 | ||
320 | event_term: | |
321 | PE_NAME '=' PE_NAME | |
322 | { | |
323 | struct parse_events__term *term; | |
324 | ||
16fa7e82 JO |
325 | ABORT_ON(parse_events__term_str(&term, PARSE_EVENTS__TERM_TYPE_USER, |
326 | $1, $3)); | |
8f707d84 JO |
327 | $$ = term; |
328 | } | |
329 | | | |
330 | PE_NAME '=' PE_VALUE | |
331 | { | |
332 | struct parse_events__term *term; | |
333 | ||
16fa7e82 JO |
334 | ABORT_ON(parse_events__term_num(&term, PARSE_EVENTS__TERM_TYPE_USER, |
335 | $1, $3)); | |
8f707d84 JO |
336 | $$ = term; |
337 | } | |
338 | | | |
339 | PE_NAME | |
340 | { | |
341 | struct parse_events__term *term; | |
342 | ||
16fa7e82 JO |
343 | ABORT_ON(parse_events__term_num(&term, PARSE_EVENTS__TERM_TYPE_USER, |
344 | $1, 1)); | |
8f707d84 JO |
345 | $$ = term; |
346 | } | |
347 | | | |
6b5fc39b JO |
348 | PE_TERM '=' PE_NAME |
349 | { | |
350 | struct parse_events__term *term; | |
351 | ||
b527bab5 | 352 | ABORT_ON(parse_events__term_str(&term, (int)$1, NULL, $3)); |
6b5fc39b JO |
353 | $$ = term; |
354 | } | |
355 | | | |
8f707d84 JO |
356 | PE_TERM '=' PE_VALUE |
357 | { | |
358 | struct parse_events__term *term; | |
359 | ||
b527bab5 | 360 | ABORT_ON(parse_events__term_num(&term, (int)$1, NULL, $3)); |
8f707d84 JO |
361 | $$ = term; |
362 | } | |
363 | | | |
364 | PE_TERM | |
365 | { | |
366 | struct parse_events__term *term; | |
367 | ||
b527bab5 | 368 | ABORT_ON(parse_events__term_num(&term, (int)$1, NULL, 1)); |
8f707d84 | 369 | $$ = term; |
89812fc8 JO |
370 | } |
371 | ||
372 | sep_dc: ':' | | |
373 | ||
8f707d84 JO |
374 | sep_slash_dc: '/' | ':' | |
375 | ||
89812fc8 JO |
376 | %% |
377 | ||
ac20de6f | 378 | void parse_events_error(void *data __used, void *scanner __used, |
89812fc8 JO |
379 | char const *msg __used) |
380 | { | |
381 | } |