]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blame - tools/perf/util/parse-events.y
perf tools: Always bail out when config_attr function fails
[mirror_ubuntu-artful-kernel.git] / tools / perf / util / parse-events.y
CommitLineData
ac20de6f 1%pure-parser
46010ab2 2%parse-param {void *_data}
ac20de6f
ZY
3%parse-param {void *scanner}
4%lex-param {void* scanner}
6297d423 5%locations
89812fc8
JO
6
7%{
8
9#define YYDEBUG 1
10
11#include <linux/compiler.h>
12#include <linux/list.h>
d944c4ee 13#include <linux/types.h>
89812fc8
JO
14#include "util.h"
15#include "parse-events.h"
ac20de6f 16#include "parse-events-bison.h"
89812fc8 17
89812fc8
JO
18#define ABORT_ON(val) \
19do { \
20 if (val) \
21 YYABORT; \
22} while (0)
23
c5cd8ac0
DA
24#define ALLOC_LIST(list) \
25do { \
26 list = malloc(sizeof(*list)); \
27 ABORT_ON(!list); \
28 INIT_LIST_HEAD(list); \
29} while (0)
30
97f63e4a
NK
31static inc_group_count(struct list_head *list,
32 struct parse_events_evlist *data)
33{
34 /* Count groups only have more than 1 members */
35 if (!list_is_last(list->next, list))
36 data->nr_groups++;
37}
38
89812fc8
JO
39%}
40
90e2b22d 41%token PE_START_EVENTS PE_START_TERMS
cf3506dc 42%token PE_VALUE PE_VALUE_SYM_HW PE_VALUE_SYM_SW PE_RAW PE_TERM
ac2ba9f3 43%token PE_EVENT_NAME
89812fc8
JO
44%token PE_NAME
45%token PE_MODIFIER_EVENT PE_MODIFIER_BP
46%token PE_NAME_CACHE_TYPE PE_NAME_CACHE_OP_RESULT
89efb029 47%token PE_PREFIX_MEM PE_PREFIX_RAW PE_PREFIX_GROUP
89812fc8 48%token PE_ERROR
ba32a451 49%token PE_PMU_EVENT_PRE PE_PMU_EVENT_SUF PE_KERNEL_PMU_EVENT
89812fc8 50%type <num> PE_VALUE
cf3506dc
JO
51%type <num> PE_VALUE_SYM_HW
52%type <num> PE_VALUE_SYM_SW
89812fc8 53%type <num> PE_RAW
8f707d84 54%type <num> PE_TERM
89812fc8
JO
55%type <str> PE_NAME
56%type <str> PE_NAME_CACHE_TYPE
57%type <str> PE_NAME_CACHE_OP_RESULT
58%type <str> PE_MODIFIER_EVENT
59%type <str> PE_MODIFIER_BP
ac2ba9f3 60%type <str> PE_EVENT_NAME
ba32a451 61%type <str> PE_PMU_EVENT_PRE PE_PMU_EVENT_SUF PE_KERNEL_PMU_EVENT
cf3506dc 62%type <num> value_sym
8f707d84
JO
63%type <head> event_config
64%type <term> event_term
b847cbdc
JO
65%type <head> event_pmu
66%type <head> event_legacy_symbol
67%type <head> event_legacy_cache
68%type <head> event_legacy_mem
69%type <head> event_legacy_tracepoint
70%type <head> event_legacy_numeric
71%type <head> event_legacy_raw
72%type <head> event_def
ac2ba9f3
RR
73%type <head> event_mod
74%type <head> event_name
89efb029
JO
75%type <head> event
76%type <head> events
77%type <head> group_def
78%type <head> group
79%type <head> groups
89812fc8
JO
80
81%union
82{
83 char *str;
b527bab5 84 u64 num;
8f707d84 85 struct list_head *head;
6cee6cd3 86 struct parse_events_term *term;
89812fc8
JO
87}
88%%
89
90e2b22d 90start:
89efb029 91PE_START_EVENTS start_events
90e2b22d 92|
89efb029
JO
93PE_START_TERMS start_terms
94
95start_events: groups
96{
23b6339b 97 struct parse_events_evlist *data = _data;
89efb029
JO
98
99 parse_events_update_lists($1, &data->list);
100}
101
102groups:
103groups ',' group
104{
105 struct list_head *list = $1;
106 struct list_head *group = $3;
107
108 parse_events_update_lists(group, list);
109 $$ = list;
110}
111|
112groups ',' event
113{
114 struct list_head *list = $1;
115 struct list_head *event = $3;
116
117 parse_events_update_lists(event, list);
118 $$ = list;
119}
120|
121group
122|
123event
124
125group:
126group_def ':' PE_MODIFIER_EVENT
127{
128 struct list_head *list = $1;
129
130 ABORT_ON(parse_events__modifier_group(list, $3));
131 $$ = list;
132}
133|
134group_def
135
136group_def:
137PE_NAME '{' events '}'
138{
139 struct list_head *list = $3;
140
97f63e4a 141 inc_group_count(list, _data);
63dab225 142 parse_events__set_leader($1, list);
89efb029
JO
143 $$ = list;
144}
145|
146'{' events '}'
147{
148 struct list_head *list = $2;
149
97f63e4a 150 inc_group_count(list, _data);
63dab225 151 parse_events__set_leader(NULL, list);
89efb029
JO
152 $$ = list;
153}
90e2b22d 154
89812fc8 155events:
89efb029
JO
156events ',' event
157{
158 struct list_head *event = $3;
159 struct list_head *list = $1;
160
161 parse_events_update_lists(event, list);
162 $$ = list;
163}
164|
165event
89812fc8 166
ac2ba9f3
RR
167event: event_mod
168
169event_mod:
170event_name PE_MODIFIER_EVENT
89812fc8 171{
89efb029 172 struct list_head *list = $1;
46010ab2 173
5d7be90e
JO
174 /*
175 * Apply modifier on all events added by single event definition
176 * (there could be more events added for multiple tracepoint
177 * definitions via '*?'.
178 */
f5b1135b 179 ABORT_ON(parse_events__modifier_event(list, $2, false));
89efb029 180 $$ = list;
89812fc8
JO
181}
182|
ac2ba9f3
RR
183event_name
184
185event_name:
186PE_EVENT_NAME event_def
187{
188 ABORT_ON(parse_events_name($2, $1));
189 free($1);
190 $$ = $2;
191}
192|
89812fc8
JO
193event_def
194
5f537a26
JO
195event_def: event_pmu |
196 event_legacy_symbol |
89812fc8
JO
197 event_legacy_cache sep_dc |
198 event_legacy_mem |
199 event_legacy_tracepoint sep_dc |
200 event_legacy_numeric sep_dc |
201 event_legacy_raw sep_dc
202
5f537a26
JO
203event_pmu:
204PE_NAME '/' event_config '/'
205{
23b6339b 206 struct parse_events_evlist *data = _data;
c5cd8ac0 207 struct list_head *list;
b847cbdc 208
c5cd8ac0
DA
209 ALLOC_LIST(list);
210 ABORT_ON(parse_events_add_pmu(list, &data->idx, $1, $3));
5f537a26 211 parse_events__free_terms($3);
b847cbdc 212 $$ = list;
5f537a26 213}
ad962273
AH
214|
215PE_NAME '/' '/'
216{
217 struct parse_events_evlist *data = _data;
218 struct list_head *list;
219
220 ALLOC_LIST(list);
221 ABORT_ON(parse_events_add_pmu(list, &data->idx, $1, NULL));
222 $$ = list;
223}
ba32a451
KL
224|
225PE_KERNEL_PMU_EVENT sep_dc
226{
227 struct parse_events_evlist *data = _data;
228 struct list_head *head;
229 struct parse_events_term *term;
230 struct list_head *list;
231
232 ALLOC_LIST(head);
233 ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
234 $1, 1));
235 list_add_tail(&term->list, head);
236
237 ALLOC_LIST(list);
238 ABORT_ON(parse_events_add_pmu(list, &data->idx, "cpu", head));
239 parse_events__free_terms(head);
240 $$ = list;
241}
242|
243PE_PMU_EVENT_PRE '-' PE_PMU_EVENT_SUF sep_dc
244{
245 struct parse_events_evlist *data = _data;
246 struct list_head *head;
247 struct parse_events_term *term;
248 struct list_head *list;
249 char pmu_name[128];
250 snprintf(&pmu_name, 128, "%s-%s", $1, $3);
251
252 ALLOC_LIST(head);
253 ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
254 &pmu_name, 1));
255 list_add_tail(&term->list, head);
256
257 ALLOC_LIST(list);
258 ABORT_ON(parse_events_add_pmu(list, &data->idx, "cpu", head));
259 parse_events__free_terms(head);
260 $$ = list;
261}
5f537a26 262
cf3506dc
JO
263value_sym:
264PE_VALUE_SYM_HW
265|
266PE_VALUE_SYM_SW
267
89812fc8 268event_legacy_symbol:
cf3506dc 269value_sym '/' event_config '/'
89812fc8 270{
23b6339b 271 struct parse_events_evlist *data = _data;
c5cd8ac0 272 struct list_head *list;
89812fc8
JO
273 int type = $1 >> 16;
274 int config = $1 & 255;
275
c5cd8ac0
DA
276 ALLOC_LIST(list);
277 ABORT_ON(parse_events_add_numeric(list, &data->idx,
46010ab2 278 type, config, $3));
8f707d84 279 parse_events__free_terms($3);
b847cbdc 280 $$ = list;
8f707d84
JO
281}
282|
cf3506dc 283value_sym sep_slash_dc
8f707d84 284{
23b6339b 285 struct parse_events_evlist *data = _data;
c5cd8ac0 286 struct list_head *list;
8f707d84
JO
287 int type = $1 >> 16;
288 int config = $1 & 255;
289
c5cd8ac0
DA
290 ALLOC_LIST(list);
291 ABORT_ON(parse_events_add_numeric(list, &data->idx,
46010ab2 292 type, config, NULL));
b847cbdc 293 $$ = list;
89812fc8
JO
294}
295
296event_legacy_cache:
297PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT '-' PE_NAME_CACHE_OP_RESULT
298{
23b6339b 299 struct parse_events_evlist *data = _data;
c5cd8ac0 300 struct list_head *list;
b847cbdc 301
c5cd8ac0
DA
302 ALLOC_LIST(list);
303 ABORT_ON(parse_events_add_cache(list, &data->idx, $1, $3, $5));
b847cbdc 304 $$ = list;
89812fc8
JO
305}
306|
307PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT
308{
23b6339b 309 struct parse_events_evlist *data = _data;
c5cd8ac0 310 struct list_head *list;
b847cbdc 311
c5cd8ac0
DA
312 ALLOC_LIST(list);
313 ABORT_ON(parse_events_add_cache(list, &data->idx, $1, $3, NULL));
b847cbdc 314 $$ = list;
89812fc8
JO
315}
316|
317PE_NAME_CACHE_TYPE
318{
23b6339b 319 struct parse_events_evlist *data = _data;
c5cd8ac0 320 struct list_head *list;
b847cbdc 321
c5cd8ac0
DA
322 ALLOC_LIST(list);
323 ABORT_ON(parse_events_add_cache(list, &data->idx, $1, NULL, NULL));
b847cbdc 324 $$ = list;
89812fc8
JO
325}
326
327event_legacy_mem:
3741eb9f
JS
328PE_PREFIX_MEM PE_VALUE '/' PE_VALUE ':' PE_MODIFIER_BP sep_dc
329{
330 struct parse_events_evlist *data = _data;
331 struct list_head *list;
332
333 ALLOC_LIST(list);
334 ABORT_ON(parse_events_add_breakpoint(list, &data->idx,
335 (void *) $2, $6, $4));
336 $$ = list;
337}
338|
339PE_PREFIX_MEM PE_VALUE '/' PE_VALUE sep_dc
340{
341 struct parse_events_evlist *data = _data;
342 struct list_head *list;
343
344 ALLOC_LIST(list);
345 ABORT_ON(parse_events_add_breakpoint(list, &data->idx,
346 (void *) $2, NULL, $4));
347 $$ = list;
348}
349|
89812fc8
JO
350PE_PREFIX_MEM PE_VALUE ':' PE_MODIFIER_BP sep_dc
351{
23b6339b 352 struct parse_events_evlist *data = _data;
c5cd8ac0 353 struct list_head *list;
b847cbdc 354
c5cd8ac0
DA
355 ALLOC_LIST(list);
356 ABORT_ON(parse_events_add_breakpoint(list, &data->idx,
3741eb9f 357 (void *) $2, $4, 0));
b847cbdc 358 $$ = list;
89812fc8
JO
359}
360|
361PE_PREFIX_MEM PE_VALUE sep_dc
362{
23b6339b 363 struct parse_events_evlist *data = _data;
c5cd8ac0 364 struct list_head *list;
b847cbdc 365
c5cd8ac0
DA
366 ALLOC_LIST(list);
367 ABORT_ON(parse_events_add_breakpoint(list, &data->idx,
3741eb9f 368 (void *) $2, NULL, 0));
b847cbdc 369 $$ = list;
89812fc8
JO
370}
371
372event_legacy_tracepoint:
2b9032e0
AY
373PE_NAME '-' PE_NAME ':' PE_NAME
374{
375 struct parse_events_evlist *data = _data;
376 struct list_head *list;
377 char sys_name[128];
378 snprintf(&sys_name, 128, "%s-%s", $1, $3);
379
380 ALLOC_LIST(list);
381 ABORT_ON(parse_events_add_tracepoint(list, &data->idx, &sys_name, $5));
382 $$ = list;
383}
384|
89812fc8
JO
385PE_NAME ':' PE_NAME
386{
23b6339b 387 struct parse_events_evlist *data = _data;
c5cd8ac0 388 struct list_head *list;
b847cbdc 389
c5cd8ac0
DA
390 ALLOC_LIST(list);
391 ABORT_ON(parse_events_add_tracepoint(list, &data->idx, $1, $3));
b847cbdc 392 $$ = list;
89812fc8
JO
393}
394
395event_legacy_numeric:
396PE_VALUE ':' PE_VALUE
397{
23b6339b 398 struct parse_events_evlist *data = _data;
c5cd8ac0 399 struct list_head *list;
b847cbdc 400
c5cd8ac0
DA
401 ALLOC_LIST(list);
402 ABORT_ON(parse_events_add_numeric(list, &data->idx, (u32)$1, $3, NULL));
b847cbdc 403 $$ = list;
89812fc8
JO
404}
405
406event_legacy_raw:
407PE_RAW
408{
23b6339b 409 struct parse_events_evlist *data = _data;
c5cd8ac0 410 struct list_head *list;
b847cbdc 411
c5cd8ac0
DA
412 ALLOC_LIST(list);
413 ABORT_ON(parse_events_add_numeric(list, &data->idx,
46010ab2 414 PERF_TYPE_RAW, $1, NULL));
b847cbdc 415 $$ = list;
8f707d84
JO
416}
417
89efb029 418start_terms: event_config
90e2b22d 419{
23b6339b 420 struct parse_events_terms *data = _data;
90e2b22d
JO
421 data->terms = $1;
422}
423
8f707d84
JO
424event_config:
425event_config ',' event_term
426{
427 struct list_head *head = $1;
6cee6cd3 428 struct parse_events_term *term = $3;
8f707d84
JO
429
430 ABORT_ON(!head);
431 list_add_tail(&term->list, head);
432 $$ = $1;
433}
434|
435event_term
436{
437 struct list_head *head = malloc(sizeof(*head));
6cee6cd3 438 struct parse_events_term *term = $1;
8f707d84
JO
439
440 ABORT_ON(!head);
441 INIT_LIST_HEAD(head);
442 list_add_tail(&term->list, head);
443 $$ = head;
444}
445
446event_term:
447PE_NAME '=' PE_NAME
448{
6cee6cd3 449 struct parse_events_term *term;
8f707d84 450
6cee6cd3 451 ABORT_ON(parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_USER,
16fa7e82 452 $1, $3));
8f707d84
JO
453 $$ = term;
454}
455|
456PE_NAME '=' PE_VALUE
457{
6cee6cd3 458 struct parse_events_term *term;
8f707d84 459
6cee6cd3 460 ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
16fa7e82 461 $1, $3));
8f707d84
JO
462 $$ = term;
463}
464|
1d33d6dc
JO
465PE_NAME '=' PE_VALUE_SYM_HW
466{
6cee6cd3 467 struct parse_events_term *term;
1d33d6dc
JO
468 int config = $3 & 255;
469
6cee6cd3 470 ABORT_ON(parse_events_term__sym_hw(&term, $1, config));
1d33d6dc
JO
471 $$ = term;
472}
473|
8f707d84
JO
474PE_NAME
475{
6cee6cd3 476 struct parse_events_term *term;
8f707d84 477
6cee6cd3 478 ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
16fa7e82 479 $1, 1));
8f707d84
JO
480 $$ = term;
481}
482|
1d33d6dc
JO
483PE_VALUE_SYM_HW
484{
6cee6cd3 485 struct parse_events_term *term;
1d33d6dc
JO
486 int config = $1 & 255;
487
6cee6cd3 488 ABORT_ON(parse_events_term__sym_hw(&term, NULL, config));
1d33d6dc
JO
489 $$ = term;
490}
491|
6b5fc39b
JO
492PE_TERM '=' PE_NAME
493{
6cee6cd3 494 struct parse_events_term *term;
6b5fc39b 495
6cee6cd3 496 ABORT_ON(parse_events_term__str(&term, (int)$1, NULL, $3));
6b5fc39b
JO
497 $$ = term;
498}
499|
8f707d84
JO
500PE_TERM '=' PE_VALUE
501{
6cee6cd3 502 struct parse_events_term *term;
8f707d84 503
6cee6cd3 504 ABORT_ON(parse_events_term__num(&term, (int)$1, NULL, $3));
8f707d84
JO
505 $$ = term;
506}
507|
508PE_TERM
509{
6cee6cd3 510 struct parse_events_term *term;
8f707d84 511
6cee6cd3 512 ABORT_ON(parse_events_term__num(&term, (int)$1, NULL, 1));
8f707d84 513 $$ = term;
89812fc8
JO
514}
515
516sep_dc: ':' |
517
8f707d84
JO
518sep_slash_dc: '/' | ':' |
519
89812fc8
JO
520%%
521
6297d423
JO
522void parse_events_error(YYLTYPE *loc, void *data,
523 void *scanner __maybe_unused,
1d037ca1 524 char const *msg __maybe_unused)
89812fc8 525{
6297d423 526 parse_events_evlist_error(data, loc->last_column, "parser error");
89812fc8 527}