2 %name
-prefix
"parse_events_"
3 %parse
-param
{void *_data
}
4 %parse
-param
{void *scanner
}
5 %lex
-param
{void* scanner
}
11 #include <linux/compiler.h>
12 #include <linux/list.h>
15 #include "parse-events.h"
16 #include "parse-events-bison.h"
18 extern
int parse_events_lex
(YYSTYPE* lvalp
, void* scanner
);
20 #define ABORT_ON(val) \
28 %token PE_START_EVENTS PE_START_TERMS
29 %token PE_VALUE PE_VALUE_SYM_HW PE_VALUE_SYM_SW PE_RAW PE_TERM
31 %token PE_MODIFIER_EVENT PE_MODIFIER_BP
32 %token PE_NAME_CACHE_TYPE PE_NAME_CACHE_OP_RESULT
33 %token PE_PREFIX_MEM PE_PREFIX_RAW PE_PREFIX_GROUP
36 %type
<num
> PE_VALUE_SYM_HW
37 %type
<num
> PE_VALUE_SYM_SW
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
46 %type
<head
> event_config
47 %type
<term
> event_term
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
58 %type
<head
> group_def
66 struct list_head
*head
;
67 struct parse_events__term
*term
;
72 PE_START_EVENTS start_events
74 PE_START_TERMS start_terms
78 struct parse_events_data__events
*data
= _data
;
80 parse_events_update_lists
($1, &data
->list
);
86 struct list_head
*list
= $1;
87 struct list_head
*group
= $3;
89 parse_events_update_lists
(group
, list
);
95 struct list_head
*list
= $1;
96 struct list_head
*event
= $3;
98 parse_events_update_lists
(event
, list
);
107 group_def
':' PE_MODIFIER_EVENT
109 struct list_head
*list
= $1;
111 ABORT_ON
(parse_events__modifier_group
(list
, $3));
118 PE_NAME
'{' events
'}'
120 struct list_head
*list
= $3;
122 parse_events__group
($1, list
);
128 struct list_head
*list
= $2;
130 parse_events__group
(NULL
, list
);
137 struct list_head
*event
= $3;
138 struct list_head
*list
= $1;
140 parse_events_update_lists
(event
, list
);
147 event_def PE_MODIFIER_EVENT
149 struct list_head
*list
= $1;
152 * Apply modifier on all events added by single event definition
153 * (there could be more events added for multiple tracepoint
154 * definitions via '*?'.
156 ABORT_ON
(parse_events__modifier_event
(list
, $2));
162 event_def: event_pmu |
163 event_legacy_symbol |
164 event_legacy_cache sep_dc |
166 event_legacy_tracepoint sep_dc |
167 event_legacy_numeric sep_dc |
168 event_legacy_raw sep_dc
171 PE_NAME
'/' event_config
'/'
173 struct parse_events_data__events
*data
= _data
;
174 struct list_head
*list
= NULL
;
176 ABORT_ON
(parse_events_add_pmu
(&list
, &data
->idx
, $1, $3));
177 parse_events__free_terms
($3);
187 value_sym
'/' event_config
'/'
189 struct parse_events_data__events
*data
= _data
;
190 struct list_head
*list
= NULL
;
192 int config
= $1 & 255;
194 ABORT_ON
(parse_events_add_numeric
(&list
, &data
->idx
,
196 parse_events__free_terms
($3);
200 value_sym sep_slash_dc
202 struct parse_events_data__events
*data
= _data
;
203 struct list_head
*list
= NULL
;
205 int config
= $1 & 255;
207 ABORT_ON
(parse_events_add_numeric
(&list
, &data
->idx
,
208 type
, config
, NULL
));
213 PE_NAME_CACHE_TYPE
'-' PE_NAME_CACHE_OP_RESULT
'-' PE_NAME_CACHE_OP_RESULT
215 struct parse_events_data__events
*data
= _data
;
216 struct list_head
*list
= NULL
;
218 ABORT_ON
(parse_events_add_cache
(&list
, &data
->idx
, $1, $3, $5));
222 PE_NAME_CACHE_TYPE
'-' PE_NAME_CACHE_OP_RESULT
224 struct parse_events_data__events
*data
= _data
;
225 struct list_head
*list
= NULL
;
227 ABORT_ON
(parse_events_add_cache
(&list
, &data
->idx
, $1, $3, NULL
));
233 struct parse_events_data__events
*data
= _data
;
234 struct list_head
*list
= NULL
;
236 ABORT_ON
(parse_events_add_cache
(&list
, &data
->idx
, $1, NULL
, NULL
));
241 PE_PREFIX_MEM PE_VALUE
':' PE_MODIFIER_BP sep_dc
243 struct parse_events_data__events
*data
= _data
;
244 struct list_head
*list
= NULL
;
246 ABORT_ON
(parse_events_add_breakpoint
(&list
, &data
->idx
,
251 PE_PREFIX_MEM PE_VALUE sep_dc
253 struct parse_events_data__events
*data
= _data
;
254 struct list_head
*list
= NULL
;
256 ABORT_ON
(parse_events_add_breakpoint
(&list
, &data
->idx
,
261 event_legacy_tracepoint:
264 struct parse_events_data__events
*data
= _data
;
265 struct list_head
*list
= NULL
;
267 ABORT_ON
(parse_events_add_tracepoint
(&list
, &data
->idx
, $1, $3));
271 event_legacy_numeric:
272 PE_VALUE
':' PE_VALUE
274 struct parse_events_data__events
*data
= _data
;
275 struct list_head
*list
= NULL
;
277 ABORT_ON
(parse_events_add_numeric
(&list
, &data
->idx
, (u32
)$1, $3, NULL
));
284 struct parse_events_data__events
*data
= _data
;
285 struct list_head
*list
= NULL
;
287 ABORT_ON
(parse_events_add_numeric
(&list
, &data
->idx
,
288 PERF_TYPE_RAW
, $1, NULL
));
292 start_terms: event_config
294 struct parse_events_data__terms
*data
= _data
;
299 event_config
',' event_term
301 struct list_head
*head
= $1;
302 struct parse_events__term
*term
= $3;
305 list_add_tail
(&term
->list
, head
);
311 struct list_head
*head
= malloc
(sizeof
(*head
));
312 struct parse_events__term
*term
= $1;
315 INIT_LIST_HEAD
(head
);
316 list_add_tail
(&term
->list
, head
);
323 struct parse_events__term
*term
;
325 ABORT_ON
(parse_events__term_str
(&term
, PARSE_EVENTS__TERM_TYPE_USER
,
332 struct parse_events__term
*term
;
334 ABORT_ON
(parse_events__term_num
(&term
, PARSE_EVENTS__TERM_TYPE_USER
,
341 struct parse_events__term
*term
;
343 ABORT_ON
(parse_events__term_num
(&term
, PARSE_EVENTS__TERM_TYPE_USER
,
350 struct parse_events__term
*term
;
352 ABORT_ON
(parse_events__term_str
(&term
, (int)$1, NULL
, $3));
358 struct parse_events__term
*term
;
360 ABORT_ON
(parse_events__term_num
(&term
, (int)$1, NULL
, $3));
366 struct parse_events__term
*term
;
368 ABORT_ON
(parse_events__term_num
(&term
, (int)$1, NULL
, 1));
374 sep_slash_dc: '/' |
':' |
378 void parse_events_error
(void *data __used
, void *scanner __used
,
379 char const *msg __used
)