162306a36Sopenharmony_ci%define api.pure full
262306a36Sopenharmony_ci%parse-param {void *_parse_state}
362306a36Sopenharmony_ci%parse-param {void *scanner}
462306a36Sopenharmony_ci%lex-param {void* scanner}
562306a36Sopenharmony_ci%locations
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci%{
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#define YYDEBUG 1
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#include <errno.h>
1262306a36Sopenharmony_ci#include <fnmatch.h>
1362306a36Sopenharmony_ci#include <stdio.h>
1462306a36Sopenharmony_ci#include <linux/compiler.h>
1562306a36Sopenharmony_ci#include <linux/types.h>
1662306a36Sopenharmony_ci#include <linux/zalloc.h>
1762306a36Sopenharmony_ci#include "pmu.h"
1862306a36Sopenharmony_ci#include "pmus.h"
1962306a36Sopenharmony_ci#include "evsel.h"
2062306a36Sopenharmony_ci#include "parse-events.h"
2162306a36Sopenharmony_ci#include "parse-events-bison.h"
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ciint parse_events_lex(YYSTYPE * yylval_param, YYLTYPE * yylloc_param , void *yyscanner);
2462306a36Sopenharmony_civoid parse_events_error(YYLTYPE *loc, void *parse_state, void *scanner, char const *msg);
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci#define PE_ABORT(val) \
2762306a36Sopenharmony_cido { \
2862306a36Sopenharmony_ci	if (val == -ENOMEM) \
2962306a36Sopenharmony_ci		YYNOMEM; \
3062306a36Sopenharmony_ci	YYABORT; \
3162306a36Sopenharmony_ci} while (0)
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_cistatic struct list_head* alloc_list(void)
3462306a36Sopenharmony_ci{
3562306a36Sopenharmony_ci	struct list_head *list;
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci	list = malloc(sizeof(*list));
3862306a36Sopenharmony_ci	if (!list)
3962306a36Sopenharmony_ci		return NULL;
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci	INIT_LIST_HEAD(list);
4262306a36Sopenharmony_ci	return list;
4362306a36Sopenharmony_ci}
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_cistatic void free_list_evsel(struct list_head* list_evsel)
4662306a36Sopenharmony_ci{
4762306a36Sopenharmony_ci	struct evsel *evsel, *tmp;
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci	list_for_each_entry_safe(evsel, tmp, list_evsel, core.node) {
5062306a36Sopenharmony_ci		list_del_init(&evsel->core.node);
5162306a36Sopenharmony_ci		evsel__delete(evsel);
5262306a36Sopenharmony_ci	}
5362306a36Sopenharmony_ci	free(list_evsel);
5462306a36Sopenharmony_ci}
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci%}
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci%token PE_START_EVENTS PE_START_TERMS
5962306a36Sopenharmony_ci%token PE_VALUE PE_VALUE_SYM_HW PE_VALUE_SYM_SW PE_TERM
6062306a36Sopenharmony_ci%token PE_VALUE_SYM_TOOL
6162306a36Sopenharmony_ci%token PE_EVENT_NAME
6262306a36Sopenharmony_ci%token PE_RAW PE_NAME
6362306a36Sopenharmony_ci%token PE_MODIFIER_EVENT PE_MODIFIER_BP PE_BP_COLON PE_BP_SLASH
6462306a36Sopenharmony_ci%token PE_LEGACY_CACHE
6562306a36Sopenharmony_ci%token PE_PREFIX_MEM
6662306a36Sopenharmony_ci%token PE_ERROR
6762306a36Sopenharmony_ci%token PE_DRV_CFG_TERM
6862306a36Sopenharmony_ci%token PE_TERM_HW
6962306a36Sopenharmony_ci%type <num> PE_VALUE
7062306a36Sopenharmony_ci%type <num> PE_VALUE_SYM_HW
7162306a36Sopenharmony_ci%type <num> PE_VALUE_SYM_SW
7262306a36Sopenharmony_ci%type <num> PE_VALUE_SYM_TOOL
7362306a36Sopenharmony_ci%type <num> PE_TERM
7462306a36Sopenharmony_ci%type <num> value_sym
7562306a36Sopenharmony_ci%type <str> PE_RAW
7662306a36Sopenharmony_ci%type <str> PE_NAME
7762306a36Sopenharmony_ci%type <str> PE_LEGACY_CACHE
7862306a36Sopenharmony_ci%type <str> PE_MODIFIER_EVENT
7962306a36Sopenharmony_ci%type <str> PE_MODIFIER_BP
8062306a36Sopenharmony_ci%type <str> PE_EVENT_NAME
8162306a36Sopenharmony_ci%type <str> PE_DRV_CFG_TERM
8262306a36Sopenharmony_ci%type <str> name_or_raw
8362306a36Sopenharmony_ci%destructor { free ($$); } <str>
8462306a36Sopenharmony_ci%type <term> event_term
8562306a36Sopenharmony_ci%destructor { parse_events_term__delete ($$); } <term>
8662306a36Sopenharmony_ci%type <list_terms> event_config
8762306a36Sopenharmony_ci%type <list_terms> opt_event_config
8862306a36Sopenharmony_ci%type <list_terms> opt_pmu_config
8962306a36Sopenharmony_ci%destructor { parse_events_terms__delete ($$); } <list_terms>
9062306a36Sopenharmony_ci%type <list_evsel> event_pmu
9162306a36Sopenharmony_ci%type <list_evsel> event_legacy_symbol
9262306a36Sopenharmony_ci%type <list_evsel> event_legacy_cache
9362306a36Sopenharmony_ci%type <list_evsel> event_legacy_mem
9462306a36Sopenharmony_ci%type <list_evsel> event_legacy_tracepoint
9562306a36Sopenharmony_ci%type <list_evsel> event_legacy_numeric
9662306a36Sopenharmony_ci%type <list_evsel> event_legacy_raw
9762306a36Sopenharmony_ci%type <list_evsel> event_def
9862306a36Sopenharmony_ci%type <list_evsel> event_mod
9962306a36Sopenharmony_ci%type <list_evsel> event_name
10062306a36Sopenharmony_ci%type <list_evsel> event
10162306a36Sopenharmony_ci%type <list_evsel> events
10262306a36Sopenharmony_ci%type <list_evsel> group_def
10362306a36Sopenharmony_ci%type <list_evsel> group
10462306a36Sopenharmony_ci%type <list_evsel> groups
10562306a36Sopenharmony_ci%destructor { free_list_evsel ($$); } <list_evsel>
10662306a36Sopenharmony_ci%type <tracepoint_name> tracepoint_name
10762306a36Sopenharmony_ci%destructor { free ($$.sys); free ($$.event); } <tracepoint_name>
10862306a36Sopenharmony_ci%type <hardware_term> PE_TERM_HW
10962306a36Sopenharmony_ci%destructor { free ($$.str); } <hardware_term>
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_ci%union
11262306a36Sopenharmony_ci{
11362306a36Sopenharmony_ci	char *str;
11462306a36Sopenharmony_ci	u64 num;
11562306a36Sopenharmony_ci	struct list_head *list_evsel;
11662306a36Sopenharmony_ci	struct list_head *list_terms;
11762306a36Sopenharmony_ci	struct parse_events_term *term;
11862306a36Sopenharmony_ci	struct tracepoint_name {
11962306a36Sopenharmony_ci		char *sys;
12062306a36Sopenharmony_ci		char *event;
12162306a36Sopenharmony_ci	} tracepoint_name;
12262306a36Sopenharmony_ci	struct hardware_term {
12362306a36Sopenharmony_ci		char *str;
12462306a36Sopenharmony_ci		u64 num;
12562306a36Sopenharmony_ci	} hardware_term;
12662306a36Sopenharmony_ci}
12762306a36Sopenharmony_ci%%
12862306a36Sopenharmony_ci
12962306a36Sopenharmony_cistart:
13062306a36Sopenharmony_ciPE_START_EVENTS start_events
13162306a36Sopenharmony_ci|
13262306a36Sopenharmony_ciPE_START_TERMS  start_terms
13362306a36Sopenharmony_ci
13462306a36Sopenharmony_cistart_events: groups
13562306a36Sopenharmony_ci{
13662306a36Sopenharmony_ci	struct parse_events_state *parse_state = _parse_state;
13762306a36Sopenharmony_ci
13862306a36Sopenharmony_ci	/* frees $1 */
13962306a36Sopenharmony_ci	parse_events_update_lists($1, &parse_state->list);
14062306a36Sopenharmony_ci}
14162306a36Sopenharmony_ci
14262306a36Sopenharmony_cigroups:
14362306a36Sopenharmony_cigroups ',' group
14462306a36Sopenharmony_ci{
14562306a36Sopenharmony_ci	struct list_head *list  = $1;
14662306a36Sopenharmony_ci	struct list_head *group = $3;
14762306a36Sopenharmony_ci
14862306a36Sopenharmony_ci	/* frees $3 */
14962306a36Sopenharmony_ci	parse_events_update_lists(group, list);
15062306a36Sopenharmony_ci	$$ = list;
15162306a36Sopenharmony_ci}
15262306a36Sopenharmony_ci|
15362306a36Sopenharmony_cigroups ',' event
15462306a36Sopenharmony_ci{
15562306a36Sopenharmony_ci	struct list_head *list  = $1;
15662306a36Sopenharmony_ci	struct list_head *event = $3;
15762306a36Sopenharmony_ci
15862306a36Sopenharmony_ci	/* frees $3 */
15962306a36Sopenharmony_ci	parse_events_update_lists(event, list);
16062306a36Sopenharmony_ci	$$ = list;
16162306a36Sopenharmony_ci}
16262306a36Sopenharmony_ci|
16362306a36Sopenharmony_cigroup
16462306a36Sopenharmony_ci|
16562306a36Sopenharmony_cievent
16662306a36Sopenharmony_ci
16762306a36Sopenharmony_cigroup:
16862306a36Sopenharmony_cigroup_def ':' PE_MODIFIER_EVENT
16962306a36Sopenharmony_ci{
17062306a36Sopenharmony_ci	struct list_head *list = $1;
17162306a36Sopenharmony_ci	int err;
17262306a36Sopenharmony_ci
17362306a36Sopenharmony_ci	err = parse_events__modifier_group(list, $3);
17462306a36Sopenharmony_ci	free($3);
17562306a36Sopenharmony_ci	if (err) {
17662306a36Sopenharmony_ci		struct parse_events_state *parse_state = _parse_state;
17762306a36Sopenharmony_ci		struct parse_events_error *error = parse_state->error;
17862306a36Sopenharmony_ci
17962306a36Sopenharmony_ci		parse_events_error__handle(error, @3.first_column,
18062306a36Sopenharmony_ci					   strdup("Bad modifier"), NULL);
18162306a36Sopenharmony_ci		free_list_evsel(list);
18262306a36Sopenharmony_ci		YYABORT;
18362306a36Sopenharmony_ci	}
18462306a36Sopenharmony_ci	$$ = list;
18562306a36Sopenharmony_ci}
18662306a36Sopenharmony_ci|
18762306a36Sopenharmony_cigroup_def
18862306a36Sopenharmony_ci
18962306a36Sopenharmony_cigroup_def:
19062306a36Sopenharmony_ciPE_NAME '{' events '}'
19162306a36Sopenharmony_ci{
19262306a36Sopenharmony_ci	struct list_head *list = $3;
19362306a36Sopenharmony_ci
19462306a36Sopenharmony_ci	/* Takes ownership of $1. */
19562306a36Sopenharmony_ci	parse_events__set_leader($1, list);
19662306a36Sopenharmony_ci	$$ = list;
19762306a36Sopenharmony_ci}
19862306a36Sopenharmony_ci|
19962306a36Sopenharmony_ci'{' events '}'
20062306a36Sopenharmony_ci{
20162306a36Sopenharmony_ci	struct list_head *list = $2;
20262306a36Sopenharmony_ci
20362306a36Sopenharmony_ci	parse_events__set_leader(NULL, list);
20462306a36Sopenharmony_ci	$$ = list;
20562306a36Sopenharmony_ci}
20662306a36Sopenharmony_ci
20762306a36Sopenharmony_cievents:
20862306a36Sopenharmony_cievents ',' event
20962306a36Sopenharmony_ci{
21062306a36Sopenharmony_ci	struct list_head *event = $3;
21162306a36Sopenharmony_ci	struct list_head *list  = $1;
21262306a36Sopenharmony_ci
21362306a36Sopenharmony_ci	/* frees $3 */
21462306a36Sopenharmony_ci	parse_events_update_lists(event, list);
21562306a36Sopenharmony_ci	$$ = list;
21662306a36Sopenharmony_ci}
21762306a36Sopenharmony_ci|
21862306a36Sopenharmony_cievent
21962306a36Sopenharmony_ci
22062306a36Sopenharmony_cievent: event_mod
22162306a36Sopenharmony_ci
22262306a36Sopenharmony_cievent_mod:
22362306a36Sopenharmony_cievent_name PE_MODIFIER_EVENT
22462306a36Sopenharmony_ci{
22562306a36Sopenharmony_ci	struct list_head *list = $1;
22662306a36Sopenharmony_ci	int err;
22762306a36Sopenharmony_ci
22862306a36Sopenharmony_ci	/*
22962306a36Sopenharmony_ci	 * Apply modifier on all events added by single event definition
23062306a36Sopenharmony_ci	 * (there could be more events added for multiple tracepoint
23162306a36Sopenharmony_ci	 * definitions via '*?'.
23262306a36Sopenharmony_ci	 */
23362306a36Sopenharmony_ci	err = parse_events__modifier_event(list, $2, false);
23462306a36Sopenharmony_ci	free($2);
23562306a36Sopenharmony_ci	if (err) {
23662306a36Sopenharmony_ci		struct parse_events_state *parse_state = _parse_state;
23762306a36Sopenharmony_ci		struct parse_events_error *error = parse_state->error;
23862306a36Sopenharmony_ci
23962306a36Sopenharmony_ci		parse_events_error__handle(error, @2.first_column,
24062306a36Sopenharmony_ci					   strdup("Bad modifier"), NULL);
24162306a36Sopenharmony_ci		free_list_evsel(list);
24262306a36Sopenharmony_ci		YYABORT;
24362306a36Sopenharmony_ci	}
24462306a36Sopenharmony_ci	$$ = list;
24562306a36Sopenharmony_ci}
24662306a36Sopenharmony_ci|
24762306a36Sopenharmony_cievent_name
24862306a36Sopenharmony_ci
24962306a36Sopenharmony_cievent_name:
25062306a36Sopenharmony_ciPE_EVENT_NAME event_def
25162306a36Sopenharmony_ci{
25262306a36Sopenharmony_ci	int err;
25362306a36Sopenharmony_ci
25462306a36Sopenharmony_ci	err = parse_events_name($2, $1);
25562306a36Sopenharmony_ci	free($1);
25662306a36Sopenharmony_ci	if (err) {
25762306a36Sopenharmony_ci		free_list_evsel($2);
25862306a36Sopenharmony_ci		YYNOMEM;
25962306a36Sopenharmony_ci	}
26062306a36Sopenharmony_ci	$$ = $2;
26162306a36Sopenharmony_ci}
26262306a36Sopenharmony_ci|
26362306a36Sopenharmony_cievent_def
26462306a36Sopenharmony_ci
26562306a36Sopenharmony_cievent_def: event_pmu |
26662306a36Sopenharmony_ci	   event_legacy_symbol |
26762306a36Sopenharmony_ci	   event_legacy_cache sep_dc |
26862306a36Sopenharmony_ci	   event_legacy_mem sep_dc |
26962306a36Sopenharmony_ci	   event_legacy_tracepoint sep_dc |
27062306a36Sopenharmony_ci	   event_legacy_numeric sep_dc |
27162306a36Sopenharmony_ci	   event_legacy_raw sep_dc
27262306a36Sopenharmony_ci
27362306a36Sopenharmony_cievent_pmu:
27462306a36Sopenharmony_ciPE_NAME opt_pmu_config
27562306a36Sopenharmony_ci{
27662306a36Sopenharmony_ci	struct parse_events_state *parse_state = _parse_state;
27762306a36Sopenharmony_ci	struct list_head *list = NULL, *orig_terms = NULL, *terms= NULL;
27862306a36Sopenharmony_ci	char *pattern = NULL;
27962306a36Sopenharmony_ci
28062306a36Sopenharmony_ci#define CLEANUP						\
28162306a36Sopenharmony_ci	do {						\
28262306a36Sopenharmony_ci		parse_events_terms__delete($2);		\
28362306a36Sopenharmony_ci		parse_events_terms__delete(orig_terms);	\
28462306a36Sopenharmony_ci		free(list);				\
28562306a36Sopenharmony_ci		free($1);				\
28662306a36Sopenharmony_ci		free(pattern);				\
28762306a36Sopenharmony_ci	} while(0)
28862306a36Sopenharmony_ci
28962306a36Sopenharmony_ci	if (parse_events_copy_term_list($2, &orig_terms)) {
29062306a36Sopenharmony_ci		CLEANUP;
29162306a36Sopenharmony_ci		YYNOMEM;
29262306a36Sopenharmony_ci	}
29362306a36Sopenharmony_ci
29462306a36Sopenharmony_ci	list = alloc_list();
29562306a36Sopenharmony_ci	if (!list) {
29662306a36Sopenharmony_ci		CLEANUP;
29762306a36Sopenharmony_ci		YYNOMEM;
29862306a36Sopenharmony_ci	}
29962306a36Sopenharmony_ci	/* Attempt to add to list assuming $1 is a PMU name. */
30062306a36Sopenharmony_ci	if (parse_events_add_pmu(parse_state, list, $1, $2, /*auto_merge_stats=*/false, &@1)) {
30162306a36Sopenharmony_ci		struct perf_pmu *pmu = NULL;
30262306a36Sopenharmony_ci		int ok = 0;
30362306a36Sopenharmony_ci
30462306a36Sopenharmony_ci		/* Failure to add, try wildcard expansion of $1 as a PMU name. */
30562306a36Sopenharmony_ci		if (asprintf(&pattern, "%s*", $1) < 0) {
30662306a36Sopenharmony_ci			CLEANUP;
30762306a36Sopenharmony_ci			YYNOMEM;
30862306a36Sopenharmony_ci		}
30962306a36Sopenharmony_ci
31062306a36Sopenharmony_ci		while ((pmu = perf_pmus__scan(pmu)) != NULL) {
31162306a36Sopenharmony_ci			const char *name = pmu->name;
31262306a36Sopenharmony_ci
31362306a36Sopenharmony_ci			if (parse_events__filter_pmu(parse_state, pmu))
31462306a36Sopenharmony_ci				continue;
31562306a36Sopenharmony_ci
31662306a36Sopenharmony_ci			if (!strncmp(name, "uncore_", 7) &&
31762306a36Sopenharmony_ci			    strncmp($1, "uncore_", 7))
31862306a36Sopenharmony_ci				name += 7;
31962306a36Sopenharmony_ci			if (!perf_pmu__match(pattern, name, $1) ||
32062306a36Sopenharmony_ci			    !perf_pmu__match(pattern, pmu->alias_name, $1)) {
32162306a36Sopenharmony_ci				bool auto_merge_stats = perf_pmu__auto_merge_stats(pmu);
32262306a36Sopenharmony_ci
32362306a36Sopenharmony_ci				if (parse_events_copy_term_list(orig_terms, &terms)) {
32462306a36Sopenharmony_ci					CLEANUP;
32562306a36Sopenharmony_ci					YYNOMEM;
32662306a36Sopenharmony_ci				}
32762306a36Sopenharmony_ci				if (!parse_events_add_pmu(parse_state, list, pmu->name, terms,
32862306a36Sopenharmony_ci							  auto_merge_stats, &@1)) {
32962306a36Sopenharmony_ci					ok++;
33062306a36Sopenharmony_ci					parse_state->wild_card_pmus = true;
33162306a36Sopenharmony_ci				}
33262306a36Sopenharmony_ci				parse_events_terms__delete(terms);
33362306a36Sopenharmony_ci			}
33462306a36Sopenharmony_ci		}
33562306a36Sopenharmony_ci
33662306a36Sopenharmony_ci		if (!ok) {
33762306a36Sopenharmony_ci			/* Failure to add, assume $1 is an event name. */
33862306a36Sopenharmony_ci			zfree(&list);
33962306a36Sopenharmony_ci			ok = !parse_events_multi_pmu_add(parse_state, $1, $2, &list, &@1);
34062306a36Sopenharmony_ci			$2 = NULL;
34162306a36Sopenharmony_ci		}
34262306a36Sopenharmony_ci		if (!ok) {
34362306a36Sopenharmony_ci			struct parse_events_error *error = parse_state->error;
34462306a36Sopenharmony_ci			char *help;
34562306a36Sopenharmony_ci
34662306a36Sopenharmony_ci			if (asprintf(&help, "Unable to find PMU or event on a PMU of '%s'", $1) < 0)
34762306a36Sopenharmony_ci				help = NULL;
34862306a36Sopenharmony_ci			parse_events_error__handle(error, @1.first_column,
34962306a36Sopenharmony_ci						   strdup("Bad event or PMU"),
35062306a36Sopenharmony_ci						   help);
35162306a36Sopenharmony_ci			CLEANUP;
35262306a36Sopenharmony_ci			YYABORT;
35362306a36Sopenharmony_ci		}
35462306a36Sopenharmony_ci	}
35562306a36Sopenharmony_ci	$$ = list;
35662306a36Sopenharmony_ci	list = NULL;
35762306a36Sopenharmony_ci	CLEANUP;
35862306a36Sopenharmony_ci#undef CLEANUP
35962306a36Sopenharmony_ci}
36062306a36Sopenharmony_ci|
36162306a36Sopenharmony_ciPE_NAME sep_dc
36262306a36Sopenharmony_ci{
36362306a36Sopenharmony_ci	struct list_head *list;
36462306a36Sopenharmony_ci	int err;
36562306a36Sopenharmony_ci
36662306a36Sopenharmony_ci	err = parse_events_multi_pmu_add(_parse_state, $1, NULL, &list, &@1);
36762306a36Sopenharmony_ci	if (err < 0) {
36862306a36Sopenharmony_ci		struct parse_events_state *parse_state = _parse_state;
36962306a36Sopenharmony_ci		struct parse_events_error *error = parse_state->error;
37062306a36Sopenharmony_ci		char *help;
37162306a36Sopenharmony_ci
37262306a36Sopenharmony_ci		if (asprintf(&help, "Unable to find event on a PMU of '%s'", $1) < 0)
37362306a36Sopenharmony_ci			help = NULL;
37462306a36Sopenharmony_ci		parse_events_error__handle(error, @1.first_column, strdup("Bad event name"), help);
37562306a36Sopenharmony_ci		free($1);
37662306a36Sopenharmony_ci		PE_ABORT(err);
37762306a36Sopenharmony_ci	}
37862306a36Sopenharmony_ci	free($1);
37962306a36Sopenharmony_ci	$$ = list;
38062306a36Sopenharmony_ci}
38162306a36Sopenharmony_ci
38262306a36Sopenharmony_civalue_sym:
38362306a36Sopenharmony_ciPE_VALUE_SYM_HW
38462306a36Sopenharmony_ci|
38562306a36Sopenharmony_ciPE_VALUE_SYM_SW
38662306a36Sopenharmony_ci
38762306a36Sopenharmony_cievent_legacy_symbol:
38862306a36Sopenharmony_civalue_sym '/' event_config '/'
38962306a36Sopenharmony_ci{
39062306a36Sopenharmony_ci	struct list_head *list;
39162306a36Sopenharmony_ci	int type = $1 >> 16;
39262306a36Sopenharmony_ci	int config = $1 & 255;
39362306a36Sopenharmony_ci	int err;
39462306a36Sopenharmony_ci	bool wildcard = (type == PERF_TYPE_HARDWARE || type == PERF_TYPE_HW_CACHE);
39562306a36Sopenharmony_ci
39662306a36Sopenharmony_ci	list = alloc_list();
39762306a36Sopenharmony_ci	if (!list)
39862306a36Sopenharmony_ci		YYNOMEM;
39962306a36Sopenharmony_ci	err = parse_events_add_numeric(_parse_state, list, type, config, $3, wildcard);
40062306a36Sopenharmony_ci	parse_events_terms__delete($3);
40162306a36Sopenharmony_ci	if (err) {
40262306a36Sopenharmony_ci		free_list_evsel(list);
40362306a36Sopenharmony_ci		PE_ABORT(err);
40462306a36Sopenharmony_ci	}
40562306a36Sopenharmony_ci	$$ = list;
40662306a36Sopenharmony_ci}
40762306a36Sopenharmony_ci|
40862306a36Sopenharmony_civalue_sym sep_slash_slash_dc
40962306a36Sopenharmony_ci{
41062306a36Sopenharmony_ci	struct list_head *list;
41162306a36Sopenharmony_ci	int type = $1 >> 16;
41262306a36Sopenharmony_ci	int config = $1 & 255;
41362306a36Sopenharmony_ci	bool wildcard = (type == PERF_TYPE_HARDWARE || type == PERF_TYPE_HW_CACHE);
41462306a36Sopenharmony_ci	int err;
41562306a36Sopenharmony_ci
41662306a36Sopenharmony_ci	list = alloc_list();
41762306a36Sopenharmony_ci	if (!list)
41862306a36Sopenharmony_ci		YYNOMEM;
41962306a36Sopenharmony_ci	err = parse_events_add_numeric(_parse_state, list, type, config, /*head_config=*/NULL, wildcard);
42062306a36Sopenharmony_ci	if (err)
42162306a36Sopenharmony_ci		PE_ABORT(err);
42262306a36Sopenharmony_ci	$$ = list;
42362306a36Sopenharmony_ci}
42462306a36Sopenharmony_ci|
42562306a36Sopenharmony_ciPE_VALUE_SYM_TOOL sep_slash_slash_dc
42662306a36Sopenharmony_ci{
42762306a36Sopenharmony_ci	struct list_head *list;
42862306a36Sopenharmony_ci	int err;
42962306a36Sopenharmony_ci
43062306a36Sopenharmony_ci	list = alloc_list();
43162306a36Sopenharmony_ci	if (!list)
43262306a36Sopenharmony_ci		YYNOMEM;
43362306a36Sopenharmony_ci	err = parse_events_add_tool(_parse_state, list, $1);
43462306a36Sopenharmony_ci	if (err)
43562306a36Sopenharmony_ci		YYNOMEM;
43662306a36Sopenharmony_ci	$$ = list;
43762306a36Sopenharmony_ci}
43862306a36Sopenharmony_ci
43962306a36Sopenharmony_cievent_legacy_cache:
44062306a36Sopenharmony_ciPE_LEGACY_CACHE opt_event_config
44162306a36Sopenharmony_ci{
44262306a36Sopenharmony_ci	struct parse_events_state *parse_state = _parse_state;
44362306a36Sopenharmony_ci	struct list_head *list;
44462306a36Sopenharmony_ci	int err;
44562306a36Sopenharmony_ci
44662306a36Sopenharmony_ci	list = alloc_list();
44762306a36Sopenharmony_ci	if (!list)
44862306a36Sopenharmony_ci		YYNOMEM;
44962306a36Sopenharmony_ci
45062306a36Sopenharmony_ci	err = parse_events_add_cache(list, &parse_state->idx, $1, parse_state, $2);
45162306a36Sopenharmony_ci
45262306a36Sopenharmony_ci	parse_events_terms__delete($2);
45362306a36Sopenharmony_ci	free($1);
45462306a36Sopenharmony_ci	if (err) {
45562306a36Sopenharmony_ci		free_list_evsel(list);
45662306a36Sopenharmony_ci		PE_ABORT(err);
45762306a36Sopenharmony_ci	}
45862306a36Sopenharmony_ci	$$ = list;
45962306a36Sopenharmony_ci}
46062306a36Sopenharmony_ci
46162306a36Sopenharmony_cievent_legacy_mem:
46262306a36Sopenharmony_ciPE_PREFIX_MEM PE_VALUE PE_BP_SLASH PE_VALUE PE_BP_COLON PE_MODIFIER_BP opt_event_config
46362306a36Sopenharmony_ci{
46462306a36Sopenharmony_ci	struct list_head *list;
46562306a36Sopenharmony_ci	int err;
46662306a36Sopenharmony_ci
46762306a36Sopenharmony_ci	list = alloc_list();
46862306a36Sopenharmony_ci	if (!list)
46962306a36Sopenharmony_ci		YYNOMEM;
47062306a36Sopenharmony_ci
47162306a36Sopenharmony_ci	err = parse_events_add_breakpoint(_parse_state, list,
47262306a36Sopenharmony_ci					  $2, $6, $4, $7);
47362306a36Sopenharmony_ci	parse_events_terms__delete($7);
47462306a36Sopenharmony_ci	free($6);
47562306a36Sopenharmony_ci	if (err) {
47662306a36Sopenharmony_ci		free(list);
47762306a36Sopenharmony_ci		PE_ABORT(err);
47862306a36Sopenharmony_ci	}
47962306a36Sopenharmony_ci	$$ = list;
48062306a36Sopenharmony_ci}
48162306a36Sopenharmony_ci|
48262306a36Sopenharmony_ciPE_PREFIX_MEM PE_VALUE PE_BP_SLASH PE_VALUE opt_event_config
48362306a36Sopenharmony_ci{
48462306a36Sopenharmony_ci	struct list_head *list;
48562306a36Sopenharmony_ci	int err;
48662306a36Sopenharmony_ci
48762306a36Sopenharmony_ci	list = alloc_list();
48862306a36Sopenharmony_ci	if (!list)
48962306a36Sopenharmony_ci		YYNOMEM;
49062306a36Sopenharmony_ci
49162306a36Sopenharmony_ci	err = parse_events_add_breakpoint(_parse_state, list,
49262306a36Sopenharmony_ci					  $2, NULL, $4, $5);
49362306a36Sopenharmony_ci	parse_events_terms__delete($5);
49462306a36Sopenharmony_ci	if (err) {
49562306a36Sopenharmony_ci		free(list);
49662306a36Sopenharmony_ci		PE_ABORT(err);
49762306a36Sopenharmony_ci	}
49862306a36Sopenharmony_ci	$$ = list;
49962306a36Sopenharmony_ci}
50062306a36Sopenharmony_ci|
50162306a36Sopenharmony_ciPE_PREFIX_MEM PE_VALUE PE_BP_COLON PE_MODIFIER_BP opt_event_config
50262306a36Sopenharmony_ci{
50362306a36Sopenharmony_ci	struct list_head *list;
50462306a36Sopenharmony_ci	int err;
50562306a36Sopenharmony_ci
50662306a36Sopenharmony_ci	list = alloc_list();
50762306a36Sopenharmony_ci	if (!list)
50862306a36Sopenharmony_ci		YYNOMEM;
50962306a36Sopenharmony_ci
51062306a36Sopenharmony_ci	err = parse_events_add_breakpoint(_parse_state, list,
51162306a36Sopenharmony_ci					  $2, $4, 0, $5);
51262306a36Sopenharmony_ci	parse_events_terms__delete($5);
51362306a36Sopenharmony_ci	free($4);
51462306a36Sopenharmony_ci	if (err) {
51562306a36Sopenharmony_ci		free(list);
51662306a36Sopenharmony_ci		PE_ABORT(err);
51762306a36Sopenharmony_ci	}
51862306a36Sopenharmony_ci	$$ = list;
51962306a36Sopenharmony_ci}
52062306a36Sopenharmony_ci|
52162306a36Sopenharmony_ciPE_PREFIX_MEM PE_VALUE opt_event_config
52262306a36Sopenharmony_ci{
52362306a36Sopenharmony_ci	struct list_head *list;
52462306a36Sopenharmony_ci	int err;
52562306a36Sopenharmony_ci
52662306a36Sopenharmony_ci	list = alloc_list();
52762306a36Sopenharmony_ci	if (!list)
52862306a36Sopenharmony_ci		YYNOMEM;
52962306a36Sopenharmony_ci	err = parse_events_add_breakpoint(_parse_state, list,
53062306a36Sopenharmony_ci					  $2, NULL, 0, $3);
53162306a36Sopenharmony_ci	parse_events_terms__delete($3);
53262306a36Sopenharmony_ci	if (err) {
53362306a36Sopenharmony_ci		free(list);
53462306a36Sopenharmony_ci		PE_ABORT(err);
53562306a36Sopenharmony_ci	}
53662306a36Sopenharmony_ci	$$ = list;
53762306a36Sopenharmony_ci}
53862306a36Sopenharmony_ci
53962306a36Sopenharmony_cievent_legacy_tracepoint:
54062306a36Sopenharmony_citracepoint_name opt_event_config
54162306a36Sopenharmony_ci{
54262306a36Sopenharmony_ci	struct parse_events_state *parse_state = _parse_state;
54362306a36Sopenharmony_ci	struct parse_events_error *error = parse_state->error;
54462306a36Sopenharmony_ci	struct list_head *list;
54562306a36Sopenharmony_ci	int err;
54662306a36Sopenharmony_ci
54762306a36Sopenharmony_ci	list = alloc_list();
54862306a36Sopenharmony_ci	if (!list)
54962306a36Sopenharmony_ci		YYNOMEM;
55062306a36Sopenharmony_ci	if (error)
55162306a36Sopenharmony_ci		error->idx = @1.first_column;
55262306a36Sopenharmony_ci
55362306a36Sopenharmony_ci	err = parse_events_add_tracepoint(list, &parse_state->idx, $1.sys, $1.event,
55462306a36Sopenharmony_ci					error, $2, &@1);
55562306a36Sopenharmony_ci
55662306a36Sopenharmony_ci	parse_events_terms__delete($2);
55762306a36Sopenharmony_ci	free($1.sys);
55862306a36Sopenharmony_ci	free($1.event);
55962306a36Sopenharmony_ci	if (err) {
56062306a36Sopenharmony_ci		free(list);
56162306a36Sopenharmony_ci		PE_ABORT(err);
56262306a36Sopenharmony_ci	}
56362306a36Sopenharmony_ci	$$ = list;
56462306a36Sopenharmony_ci}
56562306a36Sopenharmony_ci
56662306a36Sopenharmony_citracepoint_name:
56762306a36Sopenharmony_ciPE_NAME ':' PE_NAME
56862306a36Sopenharmony_ci{
56962306a36Sopenharmony_ci	struct tracepoint_name tracepoint = {$1, $3};
57062306a36Sopenharmony_ci
57162306a36Sopenharmony_ci	$$ = tracepoint;
57262306a36Sopenharmony_ci}
57362306a36Sopenharmony_ci
57462306a36Sopenharmony_cievent_legacy_numeric:
57562306a36Sopenharmony_ciPE_VALUE ':' PE_VALUE opt_event_config
57662306a36Sopenharmony_ci{
57762306a36Sopenharmony_ci	struct list_head *list;
57862306a36Sopenharmony_ci	int err;
57962306a36Sopenharmony_ci
58062306a36Sopenharmony_ci	list = alloc_list();
58162306a36Sopenharmony_ci	if (!list)
58262306a36Sopenharmony_ci		YYNOMEM;
58362306a36Sopenharmony_ci	err = parse_events_add_numeric(_parse_state, list, (u32)$1, $3, $4,
58462306a36Sopenharmony_ci				       /*wildcard=*/false);
58562306a36Sopenharmony_ci	parse_events_terms__delete($4);
58662306a36Sopenharmony_ci	if (err) {
58762306a36Sopenharmony_ci		free(list);
58862306a36Sopenharmony_ci		PE_ABORT(err);
58962306a36Sopenharmony_ci	}
59062306a36Sopenharmony_ci	$$ = list;
59162306a36Sopenharmony_ci}
59262306a36Sopenharmony_ci
59362306a36Sopenharmony_cievent_legacy_raw:
59462306a36Sopenharmony_ciPE_RAW opt_event_config
59562306a36Sopenharmony_ci{
59662306a36Sopenharmony_ci	struct list_head *list;
59762306a36Sopenharmony_ci	int err;
59862306a36Sopenharmony_ci	u64 num;
59962306a36Sopenharmony_ci
60062306a36Sopenharmony_ci	list = alloc_list();
60162306a36Sopenharmony_ci	if (!list)
60262306a36Sopenharmony_ci		YYNOMEM;
60362306a36Sopenharmony_ci	errno = 0;
60462306a36Sopenharmony_ci	num = strtoull($1 + 1, NULL, 16);
60562306a36Sopenharmony_ci	/* Given the lexer will only give [a-fA-F0-9]+ a failure here should be impossible. */
60662306a36Sopenharmony_ci	if (errno)
60762306a36Sopenharmony_ci		YYABORT;
60862306a36Sopenharmony_ci	free($1);
60962306a36Sopenharmony_ci	err = parse_events_add_numeric(_parse_state, list, PERF_TYPE_RAW, num, $2,
61062306a36Sopenharmony_ci				       /*wildcard=*/false);
61162306a36Sopenharmony_ci	parse_events_terms__delete($2);
61262306a36Sopenharmony_ci	if (err) {
61362306a36Sopenharmony_ci		free(list);
61462306a36Sopenharmony_ci		PE_ABORT(err);
61562306a36Sopenharmony_ci	}
61662306a36Sopenharmony_ci	$$ = list;
61762306a36Sopenharmony_ci}
61862306a36Sopenharmony_ci
61962306a36Sopenharmony_ciopt_event_config:
62062306a36Sopenharmony_ci'/' event_config '/'
62162306a36Sopenharmony_ci{
62262306a36Sopenharmony_ci	$$ = $2;
62362306a36Sopenharmony_ci}
62462306a36Sopenharmony_ci|
62562306a36Sopenharmony_ci'/' '/'
62662306a36Sopenharmony_ci{
62762306a36Sopenharmony_ci	$$ = NULL;
62862306a36Sopenharmony_ci}
62962306a36Sopenharmony_ci|
63062306a36Sopenharmony_ci{
63162306a36Sopenharmony_ci	$$ = NULL;
63262306a36Sopenharmony_ci}
63362306a36Sopenharmony_ci
63462306a36Sopenharmony_ciopt_pmu_config:
63562306a36Sopenharmony_ci'/' event_config '/'
63662306a36Sopenharmony_ci{
63762306a36Sopenharmony_ci	$$ = $2;
63862306a36Sopenharmony_ci}
63962306a36Sopenharmony_ci|
64062306a36Sopenharmony_ci'/' '/'
64162306a36Sopenharmony_ci{
64262306a36Sopenharmony_ci	$$ = NULL;
64362306a36Sopenharmony_ci}
64462306a36Sopenharmony_ci
64562306a36Sopenharmony_cistart_terms: event_config
64662306a36Sopenharmony_ci{
64762306a36Sopenharmony_ci	struct parse_events_state *parse_state = _parse_state;
64862306a36Sopenharmony_ci	if (parse_state->terms) {
64962306a36Sopenharmony_ci		parse_events_terms__delete ($1);
65062306a36Sopenharmony_ci		YYABORT;
65162306a36Sopenharmony_ci	}
65262306a36Sopenharmony_ci	parse_state->terms = $1;
65362306a36Sopenharmony_ci}
65462306a36Sopenharmony_ci
65562306a36Sopenharmony_cievent_config:
65662306a36Sopenharmony_cievent_config ',' event_term
65762306a36Sopenharmony_ci{
65862306a36Sopenharmony_ci	struct list_head *head = $1;
65962306a36Sopenharmony_ci	struct parse_events_term *term = $3;
66062306a36Sopenharmony_ci
66162306a36Sopenharmony_ci	if (!head) {
66262306a36Sopenharmony_ci		parse_events_term__delete(term);
66362306a36Sopenharmony_ci		YYABORT;
66462306a36Sopenharmony_ci	}
66562306a36Sopenharmony_ci	list_add_tail(&term->list, head);
66662306a36Sopenharmony_ci	$$ = $1;
66762306a36Sopenharmony_ci}
66862306a36Sopenharmony_ci|
66962306a36Sopenharmony_cievent_term
67062306a36Sopenharmony_ci{
67162306a36Sopenharmony_ci	struct list_head *head = malloc(sizeof(*head));
67262306a36Sopenharmony_ci	struct parse_events_term *term = $1;
67362306a36Sopenharmony_ci
67462306a36Sopenharmony_ci	if (!head)
67562306a36Sopenharmony_ci		YYNOMEM;
67662306a36Sopenharmony_ci	INIT_LIST_HEAD(head);
67762306a36Sopenharmony_ci	list_add_tail(&term->list, head);
67862306a36Sopenharmony_ci	$$ = head;
67962306a36Sopenharmony_ci}
68062306a36Sopenharmony_ci
68162306a36Sopenharmony_ciname_or_raw: PE_RAW | PE_NAME | PE_LEGACY_CACHE
68262306a36Sopenharmony_ci
68362306a36Sopenharmony_cievent_term:
68462306a36Sopenharmony_ciPE_RAW
68562306a36Sopenharmony_ci{
68662306a36Sopenharmony_ci	struct parse_events_term *term;
68762306a36Sopenharmony_ci	int err = parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_RAW,
68862306a36Sopenharmony_ci					 strdup("raw"), $1, &@1, &@1);
68962306a36Sopenharmony_ci
69062306a36Sopenharmony_ci	if (err) {
69162306a36Sopenharmony_ci		free($1);
69262306a36Sopenharmony_ci		PE_ABORT(err);
69362306a36Sopenharmony_ci	}
69462306a36Sopenharmony_ci	$$ = term;
69562306a36Sopenharmony_ci}
69662306a36Sopenharmony_ci|
69762306a36Sopenharmony_ciname_or_raw '=' name_or_raw
69862306a36Sopenharmony_ci{
69962306a36Sopenharmony_ci	struct parse_events_term *term;
70062306a36Sopenharmony_ci	int err = parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_USER, $1, $3, &@1, &@3);
70162306a36Sopenharmony_ci
70262306a36Sopenharmony_ci	if (err) {
70362306a36Sopenharmony_ci		free($1);
70462306a36Sopenharmony_ci		free($3);
70562306a36Sopenharmony_ci		PE_ABORT(err);
70662306a36Sopenharmony_ci	}
70762306a36Sopenharmony_ci	$$ = term;
70862306a36Sopenharmony_ci}
70962306a36Sopenharmony_ci|
71062306a36Sopenharmony_ciname_or_raw '=' PE_VALUE
71162306a36Sopenharmony_ci{
71262306a36Sopenharmony_ci	struct parse_events_term *term;
71362306a36Sopenharmony_ci	int err = parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
71462306a36Sopenharmony_ci					 $1, $3, /*novalue=*/false, &@1, &@3);
71562306a36Sopenharmony_ci
71662306a36Sopenharmony_ci	if (err) {
71762306a36Sopenharmony_ci		free($1);
71862306a36Sopenharmony_ci		PE_ABORT(err);
71962306a36Sopenharmony_ci	}
72062306a36Sopenharmony_ci	$$ = term;
72162306a36Sopenharmony_ci}
72262306a36Sopenharmony_ci|
72362306a36Sopenharmony_ciname_or_raw '=' PE_TERM_HW
72462306a36Sopenharmony_ci{
72562306a36Sopenharmony_ci	struct parse_events_term *term;
72662306a36Sopenharmony_ci	int err = parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_USER,
72762306a36Sopenharmony_ci					 $1, $3.str, &@1, &@3);
72862306a36Sopenharmony_ci
72962306a36Sopenharmony_ci	if (err) {
73062306a36Sopenharmony_ci		free($1);
73162306a36Sopenharmony_ci		free($3.str);
73262306a36Sopenharmony_ci		PE_ABORT(err);
73362306a36Sopenharmony_ci	}
73462306a36Sopenharmony_ci	$$ = term;
73562306a36Sopenharmony_ci}
73662306a36Sopenharmony_ci|
73762306a36Sopenharmony_ciPE_LEGACY_CACHE
73862306a36Sopenharmony_ci{
73962306a36Sopenharmony_ci	struct parse_events_term *term;
74062306a36Sopenharmony_ci	int err = parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE,
74162306a36Sopenharmony_ci					 $1, /*num=*/1, /*novalue=*/true, &@1, /*loc_val=*/NULL);
74262306a36Sopenharmony_ci
74362306a36Sopenharmony_ci	if (err) {
74462306a36Sopenharmony_ci		free($1);
74562306a36Sopenharmony_ci		PE_ABORT(err);
74662306a36Sopenharmony_ci	}
74762306a36Sopenharmony_ci	$$ = term;
74862306a36Sopenharmony_ci}
74962306a36Sopenharmony_ci|
75062306a36Sopenharmony_ciPE_NAME
75162306a36Sopenharmony_ci{
75262306a36Sopenharmony_ci	struct parse_events_term *term;
75362306a36Sopenharmony_ci	int err = parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
75462306a36Sopenharmony_ci					 $1, /*num=*/1, /*novalue=*/true, &@1, /*loc_val=*/NULL);
75562306a36Sopenharmony_ci
75662306a36Sopenharmony_ci	if (err) {
75762306a36Sopenharmony_ci		free($1);
75862306a36Sopenharmony_ci		PE_ABORT(err);
75962306a36Sopenharmony_ci	}
76062306a36Sopenharmony_ci	$$ = term;
76162306a36Sopenharmony_ci}
76262306a36Sopenharmony_ci|
76362306a36Sopenharmony_ciPE_TERM_HW
76462306a36Sopenharmony_ci{
76562306a36Sopenharmony_ci	struct parse_events_term *term;
76662306a36Sopenharmony_ci	int err = parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_HARDWARE,
76762306a36Sopenharmony_ci					 $1.str, $1.num & 255, /*novalue=*/false,
76862306a36Sopenharmony_ci					 &@1, /*loc_val=*/NULL);
76962306a36Sopenharmony_ci
77062306a36Sopenharmony_ci	if (err) {
77162306a36Sopenharmony_ci		free($1.str);
77262306a36Sopenharmony_ci		PE_ABORT(err);
77362306a36Sopenharmony_ci	}
77462306a36Sopenharmony_ci	$$ = term;
77562306a36Sopenharmony_ci}
77662306a36Sopenharmony_ci|
77762306a36Sopenharmony_ciPE_TERM '=' name_or_raw
77862306a36Sopenharmony_ci{
77962306a36Sopenharmony_ci	struct parse_events_term *term;
78062306a36Sopenharmony_ci	int err = parse_events_term__str(&term, (enum parse_events__term_type)$1,
78162306a36Sopenharmony_ci					/*config=*/NULL, $3, &@1, &@3);
78262306a36Sopenharmony_ci
78362306a36Sopenharmony_ci	if (err) {
78462306a36Sopenharmony_ci		free($3);
78562306a36Sopenharmony_ci		PE_ABORT(err);
78662306a36Sopenharmony_ci	}
78762306a36Sopenharmony_ci	$$ = term;
78862306a36Sopenharmony_ci}
78962306a36Sopenharmony_ci|
79062306a36Sopenharmony_ciPE_TERM '=' PE_TERM_HW
79162306a36Sopenharmony_ci{
79262306a36Sopenharmony_ci	struct parse_events_term *term;
79362306a36Sopenharmony_ci	int err = parse_events_term__str(&term, (enum parse_events__term_type)$1,
79462306a36Sopenharmony_ci					 /*config=*/NULL, $3.str, &@1, &@3);
79562306a36Sopenharmony_ci
79662306a36Sopenharmony_ci	if (err) {
79762306a36Sopenharmony_ci		free($3.str);
79862306a36Sopenharmony_ci		PE_ABORT(err);
79962306a36Sopenharmony_ci	}
80062306a36Sopenharmony_ci	$$ = term;
80162306a36Sopenharmony_ci}
80262306a36Sopenharmony_ci|
80362306a36Sopenharmony_ciPE_TERM '=' PE_TERM
80462306a36Sopenharmony_ci{
80562306a36Sopenharmony_ci	struct parse_events_term *term;
80662306a36Sopenharmony_ci	int err = parse_events_term__term(&term,
80762306a36Sopenharmony_ci					  (enum parse_events__term_type)$1,
80862306a36Sopenharmony_ci					  (enum parse_events__term_type)$3,
80962306a36Sopenharmony_ci					  &@1, &@3);
81062306a36Sopenharmony_ci
81162306a36Sopenharmony_ci	if (err)
81262306a36Sopenharmony_ci		PE_ABORT(err);
81362306a36Sopenharmony_ci
81462306a36Sopenharmony_ci	$$ = term;
81562306a36Sopenharmony_ci}
81662306a36Sopenharmony_ci|
81762306a36Sopenharmony_ciPE_TERM '=' PE_VALUE
81862306a36Sopenharmony_ci{
81962306a36Sopenharmony_ci	struct parse_events_term *term;
82062306a36Sopenharmony_ci	int err = parse_events_term__num(&term, (enum parse_events__term_type)$1,
82162306a36Sopenharmony_ci					 /*config=*/NULL, $3, /*novalue=*/false, &@1, &@3);
82262306a36Sopenharmony_ci
82362306a36Sopenharmony_ci	if (err)
82462306a36Sopenharmony_ci		PE_ABORT(err);
82562306a36Sopenharmony_ci
82662306a36Sopenharmony_ci	$$ = term;
82762306a36Sopenharmony_ci}
82862306a36Sopenharmony_ci|
82962306a36Sopenharmony_ciPE_TERM
83062306a36Sopenharmony_ci{
83162306a36Sopenharmony_ci	struct parse_events_term *term;
83262306a36Sopenharmony_ci	int err = parse_events_term__num(&term, (enum parse_events__term_type)$1,
83362306a36Sopenharmony_ci					/*config=*/NULL, /*num=*/1, /*novalue=*/true,
83462306a36Sopenharmony_ci					&@1, /*loc_val=*/NULL);
83562306a36Sopenharmony_ci
83662306a36Sopenharmony_ci	if (err)
83762306a36Sopenharmony_ci		PE_ABORT(err);
83862306a36Sopenharmony_ci
83962306a36Sopenharmony_ci	$$ = term;
84062306a36Sopenharmony_ci}
84162306a36Sopenharmony_ci|
84262306a36Sopenharmony_ciPE_DRV_CFG_TERM
84362306a36Sopenharmony_ci{
84462306a36Sopenharmony_ci	struct parse_events_term *term;
84562306a36Sopenharmony_ci	char *config = strdup($1);
84662306a36Sopenharmony_ci	int err;
84762306a36Sopenharmony_ci
84862306a36Sopenharmony_ci	if (!config)
84962306a36Sopenharmony_ci		YYNOMEM;
85062306a36Sopenharmony_ci	err = parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_DRV_CFG, config, $1, &@1, NULL);
85162306a36Sopenharmony_ci	if (err) {
85262306a36Sopenharmony_ci		free($1);
85362306a36Sopenharmony_ci		free(config);
85462306a36Sopenharmony_ci		PE_ABORT(err);
85562306a36Sopenharmony_ci	}
85662306a36Sopenharmony_ci	$$ = term;
85762306a36Sopenharmony_ci}
85862306a36Sopenharmony_ci
85962306a36Sopenharmony_cisep_dc: ':' |
86062306a36Sopenharmony_ci
86162306a36Sopenharmony_cisep_slash_slash_dc: '/' '/' | ':' |
86262306a36Sopenharmony_ci
86362306a36Sopenharmony_ci%%
86462306a36Sopenharmony_ci
86562306a36Sopenharmony_civoid parse_events_error(YYLTYPE *loc, void *parse_state,
86662306a36Sopenharmony_ci			void *scanner __maybe_unused,
86762306a36Sopenharmony_ci			char const *msg __maybe_unused)
86862306a36Sopenharmony_ci{
86962306a36Sopenharmony_ci	parse_events_evlist_error(parse_state, loc->last_column, "parser error");
87062306a36Sopenharmony_ci}
871