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