xref: /linux/tools/perf/util/parse-events.y (revision 3cdc5c2cb924acb43a93241e75c61570eab71614)
1ac20de6fSZheng Yan %pure-parser
25d9cdc11SArnaldo Carvalho de Melo %parse-param {void *_parse_state}
3ac20de6fSZheng Yan %parse-param {void *scanner}
4ac20de6fSZheng Yan %lex-param {void* scanner}
56297d423SJiri Olsa %locations
689812fc8SJiri Olsa 
789812fc8SJiri Olsa %{
889812fc8SJiri Olsa 
989812fc8SJiri Olsa #define YYDEBUG 1
1089812fc8SJiri Olsa 
11b2b9d3a3SAgustin Vega-Frias #include <fnmatch.h>
1289812fc8SJiri Olsa #include <linux/compiler.h>
1389812fc8SJiri Olsa #include <linux/list.h>
14d944c4eeSBorislav Petkov #include <linux/types.h>
1589812fc8SJiri Olsa #include "util.h"
16231bb2aaSAndi Kleen #include "pmu.h"
17f2361024SAndi Kleen #include "debug.h"
1889812fc8SJiri Olsa #include "parse-events.h"
19ac20de6fSZheng Yan #include "parse-events-bison.h"
2089812fc8SJiri Olsa 
215d9cdc11SArnaldo Carvalho de Melo void parse_events_error(YYLTYPE *loc, void *parse_state, void *scanner, char const *msg);
2234a0548fSArnaldo Carvalho de Melo 
2389812fc8SJiri Olsa #define ABORT_ON(val) \
2489812fc8SJiri Olsa do { \
2589812fc8SJiri Olsa 	if (val) \
2689812fc8SJiri Olsa 		YYABORT; \
2789812fc8SJiri Olsa } while (0)
2889812fc8SJiri Olsa 
29c5cd8ac0SDavid Ahern #define ALLOC_LIST(list) \
30c5cd8ac0SDavid Ahern do { \
31c5cd8ac0SDavid Ahern 	list = malloc(sizeof(*list)); \
32c5cd8ac0SDavid Ahern 	ABORT_ON(!list);              \
33c5cd8ac0SDavid Ahern 	INIT_LIST_HEAD(list);         \
34c5cd8ac0SDavid Ahern } while (0)
35c5cd8ac0SDavid Ahern 
3607ef7574SColin Ian King static void inc_group_count(struct list_head *list,
375d9cdc11SArnaldo Carvalho de Melo 		       struct parse_events_state *parse_state)
3897f63e4aSNamhyung Kim {
3997f63e4aSNamhyung Kim 	/* Count groups only have more than 1 members */
4097f63e4aSNamhyung Kim 	if (!list_is_last(list->next, list))
415d9cdc11SArnaldo Carvalho de Melo 		parse_state->nr_groups++;
4297f63e4aSNamhyung Kim }
4397f63e4aSNamhyung Kim 
4489812fc8SJiri Olsa %}
4589812fc8SJiri Olsa 
4690e2b22dSJiri Olsa %token PE_START_EVENTS PE_START_TERMS
47cf3506dcSJiri Olsa %token PE_VALUE PE_VALUE_SYM_HW PE_VALUE_SYM_SW PE_RAW PE_TERM
48ac2ba9f3SRobert Richter %token PE_EVENT_NAME
4989812fc8SJiri Olsa %token PE_NAME
50d509db04SWang Nan %token PE_BPF_OBJECT PE_BPF_SOURCE
5189812fc8SJiri Olsa %token PE_MODIFIER_EVENT PE_MODIFIER_BP
5289812fc8SJiri Olsa %token PE_NAME_CACHE_TYPE PE_NAME_CACHE_OP_RESULT
5389efb029SJiri Olsa %token PE_PREFIX_MEM PE_PREFIX_RAW PE_PREFIX_GROUP
5489812fc8SJiri Olsa %token PE_ERROR
55ba32a451SKan Liang %token PE_PMU_EVENT_PRE PE_PMU_EVENT_SUF PE_KERNEL_PMU_EVENT
56e571e029SWang Nan %token PE_ARRAY_ALL PE_ARRAY_RANGE
57dd60fba7SMathieu Poirier %token PE_DRV_CFG_TERM
5889812fc8SJiri Olsa %type <num> PE_VALUE
59cf3506dcSJiri Olsa %type <num> PE_VALUE_SYM_HW
60cf3506dcSJiri Olsa %type <num> PE_VALUE_SYM_SW
6189812fc8SJiri Olsa %type <num> PE_RAW
628f707d84SJiri Olsa %type <num> PE_TERM
6389812fc8SJiri Olsa %type <str> PE_NAME
6484c86ca1SWang Nan %type <str> PE_BPF_OBJECT
65d509db04SWang Nan %type <str> PE_BPF_SOURCE
6689812fc8SJiri Olsa %type <str> PE_NAME_CACHE_TYPE
6789812fc8SJiri Olsa %type <str> PE_NAME_CACHE_OP_RESULT
6889812fc8SJiri Olsa %type <str> PE_MODIFIER_EVENT
6989812fc8SJiri Olsa %type <str> PE_MODIFIER_BP
70ac2ba9f3SRobert Richter %type <str> PE_EVENT_NAME
71ba32a451SKan Liang %type <str> PE_PMU_EVENT_PRE PE_PMU_EVENT_SUF PE_KERNEL_PMU_EVENT
72dd60fba7SMathieu Poirier %type <str> PE_DRV_CFG_TERM
73cf3506dcSJiri Olsa %type <num> value_sym
748f707d84SJiri Olsa %type <head> event_config
751d55e8efSArnaldo Carvalho de Melo %type <head> opt_event_config
768f707d84SJiri Olsa %type <term> event_term
77b847cbdcSJiri Olsa %type <head> event_pmu
78b847cbdcSJiri Olsa %type <head> event_legacy_symbol
79b847cbdcSJiri Olsa %type <head> event_legacy_cache
80b847cbdcSJiri Olsa %type <head> event_legacy_mem
81b847cbdcSJiri Olsa %type <head> event_legacy_tracepoint
82865582c3SHe Kuang %type <tracepoint_name> tracepoint_name
83b847cbdcSJiri Olsa %type <head> event_legacy_numeric
84b847cbdcSJiri Olsa %type <head> event_legacy_raw
8584c86ca1SWang Nan %type <head> event_bpf_file
86b847cbdcSJiri Olsa %type <head> event_def
87ac2ba9f3SRobert Richter %type <head> event_mod
88ac2ba9f3SRobert Richter %type <head> event_name
8989efb029SJiri Olsa %type <head> event
9089efb029SJiri Olsa %type <head> events
9189efb029SJiri Olsa %type <head> group_def
9289efb029SJiri Olsa %type <head> group
9389efb029SJiri Olsa %type <head> groups
94e571e029SWang Nan %type <array> array
95e571e029SWang Nan %type <array> array_term
96e571e029SWang Nan %type <array> array_terms
9789812fc8SJiri Olsa 
9889812fc8SJiri Olsa %union
9989812fc8SJiri Olsa {
10089812fc8SJiri Olsa 	char *str;
101b527bab5SRobert Richter 	u64 num;
1028f707d84SJiri Olsa 	struct list_head *head;
1036cee6cd3SArnaldo Carvalho de Melo 	struct parse_events_term *term;
104865582c3SHe Kuang 	struct tracepoint_name {
105865582c3SHe Kuang 		char *sys;
106865582c3SHe Kuang 		char *event;
107865582c3SHe Kuang 	} tracepoint_name;
108e571e029SWang Nan 	struct parse_events_array array;
10989812fc8SJiri Olsa }
11089812fc8SJiri Olsa %%
11189812fc8SJiri Olsa 
11290e2b22dSJiri Olsa start:
11389efb029SJiri Olsa PE_START_EVENTS start_events
11490e2b22dSJiri Olsa |
11589efb029SJiri Olsa PE_START_TERMS  start_terms
11689efb029SJiri Olsa 
11789efb029SJiri Olsa start_events: groups
11889efb029SJiri Olsa {
1195d9cdc11SArnaldo Carvalho de Melo 	struct parse_events_state *parse_state = _parse_state;
12089efb029SJiri Olsa 
1215d9cdc11SArnaldo Carvalho de Melo 	parse_events_update_lists($1, &parse_state->list);
12289efb029SJiri Olsa }
12389efb029SJiri Olsa 
12489efb029SJiri Olsa groups:
12589efb029SJiri Olsa groups ',' group
12689efb029SJiri Olsa {
12789efb029SJiri Olsa 	struct list_head *list  = $1;
12889efb029SJiri Olsa 	struct list_head *group = $3;
12989efb029SJiri Olsa 
13089efb029SJiri Olsa 	parse_events_update_lists(group, list);
13189efb029SJiri Olsa 	$$ = list;
13289efb029SJiri Olsa }
13389efb029SJiri Olsa |
13489efb029SJiri Olsa groups ',' event
13589efb029SJiri Olsa {
13689efb029SJiri Olsa 	struct list_head *list  = $1;
13789efb029SJiri Olsa 	struct list_head *event = $3;
13889efb029SJiri Olsa 
13989efb029SJiri Olsa 	parse_events_update_lists(event, list);
14089efb029SJiri Olsa 	$$ = list;
14189efb029SJiri Olsa }
14289efb029SJiri Olsa |
14389efb029SJiri Olsa group
14489efb029SJiri Olsa |
14589efb029SJiri Olsa event
14689efb029SJiri Olsa 
14789efb029SJiri Olsa group:
14889efb029SJiri Olsa group_def ':' PE_MODIFIER_EVENT
14989efb029SJiri Olsa {
15089efb029SJiri Olsa 	struct list_head *list = $1;
15189efb029SJiri Olsa 
15289efb029SJiri Olsa 	ABORT_ON(parse_events__modifier_group(list, $3));
15389efb029SJiri Olsa 	$$ = list;
15489efb029SJiri Olsa }
15589efb029SJiri Olsa |
15689efb029SJiri Olsa group_def
15789efb029SJiri Olsa 
15889efb029SJiri Olsa group_def:
15989efb029SJiri Olsa PE_NAME '{' events '}'
16089efb029SJiri Olsa {
16189efb029SJiri Olsa 	struct list_head *list = $3;
16289efb029SJiri Olsa 
1635d9cdc11SArnaldo Carvalho de Melo 	inc_group_count(list, _parse_state);
164*3cdc5c2cSKan Liang 	parse_events__set_leader($1, list, _parse_state);
16589efb029SJiri Olsa 	$$ = list;
16689efb029SJiri Olsa }
16789efb029SJiri Olsa |
16889efb029SJiri Olsa '{' events '}'
16989efb029SJiri Olsa {
17089efb029SJiri Olsa 	struct list_head *list = $2;
17189efb029SJiri Olsa 
1725d9cdc11SArnaldo Carvalho de Melo 	inc_group_count(list, _parse_state);
173*3cdc5c2cSKan Liang 	parse_events__set_leader(NULL, list, _parse_state);
17489efb029SJiri Olsa 	$$ = list;
17589efb029SJiri Olsa }
17690e2b22dSJiri Olsa 
17789812fc8SJiri Olsa events:
17889efb029SJiri Olsa events ',' event
17989efb029SJiri Olsa {
18089efb029SJiri Olsa 	struct list_head *event = $3;
18189efb029SJiri Olsa 	struct list_head *list  = $1;
18289efb029SJiri Olsa 
18389efb029SJiri Olsa 	parse_events_update_lists(event, list);
18489efb029SJiri Olsa 	$$ = list;
18589efb029SJiri Olsa }
18689efb029SJiri Olsa |
18789efb029SJiri Olsa event
18889812fc8SJiri Olsa 
189ac2ba9f3SRobert Richter event: event_mod
190ac2ba9f3SRobert Richter 
191ac2ba9f3SRobert Richter event_mod:
192ac2ba9f3SRobert Richter event_name PE_MODIFIER_EVENT
19389812fc8SJiri Olsa {
19489efb029SJiri Olsa 	struct list_head *list = $1;
19546010ab2SJiri Olsa 
1965d7be90eSJiri Olsa 	/*
1975d7be90eSJiri Olsa 	 * Apply modifier on all events added by single event definition
1985d7be90eSJiri Olsa 	 * (there could be more events added for multiple tracepoint
1995d7be90eSJiri Olsa 	 * definitions via '*?'.
2005d7be90eSJiri Olsa 	 */
201f5b1135bSJiri Olsa 	ABORT_ON(parse_events__modifier_event(list, $2, false));
20289efb029SJiri Olsa 	$$ = list;
20389812fc8SJiri Olsa }
20489812fc8SJiri Olsa |
205ac2ba9f3SRobert Richter event_name
206ac2ba9f3SRobert Richter 
207ac2ba9f3SRobert Richter event_name:
208ac2ba9f3SRobert Richter PE_EVENT_NAME event_def
209ac2ba9f3SRobert Richter {
210ac2ba9f3SRobert Richter 	ABORT_ON(parse_events_name($2, $1));
211ac2ba9f3SRobert Richter 	free($1);
212ac2ba9f3SRobert Richter 	$$ = $2;
213ac2ba9f3SRobert Richter }
214ac2ba9f3SRobert Richter |
21589812fc8SJiri Olsa event_def
21689812fc8SJiri Olsa 
2175f537a26SJiri Olsa event_def: event_pmu |
2185f537a26SJiri Olsa 	   event_legacy_symbol |
21989812fc8SJiri Olsa 	   event_legacy_cache sep_dc |
22089812fc8SJiri Olsa 	   event_legacy_mem |
22189812fc8SJiri Olsa 	   event_legacy_tracepoint sep_dc |
22289812fc8SJiri Olsa 	   event_legacy_numeric sep_dc |
22384c86ca1SWang Nan 	   event_legacy_raw sep_dc |
22484c86ca1SWang Nan 	   event_bpf_file
22589812fc8SJiri Olsa 
2265f537a26SJiri Olsa event_pmu:
2274a35a902SArnaldo Carvalho de Melo PE_NAME opt_event_config
2285f537a26SJiri Olsa {
2298255718fSAndi Kleen 	struct list_head *list, *orig_terms, *terms;
2308255718fSAndi Kleen 
2314a35a902SArnaldo Carvalho de Melo 	if (parse_events_copy_term_list($2, &orig_terms))
2328255718fSAndi Kleen 		YYABORT;
233b847cbdcSJiri Olsa 
234c5cd8ac0SDavid Ahern 	ALLOC_LIST(list);
235*3cdc5c2cSKan Liang 	if (parse_events_add_pmu(_parse_state, list, $1, $2, false, false)) {
2368255718fSAndi Kleen 		struct perf_pmu *pmu = NULL;
2378255718fSAndi Kleen 		int ok = 0;
238b2b9d3a3SAgustin Vega-Frias 		char *pattern;
239b2b9d3a3SAgustin Vega-Frias 
240b2b9d3a3SAgustin Vega-Frias 		if (asprintf(&pattern, "%s*", $1) < 0)
241b2b9d3a3SAgustin Vega-Frias 			YYABORT;
2428255718fSAndi Kleen 
2438255718fSAndi Kleen 		while ((pmu = perf_pmu__scan(pmu)) != NULL) {
2448255718fSAndi Kleen 			char *name = pmu->name;
2458255718fSAndi Kleen 
246a820e335SAndi Kleen 			if (!strncmp(name, "uncore_", 7) &&
247a820e335SAndi Kleen 			    strncmp($1, "uncore_", 7))
248a820e335SAndi Kleen 				name += 7;
249b2b9d3a3SAgustin Vega-Frias 			if (!fnmatch(pattern, name, 0)) {
250b2b9d3a3SAgustin Vega-Frias 				if (parse_events_copy_term_list(orig_terms, &terms)) {
251b2b9d3a3SAgustin Vega-Frias 					free(pattern);
2528255718fSAndi Kleen 					YYABORT;
253b2b9d3a3SAgustin Vega-Frias 				}
254*3cdc5c2cSKan Liang 				if (!parse_events_add_pmu(_parse_state, list, pmu->name, terms, true, false))
2558255718fSAndi Kleen 					ok++;
2568255718fSAndi Kleen 				parse_events_terms__delete(terms);
2578255718fSAndi Kleen 			}
2588255718fSAndi Kleen 		}
259b2b9d3a3SAgustin Vega-Frias 
260b2b9d3a3SAgustin Vega-Frias 		free(pattern);
261b2b9d3a3SAgustin Vega-Frias 
2628255718fSAndi Kleen 		if (!ok)
2638255718fSAndi Kleen 			YYABORT;
2648255718fSAndi Kleen 	}
2654a35a902SArnaldo Carvalho de Melo 	parse_events_terms__delete($2);
2668255718fSAndi Kleen 	parse_events_terms__delete(orig_terms);
267b847cbdcSJiri Olsa 	$$ = list;
2685f537a26SJiri Olsa }
269ad962273SAdrian Hunter |
270ba32a451SKan Liang PE_KERNEL_PMU_EVENT sep_dc
271ba32a451SKan Liang {
272ba32a451SKan Liang 	struct list_head *list;
273ba32a451SKan Liang 
2745d9cdc11SArnaldo Carvalho de Melo 	if (parse_events_multi_pmu_add(_parse_state, $1, &list) < 0)
275231bb2aaSAndi Kleen 		YYABORT;
276ba32a451SKan Liang 	$$ = list;
277ba32a451SKan Liang }
278ba32a451SKan Liang |
279ba32a451SKan Liang PE_PMU_EVENT_PRE '-' PE_PMU_EVENT_SUF sep_dc
280ba32a451SKan Liang {
281ba32a451SKan Liang 	struct list_head *list;
282ba32a451SKan Liang 	char pmu_name[128];
2838255718fSAndi Kleen 
284ba32a451SKan Liang 	snprintf(&pmu_name, 128, "%s-%s", $1, $3);
2855d9cdc11SArnaldo Carvalho de Melo 	if (parse_events_multi_pmu_add(_parse_state, pmu_name, &list) < 0)
2868255718fSAndi Kleen 		YYABORT;
287ba32a451SKan Liang 	$$ = list;
288ba32a451SKan Liang }
2895f537a26SJiri Olsa 
290cf3506dcSJiri Olsa value_sym:
291cf3506dcSJiri Olsa PE_VALUE_SYM_HW
292cf3506dcSJiri Olsa |
293cf3506dcSJiri Olsa PE_VALUE_SYM_SW
294cf3506dcSJiri Olsa 
29589812fc8SJiri Olsa event_legacy_symbol:
296cf3506dcSJiri Olsa value_sym '/' event_config '/'
29789812fc8SJiri Olsa {
298c5cd8ac0SDavid Ahern 	struct list_head *list;
29989812fc8SJiri Olsa 	int type = $1 >> 16;
30089812fc8SJiri Olsa 	int config = $1 & 255;
30189812fc8SJiri Olsa 
302c5cd8ac0SDavid Ahern 	ALLOC_LIST(list);
3035d9cdc11SArnaldo Carvalho de Melo 	ABORT_ON(parse_events_add_numeric(_parse_state, list, type, config, $3));
3042146afc6SArnaldo Carvalho de Melo 	parse_events_terms__delete($3);
305b847cbdcSJiri Olsa 	$$ = list;
3068f707d84SJiri Olsa }
3078f707d84SJiri Olsa |
308cf3506dcSJiri Olsa value_sym sep_slash_dc
3098f707d84SJiri Olsa {
310c5cd8ac0SDavid Ahern 	struct list_head *list;
3118f707d84SJiri Olsa 	int type = $1 >> 16;
3128f707d84SJiri Olsa 	int config = $1 & 255;
3138f707d84SJiri Olsa 
314c5cd8ac0SDavid Ahern 	ALLOC_LIST(list);
3155d9cdc11SArnaldo Carvalho de Melo 	ABORT_ON(parse_events_add_numeric(_parse_state, list, type, config, NULL));
316b847cbdcSJiri Olsa 	$$ = list;
31789812fc8SJiri Olsa }
31889812fc8SJiri Olsa 
31989812fc8SJiri Olsa event_legacy_cache:
32043d0b978SWang Nan PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT '-' PE_NAME_CACHE_OP_RESULT opt_event_config
32189812fc8SJiri Olsa {
3225d9cdc11SArnaldo Carvalho de Melo 	struct parse_events_state *parse_state = _parse_state;
3235d9cdc11SArnaldo Carvalho de Melo 	struct parse_events_error *error = parse_state->error;
324c5cd8ac0SDavid Ahern 	struct list_head *list;
325b847cbdcSJiri Olsa 
326c5cd8ac0SDavid Ahern 	ALLOC_LIST(list);
3275d9cdc11SArnaldo Carvalho de Melo 	ABORT_ON(parse_events_add_cache(list, &parse_state->idx, $1, $3, $5, error, $6));
32843d0b978SWang Nan 	parse_events_terms__delete($6);
329b847cbdcSJiri Olsa 	$$ = list;
33089812fc8SJiri Olsa }
33189812fc8SJiri Olsa |
33243d0b978SWang Nan PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT opt_event_config
33389812fc8SJiri Olsa {
3345d9cdc11SArnaldo Carvalho de Melo 	struct parse_events_state *parse_state = _parse_state;
3355d9cdc11SArnaldo Carvalho de Melo 	struct parse_events_error *error = parse_state->error;
336c5cd8ac0SDavid Ahern 	struct list_head *list;
337b847cbdcSJiri Olsa 
338c5cd8ac0SDavid Ahern 	ALLOC_LIST(list);
3395d9cdc11SArnaldo Carvalho de Melo 	ABORT_ON(parse_events_add_cache(list, &parse_state->idx, $1, $3, NULL, error, $4));
34043d0b978SWang Nan 	parse_events_terms__delete($4);
341b847cbdcSJiri Olsa 	$$ = list;
34289812fc8SJiri Olsa }
34389812fc8SJiri Olsa |
34443d0b978SWang Nan PE_NAME_CACHE_TYPE opt_event_config
34589812fc8SJiri Olsa {
3465d9cdc11SArnaldo Carvalho de Melo 	struct parse_events_state *parse_state = _parse_state;
3475d9cdc11SArnaldo Carvalho de Melo 	struct parse_events_error *error = parse_state->error;
348c5cd8ac0SDavid Ahern 	struct list_head *list;
349b847cbdcSJiri Olsa 
350c5cd8ac0SDavid Ahern 	ALLOC_LIST(list);
3515d9cdc11SArnaldo Carvalho de Melo 	ABORT_ON(parse_events_add_cache(list, &parse_state->idx, $1, NULL, NULL, error, $2));
35243d0b978SWang Nan 	parse_events_terms__delete($2);
353b847cbdcSJiri Olsa 	$$ = list;
35489812fc8SJiri Olsa }
35589812fc8SJiri Olsa 
35689812fc8SJiri Olsa event_legacy_mem:
3573741eb9fSJacob Shin PE_PREFIX_MEM PE_VALUE '/' PE_VALUE ':' PE_MODIFIER_BP sep_dc
3583741eb9fSJacob Shin {
3595d9cdc11SArnaldo Carvalho de Melo 	struct parse_events_state *parse_state = _parse_state;
3603741eb9fSJacob Shin 	struct list_head *list;
3613741eb9fSJacob Shin 
3623741eb9fSJacob Shin 	ALLOC_LIST(list);
3635d9cdc11SArnaldo Carvalho de Melo 	ABORT_ON(parse_events_add_breakpoint(list, &parse_state->idx,
3643741eb9fSJacob Shin 					     (void *) $2, $6, $4));
3653741eb9fSJacob Shin 	$$ = list;
3663741eb9fSJacob Shin }
3673741eb9fSJacob Shin |
3683741eb9fSJacob Shin PE_PREFIX_MEM PE_VALUE '/' PE_VALUE sep_dc
3693741eb9fSJacob Shin {
3705d9cdc11SArnaldo Carvalho de Melo 	struct parse_events_state *parse_state = _parse_state;
3713741eb9fSJacob Shin 	struct list_head *list;
3723741eb9fSJacob Shin 
3733741eb9fSJacob Shin 	ALLOC_LIST(list);
3745d9cdc11SArnaldo Carvalho de Melo 	ABORT_ON(parse_events_add_breakpoint(list, &parse_state->idx,
3753741eb9fSJacob Shin 					     (void *) $2, NULL, $4));
3763741eb9fSJacob Shin 	$$ = list;
3773741eb9fSJacob Shin }
3783741eb9fSJacob Shin |
37989812fc8SJiri Olsa PE_PREFIX_MEM PE_VALUE ':' PE_MODIFIER_BP sep_dc
38089812fc8SJiri Olsa {
3815d9cdc11SArnaldo Carvalho de Melo 	struct parse_events_state *parse_state = _parse_state;
382c5cd8ac0SDavid Ahern 	struct list_head *list;
383b847cbdcSJiri Olsa 
384c5cd8ac0SDavid Ahern 	ALLOC_LIST(list);
3855d9cdc11SArnaldo Carvalho de Melo 	ABORT_ON(parse_events_add_breakpoint(list, &parse_state->idx,
3863741eb9fSJacob Shin 					     (void *) $2, $4, 0));
387b847cbdcSJiri Olsa 	$$ = list;
38889812fc8SJiri Olsa }
38989812fc8SJiri Olsa |
39089812fc8SJiri Olsa PE_PREFIX_MEM PE_VALUE sep_dc
39189812fc8SJiri Olsa {
3925d9cdc11SArnaldo Carvalho de Melo 	struct parse_events_state *parse_state = _parse_state;
393c5cd8ac0SDavid Ahern 	struct list_head *list;
394b847cbdcSJiri Olsa 
395c5cd8ac0SDavid Ahern 	ALLOC_LIST(list);
3965d9cdc11SArnaldo Carvalho de Melo 	ABORT_ON(parse_events_add_breakpoint(list, &parse_state->idx,
3973741eb9fSJacob Shin 					     (void *) $2, NULL, 0));
398b847cbdcSJiri Olsa 	$$ = list;
39989812fc8SJiri Olsa }
40089812fc8SJiri Olsa 
40189812fc8SJiri Olsa event_legacy_tracepoint:
4021d55e8efSArnaldo Carvalho de Melo tracepoint_name opt_event_config
4032b9032e0SAlexander Yarygin {
4045d9cdc11SArnaldo Carvalho de Melo 	struct parse_events_state *parse_state = _parse_state;
4055d9cdc11SArnaldo Carvalho de Melo 	struct parse_events_error *error = parse_state->error;
4062b9032e0SAlexander Yarygin 	struct list_head *list;
4072b9032e0SAlexander Yarygin 
4082b9032e0SAlexander Yarygin 	ALLOC_LIST(list);
40919658171SJiri Olsa 	if (error)
41019658171SJiri Olsa 		error->idx = @1.first_column;
411e637d177SHe Kuang 
4125d9cdc11SArnaldo Carvalho de Melo 	if (parse_events_add_tracepoint(list, &parse_state->idx, $1.sys, $1.event,
4131d55e8efSArnaldo Carvalho de Melo 					error, $2))
414e637d177SHe Kuang 		return -1;
415e637d177SHe Kuang 
4162b9032e0SAlexander Yarygin 	$$ = list;
4172b9032e0SAlexander Yarygin }
418865582c3SHe Kuang 
419865582c3SHe Kuang tracepoint_name:
420865582c3SHe Kuang PE_NAME '-' PE_NAME ':' PE_NAME
421865582c3SHe Kuang {
422865582c3SHe Kuang 	char sys_name[128];
423865582c3SHe Kuang 	struct tracepoint_name tracepoint;
424865582c3SHe Kuang 
425865582c3SHe Kuang 	snprintf(&sys_name, 128, "%s-%s", $1, $3);
426865582c3SHe Kuang 	tracepoint.sys = &sys_name;
427865582c3SHe Kuang 	tracepoint.event = $5;
428865582c3SHe Kuang 
429865582c3SHe Kuang 	$$ = tracepoint;
430865582c3SHe Kuang }
4312b9032e0SAlexander Yarygin |
43289812fc8SJiri Olsa PE_NAME ':' PE_NAME
43389812fc8SJiri Olsa {
434865582c3SHe Kuang 	struct tracepoint_name tracepoint = {$1, $3};
435b847cbdcSJiri Olsa 
436865582c3SHe Kuang 	$$ = tracepoint;
43789812fc8SJiri Olsa }
43889812fc8SJiri Olsa 
43989812fc8SJiri Olsa event_legacy_numeric:
44010bf358aSWang Nan PE_VALUE ':' PE_VALUE opt_event_config
44189812fc8SJiri Olsa {
442c5cd8ac0SDavid Ahern 	struct list_head *list;
443b847cbdcSJiri Olsa 
444c5cd8ac0SDavid Ahern 	ALLOC_LIST(list);
4455d9cdc11SArnaldo Carvalho de Melo 	ABORT_ON(parse_events_add_numeric(_parse_state, list, (u32)$1, $3, $4));
44610bf358aSWang Nan 	parse_events_terms__delete($4);
447b847cbdcSJiri Olsa 	$$ = list;
44889812fc8SJiri Olsa }
44989812fc8SJiri Olsa 
45089812fc8SJiri Olsa event_legacy_raw:
45110bf358aSWang Nan PE_RAW opt_event_config
45289812fc8SJiri Olsa {
453c5cd8ac0SDavid Ahern 	struct list_head *list;
454b847cbdcSJiri Olsa 
455c5cd8ac0SDavid Ahern 	ALLOC_LIST(list);
4565d9cdc11SArnaldo Carvalho de Melo 	ABORT_ON(parse_events_add_numeric(_parse_state, list, PERF_TYPE_RAW, $1, $2));
45710bf358aSWang Nan 	parse_events_terms__delete($2);
458b847cbdcSJiri Olsa 	$$ = list;
4598f707d84SJiri Olsa }
4608f707d84SJiri Olsa 
46184c86ca1SWang Nan event_bpf_file:
462a34f3be7SWang Nan PE_BPF_OBJECT opt_event_config
46384c86ca1SWang Nan {
4645d9cdc11SArnaldo Carvalho de Melo 	struct parse_events_state *parse_state = _parse_state;
4655d9cdc11SArnaldo Carvalho de Melo 	struct parse_events_error *error = parse_state->error;
46684c86ca1SWang Nan 	struct list_head *list;
46784c86ca1SWang Nan 
46884c86ca1SWang Nan 	ALLOC_LIST(list);
4695d9cdc11SArnaldo Carvalho de Melo 	ABORT_ON(parse_events_load_bpf(parse_state, list, $1, false, $2));
470a34f3be7SWang Nan 	parse_events_terms__delete($2);
471d509db04SWang Nan 	$$ = list;
472d509db04SWang Nan }
473d509db04SWang Nan |
474a34f3be7SWang Nan PE_BPF_SOURCE opt_event_config
475d509db04SWang Nan {
476d509db04SWang Nan 	struct list_head *list;
477d509db04SWang Nan 
478d509db04SWang Nan 	ALLOC_LIST(list);
4795d9cdc11SArnaldo Carvalho de Melo 	ABORT_ON(parse_events_load_bpf(_parse_state, list, $1, true, $2));
480a34f3be7SWang Nan 	parse_events_terms__delete($2);
48184c86ca1SWang Nan 	$$ = list;
48284c86ca1SWang Nan }
48384c86ca1SWang Nan 
4841d55e8efSArnaldo Carvalho de Melo opt_event_config:
4851d55e8efSArnaldo Carvalho de Melo '/' event_config '/'
4861d55e8efSArnaldo Carvalho de Melo {
4871d55e8efSArnaldo Carvalho de Melo 	$$ = $2;
4881d55e8efSArnaldo Carvalho de Melo }
4891d55e8efSArnaldo Carvalho de Melo |
4901d55e8efSArnaldo Carvalho de Melo '/' '/'
4911d55e8efSArnaldo Carvalho de Melo {
4921d55e8efSArnaldo Carvalho de Melo 	$$ = NULL;
4931d55e8efSArnaldo Carvalho de Melo }
4941d55e8efSArnaldo Carvalho de Melo |
4951d55e8efSArnaldo Carvalho de Melo {
4961d55e8efSArnaldo Carvalho de Melo 	$$ = NULL;
4971d55e8efSArnaldo Carvalho de Melo }
4981d55e8efSArnaldo Carvalho de Melo 
49989efb029SJiri Olsa start_terms: event_config
50090e2b22dSJiri Olsa {
5015d9cdc11SArnaldo Carvalho de Melo 	struct parse_events_state *parse_state = _parse_state;
5025d9cdc11SArnaldo Carvalho de Melo 	parse_state->terms = $1;
50390e2b22dSJiri Olsa }
50490e2b22dSJiri Olsa 
5058f707d84SJiri Olsa event_config:
5068f707d84SJiri Olsa event_config ',' event_term
5078f707d84SJiri Olsa {
5088f707d84SJiri Olsa 	struct list_head *head = $1;
5096cee6cd3SArnaldo Carvalho de Melo 	struct parse_events_term *term = $3;
5108f707d84SJiri Olsa 
5118f707d84SJiri Olsa 	ABORT_ON(!head);
5128f707d84SJiri Olsa 	list_add_tail(&term->list, head);
5138f707d84SJiri Olsa 	$$ = $1;
5148f707d84SJiri Olsa }
5158f707d84SJiri Olsa |
5168f707d84SJiri Olsa event_term
5178f707d84SJiri Olsa {
5188f707d84SJiri Olsa 	struct list_head *head = malloc(sizeof(*head));
5196cee6cd3SArnaldo Carvalho de Melo 	struct parse_events_term *term = $1;
5208f707d84SJiri Olsa 
5218f707d84SJiri Olsa 	ABORT_ON(!head);
5228f707d84SJiri Olsa 	INIT_LIST_HEAD(head);
5238f707d84SJiri Olsa 	list_add_tail(&term->list, head);
5248f707d84SJiri Olsa 	$$ = head;
5258f707d84SJiri Olsa }
5268f707d84SJiri Olsa 
5278f707d84SJiri Olsa event_term:
5288f707d84SJiri Olsa PE_NAME '=' PE_NAME
5298f707d84SJiri Olsa {
5306cee6cd3SArnaldo Carvalho de Melo 	struct parse_events_term *term;
5318f707d84SJiri Olsa 
5326cee6cd3SArnaldo Carvalho de Melo 	ABORT_ON(parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_USER,
533cecf3a2eSJiri Olsa 					$1, $3, &@1, &@3));
5348f707d84SJiri Olsa 	$$ = term;
5358f707d84SJiri Olsa }
5368f707d84SJiri Olsa |
5378f707d84SJiri Olsa PE_NAME '=' PE_VALUE
5388f707d84SJiri Olsa {
5396cee6cd3SArnaldo Carvalho de Melo 	struct parse_events_term *term;
5408f707d84SJiri Olsa 
5416cee6cd3SArnaldo Carvalho de Melo 	ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
54299e7138eSJiri Olsa 					$1, $3, false, &@1, &@3));
5438f707d84SJiri Olsa 	$$ = term;
5448f707d84SJiri Olsa }
5458f707d84SJiri Olsa |
5461d33d6dcSJiri Olsa PE_NAME '=' PE_VALUE_SYM_HW
5471d33d6dcSJiri Olsa {
5486cee6cd3SArnaldo Carvalho de Melo 	struct parse_events_term *term;
5491d33d6dcSJiri Olsa 	int config = $3 & 255;
5501d33d6dcSJiri Olsa 
5516cee6cd3SArnaldo Carvalho de Melo 	ABORT_ON(parse_events_term__sym_hw(&term, $1, config));
5521d33d6dcSJiri Olsa 	$$ = term;
5531d33d6dcSJiri Olsa }
5541d33d6dcSJiri Olsa |
5558f707d84SJiri Olsa PE_NAME
5568f707d84SJiri Olsa {
5576cee6cd3SArnaldo Carvalho de Melo 	struct parse_events_term *term;
5588f707d84SJiri Olsa 
5596cee6cd3SArnaldo Carvalho de Melo 	ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
56099e7138eSJiri Olsa 					$1, 1, true, &@1, NULL));
5618f707d84SJiri Olsa 	$$ = term;
5628f707d84SJiri Olsa }
5638f707d84SJiri Olsa |
5641d33d6dcSJiri Olsa PE_VALUE_SYM_HW
5651d33d6dcSJiri Olsa {
5666cee6cd3SArnaldo Carvalho de Melo 	struct parse_events_term *term;
5671d33d6dcSJiri Olsa 	int config = $1 & 255;
5681d33d6dcSJiri Olsa 
5696cee6cd3SArnaldo Carvalho de Melo 	ABORT_ON(parse_events_term__sym_hw(&term, NULL, config));
5701d33d6dcSJiri Olsa 	$$ = term;
5711d33d6dcSJiri Olsa }
5721d33d6dcSJiri Olsa |
5736b5fc39bSJiri Olsa PE_TERM '=' PE_NAME
5746b5fc39bSJiri Olsa {
5756cee6cd3SArnaldo Carvalho de Melo 	struct parse_events_term *term;
5766b5fc39bSJiri Olsa 
577cecf3a2eSJiri Olsa 	ABORT_ON(parse_events_term__str(&term, (int)$1, NULL, $3, &@1, &@3));
5786b5fc39bSJiri Olsa 	$$ = term;
5796b5fc39bSJiri Olsa }
5806b5fc39bSJiri Olsa |
5818f707d84SJiri Olsa PE_TERM '=' PE_VALUE
5828f707d84SJiri Olsa {
5836cee6cd3SArnaldo Carvalho de Melo 	struct parse_events_term *term;
5848f707d84SJiri Olsa 
58599e7138eSJiri Olsa 	ABORT_ON(parse_events_term__num(&term, (int)$1, NULL, $3, false, &@1, &@3));
5868f707d84SJiri Olsa 	$$ = term;
5878f707d84SJiri Olsa }
5888f707d84SJiri Olsa |
5898f707d84SJiri Olsa PE_TERM
5908f707d84SJiri Olsa {
5916cee6cd3SArnaldo Carvalho de Melo 	struct parse_events_term *term;
5928f707d84SJiri Olsa 
59399e7138eSJiri Olsa 	ABORT_ON(parse_events_term__num(&term, (int)$1, NULL, 1, true, &@1, NULL));
5948f707d84SJiri Olsa 	$$ = term;
59589812fc8SJiri Olsa }
596e571e029SWang Nan |
597e571e029SWang Nan PE_NAME array '=' PE_NAME
598e571e029SWang Nan {
599e571e029SWang Nan 	struct parse_events_term *term;
600e571e029SWang Nan 	int i;
601e571e029SWang Nan 
602e571e029SWang Nan 	ABORT_ON(parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_USER,
603e571e029SWang Nan 					$1, $4, &@1, &@4));
604e571e029SWang Nan 
605e571e029SWang Nan 	term->array = $2;
606e571e029SWang Nan 	$$ = term;
607e571e029SWang Nan }
608e571e029SWang Nan |
609e571e029SWang Nan PE_NAME array '=' PE_VALUE
610e571e029SWang Nan {
611e571e029SWang Nan 	struct parse_events_term *term;
612e571e029SWang Nan 
613e571e029SWang Nan 	ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
61499e7138eSJiri Olsa 					$1, $4, false, &@1, &@4));
615e571e029SWang Nan 	term->array = $2;
616e571e029SWang Nan 	$$ = term;
617e571e029SWang Nan }
618dd60fba7SMathieu Poirier |
619dd60fba7SMathieu Poirier PE_DRV_CFG_TERM
620dd60fba7SMathieu Poirier {
621dd60fba7SMathieu Poirier 	struct parse_events_term *term;
622dd60fba7SMathieu Poirier 
623dd60fba7SMathieu Poirier 	ABORT_ON(parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_DRV_CFG,
624dd60fba7SMathieu Poirier 					$1, $1, &@1, NULL));
625dd60fba7SMathieu Poirier 	$$ = term;
626dd60fba7SMathieu Poirier }
627e571e029SWang Nan 
628e571e029SWang Nan array:
629e571e029SWang Nan '[' array_terms ']'
630e571e029SWang Nan {
631e571e029SWang Nan 	$$ = $2;
632e571e029SWang Nan }
633e571e029SWang Nan |
634e571e029SWang Nan PE_ARRAY_ALL
635e571e029SWang Nan {
636e571e029SWang Nan 	$$.nr_ranges = 0;
637e571e029SWang Nan 	$$.ranges = NULL;
638e571e029SWang Nan }
639e571e029SWang Nan 
640e571e029SWang Nan array_terms:
641e571e029SWang Nan array_terms ',' array_term
642e571e029SWang Nan {
643e571e029SWang Nan 	struct parse_events_array new_array;
644e571e029SWang Nan 
645e571e029SWang Nan 	new_array.nr_ranges = $1.nr_ranges + $3.nr_ranges;
646e571e029SWang Nan 	new_array.ranges = malloc(sizeof(new_array.ranges[0]) *
647e571e029SWang Nan 				  new_array.nr_ranges);
648e571e029SWang Nan 	ABORT_ON(!new_array.ranges);
649e571e029SWang Nan 	memcpy(&new_array.ranges[0], $1.ranges,
650e571e029SWang Nan 	       $1.nr_ranges * sizeof(new_array.ranges[0]));
651e571e029SWang Nan 	memcpy(&new_array.ranges[$1.nr_ranges], $3.ranges,
652e571e029SWang Nan 	       $3.nr_ranges * sizeof(new_array.ranges[0]));
653e571e029SWang Nan 	free($1.ranges);
654e571e029SWang Nan 	free($3.ranges);
655e571e029SWang Nan 	$$ = new_array;
656e571e029SWang Nan }
657e571e029SWang Nan |
658e571e029SWang Nan array_term
659e571e029SWang Nan 
660e571e029SWang Nan array_term:
661e571e029SWang Nan PE_VALUE
662e571e029SWang Nan {
663e571e029SWang Nan 	struct parse_events_array array;
664e571e029SWang Nan 
665e571e029SWang Nan 	array.nr_ranges = 1;
666e571e029SWang Nan 	array.ranges = malloc(sizeof(array.ranges[0]));
667e571e029SWang Nan 	ABORT_ON(!array.ranges);
668e571e029SWang Nan 	array.ranges[0].start = $1;
669e571e029SWang Nan 	array.ranges[0].length = 1;
670e571e029SWang Nan 	$$ = array;
671e571e029SWang Nan }
672e571e029SWang Nan |
673e571e029SWang Nan PE_VALUE PE_ARRAY_RANGE PE_VALUE
674e571e029SWang Nan {
675e571e029SWang Nan 	struct parse_events_array array;
676e571e029SWang Nan 
677e571e029SWang Nan 	ABORT_ON($3 < $1);
678e571e029SWang Nan 	array.nr_ranges = 1;
679e571e029SWang Nan 	array.ranges = malloc(sizeof(array.ranges[0]));
680e571e029SWang Nan 	ABORT_ON(!array.ranges);
681e571e029SWang Nan 	array.ranges[0].start = $1;
682e571e029SWang Nan 	array.ranges[0].length = $3 - $1 + 1;
683e571e029SWang Nan 	$$ = array;
684e571e029SWang Nan }
68589812fc8SJiri Olsa 
68689812fc8SJiri Olsa sep_dc: ':' |
68789812fc8SJiri Olsa 
6888f707d84SJiri Olsa sep_slash_dc: '/' | ':' |
6898f707d84SJiri Olsa 
69089812fc8SJiri Olsa %%
69189812fc8SJiri Olsa 
6925d9cdc11SArnaldo Carvalho de Melo void parse_events_error(YYLTYPE *loc, void *parse_state,
6936297d423SJiri Olsa 			void *scanner __maybe_unused,
6941d037ca1SIrina Tirdea 			char const *msg __maybe_unused)
69589812fc8SJiri Olsa {
6965d9cdc11SArnaldo Carvalho de Melo 	parse_events_evlist_error(parse_state, loc->last_column, "parser error");
69789812fc8SJiri Olsa }
698