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
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
61 struct list_head *head;
62 struct parse_events__term *term;
67 PE_START_EVENTS events
72 events ',' event | event
75 event_def PE_MODIFIER_EVENT
77 struct parse_events_data__events *data = _data;
80 * Apply modifier on all events added by single event definition
81 * (there could be more events added for multiple tracepoint
82 * definitions via '*?'.
84 ABORT_ON(parse_events_modifier($1, $2));
85 parse_events_update_lists($1, &data->list);
90 struct parse_events_data__events *data = _data;
92 parse_events_update_lists($1, &data->list);
95 event_def: event_pmu |
97 event_legacy_cache sep_dc |
99 event_legacy_tracepoint sep_dc |
100 event_legacy_numeric sep_dc |
101 event_legacy_raw sep_dc
104 PE_NAME '/' event_config '/'
106 struct parse_events_data__events *data = _data;
107 struct list_head *list = NULL;
109 ABORT_ON(parse_events_add_pmu(&list, &data->idx, $1, $3));
110 parse_events__free_terms($3);
120 value_sym '/' event_config '/'
122 struct parse_events_data__events *data = _data;
123 struct list_head *list = NULL;
125 int config = $1 & 255;
127 ABORT_ON(parse_events_add_numeric(&list, &data->idx,
129 parse_events__free_terms($3);
133 value_sym sep_slash_dc
135 struct parse_events_data__events *data = _data;
136 struct list_head *list = NULL;
138 int config = $1 & 255;
140 ABORT_ON(parse_events_add_numeric(&list, &data->idx,
141 type, config, NULL));
146 PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT '-' PE_NAME_CACHE_OP_RESULT
148 struct parse_events_data__events *data = _data;
149 struct list_head *list = NULL;
151 ABORT_ON(parse_events_add_cache(&list, &data->idx, $1, $3, $5));
155 PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT
157 struct parse_events_data__events *data = _data;
158 struct list_head *list = NULL;
160 ABORT_ON(parse_events_add_cache(&list, &data->idx, $1, $3, NULL));
166 struct parse_events_data__events *data = _data;
167 struct list_head *list = NULL;
169 ABORT_ON(parse_events_add_cache(&list, &data->idx, $1, NULL, NULL));
174 PE_PREFIX_MEM PE_VALUE ':' PE_MODIFIER_BP sep_dc
176 struct parse_events_data__events *data = _data;
177 struct list_head *list = NULL;
179 ABORT_ON(parse_events_add_breakpoint(&list, &data->idx,
184 PE_PREFIX_MEM PE_VALUE sep_dc
186 struct parse_events_data__events *data = _data;
187 struct list_head *list = NULL;
189 ABORT_ON(parse_events_add_breakpoint(&list, &data->idx,
194 event_legacy_tracepoint:
197 struct parse_events_data__events *data = _data;
198 struct list_head *list = NULL;
200 ABORT_ON(parse_events_add_tracepoint(&list, &data->idx, $1, $3));
204 event_legacy_numeric:
205 PE_VALUE ':' PE_VALUE
207 struct parse_events_data__events *data = _data;
208 struct list_head *list = NULL;
210 ABORT_ON(parse_events_add_numeric(&list, &data->idx, $1, $3, NULL));
217 struct parse_events_data__events *data = _data;
218 struct list_head *list = NULL;
220 ABORT_ON(parse_events_add_numeric(&list, &data->idx,
221 PERF_TYPE_RAW, $1, NULL));
227 struct parse_events_data__terms *data = _data;
232 event_config ',' event_term
234 struct list_head *head = $1;
235 struct parse_events__term *term = $3;
238 list_add_tail(&term->list, head);
244 struct list_head *head = malloc(sizeof(*head));
245 struct parse_events__term *term = $1;
248 INIT_LIST_HEAD(head);
249 list_add_tail(&term->list, head);
256 struct parse_events__term *term;
258 ABORT_ON(parse_events__term_str(&term, PARSE_EVENTS__TERM_TYPE_USER,
265 struct parse_events__term *term;
267 ABORT_ON(parse_events__term_num(&term, PARSE_EVENTS__TERM_TYPE_USER,
274 struct parse_events__term *term;
276 ABORT_ON(parse_events__term_num(&term, PARSE_EVENTS__TERM_TYPE_USER,
283 struct parse_events__term *term;
285 ABORT_ON(parse_events__term_str(&term, $1, NULL, $3));
291 struct parse_events__term *term;
293 ABORT_ON(parse_events__term_num(&term, $1, NULL, $3));
299 struct parse_events__term *term;
301 ABORT_ON(parse_events__term_num(&term, $1, NULL, 1));
307 sep_slash_dc: '/' | ':' |
311 void parse_events_error(void *data __used, void *scanner __used,
312 char const *msg __used)