blob: 5be4a5f216d6d23889e07e225810fec40df67c30 [file] [log] [blame]
Zheng Yanac20de6f2012-06-15 14:31:39 +08001%pure-parser
Jiri Olsa46010ab2012-06-15 14:31:38 +08002%parse-param {void *_data}
Zheng Yanac20de6f2012-06-15 14:31:39 +08003%parse-param {void *scanner}
4%lex-param {void* scanner}
Jiri Olsa6297d422015-04-22 21:10:17 +02005%locations
Jiri Olsa89812fc2012-03-15 20:09:15 +01006
7%{
8
9#define YYDEBUG 1
10
11#include <linux/compiler.h>
12#include <linux/list.h>
Borislav Petkovd944c4e2014-04-25 21:31:02 +020013#include <linux/types.h>
Jiri Olsa89812fc2012-03-15 20:09:15 +010014#include "util.h"
15#include "parse-events.h"
Zheng Yanac20de6f2012-06-15 14:31:39 +080016#include "parse-events-bison.h"
Jiri Olsa89812fc2012-03-15 20:09:15 +010017
Jiri Olsa89812fc2012-03-15 20:09:15 +010018#define ABORT_ON(val) \
19do { \
20 if (val) \
21 YYABORT; \
22} while (0)
23
David Ahernc5cd8ac2013-07-02 13:27:25 -060024#define ALLOC_LIST(list) \
25do { \
26 list = malloc(sizeof(*list)); \
27 ABORT_ON(!list); \
28 INIT_LIST_HEAD(list); \
29} while (0)
30
Colin Ian King07ef7572016-03-07 16:44:37 -030031static void inc_group_count(struct list_head *list,
Namhyung Kim97f63e42013-01-22 18:09:29 +090032 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
Jiri Olsa89812fc2012-03-15 20:09:15 +010039%}
40
Jiri Olsa90e2b222012-06-15 14:31:40 +080041%token PE_START_EVENTS PE_START_TERMS
Jiri Olsacf3506d2012-07-04 00:00:43 +020042%token PE_VALUE PE_VALUE_SYM_HW PE_VALUE_SYM_SW PE_RAW PE_TERM
Robert Richterac2ba9f2012-08-16 21:10:21 +020043%token PE_EVENT_NAME
Jiri Olsa89812fc2012-03-15 20:09:15 +010044%token PE_NAME
Wang Nand509db02015-10-14 12:41:20 +000045%token PE_BPF_OBJECT PE_BPF_SOURCE
Jiri Olsa89812fc2012-03-15 20:09:15 +010046%token PE_MODIFIER_EVENT PE_MODIFIER_BP
47%token PE_NAME_CACHE_TYPE PE_NAME_CACHE_OP_RESULT
Jiri Olsa89efb022012-08-08 12:14:14 +020048%token PE_PREFIX_MEM PE_PREFIX_RAW PE_PREFIX_GROUP
Jiri Olsa89812fc2012-03-15 20:09:15 +010049%token PE_ERROR
Kan Liangba32a452014-10-07 11:08:51 -040050%token PE_PMU_EVENT_PRE PE_PMU_EVENT_SUF PE_KERNEL_PMU_EVENT
Wang Nane571e022016-02-22 09:10:35 +000051%token PE_ARRAY_ALL PE_ARRAY_RANGE
Jiri Olsa89812fc2012-03-15 20:09:15 +010052%type <num> PE_VALUE
Jiri Olsacf3506d2012-07-04 00:00:43 +020053%type <num> PE_VALUE_SYM_HW
54%type <num> PE_VALUE_SYM_SW
Jiri Olsa89812fc2012-03-15 20:09:15 +010055%type <num> PE_RAW
Jiri Olsa8f707d82012-03-15 20:09:16 +010056%type <num> PE_TERM
Jiri Olsa89812fc2012-03-15 20:09:15 +010057%type <str> PE_NAME
Wang Nan84c86ca2015-10-14 12:41:14 +000058%type <str> PE_BPF_OBJECT
Wang Nand509db02015-10-14 12:41:20 +000059%type <str> PE_BPF_SOURCE
Jiri Olsa89812fc2012-03-15 20:09:15 +010060%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
Robert Richterac2ba9f2012-08-16 21:10:21 +020064%type <str> PE_EVENT_NAME
Kan Liangba32a452014-10-07 11:08:51 -040065%type <str> PE_PMU_EVENT_PRE PE_PMU_EVENT_SUF PE_KERNEL_PMU_EVENT
Jiri Olsacf3506d2012-07-04 00:00:43 +020066%type <num> value_sym
Jiri Olsa8f707d82012-03-15 20:09:16 +010067%type <head> event_config
Arnaldo Carvalho de Melo1d55e8e2016-02-19 18:45:12 -030068%type <head> opt_event_config
Jiri Olsa8f707d82012-03-15 20:09:16 +010069%type <term> event_term
Jiri Olsab847cbd2012-05-21 09:12:51 +020070%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
He Kuang865582c2015-09-28 03:52:15 +000075%type <tracepoint_name> tracepoint_name
Jiri Olsab847cbd2012-05-21 09:12:51 +020076%type <head> event_legacy_numeric
77%type <head> event_legacy_raw
Wang Nan84c86ca2015-10-14 12:41:14 +000078%type <head> event_bpf_file
Jiri Olsab847cbd2012-05-21 09:12:51 +020079%type <head> event_def
Robert Richterac2ba9f2012-08-16 21:10:21 +020080%type <head> event_mod
81%type <head> event_name
Jiri Olsa89efb022012-08-08 12:14:14 +020082%type <head> event
83%type <head> events
84%type <head> group_def
85%type <head> group
86%type <head> groups
Wang Nane571e022016-02-22 09:10:35 +000087%type <array> array
88%type <array> array_term
89%type <array> array_terms
Jiri Olsa89812fc2012-03-15 20:09:15 +010090
91%union
92{
93 char *str;
Robert Richterb527bab2012-08-07 19:43:13 +020094 u64 num;
Jiri Olsa8f707d82012-03-15 20:09:16 +010095 struct list_head *head;
Arnaldo Carvalho de Melo6cee6cd2013-01-18 16:29:49 -030096 struct parse_events_term *term;
He Kuang865582c2015-09-28 03:52:15 +000097 struct tracepoint_name {
98 char *sys;
99 char *event;
100 } tracepoint_name;
Wang Nane571e022016-02-22 09:10:35 +0000101 struct parse_events_array array;
Jiri Olsa89812fc2012-03-15 20:09:15 +0100102}
103%%
104
Jiri Olsa90e2b222012-06-15 14:31:40 +0800105start:
Jiri Olsa89efb022012-08-08 12:14:14 +0200106PE_START_EVENTS start_events
Jiri Olsa90e2b222012-06-15 14:31:40 +0800107|
Jiri Olsa89efb022012-08-08 12:14:14 +0200108PE_START_TERMS start_terms
109
110start_events: groups
111{
Arnaldo Carvalho de Melo23b63392013-01-18 16:56:57 -0300112 struct parse_events_evlist *data = _data;
Jiri Olsa89efb022012-08-08 12:14:14 +0200113
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
Namhyung Kim97f63e42013-01-22 18:09:29 +0900156 inc_group_count(list, _data);
Arnaldo Carvalho de Melo63dab222012-08-14 16:35:48 -0300157 parse_events__set_leader($1, list);
Jiri Olsa89efb022012-08-08 12:14:14 +0200158 $$ = list;
159}
160|
161'{' events '}'
162{
163 struct list_head *list = $2;
164
Namhyung Kim97f63e42013-01-22 18:09:29 +0900165 inc_group_count(list, _data);
Arnaldo Carvalho de Melo63dab222012-08-14 16:35:48 -0300166 parse_events__set_leader(NULL, list);
Jiri Olsa89efb022012-08-08 12:14:14 +0200167 $$ = list;
168}
Jiri Olsa90e2b222012-06-15 14:31:40 +0800169
Jiri Olsa89812fc2012-03-15 20:09:15 +0100170events:
Jiri Olsa89efb022012-08-08 12:14:14 +0200171events ',' 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
Jiri Olsa89812fc2012-03-15 20:09:15 +0100181
Robert Richterac2ba9f2012-08-16 21:10:21 +0200182event: event_mod
183
184event_mod:
185event_name PE_MODIFIER_EVENT
Jiri Olsa89812fc2012-03-15 20:09:15 +0100186{
Jiri Olsa89efb022012-08-08 12:14:14 +0200187 struct list_head *list = $1;
Jiri Olsa46010ab2012-06-15 14:31:38 +0800188
Jiri Olsa5d7be902012-03-20 19:15:40 +0100189 /*
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 */
Jiri Olsaf5b11352012-08-08 12:21:54 +0200194 ABORT_ON(parse_events__modifier_event(list, $2, false));
Jiri Olsa89efb022012-08-08 12:14:14 +0200195 $$ = list;
Jiri Olsa89812fc2012-03-15 20:09:15 +0100196}
197|
Robert Richterac2ba9f2012-08-16 21:10:21 +0200198event_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|
Jiri Olsa89812fc2012-03-15 20:09:15 +0100208event_def
209
Jiri Olsa5f537a22012-03-15 20:09:18 +0100210event_def: event_pmu |
211 event_legacy_symbol |
Jiri Olsa89812fc2012-03-15 20:09:15 +0100212 event_legacy_cache sep_dc |
213 event_legacy_mem |
214 event_legacy_tracepoint sep_dc |
215 event_legacy_numeric sep_dc |
Wang Nan84c86ca2015-10-14 12:41:14 +0000216 event_legacy_raw sep_dc |
217 event_bpf_file
Jiri Olsa89812fc2012-03-15 20:09:15 +0100218
Jiri Olsa5f537a22012-03-15 20:09:18 +0100219event_pmu:
Arnaldo Carvalho de Melobb109ac2016-02-25 10:56:21 -0300220PE_NAME opt_event_config
Jiri Olsa5f537a22012-03-15 20:09:18 +0100221{
Arnaldo Carvalho de Melo23b63392013-01-18 16:56:57 -0300222 struct parse_events_evlist *data = _data;
David Ahernc5cd8ac2013-07-02 13:27:25 -0600223 struct list_head *list;
Jiri Olsab847cbd2012-05-21 09:12:51 +0200224
David Ahernc5cd8ac2013-07-02 13:27:25 -0600225 ALLOC_LIST(list);
Arnaldo Carvalho de Melobb109ac2016-02-25 10:56:21 -0300226 ABORT_ON(parse_events_add_pmu(data, list, $1, $2));
227 parse_events_terms__delete($2);
Jiri Olsab847cbd2012-05-21 09:12:51 +0200228 $$ = list;
Jiri Olsa5f537a22012-03-15 20:09:18 +0100229}
Adrian Hunterad962272014-08-15 22:08:40 +0300230|
Kan Liangba32a452014-10-07 11:08:51 -0400231PE_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,
Jiri Olsacecf3a2e2015-04-22 21:10:20 +0200240 $1, 1, &@1, NULL));
Kan Liangba32a452014-10-07 11:08:51 -0400241 list_add_tail(&term->list, head);
242
243 ALLOC_LIST(list);
Jiri Olsa36adec82015-04-22 21:10:19 +0200244 ABORT_ON(parse_events_add_pmu(data, list, "cpu", head));
Arnaldo Carvalho de Melo2146afc2016-02-12 17:09:17 -0300245 parse_events_terms__delete(head);
Kan Liangba32a452014-10-07 11:08:51 -0400246 $$ = 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,
Jiri Olsacecf3a2e2015-04-22 21:10:20 +0200260 &pmu_name, 1, &@1, NULL));
Kan Liangba32a452014-10-07 11:08:51 -0400261 list_add_tail(&term->list, head);
262
263 ALLOC_LIST(list);
Jiri Olsa5ad4da42015-09-02 09:56:31 +0200264 ABORT_ON(parse_events_add_pmu(data, list, "cpu", head));
Arnaldo Carvalho de Melo2146afc2016-02-12 17:09:17 -0300265 parse_events_terms__delete(head);
Kan Liangba32a452014-10-07 11:08:51 -0400266 $$ = list;
267}
Jiri Olsa5f537a22012-03-15 20:09:18 +0100268
Jiri Olsacf3506d2012-07-04 00:00:43 +0200269value_sym:
270PE_VALUE_SYM_HW
271|
272PE_VALUE_SYM_SW
273
Jiri Olsa89812fc2012-03-15 20:09:15 +0100274event_legacy_symbol:
Jiri Olsacf3506d2012-07-04 00:00:43 +0200275value_sym '/' event_config '/'
Jiri Olsa89812fc2012-03-15 20:09:15 +0100276{
Arnaldo Carvalho de Melo23b63392013-01-18 16:56:57 -0300277 struct parse_events_evlist *data = _data;
David Ahernc5cd8ac2013-07-02 13:27:25 -0600278 struct list_head *list;
Jiri Olsa89812fc2012-03-15 20:09:15 +0100279 int type = $1 >> 16;
280 int config = $1 & 255;
281
David Ahernc5cd8ac2013-07-02 13:27:25 -0600282 ALLOC_LIST(list);
Jiri Olsa87d650b2015-04-22 21:10:24 +0200283 ABORT_ON(parse_events_add_numeric(data, list, type, config, $3));
Arnaldo Carvalho de Melo2146afc2016-02-12 17:09:17 -0300284 parse_events_terms__delete($3);
Jiri Olsab847cbd2012-05-21 09:12:51 +0200285 $$ = list;
Jiri Olsa8f707d82012-03-15 20:09:16 +0100286}
287|
Jiri Olsacf3506d2012-07-04 00:00:43 +0200288value_sym sep_slash_dc
Jiri Olsa8f707d82012-03-15 20:09:16 +0100289{
Arnaldo Carvalho de Melo23b63392013-01-18 16:56:57 -0300290 struct parse_events_evlist *data = _data;
David Ahernc5cd8ac2013-07-02 13:27:25 -0600291 struct list_head *list;
Jiri Olsa8f707d82012-03-15 20:09:16 +0100292 int type = $1 >> 16;
293 int config = $1 & 255;
294
David Ahernc5cd8ac2013-07-02 13:27:25 -0600295 ALLOC_LIST(list);
Jiri Olsa87d650b2015-04-22 21:10:24 +0200296 ABORT_ON(parse_events_add_numeric(data, list, type, config, NULL));
Jiri Olsab847cbd2012-05-21 09:12:51 +0200297 $$ = list;
Jiri Olsa89812fc2012-03-15 20:09:15 +0100298}
299
300event_legacy_cache:
Wang Nan43d0b972016-02-19 11:44:01 +0000301PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT '-' PE_NAME_CACHE_OP_RESULT opt_event_config
Jiri Olsa89812fc2012-03-15 20:09:15 +0100302{
Arnaldo Carvalho de Melo23b63392013-01-18 16:56:57 -0300303 struct parse_events_evlist *data = _data;
Wang Nan43d0b972016-02-19 11:44:01 +0000304 struct parse_events_error *error = data->error;
David Ahernc5cd8ac2013-07-02 13:27:25 -0600305 struct list_head *list;
Jiri Olsab847cbd2012-05-21 09:12:51 +0200306
David Ahernc5cd8ac2013-07-02 13:27:25 -0600307 ALLOC_LIST(list);
Wang Nan43d0b972016-02-19 11:44:01 +0000308 ABORT_ON(parse_events_add_cache(list, &data->idx, $1, $3, $5, error, $6));
309 parse_events_terms__delete($6);
Jiri Olsab847cbd2012-05-21 09:12:51 +0200310 $$ = list;
Jiri Olsa89812fc2012-03-15 20:09:15 +0100311}
312|
Wang Nan43d0b972016-02-19 11:44:01 +0000313PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT opt_event_config
Jiri Olsa89812fc2012-03-15 20:09:15 +0100314{
Arnaldo Carvalho de Melo23b63392013-01-18 16:56:57 -0300315 struct parse_events_evlist *data = _data;
Wang Nan43d0b972016-02-19 11:44:01 +0000316 struct parse_events_error *error = data->error;
David Ahernc5cd8ac2013-07-02 13:27:25 -0600317 struct list_head *list;
Jiri Olsab847cbd2012-05-21 09:12:51 +0200318
David Ahernc5cd8ac2013-07-02 13:27:25 -0600319 ALLOC_LIST(list);
Wang Nan43d0b972016-02-19 11:44:01 +0000320 ABORT_ON(parse_events_add_cache(list, &data->idx, $1, $3, NULL, error, $4));
321 parse_events_terms__delete($4);
Jiri Olsab847cbd2012-05-21 09:12:51 +0200322 $$ = list;
Jiri Olsa89812fc2012-03-15 20:09:15 +0100323}
324|
Wang Nan43d0b972016-02-19 11:44:01 +0000325PE_NAME_CACHE_TYPE opt_event_config
Jiri Olsa89812fc2012-03-15 20:09:15 +0100326{
Arnaldo Carvalho de Melo23b63392013-01-18 16:56:57 -0300327 struct parse_events_evlist *data = _data;
Wang Nan43d0b972016-02-19 11:44:01 +0000328 struct parse_events_error *error = data->error;
David Ahernc5cd8ac2013-07-02 13:27:25 -0600329 struct list_head *list;
Jiri Olsab847cbd2012-05-21 09:12:51 +0200330
David Ahernc5cd8ac2013-07-02 13:27:25 -0600331 ALLOC_LIST(list);
Wang Nan43d0b972016-02-19 11:44:01 +0000332 ABORT_ON(parse_events_add_cache(list, &data->idx, $1, NULL, NULL, error, $2));
333 parse_events_terms__delete($2);
Jiri Olsab847cbd2012-05-21 09:12:51 +0200334 $$ = list;
Jiri Olsa89812fc2012-03-15 20:09:15 +0100335}
336
337event_legacy_mem:
Jacob Shin3741eb92014-05-29 17:26:51 +0200338PE_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|
Jiri Olsa89812fc2012-03-15 20:09:15 +0100360PE_PREFIX_MEM PE_VALUE ':' PE_MODIFIER_BP sep_dc
361{
Arnaldo Carvalho de Melo23b63392013-01-18 16:56:57 -0300362 struct parse_events_evlist *data = _data;
David Ahernc5cd8ac2013-07-02 13:27:25 -0600363 struct list_head *list;
Jiri Olsab847cbd2012-05-21 09:12:51 +0200364
David Ahernc5cd8ac2013-07-02 13:27:25 -0600365 ALLOC_LIST(list);
366 ABORT_ON(parse_events_add_breakpoint(list, &data->idx,
Jacob Shin3741eb92014-05-29 17:26:51 +0200367 (void *) $2, $4, 0));
Jiri Olsab847cbd2012-05-21 09:12:51 +0200368 $$ = list;
Jiri Olsa89812fc2012-03-15 20:09:15 +0100369}
370|
371PE_PREFIX_MEM PE_VALUE sep_dc
372{
Arnaldo Carvalho de Melo23b63392013-01-18 16:56:57 -0300373 struct parse_events_evlist *data = _data;
David Ahernc5cd8ac2013-07-02 13:27:25 -0600374 struct list_head *list;
Jiri Olsab847cbd2012-05-21 09:12:51 +0200375
David Ahernc5cd8ac2013-07-02 13:27:25 -0600376 ALLOC_LIST(list);
377 ABORT_ON(parse_events_add_breakpoint(list, &data->idx,
Jacob Shin3741eb92014-05-29 17:26:51 +0200378 (void *) $2, NULL, 0));
Jiri Olsab847cbd2012-05-21 09:12:51 +0200379 $$ = list;
Jiri Olsa89812fc2012-03-15 20:09:15 +0100380}
381
382event_legacy_tracepoint:
Arnaldo Carvalho de Melo1d55e8e2016-02-19 18:45:12 -0300383tracepoint_name opt_event_config
Alexander Yarygin2b9032e2014-04-25 17:34:05 +0200384{
385 struct parse_events_evlist *data = _data;
Jiri Olsa19658172015-09-07 10:38:07 +0200386 struct parse_events_error *error = data->error;
Alexander Yarygin2b9032e2014-04-25 17:34:05 +0200387 struct list_head *list;
Alexander Yarygin2b9032e2014-04-25 17:34:05 +0200388
389 ALLOC_LIST(list);
He Kuange637d172015-09-28 03:52:16 +0000390 if (error)
391 error->idx = @1.first_column;
392
He Kuang865582c2015-09-28 03:52:15 +0000393 if (parse_events_add_tracepoint(list, &data->idx, $1.sys, $1.event,
Arnaldo Carvalho de Melo1d55e8e2016-02-19 18:45:12 -0300394 error, $2))
He Kuange637d172015-09-28 03:52:16 +0000395 return -1;
396
Alexander Yarygin2b9032e2014-04-25 17:34:05 +0200397 $$ = list;
398}
He Kuang865582c2015-09-28 03:52:15 +0000399
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}
Alexander Yarygin2b9032e2014-04-25 17:34:05 +0200412|
Jiri Olsa89812fc2012-03-15 20:09:15 +0100413PE_NAME ':' PE_NAME
414{
He Kuang865582c2015-09-28 03:52:15 +0000415 struct tracepoint_name tracepoint = {$1, $3};
Jiri Olsab847cbd2012-05-21 09:12:51 +0200416
He Kuang865582c2015-09-28 03:52:15 +0000417 $$ = tracepoint;
Jiri Olsa89812fc2012-03-15 20:09:15 +0100418}
419
420event_legacy_numeric:
Wang Nan10bf3582016-02-19 11:44:00 +0000421PE_VALUE ':' PE_VALUE opt_event_config
Jiri Olsa89812fc2012-03-15 20:09:15 +0100422{
Arnaldo Carvalho de Melo23b63392013-01-18 16:56:57 -0300423 struct parse_events_evlist *data = _data;
David Ahernc5cd8ac2013-07-02 13:27:25 -0600424 struct list_head *list;
Jiri Olsab847cbd2012-05-21 09:12:51 +0200425
David Ahernc5cd8ac2013-07-02 13:27:25 -0600426 ALLOC_LIST(list);
Wang Nan10bf3582016-02-19 11:44:00 +0000427 ABORT_ON(parse_events_add_numeric(data, list, (u32)$1, $3, $4));
428 parse_events_terms__delete($4);
Jiri Olsab847cbd2012-05-21 09:12:51 +0200429 $$ = list;
Jiri Olsa89812fc2012-03-15 20:09:15 +0100430}
431
432event_legacy_raw:
Wang Nan10bf3582016-02-19 11:44:00 +0000433PE_RAW opt_event_config
Jiri Olsa89812fc2012-03-15 20:09:15 +0100434{
Arnaldo Carvalho de Melo23b63392013-01-18 16:56:57 -0300435 struct parse_events_evlist *data = _data;
David Ahernc5cd8ac2013-07-02 13:27:25 -0600436 struct list_head *list;
Jiri Olsab847cbd2012-05-21 09:12:51 +0200437
David Ahernc5cd8ac2013-07-02 13:27:25 -0600438 ALLOC_LIST(list);
Wang Nan10bf3582016-02-19 11:44:00 +0000439 ABORT_ON(parse_events_add_numeric(data, list, PERF_TYPE_RAW, $1, $2));
440 parse_events_terms__delete($2);
Jiri Olsab847cbd2012-05-21 09:12:51 +0200441 $$ = list;
Jiri Olsa8f707d82012-03-15 20:09:16 +0100442}
443
Wang Nan84c86ca2015-10-14 12:41:14 +0000444event_bpf_file:
Wang Nana34f3be2016-02-22 09:10:31 +0000445PE_BPF_OBJECT opt_event_config
Wang Nan84c86ca2015-10-14 12:41:14 +0000446{
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);
Wang Nana34f3be2016-02-22 09:10:31 +0000452 ABORT_ON(parse_events_load_bpf(data, list, $1, false, $2));
453 parse_events_terms__delete($2);
Wang Nand509db02015-10-14 12:41:20 +0000454 $$ = list;
455}
456|
Wang Nana34f3be2016-02-22 09:10:31 +0000457PE_BPF_SOURCE opt_event_config
Wang Nand509db02015-10-14 12:41:20 +0000458{
459 struct parse_events_evlist *data = _data;
460 struct list_head *list;
461
462 ALLOC_LIST(list);
Wang Nana34f3be2016-02-22 09:10:31 +0000463 ABORT_ON(parse_events_load_bpf(data, list, $1, true, $2));
464 parse_events_terms__delete($2);
Wang Nan84c86ca2015-10-14 12:41:14 +0000465 $$ = list;
466}
467
Arnaldo Carvalho de Melo1d55e8e2016-02-19 18:45:12 -0300468opt_event_config:
469'/' event_config '/'
470{
471 $$ = $2;
472}
473|
474'/' '/'
475{
476 $$ = NULL;
477}
478|
479{
480 $$ = NULL;
481}
482
Jiri Olsa89efb022012-08-08 12:14:14 +0200483start_terms: event_config
Jiri Olsa90e2b222012-06-15 14:31:40 +0800484{
Arnaldo Carvalho de Melo23b63392013-01-18 16:56:57 -0300485 struct parse_events_terms *data = _data;
Jiri Olsa90e2b222012-06-15 14:31:40 +0800486 data->terms = $1;
487}
488
Jiri Olsa8f707d82012-03-15 20:09:16 +0100489event_config:
490event_config ',' event_term
491{
492 struct list_head *head = $1;
Arnaldo Carvalho de Melo6cee6cd2013-01-18 16:29:49 -0300493 struct parse_events_term *term = $3;
Jiri Olsa8f707d82012-03-15 20:09:16 +0100494
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));
Arnaldo Carvalho de Melo6cee6cd2013-01-18 16:29:49 -0300503 struct parse_events_term *term = $1;
Jiri Olsa8f707d82012-03-15 20:09:16 +0100504
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{
Arnaldo Carvalho de Melo6cee6cd2013-01-18 16:29:49 -0300514 struct parse_events_term *term;
Jiri Olsa8f707d82012-03-15 20:09:16 +0100515
Arnaldo Carvalho de Melo6cee6cd2013-01-18 16:29:49 -0300516 ABORT_ON(parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_USER,
Jiri Olsacecf3a2e2015-04-22 21:10:20 +0200517 $1, $3, &@1, &@3));
Jiri Olsa8f707d82012-03-15 20:09:16 +0100518 $$ = term;
519}
520|
521PE_NAME '=' PE_VALUE
522{
Arnaldo Carvalho de Melo6cee6cd2013-01-18 16:29:49 -0300523 struct parse_events_term *term;
Jiri Olsa8f707d82012-03-15 20:09:16 +0100524
Arnaldo Carvalho de Melo6cee6cd2013-01-18 16:29:49 -0300525 ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
Jiri Olsacecf3a2e2015-04-22 21:10:20 +0200526 $1, $3, &@1, &@3));
Jiri Olsa8f707d82012-03-15 20:09:16 +0100527 $$ = term;
528}
529|
Jiri Olsa1d33d6d2012-10-10 14:53:17 +0200530PE_NAME '=' PE_VALUE_SYM_HW
531{
Arnaldo Carvalho de Melo6cee6cd2013-01-18 16:29:49 -0300532 struct parse_events_term *term;
Jiri Olsa1d33d6d2012-10-10 14:53:17 +0200533 int config = $3 & 255;
534
Arnaldo Carvalho de Melo6cee6cd2013-01-18 16:29:49 -0300535 ABORT_ON(parse_events_term__sym_hw(&term, $1, config));
Jiri Olsa1d33d6d2012-10-10 14:53:17 +0200536 $$ = term;
537}
538|
Jiri Olsa8f707d82012-03-15 20:09:16 +0100539PE_NAME
540{
Arnaldo Carvalho de Melo6cee6cd2013-01-18 16:29:49 -0300541 struct parse_events_term *term;
Jiri Olsa8f707d82012-03-15 20:09:16 +0100542
Arnaldo Carvalho de Melo6cee6cd2013-01-18 16:29:49 -0300543 ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
Jiri Olsacecf3a2e2015-04-22 21:10:20 +0200544 $1, 1, &@1, NULL));
Jiri Olsa8f707d82012-03-15 20:09:16 +0100545 $$ = term;
546}
547|
Jiri Olsa1d33d6d2012-10-10 14:53:17 +0200548PE_VALUE_SYM_HW
549{
Arnaldo Carvalho de Melo6cee6cd2013-01-18 16:29:49 -0300550 struct parse_events_term *term;
Jiri Olsa1d33d6d2012-10-10 14:53:17 +0200551 int config = $1 & 255;
552
Arnaldo Carvalho de Melo6cee6cd2013-01-18 16:29:49 -0300553 ABORT_ON(parse_events_term__sym_hw(&term, NULL, config));
Jiri Olsa1d33d6d2012-10-10 14:53:17 +0200554 $$ = term;
555}
556|
Jiri Olsa6b5fc392012-05-21 09:12:53 +0200557PE_TERM '=' PE_NAME
558{
Arnaldo Carvalho de Melo6cee6cd2013-01-18 16:29:49 -0300559 struct parse_events_term *term;
Jiri Olsa6b5fc392012-05-21 09:12:53 +0200560
Jiri Olsacecf3a2e2015-04-22 21:10:20 +0200561 ABORT_ON(parse_events_term__str(&term, (int)$1, NULL, $3, &@1, &@3));
Jiri Olsa6b5fc392012-05-21 09:12:53 +0200562 $$ = term;
563}
564|
Jiri Olsa8f707d82012-03-15 20:09:16 +0100565PE_TERM '=' PE_VALUE
566{
Arnaldo Carvalho de Melo6cee6cd2013-01-18 16:29:49 -0300567 struct parse_events_term *term;
Jiri Olsa8f707d82012-03-15 20:09:16 +0100568
Jiri Olsacecf3a2e2015-04-22 21:10:20 +0200569 ABORT_ON(parse_events_term__num(&term, (int)$1, NULL, $3, &@1, &@3));
Jiri Olsa8f707d82012-03-15 20:09:16 +0100570 $$ = term;
571}
572|
573PE_TERM
574{
Arnaldo Carvalho de Melo6cee6cd2013-01-18 16:29:49 -0300575 struct parse_events_term *term;
Jiri Olsa8f707d82012-03-15 20:09:16 +0100576
Jiri Olsacecf3a2e2015-04-22 21:10:20 +0200577 ABORT_ON(parse_events_term__num(&term, (int)$1, NULL, 1, &@1, NULL));
Jiri Olsa8f707d82012-03-15 20:09:16 +0100578 $$ = term;
Jiri Olsa89812fc2012-03-15 20:09:15 +0100579}
Wang Nane571e022016-02-22 09:10:35 +0000580|
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}
Jiri Olsa89812fc2012-03-15 20:09:15 +0100660
661sep_dc: ':' |
662
Jiri Olsa8f707d82012-03-15 20:09:16 +0100663sep_slash_dc: '/' | ':' |
664
Jiri Olsa89812fc2012-03-15 20:09:15 +0100665%%
666
Jiri Olsa6297d422015-04-22 21:10:17 +0200667void parse_events_error(YYLTYPE *loc, void *data,
668 void *scanner __maybe_unused,
Irina Tirdea1d037ca2012-09-11 01:15:03 +0300669 char const *msg __maybe_unused)
Jiri Olsa89812fc2012-03-15 20:09:15 +0100670{
Jiri Olsa6297d422015-04-22 21:10:17 +0200671 parse_events_evlist_error(data, loc->last_column, "parser error");
Jiri Olsa89812fc2012-03-15 20:09:15 +0100672}