aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tools/perf/util/parse-events.c14
-rw-r--r--tools/perf/util/parse-events.h4
-rw-r--r--tools/perf/util/parse-events.l2
-rw-r--r--tools/perf/util/parse-events.y93
4 files changed, 97 insertions, 16 deletions
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index 3ec4bfcd3f9c..57d5809f2860 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -611,19 +611,29 @@ int parse_events_add_pmu(struct list_head **list, int *idx,
611 pmu_event_name(head_config)); 611 pmu_event_name(head_config));
612} 612}
613 613
614int parse_events__modifier_group(struct list_head *list __used,
615 char *event_mod __used)
616{
617 return 0;
618}
619
620void parse_events__group(char *name __used, struct list_head *list __used)
621{
622}
623
614void parse_events_update_lists(struct list_head *list_event, 624void parse_events_update_lists(struct list_head *list_event,
615 struct list_head *list_all) 625 struct list_head *list_all)
616{ 626{
617 /* 627 /*
618 * Called for single event definition. Update the 628 * Called for single event definition. Update the
619 * 'all event' list, and reinit the 'signle event' 629 * 'all event' list, and reinit the 'single event'
620 * list, for next event definition. 630 * list, for next event definition.
621 */ 631 */
622 list_splice_tail(list_event, list_all); 632 list_splice_tail(list_event, list_all);
623 free(list_event); 633 free(list_event);
624} 634}
625 635
626int parse_events_modifier(struct list_head *list, char *str) 636int parse_events__modifier_event(struct list_head *list, char *str)
627{ 637{
628 struct perf_evsel *evsel; 638 struct perf_evsel *evsel;
629 int exclude = 0, exclude_GH = 0; 639 int exclude = 0, exclude_GH = 0;
diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
index 00416d7fd012..c3bb04c6f025 100644
--- a/tools/perf/util/parse-events.h
+++ b/tools/perf/util/parse-events.h
@@ -79,7 +79,8 @@ int parse_events__term_str(struct parse_events__term **_term,
79int parse_events__term_clone(struct parse_events__term **new, 79int parse_events__term_clone(struct parse_events__term **new,
80 struct parse_events__term *term); 80 struct parse_events__term *term);
81void parse_events__free_terms(struct list_head *terms); 81void parse_events__free_terms(struct list_head *terms);
82int parse_events_modifier(struct list_head *list, char *str); 82int parse_events__modifier_event(struct list_head *list, char *str);
83int parse_events__modifier_group(struct list_head *list, char *event_mod);
83int parse_events_add_tracepoint(struct list_head **list, int *idx, 84int parse_events_add_tracepoint(struct list_head **list, int *idx,
84 char *sys, char *event); 85 char *sys, char *event);
85int parse_events_add_numeric(struct list_head **list, int *idx, 86int parse_events_add_numeric(struct list_head **list, int *idx,
@@ -91,6 +92,7 @@ int parse_events_add_breakpoint(struct list_head **list, int *idx,
91 void *ptr, char *type); 92 void *ptr, char *type);
92int parse_events_add_pmu(struct list_head **list, int *idx, 93int parse_events_add_pmu(struct list_head **list, int *idx,
93 char *pmu , struct list_head *head_config); 94 char *pmu , struct list_head *head_config);
95void parse_events__group(char *name, struct list_head *list);
94void parse_events_update_lists(struct list_head *list_event, 96void parse_events_update_lists(struct list_head *list_event,
95 struct list_head *list_all); 97 struct list_head *list_all);
96void parse_events_error(void *data, void *scanner, char const *msg); 98void parse_events_error(void *data, void *scanner, char const *msg);
diff --git a/tools/perf/util/parse-events.l b/tools/perf/util/parse-events.l
index e4abdf25d493..2c0d006d43db 100644
--- a/tools/perf/util/parse-events.l
+++ b/tools/perf/util/parse-events.l
@@ -151,6 +151,8 @@ r{num_raw_hex} { return raw(yyscanner); }
151- { return '-'; } 151- { return '-'; }
152, { return ','; } 152, { return ','; }
153: { return ':'; } 153: { return ':'; }
154"{" { return '{'; }
155"}" { return '}'; }
154= { return '='; } 156= { return '='; }
155\n { } 157\n { }
156 158
diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y
index 423d33151466..15e6e97e5b34 100644
--- a/tools/perf/util/parse-events.y
+++ b/tools/perf/util/parse-events.y
@@ -30,7 +30,7 @@ do { \
30%token PE_NAME 30%token PE_NAME
31%token PE_MODIFIER_EVENT PE_MODIFIER_BP 31%token PE_MODIFIER_EVENT PE_MODIFIER_BP
32%token PE_NAME_CACHE_TYPE PE_NAME_CACHE_OP_RESULT 32%token PE_NAME_CACHE_TYPE PE_NAME_CACHE_OP_RESULT
33%token PE_PREFIX_MEM PE_PREFIX_RAW 33%token PE_PREFIX_MEM PE_PREFIX_RAW PE_PREFIX_GROUP
34%token PE_ERROR 34%token PE_ERROR
35%type <num> PE_VALUE 35%type <num> PE_VALUE
36%type <num> PE_VALUE_SYM_HW 36%type <num> PE_VALUE_SYM_HW
@@ -53,6 +53,11 @@ do { \
53%type <head> event_legacy_numeric 53%type <head> event_legacy_numeric
54%type <head> event_legacy_raw 54%type <head> event_legacy_raw
55%type <head> event_def 55%type <head> event_def
56%type <head> event
57%type <head> events
58%type <head> group_def
59%type <head> group
60%type <head> groups
56 61
57%union 62%union
58{ 63{
@@ -64,33 +69,95 @@ do { \
64%% 69%%
65 70
66start: 71start:
67PE_START_EVENTS events 72PE_START_EVENTS start_events
68| 73|
69PE_START_TERMS terms 74PE_START_TERMS start_terms
75
76start_events: groups
77{
78 struct parse_events_data__events *data = _data;
79
80 parse_events_update_lists($1, &data->list);
81}
82
83groups:
84groups ',' group
85{
86 struct list_head *list = $1;
87 struct list_head *group = $3;
88
89 parse_events_update_lists(group, list);
90 $$ = list;
91}
92|
93groups ',' event
94{
95 struct list_head *list = $1;
96 struct list_head *event = $3;
97
98 parse_events_update_lists(event, list);
99 $$ = list;
100}
101|
102group
103|
104event
105
106group:
107group_def ':' PE_MODIFIER_EVENT
108{
109 struct list_head *list = $1;
110
111 ABORT_ON(parse_events__modifier_group(list, $3));
112 $$ = list;
113}
114|
115group_def
116
117group_def:
118PE_NAME '{' events '}'
119{
120 struct list_head *list = $3;
121
122 parse_events__group($1, list);
123 $$ = list;
124}
125|
126'{' events '}'
127{
128 struct list_head *list = $2;
129
130 parse_events__group(NULL, list);
131 $$ = list;
132}
70 133
71events: 134events:
72events ',' event | event 135events ',' event
136{
137 struct list_head *event = $3;
138 struct list_head *list = $1;
139
140 parse_events_update_lists(event, list);
141 $$ = list;
142}
143|
144event
73 145
74event: 146event:
75event_def PE_MODIFIER_EVENT 147event_def PE_MODIFIER_EVENT
76{ 148{
77 struct parse_events_data__events *data = _data; 149 struct list_head *list = $1;
78 150
79 /* 151 /*
80 * Apply modifier on all events added by single event definition 152 * Apply modifier on all events added by single event definition
81 * (there could be more events added for multiple tracepoint 153 * (there could be more events added for multiple tracepoint
82 * definitions via '*?'. 154 * definitions via '*?'.
83 */ 155 */
84 ABORT_ON(parse_events_modifier($1, $2)); 156 ABORT_ON(parse_events__modifier_event(list, $2));
85 parse_events_update_lists($1, &data->list); 157 $$ = list;
86} 158}
87| 159|
88event_def 160event_def
89{
90 struct parse_events_data__events *data = _data;
91
92 parse_events_update_lists($1, &data->list);
93}
94 161
95event_def: event_pmu | 162event_def: event_pmu |
96 event_legacy_symbol | 163 event_legacy_symbol |
@@ -222,7 +289,7 @@ PE_RAW
222 $$ = list; 289 $$ = list;
223} 290}
224 291
225terms: event_config 292start_terms: event_config
226{ 293{
227 struct parse_events_data__terms *data = _data; 294 struct parse_events_data__terms *data = _data;
228 data->terms = $1; 295 data->terms = $1;