diff options
-rw-r--r-- | tools/perf/util/parse-events.c | 14 | ||||
-rw-r--r-- | tools/perf/util/parse-events.h | 4 | ||||
-rw-r--r-- | tools/perf/util/parse-events.l | 2 | ||||
-rw-r--r-- | tools/perf/util/parse-events.y | 93 |
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 | ||
614 | int parse_events__modifier_group(struct list_head *list __used, | ||
615 | char *event_mod __used) | ||
616 | { | ||
617 | return 0; | ||
618 | } | ||
619 | |||
620 | void parse_events__group(char *name __used, struct list_head *list __used) | ||
621 | { | ||
622 | } | ||
623 | |||
614 | void parse_events_update_lists(struct list_head *list_event, | 624 | void 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 | ||
626 | int parse_events_modifier(struct list_head *list, char *str) | 636 | int 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, | |||
79 | int parse_events__term_clone(struct parse_events__term **new, | 79 | int parse_events__term_clone(struct parse_events__term **new, |
80 | struct parse_events__term *term); | 80 | struct parse_events__term *term); |
81 | void parse_events__free_terms(struct list_head *terms); | 81 | void parse_events__free_terms(struct list_head *terms); |
82 | int parse_events_modifier(struct list_head *list, char *str); | 82 | int parse_events__modifier_event(struct list_head *list, char *str); |
83 | int parse_events__modifier_group(struct list_head *list, char *event_mod); | ||
83 | int parse_events_add_tracepoint(struct list_head **list, int *idx, | 84 | int parse_events_add_tracepoint(struct list_head **list, int *idx, |
84 | char *sys, char *event); | 85 | char *sys, char *event); |
85 | int parse_events_add_numeric(struct list_head **list, int *idx, | 86 | int 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); |
92 | int parse_events_add_pmu(struct list_head **list, int *idx, | 93 | int 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); |
95 | void parse_events__group(char *name, struct list_head *list); | ||
94 | void parse_events_update_lists(struct list_head *list_event, | 96 | void parse_events_update_lists(struct list_head *list_event, |
95 | struct list_head *list_all); | 97 | struct list_head *list_all); |
96 | void parse_events_error(void *data, void *scanner, char const *msg); | 98 | void 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 | ||
66 | start: | 71 | start: |
67 | PE_START_EVENTS events | 72 | PE_START_EVENTS start_events |
68 | | | 73 | | |
69 | PE_START_TERMS terms | 74 | PE_START_TERMS start_terms |
75 | |||
76 | start_events: groups | ||
77 | { | ||
78 | struct parse_events_data__events *data = _data; | ||
79 | |||
80 | parse_events_update_lists($1, &data->list); | ||
81 | } | ||
82 | |||
83 | groups: | ||
84 | groups ',' 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 | | | ||
93 | groups ',' 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 | | | ||
102 | group | ||
103 | | | ||
104 | event | ||
105 | |||
106 | group: | ||
107 | group_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 | | | ||
115 | group_def | ||
116 | |||
117 | group_def: | ||
118 | PE_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 | ||
71 | events: | 134 | events: |
72 | events ',' event | event | 135 | events ',' 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 | | | ||
144 | event | ||
73 | 145 | ||
74 | event: | 146 | event: |
75 | event_def PE_MODIFIER_EVENT | 147 | event_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 | | |
88 | event_def | 160 | event_def |
89 | { | ||
90 | struct parse_events_data__events *data = _data; | ||
91 | |||
92 | parse_events_update_lists($1, &data->list); | ||
93 | } | ||
94 | 161 | ||
95 | event_def: event_pmu | | 162 | event_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 | ||
225 | terms: event_config | 292 | start_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; |