]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blame - tools/perf/util/parse-events.y
Merge tag 'drm/atmel-hlcdc/4.8-fixes' of github.com:bbrezillon/linux-at91 into drm...
[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
07ef7574 31static void inc_group_count(struct list_head *list,
97f63e4a
NK
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 44%token PE_NAME
d509db04 45%token PE_BPF_OBJECT PE_BPF_SOURCE
89812fc8
JO
46%token PE_MODIFIER_EVENT PE_MODIFIER_BP
47%token PE_NAME_CACHE_TYPE PE_NAME_CACHE_OP_RESULT
89efb029 48%token PE_PREFIX_MEM PE_PREFIX_RAW PE_PREFIX_GROUP
89812fc8 49%token PE_ERROR
ba32a451 50%token PE_PMU_EVENT_PRE PE_PMU_EVENT_SUF PE_KERNEL_PMU_EVENT
e571e029 51%token PE_ARRAY_ALL PE_ARRAY_RANGE
89812fc8 52%type <num> PE_VALUE
cf3506dc
JO
53%type <num> PE_VALUE_SYM_HW
54%type <num> PE_VALUE_SYM_SW
89812fc8 55%type <num> PE_RAW
8f707d84 56%type <num> PE_TERM
89812fc8 57%type <str> PE_NAME
84c86ca1 58%type <str> PE_BPF_OBJECT
d509db04 59%type <str> PE_BPF_SOURCE
89812fc8
JO
60%type <str> PE_NAME_CACHE_TYPE
61%type <str> PE_NAME_CACHE_OP_RESULT
62%type <str> PE_MODIFIER_EVENT
63%type <str> PE_MODIFIER_BP
ac2ba9f3 64%type <str> PE_EVENT_NAME
ba32a451 65%type <str> PE_PMU_EVENT_PRE PE_PMU_EVENT_SUF PE_KERNEL_PMU_EVENT
cf3506dc 66%type <num> value_sym
8f707d84 67%type <head> event_config
1d55e8ef 68%type <head> opt_event_config
8f707d84 69%type <term> event_term
b847cbdc
JO
70%type <head> event_pmu
71%type <head> event_legacy_symbol
72%type <head> event_legacy_cache
73%type <head> event_legacy_mem
74%type <head> event_legacy_tracepoint
865582c3 75%type <tracepoint_name> tracepoint_name
b847cbdc
JO
76%type <head> event_legacy_numeric
77%type <head> event_legacy_raw
84c86ca1 78%type <head> event_bpf_file
b847cbdc 79%type <head> event_def
ac2ba9f3
RR
80%type <head> event_mod
81%type <head> event_name
89efb029
JO
82%type <head> event
83%type <head> events
84%type <head> group_def
85%type <head> group
86%type <head> groups
e571e029
WN
87%type <array> array
88%type <array> array_term
89%type <array> array_terms
89812fc8
JO
90
91%union
92{
93 char *str;
b527bab5 94 u64 num;
8f707d84 95 struct list_head *head;
6cee6cd3 96 struct parse_events_term *term;
865582c3
HK
97 struct tracepoint_name {
98 char *sys;
99 char *event;
100 } tracepoint_name;
e571e029 101 struct parse_events_array array;
89812fc8
JO
102}
103%%
104
90e2b22d 105start:
89efb029 106PE_START_EVENTS start_events
90e2b22d 107|
89efb029
JO
108PE_START_TERMS start_terms
109
110start_events: groups
111{
23b6339b 112 struct parse_events_evlist *data = _data;
89efb029
JO
113
114 parse_events_update_lists($1, &data->list);
115}
116
117groups:
118groups ',' group
119{
120 struct list_head *list = $1;
121 struct list_head *group = $3;
122
123 parse_events_update_lists(group, list);
124 $$ = list;
125}
126|
127groups ',' event
128{
129 struct list_head *list = $1;
130 struct list_head *event = $3;
131
132 parse_events_update_lists(event, list);
133 $$ = list;
134}
135|
136group
137|
138event
139
140group:
141group_def ':' PE_MODIFIER_EVENT
142{
143 struct list_head *list = $1;
144
145 ABORT_ON(parse_events__modifier_group(list, $3));
146 $$ = list;
147}
148|
149group_def
150
151group_def:
152PE_NAME '{' events '}'
153{
154 struct list_head *list = $3;
155
97f63e4a 156 inc_group_count(list, _data);
63dab225 157 parse_events__set_leader($1, list);
89efb029
JO
158 $$ = list;
159}
160|
161'{' events '}'
162{
163 struct list_head *list = $2;
164
97f63e4a 165 inc_group_count(list, _data);
63dab225 166 parse_events__set_leader(NULL, list);
89efb029
JO
167 $$ = list;
168}
90e2b22d 169
89812fc8 170events:
89efb029
JO
171events ',' event
172{
173 struct list_head *event = $3;
174 struct list_head *list = $1;
175
176 parse_events_update_lists(event, list);
177 $$ = list;
178}
179|
180event
89812fc8 181
ac2ba9f3
RR
182event: event_mod
183
184event_mod:
185event_name PE_MODIFIER_EVENT
89812fc8 186{
89efb029 187 struct list_head *list = $1;
46010ab2 188
5d7be90e
JO
189 /*
190 * Apply modifier on all events added by single event definition
191 * (there could be more events added for multiple tracepoint
192 * definitions via '*?'.
193 */
f5b1135b 194 ABORT_ON(parse_events__modifier_event(list, $2, false));
89efb029 195 $$ = list;
89812fc8
JO
196}
197|
ac2ba9f3
RR
198event_name
199
200event_name:
201PE_EVENT_NAME event_def
202{
203 ABORT_ON(parse_events_name($2, $1));
204 free($1);
205 $$ = $2;
206}
207|
89812fc8
JO
208event_def
209
5f537a26
JO
210event_def: event_pmu |
211 event_legacy_symbol |
89812fc8
JO
212 event_legacy_cache sep_dc |
213 event_legacy_mem |
214 event_legacy_tracepoint sep_dc |
215 event_legacy_numeric sep_dc |
84c86ca1
WN
216 event_legacy_raw sep_dc |
217 event_bpf_file
89812fc8 218
5f537a26 219event_pmu:
bb109acc 220PE_NAME opt_event_config
5f537a26 221{
23b6339b 222 struct parse_events_evlist *data = _data;
c5cd8ac0 223 struct list_head *list;
b847cbdc 224
c5cd8ac0 225 ALLOC_LIST(list);
bb109acc
ACM
226 ABORT_ON(parse_events_add_pmu(data, list, $1, $2));
227 parse_events_terms__delete($2);
b847cbdc 228 $$ = list;
5f537a26 229}
ad962273 230|
ba32a451
KL
231PE_KERNEL_PMU_EVENT sep_dc
232{
233 struct parse_events_evlist *data = _data;
234 struct list_head *head;
235 struct parse_events_term *term;
236 struct list_head *list;
237
238 ALLOC_LIST(head);
239 ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
cecf3a2e 240 $1, 1, &@1, NULL));
ba32a451
KL
241 list_add_tail(&term->list, head);
242
243 ALLOC_LIST(list);
36adec85 244 ABORT_ON(parse_events_add_pmu(data, list, "cpu", head));
2146afc6 245 parse_events_terms__delete(head);
ba32a451
KL
246 $$ = list;
247}
248|
249PE_PMU_EVENT_PRE '-' PE_PMU_EVENT_SUF sep_dc
250{
251 struct parse_events_evlist *data = _data;
252 struct list_head *head;
253 struct parse_events_term *term;
254 struct list_head *list;
255 char pmu_name[128];
256 snprintf(&pmu_name, 128, "%s-%s", $1, $3);
257
258 ALLOC_LIST(head);
259 ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
cecf3a2e 260 &pmu_name, 1, &@1, NULL));
ba32a451
KL
261 list_add_tail(&term->list, head);
262
263 ALLOC_LIST(list);
5ad4da43 264 ABORT_ON(parse_events_add_pmu(data, list, "cpu", head));
2146afc6 265 parse_events_terms__delete(head);
ba32a451
KL
266 $$ = list;
267}
5f537a26 268
cf3506dc
JO
269value_sym:
270PE_VALUE_SYM_HW
271|
272PE_VALUE_SYM_SW
273
89812fc8 274event_legacy_symbol:
cf3506dc 275value_sym '/' event_config '/'
89812fc8 276{
23b6339b 277 struct parse_events_evlist *data = _data;
c5cd8ac0 278 struct list_head *list;
89812fc8
JO
279 int type = $1 >> 16;
280 int config = $1 & 255;
281
c5cd8ac0 282 ALLOC_LIST(list);
87d650be 283 ABORT_ON(parse_events_add_numeric(data, list, type, config, $3));
2146afc6 284 parse_events_terms__delete($3);
b847cbdc 285 $$ = list;
8f707d84
JO
286}
287|
cf3506dc 288value_sym sep_slash_dc
8f707d84 289{
23b6339b 290 struct parse_events_evlist *data = _data;
c5cd8ac0 291 struct list_head *list;
8f707d84
JO
292 int type = $1 >> 16;
293 int config = $1 & 255;
294
c5cd8ac0 295 ALLOC_LIST(list);
87d650be 296 ABORT_ON(parse_events_add_numeric(data, list, type, config, NULL));
b847cbdc 297 $$ = list;
89812fc8
JO
298}
299
300event_legacy_cache:
43d0b978 301PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT '-' PE_NAME_CACHE_OP_RESULT opt_event_config
89812fc8 302{
23b6339b 303 struct parse_events_evlist *data = _data;
43d0b978 304 struct parse_events_error *error = data->error;
c5cd8ac0 305 struct list_head *list;
b847cbdc 306
c5cd8ac0 307 ALLOC_LIST(list);
43d0b978
WN
308 ABORT_ON(parse_events_add_cache(list, &data->idx, $1, $3, $5, error, $6));
309 parse_events_terms__delete($6);
b847cbdc 310 $$ = list;
89812fc8
JO
311}
312|
43d0b978 313PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT opt_event_config
89812fc8 314{
23b6339b 315 struct parse_events_evlist *data = _data;
43d0b978 316 struct parse_events_error *error = data->error;
c5cd8ac0 317 struct list_head *list;
b847cbdc 318
c5cd8ac0 319 ALLOC_LIST(list);
43d0b978
WN
320 ABORT_ON(parse_events_add_cache(list, &data->idx, $1, $3, NULL, error, $4));
321 parse_events_terms__delete($4);
b847cbdc 322 $$ = list;
89812fc8
JO
323}
324|
43d0b978 325PE_NAME_CACHE_TYPE opt_event_config
89812fc8 326{
23b6339b 327 struct parse_events_evlist *data = _data;
43d0b978 328 struct parse_events_error *error = data->error;
c5cd8ac0 329 struct list_head *list;
b847cbdc 330
c5cd8ac0 331 ALLOC_LIST(list);
43d0b978
WN
332 ABORT_ON(parse_events_add_cache(list, &data->idx, $1, NULL, NULL, error, $2));
333 parse_events_terms__delete($2);
b847cbdc 334 $$ = list;
89812fc8
JO
335}
336
337event_legacy_mem:
3741eb9f
JS
338PE_PREFIX_MEM PE_VALUE '/' PE_VALUE ':' PE_MODIFIER_BP sep_dc
339{
340 struct parse_events_evlist *data = _data;
341 struct list_head *list;
342
343 ALLOC_LIST(list);
344 ABORT_ON(parse_events_add_breakpoint(list, &data->idx,
345 (void *) $2, $6, $4));
346 $$ = list;
347}
348|
349PE_PREFIX_MEM PE_VALUE '/' PE_VALUE sep_dc
350{
351 struct parse_events_evlist *data = _data;
352 struct list_head *list;
353
354 ALLOC_LIST(list);
355 ABORT_ON(parse_events_add_breakpoint(list, &data->idx,
356 (void *) $2, NULL, $4));
357 $$ = list;
358}
359|
89812fc8
JO
360PE_PREFIX_MEM PE_VALUE ':' PE_MODIFIER_BP sep_dc
361{
23b6339b 362 struct parse_events_evlist *data = _data;
c5cd8ac0 363 struct list_head *list;
b847cbdc 364
c5cd8ac0
DA
365 ALLOC_LIST(list);
366 ABORT_ON(parse_events_add_breakpoint(list, &data->idx,
3741eb9f 367 (void *) $2, $4, 0));
b847cbdc 368 $$ = list;
89812fc8
JO
369}
370|
371PE_PREFIX_MEM PE_VALUE sep_dc
372{
23b6339b 373 struct parse_events_evlist *data = _data;
c5cd8ac0 374 struct list_head *list;
b847cbdc 375
c5cd8ac0
DA
376 ALLOC_LIST(list);
377 ABORT_ON(parse_events_add_breakpoint(list, &data->idx,
3741eb9f 378 (void *) $2, NULL, 0));
b847cbdc 379 $$ = list;
89812fc8
JO
380}
381
382event_legacy_tracepoint:
1d55e8ef 383tracepoint_name opt_event_config
2b9032e0
AY
384{
385 struct parse_events_evlist *data = _data;
19658171 386 struct parse_events_error *error = data->error;
2b9032e0 387 struct list_head *list;
2b9032e0
AY
388
389 ALLOC_LIST(list);
e637d177
HK
390 if (error)
391 error->idx = @1.first_column;
392
865582c3 393 if (parse_events_add_tracepoint(list, &data->idx, $1.sys, $1.event,
1d55e8ef 394 error, $2))
e637d177
HK
395 return -1;
396
2b9032e0
AY
397 $$ = list;
398}
865582c3
HK
399
400tracepoint_name:
401PE_NAME '-' PE_NAME ':' PE_NAME
402{
403 char sys_name[128];
404 struct tracepoint_name tracepoint;
405
406 snprintf(&sys_name, 128, "%s-%s", $1, $3);
407 tracepoint.sys = &sys_name;
408 tracepoint.event = $5;
409
410 $$ = tracepoint;
411}
2b9032e0 412|
89812fc8
JO
413PE_NAME ':' PE_NAME
414{
865582c3 415 struct tracepoint_name tracepoint = {$1, $3};
b847cbdc 416
865582c3 417 $$ = tracepoint;
89812fc8
JO
418}
419
420event_legacy_numeric:
10bf358a 421PE_VALUE ':' PE_VALUE opt_event_config
89812fc8 422{
23b6339b 423 struct parse_events_evlist *data = _data;
c5cd8ac0 424 struct list_head *list;
b847cbdc 425
c5cd8ac0 426 ALLOC_LIST(list);
10bf358a
WN
427 ABORT_ON(parse_events_add_numeric(data, list, (u32)$1, $3, $4));
428 parse_events_terms__delete($4);
b847cbdc 429 $$ = list;
89812fc8
JO
430}
431
432event_legacy_raw:
10bf358a 433PE_RAW opt_event_config
89812fc8 434{
23b6339b 435 struct parse_events_evlist *data = _data;
c5cd8ac0 436 struct list_head *list;
b847cbdc 437
c5cd8ac0 438 ALLOC_LIST(list);
10bf358a
WN
439 ABORT_ON(parse_events_add_numeric(data, list, PERF_TYPE_RAW, $1, $2));
440 parse_events_terms__delete($2);
b847cbdc 441 $$ = list;
8f707d84
JO
442}
443
84c86ca1 444event_bpf_file:
a34f3be7 445PE_BPF_OBJECT opt_event_config
84c86ca1
WN
446{
447 struct parse_events_evlist *data = _data;
448 struct parse_events_error *error = data->error;
449 struct list_head *list;
450
451 ALLOC_LIST(list);
a34f3be7
WN
452 ABORT_ON(parse_events_load_bpf(data, list, $1, false, $2));
453 parse_events_terms__delete($2);
d509db04
WN
454 $$ = list;
455}
456|
a34f3be7 457PE_BPF_SOURCE opt_event_config
d509db04
WN
458{
459 struct parse_events_evlist *data = _data;
460 struct list_head *list;
461
462 ALLOC_LIST(list);
a34f3be7
WN
463 ABORT_ON(parse_events_load_bpf(data, list, $1, true, $2));
464 parse_events_terms__delete($2);
84c86ca1
WN
465 $$ = list;
466}
467
1d55e8ef
ACM
468opt_event_config:
469'/' event_config '/'
470{
471 $$ = $2;
472}
473|
474'/' '/'
475{
476 $$ = NULL;
477}
478|
479{
480 $$ = NULL;
481}
482
89efb029 483start_terms: event_config
90e2b22d 484{
23b6339b 485 struct parse_events_terms *data = _data;
90e2b22d
JO
486 data->terms = $1;
487}
488
8f707d84
JO
489event_config:
490event_config ',' event_term
491{
492 struct list_head *head = $1;
6cee6cd3 493 struct parse_events_term *term = $3;
8f707d84
JO
494
495 ABORT_ON(!head);
496 list_add_tail(&term->list, head);
497 $$ = $1;
498}
499|
500event_term
501{
502 struct list_head *head = malloc(sizeof(*head));
6cee6cd3 503 struct parse_events_term *term = $1;
8f707d84
JO
504
505 ABORT_ON(!head);
506 INIT_LIST_HEAD(head);
507 list_add_tail(&term->list, head);
508 $$ = head;
509}
510
511event_term:
512PE_NAME '=' PE_NAME
513{
6cee6cd3 514 struct parse_events_term *term;
8f707d84 515
6cee6cd3 516 ABORT_ON(parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_USER,
cecf3a2e 517 $1, $3, &@1, &@3));
8f707d84
JO
518 $$ = term;
519}
520|
521PE_NAME '=' PE_VALUE
522{
6cee6cd3 523 struct parse_events_term *term;
8f707d84 524
6cee6cd3 525 ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
cecf3a2e 526 $1, $3, &@1, &@3));
8f707d84
JO
527 $$ = term;
528}
529|
1d33d6dc
JO
530PE_NAME '=' PE_VALUE_SYM_HW
531{
6cee6cd3 532 struct parse_events_term *term;
1d33d6dc
JO
533 int config = $3 & 255;
534
6cee6cd3 535 ABORT_ON(parse_events_term__sym_hw(&term, $1, config));
1d33d6dc
JO
536 $$ = term;
537}
538|
8f707d84
JO
539PE_NAME
540{
6cee6cd3 541 struct parse_events_term *term;
8f707d84 542
6cee6cd3 543 ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
cecf3a2e 544 $1, 1, &@1, NULL));
8f707d84
JO
545 $$ = term;
546}
547|
1d33d6dc
JO
548PE_VALUE_SYM_HW
549{
6cee6cd3 550 struct parse_events_term *term;
1d33d6dc
JO
551 int config = $1 & 255;
552
6cee6cd3 553 ABORT_ON(parse_events_term__sym_hw(&term, NULL, config));
1d33d6dc
JO
554 $$ = term;
555}
556|
6b5fc39b
JO
557PE_TERM '=' PE_NAME
558{
6cee6cd3 559 struct parse_events_term *term;
6b5fc39b 560
cecf3a2e 561 ABORT_ON(parse_events_term__str(&term, (int)$1, NULL, $3, &@1, &@3));
6b5fc39b
JO
562 $$ = term;
563}
564|
8f707d84
JO
565PE_TERM '=' PE_VALUE
566{
6cee6cd3 567 struct parse_events_term *term;
8f707d84 568
cecf3a2e 569 ABORT_ON(parse_events_term__num(&term, (int)$1, NULL, $3, &@1, &@3));
8f707d84
JO
570 $$ = term;
571}
572|
573PE_TERM
574{
6cee6cd3 575 struct parse_events_term *term;
8f707d84 576
cecf3a2e 577 ABORT_ON(parse_events_term__num(&term, (int)$1, NULL, 1, &@1, NULL));
8f707d84 578 $$ = term;
89812fc8 579}
e571e029
WN
580|
581PE_NAME array '=' PE_NAME
582{
583 struct parse_events_term *term;
584 int i;
585
586 ABORT_ON(parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_USER,
587 $1, $4, &@1, &@4));
588
589 term->array = $2;
590 $$ = term;
591}
592|
593PE_NAME array '=' PE_VALUE
594{
595 struct parse_events_term *term;
596
597 ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
598 $1, $4, &@1, &@4));
599 term->array = $2;
600 $$ = term;
601}
602
603array:
604'[' array_terms ']'
605{
606 $$ = $2;
607}
608|
609PE_ARRAY_ALL
610{
611 $$.nr_ranges = 0;
612 $$.ranges = NULL;
613}
614
615array_terms:
616array_terms ',' array_term
617{
618 struct parse_events_array new_array;
619
620 new_array.nr_ranges = $1.nr_ranges + $3.nr_ranges;
621 new_array.ranges = malloc(sizeof(new_array.ranges[0]) *
622 new_array.nr_ranges);
623 ABORT_ON(!new_array.ranges);
624 memcpy(&new_array.ranges[0], $1.ranges,
625 $1.nr_ranges * sizeof(new_array.ranges[0]));
626 memcpy(&new_array.ranges[$1.nr_ranges], $3.ranges,
627 $3.nr_ranges * sizeof(new_array.ranges[0]));
628 free($1.ranges);
629 free($3.ranges);
630 $$ = new_array;
631}
632|
633array_term
634
635array_term:
636PE_VALUE
637{
638 struct parse_events_array array;
639
640 array.nr_ranges = 1;
641 array.ranges = malloc(sizeof(array.ranges[0]));
642 ABORT_ON(!array.ranges);
643 array.ranges[0].start = $1;
644 array.ranges[0].length = 1;
645 $$ = array;
646}
647|
648PE_VALUE PE_ARRAY_RANGE PE_VALUE
649{
650 struct parse_events_array array;
651
652 ABORT_ON($3 < $1);
653 array.nr_ranges = 1;
654 array.ranges = malloc(sizeof(array.ranges[0]));
655 ABORT_ON(!array.ranges);
656 array.ranges[0].start = $1;
657 array.ranges[0].length = $3 - $1 + 1;
658 $$ = array;
659}
89812fc8
JO
660
661sep_dc: ':' |
662
8f707d84
JO
663sep_slash_dc: '/' | ':' |
664
89812fc8
JO
665%%
666
6297d423
JO
667void parse_events_error(YYLTYPE *loc, void *data,
668 void *scanner __maybe_unused,
1d037ca1 669 char const *msg __maybe_unused)
89812fc8 670{
6297d423 671 parse_events_evlist_error(data, loc->last_column, "parser error");
89812fc8 672}