blob: 9525c455d27f9b095343b0e8ceaa3a63add8c2fd [file] [log] [blame]
Zheng Yanac20de6f2012-06-15 14:31:39 +08001%pure-parser
Jiri Olsa89812fc2012-03-15 20:09:15 +01002%name-prefix "parse_events_"
Jiri Olsa46010ab2012-06-15 14:31:38 +08003%parse-param {void *_data}
Zheng Yanac20de6f2012-06-15 14:31:39 +08004%parse-param {void *scanner}
5%lex-param {void* scanner}
Jiri Olsa89812fc2012-03-15 20:09:15 +01006
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"
Zheng Yanac20de6f2012-06-15 14:31:39 +080016#include "parse-events-bison.h"
Jiri Olsa89812fc2012-03-15 20:09:15 +010017
Zheng Yanac20de6f2012-06-15 14:31:39 +080018extern int parse_events_lex (YYSTYPE* lvalp, void* scanner);
Jiri Olsa89812fc2012-03-15 20:09:15 +010019
20#define ABORT_ON(val) \
21do { \
22 if (val) \
23 YYABORT; \
24} while (0)
25
26%}
27
Jiri Olsa90e2b222012-06-15 14:31:40 +080028%token PE_START_EVENTS PE_START_TERMS
Jiri Olsa8f707d82012-03-15 20:09:16 +010029%token PE_VALUE PE_VALUE_SYM PE_RAW PE_TERM
Jiri Olsa89812fc2012-03-15 20:09:15 +010030%token PE_NAME
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
34%token PE_ERROR
35%type <num> PE_VALUE
36%type <num> PE_VALUE_SYM
37%type <num> PE_RAW
Jiri Olsa8f707d82012-03-15 20:09:16 +010038%type <num> PE_TERM
Jiri Olsa89812fc2012-03-15 20:09:15 +010039%type <str> PE_NAME
40%type <str> PE_NAME_CACHE_TYPE
41%type <str> PE_NAME_CACHE_OP_RESULT
42%type <str> PE_MODIFIER_EVENT
43%type <str> PE_MODIFIER_BP
Jiri Olsa8f707d82012-03-15 20:09:16 +010044%type <head> event_config
45%type <term> event_term
Jiri Olsab847cbd2012-05-21 09:12:51 +020046%type <head> event_pmu
47%type <head> event_legacy_symbol
48%type <head> event_legacy_cache
49%type <head> event_legacy_mem
50%type <head> event_legacy_tracepoint
51%type <head> event_legacy_numeric
52%type <head> event_legacy_raw
53%type <head> event_def
Jiri Olsa89812fc2012-03-15 20:09:15 +010054
55%union
56{
57 char *str;
58 unsigned long num;
Jiri Olsa8f707d82012-03-15 20:09:16 +010059 struct list_head *head;
60 struct parse_events__term *term;
Jiri Olsa89812fc2012-03-15 20:09:15 +010061}
62%%
63
Jiri Olsa90e2b222012-06-15 14:31:40 +080064start:
65PE_START_EVENTS events
66|
67PE_START_TERMS terms
68
Jiri Olsa89812fc2012-03-15 20:09:15 +010069events:
70events ',' event | event
71
72event:
73event_def PE_MODIFIER_EVENT
74{
Jiri Olsa46010ab2012-06-15 14:31:38 +080075 struct parse_events_data__events *data = _data;
76
Jiri Olsa5d7be902012-03-20 19:15:40 +010077 /*
78 * Apply modifier on all events added by single event definition
79 * (there could be more events added for multiple tracepoint
80 * definitions via '*?'.
81 */
Jiri Olsab847cbd2012-05-21 09:12:51 +020082 ABORT_ON(parse_events_modifier($1, $2));
Jiri Olsa46010ab2012-06-15 14:31:38 +080083 parse_events_update_lists($1, &data->list);
Jiri Olsa89812fc2012-03-15 20:09:15 +010084}
85|
86event_def
Jiri Olsa5d7be902012-03-20 19:15:40 +010087{
Jiri Olsa46010ab2012-06-15 14:31:38 +080088 struct parse_events_data__events *data = _data;
89
90 parse_events_update_lists($1, &data->list);
Jiri Olsa5d7be902012-03-20 19:15:40 +010091}
Jiri Olsa89812fc2012-03-15 20:09:15 +010092
Jiri Olsa5f537a22012-03-15 20:09:18 +010093event_def: event_pmu |
94 event_legacy_symbol |
Jiri Olsa89812fc2012-03-15 20:09:15 +010095 event_legacy_cache sep_dc |
96 event_legacy_mem |
97 event_legacy_tracepoint sep_dc |
98 event_legacy_numeric sep_dc |
99 event_legacy_raw sep_dc
100
Jiri Olsa5f537a22012-03-15 20:09:18 +0100101event_pmu:
102PE_NAME '/' event_config '/'
103{
Jiri Olsa46010ab2012-06-15 14:31:38 +0800104 struct parse_events_data__events *data = _data;
Jiri Olsab847cbd2012-05-21 09:12:51 +0200105 struct list_head *list = NULL;
106
Jiri Olsa46010ab2012-06-15 14:31:38 +0800107 ABORT_ON(parse_events_add_pmu(&list, &data->idx, $1, $3));
Jiri Olsa5f537a22012-03-15 20:09:18 +0100108 parse_events__free_terms($3);
Jiri Olsab847cbd2012-05-21 09:12:51 +0200109 $$ = list;
Jiri Olsa5f537a22012-03-15 20:09:18 +0100110}
111
Jiri Olsa89812fc2012-03-15 20:09:15 +0100112event_legacy_symbol:
Jiri Olsa8f707d82012-03-15 20:09:16 +0100113PE_VALUE_SYM '/' event_config '/'
Jiri Olsa89812fc2012-03-15 20:09:15 +0100114{
Jiri Olsa46010ab2012-06-15 14:31:38 +0800115 struct parse_events_data__events *data = _data;
Jiri Olsab847cbd2012-05-21 09:12:51 +0200116 struct list_head *list = NULL;
Jiri Olsa89812fc2012-03-15 20:09:15 +0100117 int type = $1 >> 16;
118 int config = $1 & 255;
119
Jiri Olsa46010ab2012-06-15 14:31:38 +0800120 ABORT_ON(parse_events_add_numeric(&list, &data->idx,
121 type, config, $3));
Jiri Olsa8f707d82012-03-15 20:09:16 +0100122 parse_events__free_terms($3);
Jiri Olsab847cbd2012-05-21 09:12:51 +0200123 $$ = list;
Jiri Olsa8f707d82012-03-15 20:09:16 +0100124}
125|
126PE_VALUE_SYM sep_slash_dc
127{
Jiri Olsa46010ab2012-06-15 14:31:38 +0800128 struct parse_events_data__events *data = _data;
Jiri Olsab847cbd2012-05-21 09:12:51 +0200129 struct list_head *list = NULL;
Jiri Olsa8f707d82012-03-15 20:09:16 +0100130 int type = $1 >> 16;
131 int config = $1 & 255;
132
Jiri Olsa46010ab2012-06-15 14:31:38 +0800133 ABORT_ON(parse_events_add_numeric(&list, &data->idx,
134 type, config, NULL));
Jiri Olsab847cbd2012-05-21 09:12:51 +0200135 $$ = list;
Jiri Olsa89812fc2012-03-15 20:09:15 +0100136}
137
138event_legacy_cache:
139PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT '-' PE_NAME_CACHE_OP_RESULT
140{
Jiri Olsa46010ab2012-06-15 14:31:38 +0800141 struct parse_events_data__events *data = _data;
Jiri Olsab847cbd2012-05-21 09:12:51 +0200142 struct list_head *list = NULL;
143
Jiri Olsa46010ab2012-06-15 14:31:38 +0800144 ABORT_ON(parse_events_add_cache(&list, &data->idx, $1, $3, $5));
Jiri Olsab847cbd2012-05-21 09:12:51 +0200145 $$ = list;
Jiri Olsa89812fc2012-03-15 20:09:15 +0100146}
147|
148PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT
149{
Jiri Olsa46010ab2012-06-15 14:31:38 +0800150 struct parse_events_data__events *data = _data;
Jiri Olsab847cbd2012-05-21 09:12:51 +0200151 struct list_head *list = NULL;
152
Jiri Olsa46010ab2012-06-15 14:31:38 +0800153 ABORT_ON(parse_events_add_cache(&list, &data->idx, $1, $3, NULL));
Jiri Olsab847cbd2012-05-21 09:12:51 +0200154 $$ = list;
Jiri Olsa89812fc2012-03-15 20:09:15 +0100155}
156|
157PE_NAME_CACHE_TYPE
158{
Jiri Olsa46010ab2012-06-15 14:31:38 +0800159 struct parse_events_data__events *data = _data;
Jiri Olsab847cbd2012-05-21 09:12:51 +0200160 struct list_head *list = NULL;
161
Jiri Olsa46010ab2012-06-15 14:31:38 +0800162 ABORT_ON(parse_events_add_cache(&list, &data->idx, $1, NULL, NULL));
Jiri Olsab847cbd2012-05-21 09:12:51 +0200163 $$ = list;
Jiri Olsa89812fc2012-03-15 20:09:15 +0100164}
165
166event_legacy_mem:
167PE_PREFIX_MEM PE_VALUE ':' PE_MODIFIER_BP sep_dc
168{
Jiri Olsa46010ab2012-06-15 14:31:38 +0800169 struct parse_events_data__events *data = _data;
Jiri Olsab847cbd2012-05-21 09:12:51 +0200170 struct list_head *list = NULL;
171
Jiri Olsa46010ab2012-06-15 14:31:38 +0800172 ABORT_ON(parse_events_add_breakpoint(&list, &data->idx,
173 (void *) $2, $4));
Jiri Olsab847cbd2012-05-21 09:12:51 +0200174 $$ = list;
Jiri Olsa89812fc2012-03-15 20:09:15 +0100175}
176|
177PE_PREFIX_MEM PE_VALUE sep_dc
178{
Jiri Olsa46010ab2012-06-15 14:31:38 +0800179 struct parse_events_data__events *data = _data;
Jiri Olsab847cbd2012-05-21 09:12:51 +0200180 struct list_head *list = NULL;
181
Jiri Olsa46010ab2012-06-15 14:31:38 +0800182 ABORT_ON(parse_events_add_breakpoint(&list, &data->idx,
183 (void *) $2, NULL));
Jiri Olsab847cbd2012-05-21 09:12:51 +0200184 $$ = list;
Jiri Olsa89812fc2012-03-15 20:09:15 +0100185}
186
187event_legacy_tracepoint:
188PE_NAME ':' PE_NAME
189{
Jiri Olsa46010ab2012-06-15 14:31:38 +0800190 struct parse_events_data__events *data = _data;
Jiri Olsab847cbd2012-05-21 09:12:51 +0200191 struct list_head *list = NULL;
192
Jiri Olsa46010ab2012-06-15 14:31:38 +0800193 ABORT_ON(parse_events_add_tracepoint(&list, &data->idx, $1, $3));
Jiri Olsab847cbd2012-05-21 09:12:51 +0200194 $$ = list;
Jiri Olsa89812fc2012-03-15 20:09:15 +0100195}
196
197event_legacy_numeric:
198PE_VALUE ':' PE_VALUE
199{
Jiri Olsa46010ab2012-06-15 14:31:38 +0800200 struct parse_events_data__events *data = _data;
Jiri Olsab847cbd2012-05-21 09:12:51 +0200201 struct list_head *list = NULL;
202
Jiri Olsa46010ab2012-06-15 14:31:38 +0800203 ABORT_ON(parse_events_add_numeric(&list, &data->idx, $1, $3, NULL));
Jiri Olsab847cbd2012-05-21 09:12:51 +0200204 $$ = list;
Jiri Olsa89812fc2012-03-15 20:09:15 +0100205}
206
207event_legacy_raw:
208PE_RAW
209{
Jiri Olsa46010ab2012-06-15 14:31:38 +0800210 struct parse_events_data__events *data = _data;
Jiri Olsab847cbd2012-05-21 09:12:51 +0200211 struct list_head *list = NULL;
212
Jiri Olsa46010ab2012-06-15 14:31:38 +0800213 ABORT_ON(parse_events_add_numeric(&list, &data->idx,
214 PERF_TYPE_RAW, $1, NULL));
Jiri Olsab847cbd2012-05-21 09:12:51 +0200215 $$ = list;
Jiri Olsa8f707d82012-03-15 20:09:16 +0100216}
217
Jiri Olsa90e2b222012-06-15 14:31:40 +0800218terms: event_config
219{
220 struct parse_events_data__terms *data = _data;
221 data->terms = $1;
222}
223
Jiri Olsa8f707d82012-03-15 20:09:16 +0100224event_config:
225event_config ',' event_term
226{
227 struct list_head *head = $1;
228 struct parse_events__term *term = $3;
229
230 ABORT_ON(!head);
231 list_add_tail(&term->list, head);
232 $$ = $1;
233}
234|
235event_term
236{
237 struct list_head *head = malloc(sizeof(*head));
238 struct parse_events__term *term = $1;
239
240 ABORT_ON(!head);
241 INIT_LIST_HEAD(head);
242 list_add_tail(&term->list, head);
243 $$ = head;
244}
245
246event_term:
247PE_NAME '=' PE_NAME
248{
249 struct parse_events__term *term;
250
Jiri Olsa16fa7e82012-04-25 18:24:57 +0200251 ABORT_ON(parse_events__term_str(&term, PARSE_EVENTS__TERM_TYPE_USER,
252 $1, $3));
Jiri Olsa8f707d82012-03-15 20:09:16 +0100253 $$ = term;
254}
255|
256PE_NAME '=' PE_VALUE
257{
258 struct parse_events__term *term;
259
Jiri Olsa16fa7e82012-04-25 18:24:57 +0200260 ABORT_ON(parse_events__term_num(&term, PARSE_EVENTS__TERM_TYPE_USER,
261 $1, $3));
Jiri Olsa8f707d82012-03-15 20:09:16 +0100262 $$ = term;
263}
264|
265PE_NAME
266{
267 struct parse_events__term *term;
268
Jiri Olsa16fa7e82012-04-25 18:24:57 +0200269 ABORT_ON(parse_events__term_num(&term, PARSE_EVENTS__TERM_TYPE_USER,
270 $1, 1));
Jiri Olsa8f707d82012-03-15 20:09:16 +0100271 $$ = term;
272}
273|
Jiri Olsa6b5fc392012-05-21 09:12:53 +0200274PE_TERM '=' PE_NAME
275{
276 struct parse_events__term *term;
277
278 ABORT_ON(parse_events__term_str(&term, $1, NULL, $3));
279 $$ = term;
280}
281|
Jiri Olsa8f707d82012-03-15 20:09:16 +0100282PE_TERM '=' PE_VALUE
283{
284 struct parse_events__term *term;
285
Jiri Olsa16fa7e82012-04-25 18:24:57 +0200286 ABORT_ON(parse_events__term_num(&term, $1, NULL, $3));
Jiri Olsa8f707d82012-03-15 20:09:16 +0100287 $$ = term;
288}
289|
290PE_TERM
291{
292 struct parse_events__term *term;
293
Jiri Olsa16fa7e82012-04-25 18:24:57 +0200294 ABORT_ON(parse_events__term_num(&term, $1, NULL, 1));
Jiri Olsa8f707d82012-03-15 20:09:16 +0100295 $$ = term;
Jiri Olsa89812fc2012-03-15 20:09:15 +0100296}
297
298sep_dc: ':' |
299
Jiri Olsa8f707d82012-03-15 20:09:16 +0100300sep_slash_dc: '/' | ':' |
301
Jiri Olsa89812fc2012-03-15 20:09:15 +0100302%%
303
Zheng Yanac20de6f2012-06-15 14:31:39 +0800304void parse_events_error(void *data __used, void *scanner __used,
Jiri Olsa89812fc2012-03-15 20:09:15 +0100305 char const *msg __used)
306{
307}