mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-06 02:50:43 +00:00
perf parse: Add destructors for parse event terms
If parsing fails then destructors are ran to clean the up the stack. Rename the head union member to make the term and evlist use cases more distinct, this simplifies matching the correct destructor. Committer notes: Jiri: "Nice did not know about this.. looks like it's been in bison for some time, right?" Ian: "Looks like it wasn't in Bison 1 but in Bison 2, we're at Bison 3 and Bison 2 is > 14 years old: https://web.archive.org/web/20050924004158/http://www.gnu.org/software/bison/manual/html_mono/bison.html#Destructor-Decl" Signed-off-by: Ian Rogers <irogers@google.com> Acked-by: Jiri Olsa <jolsa@kernel.org> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Alexei Starovoitov <ast@kernel.org> Cc: Andi Kleen <ak@linux.intel.com> Cc: Daniel Borkmann <daniel@iogearbox.net> Cc: Jin Yao <yao.jin@linux.intel.com> Cc: John Garry <john.garry@huawei.com> Cc: Kan Liang <kan.liang@linux.intel.com> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Martin KaFai Lau <kafai@fb.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Song Liu <songliubraving@fb.com> Cc: Stephane Eranian <eranian@google.com> Cc: Yonghong Song <yhs@fb.com> Cc: bpf@vger.kernel.org Cc: clang-built-linux@googlegroups.com Cc: netdev@vger.kernel.org Link: http://lore.kernel.org/lkml/20191030223448.12930-7-irogers@google.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
b6645a7235
commit
f2a8ecd8b1
1 changed files with 48 additions and 21 deletions
|
@ -12,6 +12,7 @@
|
|||
#include <stdio.h>
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/zalloc.h>
|
||||
#include "pmu.h"
|
||||
#include "evsel.h"
|
||||
#include "parse-events.h"
|
||||
|
@ -37,6 +38,25 @@ static struct list_head* alloc_list()
|
|||
return list;
|
||||
}
|
||||
|
||||
static void free_list_evsel(struct list_head* list_evsel)
|
||||
{
|
||||
struct evsel *evsel, *tmp;
|
||||
|
||||
list_for_each_entry_safe(evsel, tmp, list_evsel, core.node) {
|
||||
list_del_init(&evsel->core.node);
|
||||
perf_evsel__delete(evsel);
|
||||
}
|
||||
free(list_evsel);
|
||||
}
|
||||
|
||||
static void free_term(struct parse_events_term *term)
|
||||
{
|
||||
if (term->type_val == PARSE_EVENTS__TERM_TYPE_STR)
|
||||
free(term->val.str);
|
||||
zfree(&term->array.ranges);
|
||||
free(term);
|
||||
}
|
||||
|
||||
static void inc_group_count(struct list_head *list,
|
||||
struct parse_events_state *parse_state)
|
||||
{
|
||||
|
@ -66,6 +86,7 @@ static void inc_group_count(struct list_head *list,
|
|||
%type <num> PE_VALUE_SYM_TOOL
|
||||
%type <num> PE_RAW
|
||||
%type <num> PE_TERM
|
||||
%type <num> value_sym
|
||||
%type <str> PE_NAME
|
||||
%type <str> PE_BPF_OBJECT
|
||||
%type <str> PE_BPF_SOURCE
|
||||
|
@ -76,37 +97,43 @@ static void inc_group_count(struct list_head *list,
|
|||
%type <str> PE_EVENT_NAME
|
||||
%type <str> PE_PMU_EVENT_PRE PE_PMU_EVENT_SUF PE_KERNEL_PMU_EVENT
|
||||
%type <str> PE_DRV_CFG_TERM
|
||||
%type <num> value_sym
|
||||
%type <head> event_config
|
||||
%type <head> opt_event_config
|
||||
%type <head> opt_pmu_config
|
||||
%destructor { free ($$); } <str>
|
||||
%type <term> event_term
|
||||
%type <head> event_pmu
|
||||
%type <head> event_legacy_symbol
|
||||
%type <head> event_legacy_cache
|
||||
%type <head> event_legacy_mem
|
||||
%type <head> event_legacy_tracepoint
|
||||
%destructor { free_term ($$); } <term>
|
||||
%type <list_terms> event_config
|
||||
%type <list_terms> opt_event_config
|
||||
%type <list_terms> opt_pmu_config
|
||||
%destructor { parse_events_terms__delete ($$); } <list_terms>
|
||||
%type <list_evsel> event_pmu
|
||||
%type <list_evsel> event_legacy_symbol
|
||||
%type <list_evsel> event_legacy_cache
|
||||
%type <list_evsel> event_legacy_mem
|
||||
%type <list_evsel> event_legacy_tracepoint
|
||||
%type <list_evsel> event_legacy_numeric
|
||||
%type <list_evsel> event_legacy_raw
|
||||
%type <list_evsel> event_bpf_file
|
||||
%type <list_evsel> event_def
|
||||
%type <list_evsel> event_mod
|
||||
%type <list_evsel> event_name
|
||||
%type <list_evsel> event
|
||||
%type <list_evsel> events
|
||||
%type <list_evsel> group_def
|
||||
%type <list_evsel> group
|
||||
%type <list_evsel> groups
|
||||
%destructor { free_list_evsel ($$); } <list_evsel>
|
||||
%type <tracepoint_name> tracepoint_name
|
||||
%type <head> event_legacy_numeric
|
||||
%type <head> event_legacy_raw
|
||||
%type <head> event_bpf_file
|
||||
%type <head> event_def
|
||||
%type <head> event_mod
|
||||
%type <head> event_name
|
||||
%type <head> event
|
||||
%type <head> events
|
||||
%type <head> group_def
|
||||
%type <head> group
|
||||
%type <head> groups
|
||||
%destructor { free ($$.sys); free ($$.event); } <tracepoint_name>
|
||||
%type <array> array
|
||||
%type <array> array_term
|
||||
%type <array> array_terms
|
||||
%destructor { free ($$.ranges); } <array>
|
||||
|
||||
%union
|
||||
{
|
||||
char *str;
|
||||
u64 num;
|
||||
struct list_head *head;
|
||||
struct list_head *list_evsel;
|
||||
struct list_head *list_terms;
|
||||
struct parse_events_term *term;
|
||||
struct tracepoint_name {
|
||||
char *sys;
|
||||
|
|
Loading…
Reference in a new issue