2 %parse
-param
{void *_data
}
3 %parse
-param
{void *scanner
}
4 %lex
-param
{void* scanner
}
10 #include <linux/compiler.h>
11 #include <linux/list.h>
14 #include "parse-events.h"
15 #include "parse-events-bison.h"
17 extern
int parse_events_lex
(YYSTYPE* lvalp
, void* scanner
);
19 #define ABORT_ON(val) \
25 #define ALLOC_LIST(list) \
27 list
= malloc
(sizeof
(*list
)); \
29 INIT_LIST_HEAD
(list
); \
32 static inc_group_count
(struct list_head
*list
,
33 struct parse_events_evlist
*data
)
35 /* Count groups only have more than 1 members */
36 if
(!list_is_last
(list
->next
, list
))
42 %token PE_START_EVENTS PE_START_TERMS
43 %token PE_VALUE PE_VALUE_SYM_HW PE_VALUE_SYM_SW PE_RAW PE_TERM
46 %token PE_MODIFIER_EVENT PE_MODIFIER_BP
47 %token PE_NAME_CACHE_TYPE PE_NAME_CACHE_OP_RESULT
48 %token PE_PREFIX_MEM PE_PREFIX_RAW PE_PREFIX_GROUP
51 %type
<num
> PE_VALUE_SYM_HW
52 %type
<num
> PE_VALUE_SYM_SW
56 %type
<str
> PE_NAME_CACHE_TYPE
57 %type
<str
> PE_NAME_CACHE_OP_RESULT
58 %type
<str
> PE_MODIFIER_EVENT
59 %type
<str
> PE_MODIFIER_BP
60 %type
<str
> PE_EVENT_NAME
62 %type
<head
> event_config
63 %type
<term
> event_term
64 %type
<head
> event_pmu
65 %type
<head
> event_legacy_symbol
66 %type
<head
> event_legacy_cache
67 %type
<head
> event_legacy_mem
68 %type
<head
> event_legacy_tracepoint
69 %type
<head
> event_legacy_numeric
70 %type
<head
> event_legacy_raw
71 %type
<head
> event_def
72 %type
<head
> event_mod
73 %type
<head
> event_name
76 %type
<head
> group_def
84 struct list_head
*head
;
85 struct parse_events_term
*term
;
90 PE_START_EVENTS start_events
92 PE_START_TERMS start_terms
96 struct parse_events_evlist
*data
= _data
;
98 parse_events_update_lists
($1, &data
->list
);
104 struct list_head
*list
= $1;
105 struct list_head
*group
= $3;
107 parse_events_update_lists
(group
, list
);
113 struct list_head
*list
= $1;
114 struct list_head
*event
= $3;
116 parse_events_update_lists
(event
, list
);
125 group_def
':' PE_MODIFIER_EVENT
127 struct list_head
*list
= $1;
129 ABORT_ON
(parse_events__modifier_group
(list
, $3));
136 PE_NAME
'{' events
'}'
138 struct list_head
*list
= $3;
140 inc_group_count
(list
, _data
);
141 parse_events__set_leader
($1, list
);
147 struct list_head
*list
= $2;
149 inc_group_count
(list
, _data
);
150 parse_events__set_leader
(NULL
, list
);
157 struct list_head
*event
= $3;
158 struct list_head
*list
= $1;
160 parse_events_update_lists
(event
, list
);
169 event_name PE_MODIFIER_EVENT
171 struct list_head
*list
= $1;
174 * Apply modifier on all events added by single event definition
175 * (there could be more events added for multiple tracepoint
176 * definitions via '*?'.
178 ABORT_ON
(parse_events__modifier_event
(list
, $2, false
));
185 PE_EVENT_NAME event_def
187 ABORT_ON
(parse_events_name
($2, $1));
194 event_def: event_pmu |
195 event_legacy_symbol |
196 event_legacy_cache sep_dc |
198 event_legacy_tracepoint sep_dc |
199 event_legacy_numeric sep_dc |
200 event_legacy_raw sep_dc
203 PE_NAME
'/' event_config
'/'
205 struct parse_events_evlist
*data
= _data
;
206 struct list_head
*list
;
209 ABORT_ON
(parse_events_add_pmu
(list
, &data
->idx
, $1, $3));
210 parse_events__free_terms
($3);
220 value_sym
'/' event_config
'/'
222 struct parse_events_evlist
*data
= _data
;
223 struct list_head
*list
;
225 int config
= $1 & 255;
228 ABORT_ON
(parse_events_add_numeric
(list
, &data
->idx
,
230 parse_events__free_terms
($3);
234 value_sym sep_slash_dc
236 struct parse_events_evlist
*data
= _data
;
237 struct list_head
*list
;
239 int config
= $1 & 255;
242 ABORT_ON
(parse_events_add_numeric
(list
, &data
->idx
,
243 type
, config
, NULL
));
248 PE_NAME_CACHE_TYPE
'-' PE_NAME_CACHE_OP_RESULT
'-' PE_NAME_CACHE_OP_RESULT
250 struct parse_events_evlist
*data
= _data
;
251 struct list_head
*list
;
254 ABORT_ON
(parse_events_add_cache
(list
, &data
->idx
, $1, $3, $5));
258 PE_NAME_CACHE_TYPE
'-' PE_NAME_CACHE_OP_RESULT
260 struct parse_events_evlist
*data
= _data
;
261 struct list_head
*list
;
264 ABORT_ON
(parse_events_add_cache
(list
, &data
->idx
, $1, $3, NULL
));
270 struct parse_events_evlist
*data
= _data
;
271 struct list_head
*list
;
274 ABORT_ON
(parse_events_add_cache
(list
, &data
->idx
, $1, NULL
, NULL
));
279 PE_PREFIX_MEM PE_VALUE
':' PE_MODIFIER_BP sep_dc
281 struct parse_events_evlist
*data
= _data
;
282 struct list_head
*list
;
285 ABORT_ON
(parse_events_add_breakpoint
(list
, &data
->idx
,
290 PE_PREFIX_MEM PE_VALUE sep_dc
292 struct parse_events_evlist
*data
= _data
;
293 struct list_head
*list
;
296 ABORT_ON
(parse_events_add_breakpoint
(list
, &data
->idx
,
301 event_legacy_tracepoint:
304 struct parse_events_evlist
*data
= _data
;
305 struct list_head
*list
;
308 ABORT_ON
(parse_events_add_tracepoint
(list
, &data
->idx
, $1, $3));
312 event_legacy_numeric:
313 PE_VALUE
':' PE_VALUE
315 struct parse_events_evlist
*data
= _data
;
316 struct list_head
*list
;
319 ABORT_ON
(parse_events_add_numeric
(list
, &data
->idx
, (u32
)$1, $3, NULL
));
326 struct parse_events_evlist
*data
= _data
;
327 struct list_head
*list
;
330 ABORT_ON
(parse_events_add_numeric
(list
, &data
->idx
,
331 PERF_TYPE_RAW
, $1, NULL
));
335 start_terms: event_config
337 struct parse_events_terms
*data
= _data
;
342 event_config
',' event_term
344 struct list_head
*head
= $1;
345 struct parse_events_term
*term
= $3;
348 list_add_tail
(&term
->list
, head
);
354 struct list_head
*head
= malloc
(sizeof
(*head
));
355 struct parse_events_term
*term
= $1;
358 INIT_LIST_HEAD
(head
);
359 list_add_tail
(&term
->list
, head
);
366 struct parse_events_term
*term
;
368 ABORT_ON
(parse_events_term__str
(&term
, PARSE_EVENTS__TERM_TYPE_USER
,
375 struct parse_events_term
*term
;
377 ABORT_ON
(parse_events_term__num
(&term
, PARSE_EVENTS__TERM_TYPE_USER
,
382 PE_NAME
'=' PE_VALUE_SYM_HW
384 struct parse_events_term
*term
;
385 int config
= $3 & 255;
387 ABORT_ON
(parse_events_term__sym_hw
(&term
, $1, config
));
393 struct parse_events_term
*term
;
395 ABORT_ON
(parse_events_term__num
(&term
, PARSE_EVENTS__TERM_TYPE_USER
,
402 struct parse_events_term
*term
;
403 int config
= $1 & 255;
405 ABORT_ON
(parse_events_term__sym_hw
(&term
, NULL
, config
));
411 struct parse_events_term
*term
;
413 ABORT_ON
(parse_events_term__str
(&term
, (int)$1, NULL
, $3));
419 struct parse_events_term
*term
;
421 ABORT_ON
(parse_events_term__num
(&term
, (int)$1, NULL
, $3));
427 struct parse_events_term
*term
;
429 ABORT_ON
(parse_events_term__num
(&term
, (int)$1, NULL
, 1));
435 sep_slash_dc: '/' |
':' |
439 void parse_events_error
(void *data __maybe_unused
, void *scanner __maybe_unused
,
440 char const *msg __maybe_unused
)