xref: /linux/tools/perf/util/parse-events.y (revision 6fbf71854e2ddea7c99397772fbbb3783bfe15b5)
1fc8c0a99SJiri Olsa %define api.pure full
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 
9d4ce6019SIan Rogers #ifndef NDEBUG
1089812fc8SJiri Olsa #define YYDEBUG 1
11d4ce6019SIan Rogers #endif
1289812fc8SJiri Olsa 
1370c90e4aSIan Rogers #include <errno.h>
1489812fc8SJiri Olsa #include <linux/compiler.h>
15d944c4eeSBorislav Petkov #include <linux/types.h>
16231bb2aaSAndi Kleen #include "pmu.h"
171eaf496eSIan Rogers #include "pmus.h"
18f0fbb114SAndi Kleen #include "evsel.h"
1989812fc8SJiri Olsa #include "parse-events.h"
20ac20de6fSZheng Yan #include "parse-events-bison.h"
2189812fc8SJiri Olsa 
22ddc8e4c9SIan Rogers int parse_events_lex(YYSTYPE * yylval_param, YYLTYPE * yylloc_param , void *yyscanner);
235d9cdc11SArnaldo Carvalho de Melo void parse_events_error(YYLTYPE *loc, void *parse_state, void *scanner, char const *msg);
2434a0548fSArnaldo Carvalho de Melo 
25b52cb995SIan Rogers #define PE_ABORT(val) \
26b52cb995SIan Rogers do { \
27b52cb995SIan Rogers 	if (val == -ENOMEM) \
28b52cb995SIan Rogers 		YYNOMEM; \
29b52cb995SIan Rogers 	YYABORT; \
30b52cb995SIan Rogers } while (0)
31b52cb995SIan Rogers 
alloc_list(void)32ffaecd7dSIan Rogers static struct list_head* alloc_list(void)
33a26e4716SIan Rogers {
34a26e4716SIan Rogers 	struct list_head *list;
35a26e4716SIan Rogers 
36a26e4716SIan Rogers 	list = malloc(sizeof(*list));
37a26e4716SIan Rogers 	if (!list)
38a26e4716SIan Rogers 		return NULL;
39a26e4716SIan Rogers 
40a26e4716SIan Rogers 	INIT_LIST_HEAD(list);
41a26e4716SIan Rogers 	return list;
42a26e4716SIan Rogers }
43c5cd8ac0SDavid Ahern 
free_list_evsel(struct list_head * list_evsel)44f2a8ecd8SIan Rogers static void free_list_evsel(struct list_head* list_evsel)
45f2a8ecd8SIan Rogers {
46f2a8ecd8SIan Rogers 	struct evsel *evsel, *tmp;
47f2a8ecd8SIan Rogers 
48f2a8ecd8SIan Rogers 	list_for_each_entry_safe(evsel, tmp, list_evsel, core.node) {
49f2a8ecd8SIan Rogers 		list_del_init(&evsel->core.node);
50672f707eSIan Rogers 		evsel__delete(evsel);
51f2a8ecd8SIan Rogers 	}
52f2a8ecd8SIan Rogers 	free(list_evsel);
53f2a8ecd8SIan Rogers }
54f2a8ecd8SIan Rogers 
5589812fc8SJiri Olsa %}
5689812fc8SJiri Olsa 
5790e2b22dSJiri Olsa %token PE_START_EVENTS PE_START_TERMS
58*4f1b0673SArnaldo Carvalho de Melo %token PE_VALUE PE_VALUE_SYM_HW PE_VALUE_SYM_SW PE_TERM
59f0fbb114SAndi Kleen %token PE_VALUE_SYM_TOOL
60ac2ba9f3SRobert Richter %token PE_EVENT_NAME
6170c90e4aSIan Rogers %token PE_RAW PE_NAME
62f0617f52SAdrian Hunter %token PE_MODIFIER_EVENT PE_MODIFIER_BP PE_BP_COLON PE_BP_SLASH
6370c90e4aSIan Rogers %token PE_LEGACY_CACHE
647e34daa5SIan Rogers %token PE_PREFIX_MEM
6589812fc8SJiri Olsa %token PE_ERROR
66dd60fba7SMathieu Poirier %token PE_DRV_CFG_TERM
675ea8f2ccSIan Rogers %token PE_TERM_HW
6889812fc8SJiri Olsa %type <num> PE_VALUE
69*4f1b0673SArnaldo Carvalho de Melo %type <num> PE_VALUE_SYM_HW
70cf3506dcSJiri Olsa %type <num> PE_VALUE_SYM_SW
71f0fbb114SAndi Kleen %type <num> PE_VALUE_SYM_TOOL
72e30a7912SIan Rogers %type <mod> PE_MODIFIER_EVENT
7341636448SIan Rogers %type <term_type> PE_TERM
74*4f1b0673SArnaldo Carvalho de Melo %type <num> value_sym
7570c90e4aSIan Rogers %type <str> PE_RAW
7689812fc8SJiri Olsa %type <str> PE_NAME
7770c90e4aSIan Rogers %type <str> PE_LEGACY_CACHE
7889812fc8SJiri Olsa %type <str> PE_MODIFIER_BP
79ac2ba9f3SRobert Richter %type <str> PE_EVENT_NAME
80dd60fba7SMathieu Poirier %type <str> PE_DRV_CFG_TERM
81b20576fdSIan Rogers %type <str> name_or_raw
82f2a8ecd8SIan Rogers %destructor { free ($$); } <str>
838f707d84SJiri Olsa %type <term> event_term
841dc92556SIan Rogers %destructor { parse_events_term__delete ($$); } <term>
85f2a8ecd8SIan Rogers %type <list_terms> event_config
86f2a8ecd8SIan Rogers %type <list_terms> opt_event_config
87f2a8ecd8SIan Rogers %type <list_terms> opt_pmu_config
88f2a8ecd8SIan Rogers %destructor { parse_events_terms__delete ($$); } <list_terms>
89f2a8ecd8SIan Rogers %type <list_evsel> event_pmu
90f2a8ecd8SIan Rogers %type <list_evsel> event_legacy_symbol
91f2a8ecd8SIan Rogers %type <list_evsel> event_legacy_cache
92f2a8ecd8SIan Rogers %type <list_evsel> event_legacy_mem
93f2a8ecd8SIan Rogers %type <list_evsel> event_legacy_tracepoint
94f2a8ecd8SIan Rogers %type <list_evsel> event_legacy_numeric
95f2a8ecd8SIan Rogers %type <list_evsel> event_legacy_raw
96f2a8ecd8SIan Rogers %type <list_evsel> event_def
97f2a8ecd8SIan Rogers %type <list_evsel> event_mod
98f2a8ecd8SIan Rogers %type <list_evsel> event_name
99f2a8ecd8SIan Rogers %type <list_evsel> event
100f2a8ecd8SIan Rogers %type <list_evsel> events
101f2a8ecd8SIan Rogers %type <list_evsel> group_def
102f2a8ecd8SIan Rogers %type <list_evsel> group
103f2a8ecd8SIan Rogers %type <list_evsel> groups
104f2a8ecd8SIan Rogers %destructor { free_list_evsel ($$); } <list_evsel>
105865582c3SHe Kuang %type <tracepoint_name> tracepoint_name
106ede72dcaSIan Rogers %destructor { free ($$.sys); free ($$.event); } <tracepoint_name>
107*4f1b0673SArnaldo Carvalho de Melo %type <hardware_term> PE_TERM_HW
108*4f1b0673SArnaldo Carvalho de Melo %destructor { free ($$.str); } <hardware_term>
10989812fc8SJiri Olsa 
11089812fc8SJiri Olsa %union
11189812fc8SJiri Olsa {
11289812fc8SJiri Olsa 	char *str;
113b527bab5SRobert Richter 	u64 num;
114e30a7912SIan Rogers 	struct parse_events_modifier mod;
11541636448SIan Rogers 	enum parse_events__term_type term_type;
116f2a8ecd8SIan Rogers 	struct list_head *list_evsel;
1170d3f0e6fSIan Rogers 	struct parse_events_terms *list_terms;
1186cee6cd3SArnaldo Carvalho de Melo 	struct parse_events_term *term;
119865582c3SHe Kuang 	struct tracepoint_name {
120865582c3SHe Kuang 		char *sys;
121865582c3SHe Kuang 		char *event;
122865582c3SHe Kuang 	} tracepoint_name;
123*4f1b0673SArnaldo Carvalho de Melo 	struct hardware_term {
1245ea8f2ccSIan Rogers 		char *str;
1255ea8f2ccSIan Rogers 		u64 num;
126*4f1b0673SArnaldo Carvalho de Melo 	} hardware_term;
12789812fc8SJiri Olsa }
12889812fc8SJiri Olsa %%
12989812fc8SJiri Olsa 
1304e5484b4SIan Rogers  /*
1314e5484b4SIan Rogers   * Entry points. We are either parsing events or terminals. Just terminal
1324e5484b4SIan Rogers   * parsing is used for parsing events in sysfs.
1334e5484b4SIan Rogers   */
13490e2b22dSJiri Olsa start:
13589efb029SJiri Olsa PE_START_EVENTS start_events
13690e2b22dSJiri Olsa |
13789efb029SJiri Olsa PE_START_TERMS  start_terms
13889efb029SJiri Olsa 
13989efb029SJiri Olsa start_events: groups
14089efb029SJiri Olsa {
1414e5484b4SIan Rogers 	/* Take the parsed events, groups.. and place into parse_state. */
1424e5484b4SIan Rogers 	struct list_head *groups  = $1;
1435d9cdc11SArnaldo Carvalho de Melo 	struct parse_events_state *parse_state = _parse_state;
14489efb029SJiri Olsa 
1454e5484b4SIan Rogers 	list_splice_tail(groups, &parse_state->list);
1464e5484b4SIan Rogers 	free(groups);
14789efb029SJiri Olsa }
14889efb029SJiri Olsa 
1494e5484b4SIan Rogers groups: /* A list of groups or events. */
15089efb029SJiri Olsa groups ',' group
15189efb029SJiri Olsa {
1524e5484b4SIan Rogers 	/* Merge group into the list of events/groups. */
1534e5484b4SIan Rogers 	struct list_head *groups  = $1;
15489efb029SJiri Olsa 	struct list_head *group  = $3;
15589efb029SJiri Olsa 
1564e5484b4SIan Rogers 	list_splice_tail(group, groups);
1574e5484b4SIan Rogers 	free(group);
1584e5484b4SIan Rogers 	$$ = groups;
15989efb029SJiri Olsa }
16089efb029SJiri Olsa |
16189efb029SJiri Olsa groups ',' event
16289efb029SJiri Olsa {
1634e5484b4SIan Rogers 	/* Merge event into the list of events/groups. */
1644e5484b4SIan Rogers 	struct list_head *groups  = $1;
16589efb029SJiri Olsa 	struct list_head *event = $3;
16689efb029SJiri Olsa 
1674e5484b4SIan Rogers 
1684e5484b4SIan Rogers 	list_splice_tail(event, groups);
1694e5484b4SIan Rogers 	free(event);
1704e5484b4SIan Rogers 	$$ = groups;
17189efb029SJiri Olsa }
17289efb029SJiri Olsa |
17389efb029SJiri Olsa group
17489efb029SJiri Olsa |
17589efb029SJiri Olsa event
17689efb029SJiri Olsa 
17789efb029SJiri Olsa group:
17889efb029SJiri Olsa group_def ':' PE_MODIFIER_EVENT
17989efb029SJiri Olsa {
180e30a7912SIan Rogers 	/* Apply the modifier to the events in the group_def. */
18189efb029SJiri Olsa 	struct list_head *list = $1;
182cabbf268SIan Rogers 	int err;
18389efb029SJiri Olsa 
184e30a7912SIan Rogers 	err = parse_events__modifier_group(_parse_state, &@3, list, $3);
185e30a7912SIan Rogers 	if (err)
186cabbf268SIan Rogers 		YYABORT;
18789efb029SJiri Olsa 	$$ = list;
18889efb029SJiri Olsa }
18989efb029SJiri Olsa |
19089efb029SJiri Olsa group_def
19189efb029SJiri Olsa 
19289efb029SJiri Olsa group_def:
19389efb029SJiri Olsa PE_NAME '{' events '}'
19489efb029SJiri Olsa {
19589efb029SJiri Olsa 	struct list_head *list = $3;
19689efb029SJiri Olsa 
197afd876bbSIan Rogers 	/*
198afd876bbSIan Rogers 	 * Set the first entry of list to be the leader. Set the group name on
199afd876bbSIan Rogers 	 * the leader to $1 taking ownership.
200afd876bbSIan Rogers 	 */
201347c2f0aSIan Rogers 	parse_events__set_leader($1, list);
20289efb029SJiri Olsa 	$$ = list;
20389efb029SJiri Olsa }
20489efb029SJiri Olsa |
20589efb029SJiri Olsa '{' events '}'
20689efb029SJiri Olsa {
20789efb029SJiri Olsa 	struct list_head *list = $2;
20889efb029SJiri Olsa 
209afd876bbSIan Rogers 	/* Set the first entry of list to be the leader clearing the group name. */
210347c2f0aSIan Rogers 	parse_events__set_leader(NULL, list);
21189efb029SJiri Olsa 	$$ = list;
21289efb029SJiri Olsa }
21390e2b22dSJiri Olsa 
21489812fc8SJiri Olsa events:
21589efb029SJiri Olsa events ',' event
21689efb029SJiri Olsa {
2174e5484b4SIan Rogers 	struct list_head *events  = $1;
21889efb029SJiri Olsa 	struct list_head *event = $3;
21989efb029SJiri Olsa 
2204e5484b4SIan Rogers 	list_splice_tail(event, events);
2214e5484b4SIan Rogers 	free(event);
2224e5484b4SIan Rogers 	$$ = events;
22389efb029SJiri Olsa }
22489efb029SJiri Olsa |
22589efb029SJiri Olsa event
22689812fc8SJiri Olsa 
227ac2ba9f3SRobert Richter event: event_mod
228ac2ba9f3SRobert Richter 
229ac2ba9f3SRobert Richter event_mod:
230ac2ba9f3SRobert Richter event_name PE_MODIFIER_EVENT
23189812fc8SJiri Olsa {
23289efb029SJiri Olsa 	struct list_head *list = $1;
233cabbf268SIan Rogers 	int err;
23446010ab2SJiri Olsa 
2355d7be90eSJiri Olsa 	/*
2365d7be90eSJiri Olsa 	 * Apply modifier on all events added by single event definition
2375d7be90eSJiri Olsa 	 * (there could be more events added for multiple tracepoint
2385d7be90eSJiri Olsa 	 * definitions via '*?'.
2395d7be90eSJiri Olsa 	 */
240e30a7912SIan Rogers 	err = parse_events__modifier_event(_parse_state, &@2, list, $2);
241e30a7912SIan Rogers 	if (err)
242cabbf268SIan Rogers 		YYABORT;
24389efb029SJiri Olsa 	$$ = list;
24489812fc8SJiri Olsa }
24589812fc8SJiri Olsa |
246ac2ba9f3SRobert Richter event_name
247ac2ba9f3SRobert Richter 
248ac2ba9f3SRobert Richter event_name:
249ac2ba9f3SRobert Richter PE_EVENT_NAME event_def
250ac2ba9f3SRobert Richter {
251bb65ff78SIan Rogers 	/*
252bb65ff78SIan Rogers 	 * When an event is parsed the text is rewound and the entire text of
253bb65ff78SIan Rogers 	 * the event is set to the str of PE_EVENT_NAME token matched here. If
254bb65ff78SIan Rogers 	 * no name was on an event via a term, set the name to the entire text
255bb65ff78SIan Rogers 	 * taking ownership of the allocation.
256bb65ff78SIan Rogers 	 */
257bb65ff78SIan Rogers 	int err = parse_events__set_default_name($2, $1);
258cabbf268SIan Rogers 
259cabbf268SIan Rogers 	if (err) {
260cabbf268SIan Rogers 		free_list_evsel($2);
2619462e4deSIan Rogers 		YYNOMEM;
262cabbf268SIan Rogers 	}
263ac2ba9f3SRobert Richter 	$$ = $2;
264ac2ba9f3SRobert Richter }
265ac2ba9f3SRobert Richter |
26689812fc8SJiri Olsa event_def
26789812fc8SJiri Olsa 
2685f537a26SJiri Olsa event_def: event_pmu |
2695f537a26SJiri Olsa 	   event_legacy_symbol |
27089812fc8SJiri Olsa 	   event_legacy_cache sep_dc |
271f0617f52SAdrian Hunter 	   event_legacy_mem sep_dc |
27289812fc8SJiri Olsa 	   event_legacy_tracepoint sep_dc |
27389812fc8SJiri Olsa 	   event_legacy_numeric sep_dc |
2743d6dfae8SIan Rogers 	   event_legacy_raw sep_dc
27589812fc8SJiri Olsa 
2765f537a26SJiri Olsa event_pmu:
27770c90e4aSIan Rogers PE_NAME opt_pmu_config
2785f537a26SJiri Olsa {
279727adeedSIan Rogers 	/* List of created evsels. */
280727adeedSIan Rogers 	struct list_head *list = NULL;
2818b734eaaSIan Rogers 	int err = parse_events_multi_pmu_add_or_add_pmu(_parse_state, $1, $2, &list, &@1);
282cabbf268SIan Rogers 
2838b734eaaSIan Rogers 	parse_events_terms__delete($2);
2848b734eaaSIan Rogers 	free($1);
2858b734eaaSIan Rogers 	if (err)
2868b734eaaSIan Rogers 		PE_ABORT(err);
287b847cbdcSJiri Olsa 	$$ = list;
2885f537a26SJiri Olsa }
289ad962273SAdrian Hunter |
29070c90e4aSIan Rogers PE_NAME sep_dc
29170c90e4aSIan Rogers {
29270c90e4aSIan Rogers 	struct list_head *list;
29370c90e4aSIan Rogers 	int err;
29470c90e4aSIan Rogers 
295*4f1b0673SArnaldo Carvalho de Melo 	err = parse_events_multi_pmu_add(_parse_state, $1, NULL, &list, &@1);
296b30d4f0bSIan Rogers 	if (err < 0) {
297b30d4f0bSIan Rogers 		struct parse_events_state *parse_state = _parse_state;
298b30d4f0bSIan Rogers 		struct parse_events_error *error = parse_state->error;
299b30d4f0bSIan Rogers 		char *help;
300b30d4f0bSIan Rogers 
3016beb6cfdSIan Rogers 		if (asprintf(&help, "Unable to find event on a PMU of '%s'", $1) < 0)
302b30d4f0bSIan Rogers 			help = NULL;
303b30d4f0bSIan Rogers 		parse_events_error__handle(error, @1.first_column, strdup("Bad event name"), help);
30470c90e4aSIan Rogers 		free($1);
305b52cb995SIan Rogers 		PE_ABORT(err);
306b30d4f0bSIan Rogers 	}
307b30d4f0bSIan Rogers 	free($1);
30870c90e4aSIan Rogers 	$$ = list;
30970c90e4aSIan Rogers }
3105f537a26SJiri Olsa 
311*4f1b0673SArnaldo Carvalho de Melo value_sym:
312*4f1b0673SArnaldo Carvalho de Melo PE_VALUE_SYM_HW
313617824a7SIan Rogers |
314*4f1b0673SArnaldo Carvalho de Melo PE_VALUE_SYM_SW
315617824a7SIan Rogers 
316617824a7SIan Rogers event_legacy_symbol:
317*4f1b0673SArnaldo Carvalho de Melo value_sym '/' event_config '/'
318617824a7SIan Rogers {
319617824a7SIan Rogers 	struct list_head *list;
320*4f1b0673SArnaldo Carvalho de Melo 	int type = $1 >> 16;
321*4f1b0673SArnaldo Carvalho de Melo 	int config = $1 & 255;
322617824a7SIan Rogers 	int err;
323*4f1b0673SArnaldo Carvalho de Melo 	bool wildcard = (type == PERF_TYPE_HARDWARE || type == PERF_TYPE_HW_CACHE);
32489812fc8SJiri Olsa 
325a26e4716SIan Rogers 	list = alloc_list();
32677cdd787SIan Rogers 	if (!list)
32777cdd787SIan Rogers 		YYNOMEM;
328*4f1b0673SArnaldo Carvalho de Melo 	err = parse_events_add_numeric(_parse_state, list, type, config, $3, wildcard);
3292146afc6SArnaldo Carvalho de Melo 	parse_events_terms__delete($3);
330cabbf268SIan Rogers 	if (err) {
331cabbf268SIan Rogers 		free_list_evsel(list);
332b52cb995SIan Rogers 		PE_ABORT(err);
333cabbf268SIan Rogers 	}
334b847cbdcSJiri Olsa 	$$ = list;
3358f707d84SJiri Olsa }
3368f707d84SJiri Olsa |
337*4f1b0673SArnaldo Carvalho de Melo value_sym sep_slash_slash_dc
3388f707d84SJiri Olsa {
339c5cd8ac0SDavid Ahern 	struct list_head *list;
340*4f1b0673SArnaldo Carvalho de Melo 	int type = $1 >> 16;
341*4f1b0673SArnaldo Carvalho de Melo 	int config = $1 & 255;
342*4f1b0673SArnaldo Carvalho de Melo 	bool wildcard = (type == PERF_TYPE_HARDWARE || type == PERF_TYPE_HW_CACHE);
343b52cb995SIan Rogers 	int err;
3448f707d84SJiri Olsa 
345a26e4716SIan Rogers 	list = alloc_list();
34677cdd787SIan Rogers 	if (!list)
34777cdd787SIan Rogers 		YYNOMEM;
348*4f1b0673SArnaldo Carvalho de Melo 	err = parse_events_add_numeric(_parse_state, list, type, config, /*head_config=*/NULL, wildcard);
349b52cb995SIan Rogers 	if (err)
350b52cb995SIan Rogers 		PE_ABORT(err);
351b847cbdcSJiri Olsa 	$$ = list;
35289812fc8SJiri Olsa }
353f0fbb114SAndi Kleen |
354f0fbb114SAndi Kleen PE_VALUE_SYM_TOOL sep_slash_slash_dc
355f0fbb114SAndi Kleen {
356f0fbb114SAndi Kleen 	struct list_head *list;
357b52cb995SIan Rogers 	int err;
358f0fbb114SAndi Kleen 
359a26e4716SIan Rogers 	list = alloc_list();
36077cdd787SIan Rogers 	if (!list)
36177cdd787SIan Rogers 		YYNOMEM;
362b52cb995SIan Rogers 	err = parse_events_add_tool(_parse_state, list, $1);
363b52cb995SIan Rogers 	if (err)
364b52cb995SIan Rogers 		YYNOMEM;
365f0fbb114SAndi Kleen 	$$ = list;
366f0fbb114SAndi Kleen }
36789812fc8SJiri Olsa 
36889812fc8SJiri Olsa event_legacy_cache:
36970c90e4aSIan Rogers PE_LEGACY_CACHE opt_event_config
37089812fc8SJiri Olsa {
3715d9cdc11SArnaldo Carvalho de Melo 	struct parse_events_state *parse_state = _parse_state;
372c5cd8ac0SDavid Ahern 	struct list_head *list;
373cabbf268SIan Rogers 	int err;
374b847cbdcSJiri Olsa 
375a26e4716SIan Rogers 	list = alloc_list();
37677cdd787SIan Rogers 	if (!list)
37777cdd787SIan Rogers 		YYNOMEM;
37877cdd787SIan Rogers 
379411ad22eSIan Rogers 	err = parse_events_add_cache(list, &parse_state->idx, $1, parse_state, $2);
380b847cbdcSJiri Olsa 
38143d0b978SWang Nan 	parse_events_terms__delete($2);
382cabbf268SIan Rogers 	free($1);
383cabbf268SIan Rogers 	if (err) {
384cabbf268SIan Rogers 		free_list_evsel(list);
385b52cb995SIan Rogers 		PE_ABORT(err);
386cabbf268SIan Rogers 	}
387b847cbdcSJiri Olsa 	$$ = list;
38889812fc8SJiri Olsa }
38989812fc8SJiri Olsa 
39089812fc8SJiri Olsa event_legacy_mem:
391f0617f52SAdrian Hunter PE_PREFIX_MEM PE_VALUE PE_BP_SLASH PE_VALUE PE_BP_COLON PE_MODIFIER_BP opt_event_config
3923741eb9fSJacob Shin {
3933741eb9fSJacob Shin 	struct list_head *list;
394cabbf268SIan Rogers 	int err;
3953741eb9fSJacob Shin 
396a26e4716SIan Rogers 	list = alloc_list();
39777cdd787SIan Rogers 	if (!list)
39877cdd787SIan Rogers 		YYNOMEM;
39977cdd787SIan Rogers 
400f0617f52SAdrian Hunter 	err = parse_events_add_breakpoint(_parse_state, list,
401f0617f52SAdrian Hunter 					  $2, $6, $4, $7);
402f0617f52SAdrian Hunter 	parse_events_terms__delete($7);
403cabbf268SIan Rogers 	free($6);
404cabbf268SIan Rogers 	if (err) {
405cabbf268SIan Rogers 		free(list);
406b52cb995SIan Rogers 		PE_ABORT(err);
407cabbf268SIan Rogers 	}
4083741eb9fSJacob Shin 	$$ = list;
4093741eb9fSJacob Shin }
4103741eb9fSJacob Shin |
411f0617f52SAdrian Hunter PE_PREFIX_MEM PE_VALUE PE_BP_SLASH PE_VALUE opt_event_config
4123741eb9fSJacob Shin {
4133741eb9fSJacob Shin 	struct list_head *list;
414f0617f52SAdrian Hunter 	int err;
415f0617f52SAdrian Hunter 
416a26e4716SIan Rogers 	list = alloc_list();
41777cdd787SIan Rogers 	if (!list)
41877cdd787SIan Rogers 		YYNOMEM;
41977cdd787SIan Rogers 
420f0617f52SAdrian Hunter 	err = parse_events_add_breakpoint(_parse_state, list,
421f0617f52SAdrian Hunter 					  $2, NULL, $4, $5);
422f0617f52SAdrian Hunter 	parse_events_terms__delete($5);
423f0617f52SAdrian Hunter 	if (err) {
424cabbf268SIan Rogers 		free(list);
425b52cb995SIan Rogers 		PE_ABORT(err);
426cabbf268SIan Rogers 	}
4273741eb9fSJacob Shin 	$$ = list;
4283741eb9fSJacob Shin }
4293741eb9fSJacob Shin |
430f0617f52SAdrian Hunter PE_PREFIX_MEM PE_VALUE PE_BP_COLON PE_MODIFIER_BP opt_event_config
43189812fc8SJiri Olsa {
432c5cd8ac0SDavid Ahern 	struct list_head *list;
433cabbf268SIan Rogers 	int err;
434b847cbdcSJiri Olsa 
435a26e4716SIan Rogers 	list = alloc_list();
43677cdd787SIan Rogers 	if (!list)
43777cdd787SIan Rogers 		YYNOMEM;
43877cdd787SIan Rogers 
439f0617f52SAdrian Hunter 	err = parse_events_add_breakpoint(_parse_state, list,
440f0617f52SAdrian Hunter 					  $2, $4, 0, $5);
441f0617f52SAdrian Hunter 	parse_events_terms__delete($5);
442cabbf268SIan Rogers 	free($4);
443cabbf268SIan Rogers 	if (err) {
444cabbf268SIan Rogers 		free(list);
445b52cb995SIan Rogers 		PE_ABORT(err);
446cabbf268SIan Rogers 	}
447b847cbdcSJiri Olsa 	$$ = list;
44889812fc8SJiri Olsa }
44989812fc8SJiri Olsa |
450f0617f52SAdrian Hunter PE_PREFIX_MEM PE_VALUE opt_event_config
45189812fc8SJiri Olsa {
452c5cd8ac0SDavid Ahern 	struct list_head *list;
453f0617f52SAdrian Hunter 	int err;
454b847cbdcSJiri Olsa 
455a26e4716SIan Rogers 	list = alloc_list();
45677cdd787SIan Rogers 	if (!list)
45777cdd787SIan Rogers 		YYNOMEM;
458f0617f52SAdrian Hunter 	err = parse_events_add_breakpoint(_parse_state, list,
459f0617f52SAdrian Hunter 					  $2, NULL, 0, $3);
460f0617f52SAdrian Hunter 	parse_events_terms__delete($3);
461f0617f52SAdrian Hunter 	if (err) {
462cabbf268SIan Rogers 		free(list);
463b52cb995SIan Rogers 		PE_ABORT(err);
464cabbf268SIan Rogers 	}
465b847cbdcSJiri Olsa 	$$ = list;
46689812fc8SJiri Olsa }
46789812fc8SJiri Olsa 
46889812fc8SJiri Olsa event_legacy_tracepoint:
4691d55e8efSArnaldo Carvalho de Melo tracepoint_name opt_event_config
4702b9032e0SAlexander Yarygin {
4715d9cdc11SArnaldo Carvalho de Melo 	struct parse_events_state *parse_state = _parse_state;
4725d9cdc11SArnaldo Carvalho de Melo 	struct parse_events_error *error = parse_state->error;
4732b9032e0SAlexander Yarygin 	struct list_head *list;
474cabbf268SIan Rogers 	int err;
4752b9032e0SAlexander Yarygin 
476a26e4716SIan Rogers 	list = alloc_list();
47777cdd787SIan Rogers 	if (!list)
47877cdd787SIan Rogers 		YYNOMEM;
479e637d177SHe Kuang 
48011a42964SDominique Martinet 	err = parse_events_add_tracepoint(parse_state, list, $1.sys, $1.event,
481d81fa63bSIan Rogers 					error, $2, &@1);
482e637d177SHe Kuang 
483cabbf268SIan Rogers 	parse_events_terms__delete($2);
484cabbf268SIan Rogers 	free($1.sys);
485cabbf268SIan Rogers 	free($1.event);
486cabbf268SIan Rogers 	if (err) {
487cabbf268SIan Rogers 		free(list);
488b52cb995SIan Rogers 		PE_ABORT(err);
489cabbf268SIan Rogers 	}
4902b9032e0SAlexander Yarygin 	$$ = list;
4912b9032e0SAlexander Yarygin }
492865582c3SHe Kuang 
493865582c3SHe Kuang tracepoint_name:
49489812fc8SJiri Olsa PE_NAME ':' PE_NAME
49589812fc8SJiri Olsa {
496865582c3SHe Kuang 	struct tracepoint_name tracepoint = {$1, $3};
497b847cbdcSJiri Olsa 
498865582c3SHe Kuang 	$$ = tracepoint;
49989812fc8SJiri Olsa }
50089812fc8SJiri Olsa 
50189812fc8SJiri Olsa event_legacy_numeric:
50210bf358aSWang Nan PE_VALUE ':' PE_VALUE opt_event_config
50389812fc8SJiri Olsa {
504c5cd8ac0SDavid Ahern 	struct list_head *list;
505cabbf268SIan Rogers 	int err;
506b847cbdcSJiri Olsa 
507a26e4716SIan Rogers 	list = alloc_list();
50877cdd787SIan Rogers 	if (!list)
50977cdd787SIan Rogers 		YYNOMEM;
5108bc75f69SIan Rogers 	err = parse_events_add_numeric(_parse_state, list, (u32)$1, $3, $4,
5118bc75f69SIan Rogers 				       /*wildcard=*/false);
51210bf358aSWang Nan 	parse_events_terms__delete($4);
513cabbf268SIan Rogers 	if (err) {
514cabbf268SIan Rogers 		free(list);
515b52cb995SIan Rogers 		PE_ABORT(err);
516cabbf268SIan Rogers 	}
517b847cbdcSJiri Olsa 	$$ = list;
51889812fc8SJiri Olsa }
51989812fc8SJiri Olsa 
52089812fc8SJiri Olsa event_legacy_raw:
52110bf358aSWang Nan PE_RAW opt_event_config
52289812fc8SJiri Olsa {
523c5cd8ac0SDavid Ahern 	struct list_head *list;
524cabbf268SIan Rogers 	int err;
52570c90e4aSIan Rogers 	u64 num;
526b847cbdcSJiri Olsa 
527a26e4716SIan Rogers 	list = alloc_list();
52877cdd787SIan Rogers 	if (!list)
52977cdd787SIan Rogers 		YYNOMEM;
53070c90e4aSIan Rogers 	errno = 0;
53170c90e4aSIan Rogers 	num = strtoull($1 + 1, NULL, 16);
5324c11adffSIan Rogers 	/* Given the lexer will only give [a-fA-F0-9]+ a failure here should be impossible. */
5334c11adffSIan Rogers 	if (errno)
5344c11adffSIan Rogers 		YYABORT;
53570c90e4aSIan Rogers 	free($1);
5368bc75f69SIan Rogers 	err = parse_events_add_numeric(_parse_state, list, PERF_TYPE_RAW, num, $2,
537251aa040SIan Rogers 				       /*wildcard=*/false);
53810bf358aSWang Nan 	parse_events_terms__delete($2);
539cabbf268SIan Rogers 	if (err) {
540cabbf268SIan Rogers 		free(list);
541b52cb995SIan Rogers 		PE_ABORT(err);
542cabbf268SIan Rogers 	}
543b847cbdcSJiri Olsa 	$$ = list;
5448f707d84SJiri Olsa }
5458f707d84SJiri Olsa 
5461d55e8efSArnaldo Carvalho de Melo opt_event_config:
5471d55e8efSArnaldo Carvalho de Melo '/' event_config '/'
5481d55e8efSArnaldo Carvalho de Melo {
5491d55e8efSArnaldo Carvalho de Melo 	$$ = $2;
5501d55e8efSArnaldo Carvalho de Melo }
5511d55e8efSArnaldo Carvalho de Melo |
5521d55e8efSArnaldo Carvalho de Melo '/' '/'
5531d55e8efSArnaldo Carvalho de Melo {
5541d55e8efSArnaldo Carvalho de Melo 	$$ = NULL;
5551d55e8efSArnaldo Carvalho de Melo }
5561d55e8efSArnaldo Carvalho de Melo |
5571d55e8efSArnaldo Carvalho de Melo {
5581d55e8efSArnaldo Carvalho de Melo 	$$ = NULL;
5591d55e8efSArnaldo Carvalho de Melo }
5601d55e8efSArnaldo Carvalho de Melo 
561ceac7b79SJiri Olsa opt_pmu_config:
562ceac7b79SJiri Olsa '/' event_config '/'
563ceac7b79SJiri Olsa {
564ceac7b79SJiri Olsa 	$$ = $2;
565ceac7b79SJiri Olsa }
566ceac7b79SJiri Olsa |
567ceac7b79SJiri Olsa '/' '/'
568ceac7b79SJiri Olsa {
569ceac7b79SJiri Olsa 	$$ = NULL;
570ceac7b79SJiri Olsa }
571ceac7b79SJiri Olsa 
57289efb029SJiri Olsa start_terms: event_config
57390e2b22dSJiri Olsa {
5745d9cdc11SArnaldo Carvalho de Melo 	struct parse_events_state *parse_state = _parse_state;
575cabbf268SIan Rogers 	if (parse_state->terms) {
576cabbf268SIan Rogers 		parse_events_terms__delete ($1);
577cabbf268SIan Rogers 		YYABORT;
578cabbf268SIan Rogers 	}
5795d9cdc11SArnaldo Carvalho de Melo 	parse_state->terms = $1;
58090e2b22dSJiri Olsa }
58190e2b22dSJiri Olsa 
5828f707d84SJiri Olsa event_config:
5838f707d84SJiri Olsa event_config ',' event_term
5848f707d84SJiri Olsa {
5850d3f0e6fSIan Rogers 	struct parse_events_terms *head = $1;
5866cee6cd3SArnaldo Carvalho de Melo 	struct parse_events_term *term = $3;
5878f707d84SJiri Olsa 
588cabbf268SIan Rogers 	if (!head) {
5891dc92556SIan Rogers 		parse_events_term__delete(term);
590cabbf268SIan Rogers 		YYABORT;
591cabbf268SIan Rogers 	}
5920d3f0e6fSIan Rogers 	list_add_tail(&term->list, &head->terms);
5938f707d84SJiri Olsa 	$$ = $1;
5948f707d84SJiri Olsa }
5958f707d84SJiri Olsa |
5968f707d84SJiri Olsa event_term
5978f707d84SJiri Olsa {
5980d3f0e6fSIan Rogers 	struct parse_events_terms *head = malloc(sizeof(*head));
5996cee6cd3SArnaldo Carvalho de Melo 	struct parse_events_term *term = $1;
6008f707d84SJiri Olsa 
60177cdd787SIan Rogers 	if (!head)
60277cdd787SIan Rogers 		YYNOMEM;
6030d3f0e6fSIan Rogers 	parse_events_terms__init(head);
6040d3f0e6fSIan Rogers 	list_add_tail(&term->list, &head->terms);
6058f707d84SJiri Olsa 	$$ = head;
6068f707d84SJiri Olsa }
6078f707d84SJiri Olsa 
6086fd1e519SIan Rogers name_or_raw: PE_RAW | PE_NAME | PE_LEGACY_CACHE
6099d0dba23SIan Rogers |
6109d0dba23SIan Rogers PE_TERM_HW
6119d0dba23SIan Rogers {
6129d0dba23SIan Rogers 	$$ = $1.str;
6139d0dba23SIan Rogers }
61470c90e4aSIan Rogers 
6158f707d84SJiri Olsa event_term:
6163a6c51e4SJiri Olsa PE_RAW
6173a6c51e4SJiri Olsa {
6183a6c51e4SJiri Olsa 	struct parse_events_term *term;
619b52cb995SIan Rogers 	int err = parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_RAW,
620b52cb995SIan Rogers 					 strdup("raw"), $1, &@1, &@1);
6213a6c51e4SJiri Olsa 
622b52cb995SIan Rogers 	if (err) {
62370c90e4aSIan Rogers 		free($1);
624b52cb995SIan Rogers 		PE_ABORT(err);
62570c90e4aSIan Rogers 	}
6263a6c51e4SJiri Olsa 	$$ = term;
6273a6c51e4SJiri Olsa }
6283a6c51e4SJiri Olsa |
629b20576fdSIan Rogers name_or_raw '=' name_or_raw
6308f707d84SJiri Olsa {
6316cee6cd3SArnaldo Carvalho de Melo 	struct parse_events_term *term;
632b52cb995SIan Rogers 	int err = parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_USER, $1, $3, &@1, &@3);
6338f707d84SJiri Olsa 
634b52cb995SIan Rogers 	if (err) {
635cabbf268SIan Rogers 		free($1);
636cabbf268SIan Rogers 		free($3);
637b52cb995SIan Rogers 		PE_ABORT(err);
638cabbf268SIan Rogers 	}
6398f707d84SJiri Olsa 	$$ = term;
6408f707d84SJiri Olsa }
6418f707d84SJiri Olsa |
64270c90e4aSIan Rogers name_or_raw '=' PE_VALUE
6438f707d84SJiri Olsa {
6446cee6cd3SArnaldo Carvalho de Melo 	struct parse_events_term *term;
645b52cb995SIan Rogers 	int err = parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
64664199ae4SIan Rogers 					 $1, $3, /*novalue=*/false, &@1, &@3);
6478f707d84SJiri Olsa 
648b52cb995SIan Rogers 	if (err) {
649cabbf268SIan Rogers 		free($1);
650b52cb995SIan Rogers 		PE_ABORT(err);
651cabbf268SIan Rogers 	}
6528f707d84SJiri Olsa 	$$ = term;
6538f707d84SJiri Olsa }
6548f707d84SJiri Olsa |
6556fd1e519SIan Rogers PE_LEGACY_CACHE
6566fd1e519SIan Rogers {
6576fd1e519SIan Rogers 	struct parse_events_term *term;
658b52cb995SIan Rogers 	int err = parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE,
65964199ae4SIan Rogers 					 $1, /*num=*/1, /*novalue=*/true, &@1, /*loc_val=*/NULL);
6606fd1e519SIan Rogers 
661b52cb995SIan Rogers 	if (err) {
6626fd1e519SIan Rogers 		free($1);
663b52cb995SIan Rogers 		PE_ABORT(err);
6646fd1e519SIan Rogers 	}
6656fd1e519SIan Rogers 	$$ = term;
6666fd1e519SIan Rogers }
6676fd1e519SIan Rogers |
6688f707d84SJiri Olsa PE_NAME
6698f707d84SJiri Olsa {
6706cee6cd3SArnaldo Carvalho de Melo 	struct parse_events_term *term;
671b52cb995SIan Rogers 	int err = parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
67264199ae4SIan Rogers 					 $1, /*num=*/1, /*novalue=*/true, &@1, /*loc_val=*/NULL);
6738f707d84SJiri Olsa 
674b52cb995SIan Rogers 	if (err) {
675cabbf268SIan Rogers 		free($1);
676b52cb995SIan Rogers 		PE_ABORT(err);
677cabbf268SIan Rogers 	}
6788f707d84SJiri Olsa 	$$ = term;
6798f707d84SJiri Olsa }
6808f707d84SJiri Olsa |
6815ea8f2ccSIan Rogers PE_TERM_HW
6821d33d6dcSJiri Olsa {
6836cee6cd3SArnaldo Carvalho de Melo 	struct parse_events_term *term;
684b52cb995SIan Rogers 	int err = parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_HARDWARE,
68564199ae4SIan Rogers 					 $1.str, $1.num & 255, /*novalue=*/false,
68664199ae4SIan Rogers 					 &@1, /*loc_val=*/NULL);
6871d33d6dcSJiri Olsa 
688b52cb995SIan Rogers 	if (err) {
6895ea8f2ccSIan Rogers 		free($1.str);
690b52cb995SIan Rogers 		PE_ABORT(err);
6915ea8f2ccSIan Rogers 	}
6921d33d6dcSJiri Olsa 	$$ = term;
6931d33d6dcSJiri Olsa }
6941d33d6dcSJiri Olsa |
695b20576fdSIan Rogers PE_TERM '=' name_or_raw
6966b5fc39bSJiri Olsa {
6976cee6cd3SArnaldo Carvalho de Melo 	struct parse_events_term *term;
69841636448SIan Rogers 	int err = parse_events_term__str(&term, $1, /*config=*/NULL, $3, &@1, &@3);
6996b5fc39bSJiri Olsa 
700b52cb995SIan Rogers 	if (err) {
701cabbf268SIan Rogers 		free($3);
702b52cb995SIan Rogers 		PE_ABORT(err);
703cabbf268SIan Rogers 	}
7046b5fc39bSJiri Olsa 	$$ = term;
7056b5fc39bSJiri Olsa }
7066b5fc39bSJiri Olsa |
707e831f3ccSIan Rogers PE_TERM '=' PE_TERM
708e831f3ccSIan Rogers {
709e831f3ccSIan Rogers 	struct parse_events_term *term;
71041636448SIan Rogers 	int err = parse_events_term__term(&term, $1, $3, &@1, &@3);
711e831f3ccSIan Rogers 
712b52cb995SIan Rogers 	if (err)
713b52cb995SIan Rogers 		PE_ABORT(err);
714b52cb995SIan Rogers 
715e831f3ccSIan Rogers 	$$ = term;
716e831f3ccSIan Rogers }
717e831f3ccSIan Rogers |
7188f707d84SJiri Olsa PE_TERM '=' PE_VALUE
7198f707d84SJiri Olsa {
7206cee6cd3SArnaldo Carvalho de Melo 	struct parse_events_term *term;
72141636448SIan Rogers 	int err = parse_events_term__num(&term, $1,
72241636448SIan Rogers 					 /*config=*/NULL, $3, /*novalue=*/false,
72341636448SIan Rogers 					 &@1, &@3);
7248f707d84SJiri Olsa 
725b52cb995SIan Rogers 	if (err)
726b52cb995SIan Rogers 		PE_ABORT(err);
727b52cb995SIan Rogers 
7288f707d84SJiri Olsa 	$$ = term;
7298f707d84SJiri Olsa }
7308f707d84SJiri Olsa |
7318f707d84SJiri Olsa PE_TERM
7328f707d84SJiri Olsa {
7336cee6cd3SArnaldo Carvalho de Melo 	struct parse_events_term *term;
73441636448SIan Rogers 	int err = parse_events_term__num(&term, $1,
73558d3a4ceSIan Rogers 					 /*config=*/NULL, /*num=*/1, /*novalue=*/true,
73658d3a4ceSIan Rogers 					 &@1, /*loc_val=*/NULL);
7378f707d84SJiri Olsa 
738b52cb995SIan Rogers 	if (err)
739b52cb995SIan Rogers 		PE_ABORT(err);
740b52cb995SIan Rogers 
7418f707d84SJiri Olsa 	$$ = term;
74289812fc8SJiri Olsa }
74345fc4628SIan Rogers |
74445fc4628SIan Rogers PE_DRV_CFG_TERM
74545fc4628SIan Rogers {
74645fc4628SIan Rogers 	struct parse_events_term *term;
74745fc4628SIan Rogers 	char *config = strdup($1);
74845fc4628SIan Rogers 	int err;
74945fc4628SIan Rogers 
75045fc4628SIan Rogers 	if (!config)
75145fc4628SIan Rogers 		YYNOMEM;
75245fc4628SIan Rogers 	err = parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_DRV_CFG, config, $1, &@1, NULL);
75345fc4628SIan Rogers 	if (err) {
75445fc4628SIan Rogers 		free($1);
75545fc4628SIan Rogers 		free(config);
75645fc4628SIan Rogers 		PE_ABORT(err);
75745fc4628SIan Rogers 	}
75845fc4628SIan Rogers 	$$ = term;
75945fc4628SIan Rogers }
76089812fc8SJiri Olsa 
76189812fc8SJiri Olsa sep_dc: ':' |
76289812fc8SJiri Olsa 
763714a92d8SJiri Olsa sep_slash_slash_dc: '/' '/' | ':' |
7648f707d84SJiri Olsa 
76589812fc8SJiri Olsa %%
76689812fc8SJiri Olsa 
767e18601d8SIan Rogers void parse_events_error(YYLTYPE *loc, void *_parse_state,
7686297d423SJiri Olsa 			void *scanner __maybe_unused,
7691d037ca1SIrina Tirdea 			char const *msg __maybe_unused)
77089812fc8SJiri Olsa {
771e18601d8SIan Rogers 	struct parse_events_state *parse_state = _parse_state;
772e18601d8SIan Rogers 
773e18601d8SIan Rogers 	if (!parse_state->error || !list_empty(&parse_state->error->list))
774e18601d8SIan Rogers 		return;
775e18601d8SIan Rogers 
776e18601d8SIan Rogers 	parse_events_error__handle(parse_state->error, loc->last_column,
777e18601d8SIan Rogers 				   strdup("Unrecognized input"), NULL);
77889812fc8SJiri Olsa }
779