]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blame - tools/perf/util/parse-events.y
perf test: Add automated tests for event group parsing
[mirror_ubuntu-bionic-kernel.git] / tools / perf / util / parse-events.y
CommitLineData
ac20de6f 1%pure-parser
89812fc8 2%name-prefix "parse_events_"
46010ab2 3%parse-param {void *_data}
ac20de6f
ZY
4%parse-param {void *scanner}
5%lex-param {void* scanner}
89812fc8
JO
6
7%{
8
9#define YYDEBUG 1
10
11#include <linux/compiler.h>
12#include <linux/list.h>
13#include "types.h"
14#include "util.h"
15#include "parse-events.h"
ac20de6f 16#include "parse-events-bison.h"
89812fc8 17
ac20de6f 18extern int parse_events_lex (YYSTYPE* lvalp, void* scanner);
89812fc8
JO
19
20#define ABORT_ON(val) \
21do { \
22 if (val) \
23 YYABORT; \
24} while (0)
25
26%}
27
90e2b22d 28%token PE_START_EVENTS PE_START_TERMS
cf3506dc 29%token PE_VALUE PE_VALUE_SYM_HW PE_VALUE_SYM_SW PE_RAW PE_TERM
89812fc8
JO
30%token PE_NAME
31%token PE_MODIFIER_EVENT PE_MODIFIER_BP
32%token PE_NAME_CACHE_TYPE PE_NAME_CACHE_OP_RESULT
89efb029 33%token PE_PREFIX_MEM PE_PREFIX_RAW PE_PREFIX_GROUP
89812fc8
JO
34%token PE_ERROR
35%type <num> PE_VALUE
cf3506dc
JO
36%type <num> PE_VALUE_SYM_HW
37%type <num> PE_VALUE_SYM_SW
89812fc8 38%type <num> PE_RAW
8f707d84 39%type <num> PE_TERM
89812fc8
JO
40%type <str> PE_NAME
41%type <str> PE_NAME_CACHE_TYPE
42%type <str> PE_NAME_CACHE_OP_RESULT
43%type <str> PE_MODIFIER_EVENT
44%type <str> PE_MODIFIER_BP
cf3506dc 45%type <num> value_sym
8f707d84
JO
46%type <head> event_config
47%type <term> event_term
b847cbdc
JO
48%type <head> event_pmu
49%type <head> event_legacy_symbol
50%type <head> event_legacy_cache
51%type <head> event_legacy_mem
52%type <head> event_legacy_tracepoint
53%type <head> event_legacy_numeric
54%type <head> event_legacy_raw
55%type <head> event_def
89efb029
JO
56%type <head> event
57%type <head> events
58%type <head> group_def
59%type <head> group
60%type <head> groups
89812fc8
JO
61
62%union
63{
64 char *str;
b527bab5 65 u64 num;
8f707d84
JO
66 struct list_head *head;
67 struct parse_events__term *term;
89812fc8
JO
68}
69%%
70
90e2b22d 71start:
89efb029 72PE_START_EVENTS start_events
90e2b22d 73|
89efb029
JO
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}
90e2b22d 133
89812fc8 134events:
89efb029
JO
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
89812fc8
JO
145
146event:
147event_def PE_MODIFIER_EVENT
148{
89efb029 149 struct list_head *list = $1;
46010ab2 150
5d7be90e
JO
151 /*
152 * Apply modifier on all events added by single event definition
153 * (there could be more events added for multiple tracepoint
154 * definitions via '*?'.
155 */
f5b1135b 156 ABORT_ON(parse_events__modifier_event(list, $2, false));
89efb029 157 $$ = list;
89812fc8
JO
158}
159|
160event_def
161
5f537a26
JO
162event_def: event_pmu |
163 event_legacy_symbol |
89812fc8
JO
164 event_legacy_cache sep_dc |
165 event_legacy_mem |
166 event_legacy_tracepoint sep_dc |
167 event_legacy_numeric sep_dc |
168 event_legacy_raw sep_dc
169
5f537a26
JO
170event_pmu:
171PE_NAME '/' event_config '/'
172{
46010ab2 173 struct parse_events_data__events *data = _data;
b847cbdc
JO
174 struct list_head *list = NULL;
175
46010ab2 176 ABORT_ON(parse_events_add_pmu(&list, &data->idx, $1, $3));
5f537a26 177 parse_events__free_terms($3);
b847cbdc 178 $$ = list;
5f537a26
JO
179}
180
cf3506dc
JO
181value_sym:
182PE_VALUE_SYM_HW
183|
184PE_VALUE_SYM_SW
185
89812fc8 186event_legacy_symbol:
cf3506dc 187value_sym '/' event_config '/'
89812fc8 188{
46010ab2 189 struct parse_events_data__events *data = _data;
b847cbdc 190 struct list_head *list = NULL;
89812fc8
JO
191 int type = $1 >> 16;
192 int config = $1 & 255;
193
46010ab2
JO
194 ABORT_ON(parse_events_add_numeric(&list, &data->idx,
195 type, config, $3));
8f707d84 196 parse_events__free_terms($3);
b847cbdc 197 $$ = list;
8f707d84
JO
198}
199|
cf3506dc 200value_sym sep_slash_dc
8f707d84 201{
46010ab2 202 struct parse_events_data__events *data = _data;
b847cbdc 203 struct list_head *list = NULL;
8f707d84
JO
204 int type = $1 >> 16;
205 int config = $1 & 255;
206
46010ab2
JO
207 ABORT_ON(parse_events_add_numeric(&list, &data->idx,
208 type, config, NULL));
b847cbdc 209 $$ = list;
89812fc8
JO
210}
211
212event_legacy_cache:
213PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT '-' PE_NAME_CACHE_OP_RESULT
214{
46010ab2 215 struct parse_events_data__events *data = _data;
b847cbdc
JO
216 struct list_head *list = NULL;
217
46010ab2 218 ABORT_ON(parse_events_add_cache(&list, &data->idx, $1, $3, $5));
b847cbdc 219 $$ = list;
89812fc8
JO
220}
221|
222PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT
223{
46010ab2 224 struct parse_events_data__events *data = _data;
b847cbdc
JO
225 struct list_head *list = NULL;
226
46010ab2 227 ABORT_ON(parse_events_add_cache(&list, &data->idx, $1, $3, NULL));
b847cbdc 228 $$ = list;
89812fc8
JO
229}
230|
231PE_NAME_CACHE_TYPE
232{
46010ab2 233 struct parse_events_data__events *data = _data;
b847cbdc
JO
234 struct list_head *list = NULL;
235
46010ab2 236 ABORT_ON(parse_events_add_cache(&list, &data->idx, $1, NULL, NULL));
b847cbdc 237 $$ = list;
89812fc8
JO
238}
239
240event_legacy_mem:
241PE_PREFIX_MEM PE_VALUE ':' PE_MODIFIER_BP sep_dc
242{
46010ab2 243 struct parse_events_data__events *data = _data;
b847cbdc
JO
244 struct list_head *list = NULL;
245
46010ab2
JO
246 ABORT_ON(parse_events_add_breakpoint(&list, &data->idx,
247 (void *) $2, $4));
b847cbdc 248 $$ = list;
89812fc8
JO
249}
250|
251PE_PREFIX_MEM PE_VALUE sep_dc
252{
46010ab2 253 struct parse_events_data__events *data = _data;
b847cbdc
JO
254 struct list_head *list = NULL;
255
46010ab2
JO
256 ABORT_ON(parse_events_add_breakpoint(&list, &data->idx,
257 (void *) $2, NULL));
b847cbdc 258 $$ = list;
89812fc8
JO
259}
260
261event_legacy_tracepoint:
262PE_NAME ':' PE_NAME
263{
46010ab2 264 struct parse_events_data__events *data = _data;
b847cbdc
JO
265 struct list_head *list = NULL;
266
46010ab2 267 ABORT_ON(parse_events_add_tracepoint(&list, &data->idx, $1, $3));
b847cbdc 268 $$ = list;
89812fc8
JO
269}
270
271event_legacy_numeric:
272PE_VALUE ':' PE_VALUE
273{
46010ab2 274 struct parse_events_data__events *data = _data;
b847cbdc
JO
275 struct list_head *list = NULL;
276
b527bab5 277 ABORT_ON(parse_events_add_numeric(&list, &data->idx, (u32)$1, $3, NULL));
b847cbdc 278 $$ = list;
89812fc8
JO
279}
280
281event_legacy_raw:
282PE_RAW
283{
46010ab2 284 struct parse_events_data__events *data = _data;
b847cbdc
JO
285 struct list_head *list = NULL;
286
46010ab2
JO
287 ABORT_ON(parse_events_add_numeric(&list, &data->idx,
288 PERF_TYPE_RAW, $1, NULL));
b847cbdc 289 $$ = list;
8f707d84
JO
290}
291
89efb029 292start_terms: event_config
90e2b22d
JO
293{
294 struct parse_events_data__terms *data = _data;
295 data->terms = $1;
296}
297
8f707d84
JO
298event_config:
299event_config ',' event_term
300{
301 struct list_head *head = $1;
302 struct parse_events__term *term = $3;
303
304 ABORT_ON(!head);
305 list_add_tail(&term->list, head);
306 $$ = $1;
307}
308|
309event_term
310{
311 struct list_head *head = malloc(sizeof(*head));
312 struct parse_events__term *term = $1;
313
314 ABORT_ON(!head);
315 INIT_LIST_HEAD(head);
316 list_add_tail(&term->list, head);
317 $$ = head;
318}
319
320event_term:
321PE_NAME '=' PE_NAME
322{
323 struct parse_events__term *term;
324
16fa7e82
JO
325 ABORT_ON(parse_events__term_str(&term, PARSE_EVENTS__TERM_TYPE_USER,
326 $1, $3));
8f707d84
JO
327 $$ = term;
328}
329|
330PE_NAME '=' PE_VALUE
331{
332 struct parse_events__term *term;
333
16fa7e82
JO
334 ABORT_ON(parse_events__term_num(&term, PARSE_EVENTS__TERM_TYPE_USER,
335 $1, $3));
8f707d84
JO
336 $$ = term;
337}
338|
339PE_NAME
340{
341 struct parse_events__term *term;
342
16fa7e82
JO
343 ABORT_ON(parse_events__term_num(&term, PARSE_EVENTS__TERM_TYPE_USER,
344 $1, 1));
8f707d84
JO
345 $$ = term;
346}
347|
6b5fc39b
JO
348PE_TERM '=' PE_NAME
349{
350 struct parse_events__term *term;
351
b527bab5 352 ABORT_ON(parse_events__term_str(&term, (int)$1, NULL, $3));
6b5fc39b
JO
353 $$ = term;
354}
355|
8f707d84
JO
356PE_TERM '=' PE_VALUE
357{
358 struct parse_events__term *term;
359
b527bab5 360 ABORT_ON(parse_events__term_num(&term, (int)$1, NULL, $3));
8f707d84
JO
361 $$ = term;
362}
363|
364PE_TERM
365{
366 struct parse_events__term *term;
367
b527bab5 368 ABORT_ON(parse_events__term_num(&term, (int)$1, NULL, 1));
8f707d84 369 $$ = term;
89812fc8
JO
370}
371
372sep_dc: ':' |
373
8f707d84
JO
374sep_slash_dc: '/' | ':' |
375
89812fc8
JO
376%%
377
ac20de6f 378void parse_events_error(void *data __used, void *scanner __used,
89812fc8
JO
379 char const *msg __used)
380{
381}