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