On Tue, Oct 22, 2019 at 05:53:32PM -0700, Ian Rogers wrote: > Having a YYABORT in a macro makes it hard to free memory for components > of a rule. Separate the logic out. Acked-by: Jiri Olsa <jolsa@xxxxxxxxxx> thanks, jirka > > Signed-off-by: Ian Rogers <irogers@xxxxxxxxxx> > --- > tools/perf/util/parse-events.y | 65 ++++++++++++++++++++++------------ > 1 file changed, 43 insertions(+), 22 deletions(-) > > diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y > index 27d6b187c9b1..26cb65798522 100644 > --- a/tools/perf/util/parse-events.y > +++ b/tools/perf/util/parse-events.y > @@ -25,12 +25,17 @@ do { \ > YYABORT; \ > } while (0) > > -#define ALLOC_LIST(list) \ > -do { \ > - list = malloc(sizeof(*list)); \ > - ABORT_ON(!list); \ > - INIT_LIST_HEAD(list); \ > -} while (0) > +static struct list_head* alloc_list() > +{ > + struct list_head *list; > + > + list = malloc(sizeof(*list)); > + if (!list) > + return NULL; > + > + INIT_LIST_HEAD(list); > + return list; > +} > > static void inc_group_count(struct list_head *list, > struct parse_events_state *parse_state) > @@ -238,7 +243,8 @@ PE_NAME opt_pmu_config > if (error) > error->idx = @1.first_column; > > - ALLOC_LIST(list); > + list = alloc_list(); > + ABORT_ON(!list); > if (parse_events_add_pmu(_parse_state, list, $1, $2, false, false)) { > struct perf_pmu *pmu = NULL; > int ok = 0; > @@ -306,7 +312,8 @@ value_sym '/' event_config '/' > int type = $1 >> 16; > int config = $1 & 255; > > - ALLOC_LIST(list); > + list = alloc_list(); > + ABORT_ON(!list); > ABORT_ON(parse_events_add_numeric(_parse_state, list, type, config, $3)); > parse_events_terms__delete($3); > $$ = list; > @@ -318,7 +325,8 @@ value_sym sep_slash_slash_dc > int type = $1 >> 16; > int config = $1 & 255; > > - ALLOC_LIST(list); > + list = alloc_list(); > + ABORT_ON(!list); > ABORT_ON(parse_events_add_numeric(_parse_state, list, type, config, NULL)); > $$ = list; > } > @@ -327,7 +335,8 @@ PE_VALUE_SYM_TOOL sep_slash_slash_dc > { > struct list_head *list; > > - ALLOC_LIST(list); > + list = alloc_list(); > + ABORT_ON(!list); > ABORT_ON(parse_events_add_tool(_parse_state, list, $1)); > $$ = list; > } > @@ -339,7 +348,8 @@ PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT '-' PE_NAME_CACHE_OP_RESULT opt_e > struct parse_events_error *error = parse_state->error; > struct list_head *list; > > - ALLOC_LIST(list); > + list = alloc_list(); > + ABORT_ON(!list); > ABORT_ON(parse_events_add_cache(list, &parse_state->idx, $1, $3, $5, error, $6)); > parse_events_terms__delete($6); > $$ = list; > @@ -351,7 +361,8 @@ PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT opt_event_config > struct parse_events_error *error = parse_state->error; > struct list_head *list; > > - ALLOC_LIST(list); > + list = alloc_list(); > + ABORT_ON(!list); > ABORT_ON(parse_events_add_cache(list, &parse_state->idx, $1, $3, NULL, error, $4)); > parse_events_terms__delete($4); > $$ = list; > @@ -363,7 +374,8 @@ PE_NAME_CACHE_TYPE opt_event_config > struct parse_events_error *error = parse_state->error; > struct list_head *list; > > - ALLOC_LIST(list); > + list = alloc_list(); > + ABORT_ON(!list); > ABORT_ON(parse_events_add_cache(list, &parse_state->idx, $1, NULL, NULL, error, $2)); > parse_events_terms__delete($2); > $$ = list; > @@ -375,7 +387,8 @@ PE_PREFIX_MEM PE_VALUE '/' PE_VALUE ':' PE_MODIFIER_BP sep_dc > struct parse_events_state *parse_state = _parse_state; > struct list_head *list; > > - ALLOC_LIST(list); > + list = alloc_list(); > + ABORT_ON(!list); > ABORT_ON(parse_events_add_breakpoint(list, &parse_state->idx, > (void *) $2, $6, $4)); > $$ = list; > @@ -386,7 +399,8 @@ PE_PREFIX_MEM PE_VALUE '/' PE_VALUE sep_dc > struct parse_events_state *parse_state = _parse_state; > struct list_head *list; > > - ALLOC_LIST(list); > + list = alloc_list(); > + ABORT_ON(!list); > ABORT_ON(parse_events_add_breakpoint(list, &parse_state->idx, > (void *) $2, NULL, $4)); > $$ = list; > @@ -397,7 +411,8 @@ PE_PREFIX_MEM PE_VALUE ':' PE_MODIFIER_BP sep_dc > struct parse_events_state *parse_state = _parse_state; > struct list_head *list; > > - ALLOC_LIST(list); > + list = alloc_list(); > + ABORT_ON(!list); > ABORT_ON(parse_events_add_breakpoint(list, &parse_state->idx, > (void *) $2, $4, 0)); > $$ = list; > @@ -408,7 +423,8 @@ PE_PREFIX_MEM PE_VALUE sep_dc > struct parse_events_state *parse_state = _parse_state; > struct list_head *list; > > - ALLOC_LIST(list); > + list = alloc_list(); > + ABORT_ON(!list); > ABORT_ON(parse_events_add_breakpoint(list, &parse_state->idx, > (void *) $2, NULL, 0)); > $$ = list; > @@ -421,7 +437,8 @@ tracepoint_name opt_event_config > struct parse_events_error *error = parse_state->error; > struct list_head *list; > > - ALLOC_LIST(list); > + list = alloc_list(); > + ABORT_ON(!list); > if (error) > error->idx = @1.first_column; > > @@ -457,7 +474,8 @@ PE_VALUE ':' PE_VALUE opt_event_config > { > struct list_head *list; > > - ALLOC_LIST(list); > + list = alloc_list(); > + ABORT_ON(!list); > ABORT_ON(parse_events_add_numeric(_parse_state, list, (u32)$1, $3, $4)); > parse_events_terms__delete($4); > $$ = list; > @@ -468,7 +486,8 @@ PE_RAW opt_event_config > { > struct list_head *list; > > - ALLOC_LIST(list); > + list = alloc_list(); > + ABORT_ON(!list); > ABORT_ON(parse_events_add_numeric(_parse_state, list, PERF_TYPE_RAW, $1, $2)); > parse_events_terms__delete($2); > $$ = list; > @@ -480,7 +499,8 @@ PE_BPF_OBJECT opt_event_config > struct parse_events_state *parse_state = _parse_state; > struct list_head *list; > > - ALLOC_LIST(list); > + list = alloc_list(); > + ABORT_ON(!list); > ABORT_ON(parse_events_load_bpf(parse_state, list, $1, false, $2)); > parse_events_terms__delete($2); > $$ = list; > @@ -490,7 +510,8 @@ PE_BPF_SOURCE opt_event_config > { > struct list_head *list; > > - ALLOC_LIST(list); > + list = alloc_list(); > + ABORT_ON(!list); > ABORT_ON(parse_events_load_bpf(_parse_state, list, $1, true, $2)); > parse_events_terms__delete($2); > $$ = list; > -- > 2.23.0.866.gb869b98d4c-goog >