Commit cd82a32e9924d3a82bd27f830755d23e4ded25bc
Committed by
Arnaldo Carvalho de Melo
1 parent
8f707d843c
Exists in
smarc-l5.0.0_1.0.0-ga
and in
5 other branches
perf tools: Add perf pmu object to access pmu format definition
Adding pmu object which provides interface to pmu's sysfs event format definition located at: ${sysfs_mount}/bus/event_source/devices/${pmu}/format Following interface is exported: struct perf_pmu* perf_pmu__find(char *name); - this function returns pmu object, which is then passed as a handle to other interface functions int perf_pmu__config(struct perf_pmu *pmu, struct perf_event_attr *attr, struct list_head *head_terms); - this function configures perf_event_attr struct based on pmu's format definitions and config terms data, containined in head_terms list. Parser generator is used to retrive the pmu's format definition. The generated parser is part of the patch. Added makefile rule 'pmu-parser' to generate the parser code out of the bison/flex sources. Added builtin test 'Test perf pmu format parsing', which could be run like: perf test pmu Acked-by: Peter Zijlstra <peterz@infradead.org> Signed-off-by: Jiri Olsa <jolsa@redhat.com> Link: http://lkml.kernel.org/n/tip-errz96u1668gj9wlop1zhpht@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Showing 10 changed files with 4541 additions and 0 deletions Side-by-side Diff
tools/perf/Makefile
... | ... | @@ -276,6 +276,7 @@ |
276 | 276 | LIB_H += util/debug.h |
277 | 277 | LIB_H += util/debugfs.h |
278 | 278 | LIB_H += util/sysfs.h |
279 | +LIB_H += util/pmu.h | |
279 | 280 | LIB_H += util/event.h |
280 | 281 | LIB_H += util/evsel.h |
281 | 282 | LIB_H += util/evlist.h |
... | ... | @@ -323,6 +324,7 @@ |
323 | 324 | LIB_OBJS += $(OUTPUT)util/ctype.o |
324 | 325 | LIB_OBJS += $(OUTPUT)util/debugfs.o |
325 | 326 | LIB_OBJS += $(OUTPUT)util/sysfs.o |
327 | +LIB_OBJS += $(OUTPUT)util/pmu.o | |
326 | 328 | LIB_OBJS += $(OUTPUT)util/environment.o |
327 | 329 | LIB_OBJS += $(OUTPUT)util/event.o |
328 | 330 | LIB_OBJS += $(OUTPUT)util/evlist.o |
... | ... | @@ -361,6 +363,8 @@ |
361 | 363 | LIB_OBJS += $(OUTPUT)util/trace-event-parse.o |
362 | 364 | LIB_OBJS += $(OUTPUT)util/parse-events-flex.o |
363 | 365 | LIB_OBJS += $(OUTPUT)util/parse-events-bison.o |
366 | +LIB_OBJS += $(OUTPUT)util/pmu-flex.o | |
367 | +LIB_OBJS += $(OUTPUT)util/pmu-bison.o | |
364 | 368 | LIB_OBJS += $(OUTPUT)util/trace-event-read.o |
365 | 369 | LIB_OBJS += $(OUTPUT)util/trace-event-info.o |
366 | 370 | LIB_OBJS += $(OUTPUT)util/trace-event-scripting.o |
... | ... | @@ -773,6 +777,9 @@ |
773 | 777 | $(OUTPUT)util/parse-events-flex.o: util/parse-events-flex.c $(OUTPUT)PERF-CFLAGS |
774 | 778 | $(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) -Wno-redundant-decls -Wno-switch-default -Wno-unused-function $< |
775 | 779 | |
780 | +$(OUTPUT)util/pmu-flex.o: util/pmu-flex.c $(OUTPUT)PERF-CFLAGS | |
781 | + $(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) -Wno-redundant-decls -Wno-switch-default -Wno-unused-function $< | |
782 | + | |
776 | 783 | $(OUTPUT)util/scripting-engines/trace-event-perl.o: util/scripting-engines/trace-event-perl.c $(OUTPUT)PERF-CFLAGS |
777 | 784 | $(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) $(PERL_EMBED_CCOPTS) -Wno-redundant-decls -Wno-strict-prototypes -Wno-unused-parameter -Wno-shadow $< |
778 | 785 | |
... | ... | @@ -810,6 +817,7 @@ |
810 | 817 | @echo ' info - make GNU info documentation (access with info <foo>)' |
811 | 818 | @echo ' pdf - make pdf documentation' |
812 | 819 | @echo ' event-parser - make event parser code' |
820 | + @echo ' pmu-parser - make pmu format parser code' | |
813 | 821 | @echo ' TAGS - use etags to make tag information for source browsing' |
814 | 822 | @echo ' tags - use ctags to make tag information for source browsing' |
815 | 823 | @echo ' cscope - use cscope to make interactive browsing database' |
... | ... | @@ -862,6 +870,10 @@ |
862 | 870 | event-parser: |
863 | 871 | $(QUIET_BISON)$(BISON) -v util/parse-events.y -d -o util/parse-events-bison.c |
864 | 872 | $(QUIET_FLEX)$(FLEX) --header-file=util/parse-events-flex.h -t util/parse-events.l > util/parse-events-flex.c |
873 | + | |
874 | +pmu-parser: | |
875 | + $(QUIET_BISON)$(BISON) -v util/pmu.y -d -o util/pmu-bison.c | |
876 | + $(QUIET_FLEX)$(FLEX) --header-file=util/pmu-flex.h -t util/pmu.l > util/pmu-flex.c | |
865 | 877 | |
866 | 878 | ### Detect prefix changes |
867 | 879 | TRACK_CFLAGS = $(subst ','\'',$(ALL_CFLAGS)):\ |
tools/perf/builtin-test.c
... | ... | @@ -13,6 +13,7 @@ |
13 | 13 | #include "util/parse-events.h" |
14 | 14 | #include "util/symbol.h" |
15 | 15 | #include "util/thread_map.h" |
16 | +#include "util/pmu.h" | |
16 | 17 | #include "../../include/linux/hw_breakpoint.h" |
17 | 18 | |
18 | 19 | #include <sys/mman.h> |
... | ... | @@ -1484,6 +1485,11 @@ |
1484 | 1485 | |
1485 | 1486 | #endif |
1486 | 1487 | |
1488 | +static int test__perf_pmu(void) | |
1489 | +{ | |
1490 | + return perf_pmu__test(); | |
1491 | +} | |
1492 | + | |
1487 | 1493 | static struct test { |
1488 | 1494 | const char *desc; |
1489 | 1495 | int (*func)(void); |
... | ... | @@ -1517,6 +1523,10 @@ |
1517 | 1523 | { |
1518 | 1524 | .desc = "Validate PERF_RECORD_* events & perf_sample fields", |
1519 | 1525 | .func = test__PERF_RECORD, |
1526 | + }, | |
1527 | + { | |
1528 | + .desc = "Test perf pmu format parsing", | |
1529 | + .func = test__perf_pmu, | |
1520 | 1530 | }, |
1521 | 1531 | { |
1522 | 1532 | .func = NULL, |
tools/perf/util/pmu-bison.c
Changes suppressed. Click to show
1 | +/* A Bison parser, made by GNU Bison 2.4.3. */ | |
2 | + | |
3 | +/* Skeleton implementation for Bison's Yacc-like parsers in C | |
4 | + | |
5 | + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006, | |
6 | + 2009, 2010 Free Software Foundation, Inc. | |
7 | + | |
8 | + This program is free software: you can redistribute it and/or modify | |
9 | + it under the terms of the GNU General Public License as published by | |
10 | + the Free Software Foundation, either version 3 of the License, or | |
11 | + (at your option) any later version. | |
12 | + | |
13 | + This program is distributed in the hope that it will be useful, | |
14 | + but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 | + GNU General Public License for more details. | |
17 | + | |
18 | + You should have received a copy of the GNU General Public License | |
19 | + along with this program. If not, see <http://www.gnu.org/licenses/>. */ | |
20 | + | |
21 | +/* As a special exception, you may create a larger work that contains | |
22 | + part or all of the Bison parser skeleton and distribute that work | |
23 | + under terms of your choice, so long as that work isn't itself a | |
24 | + parser generator using the skeleton or a modified version thereof | |
25 | + as a parser skeleton. Alternatively, if you modify or redistribute | |
26 | + the parser skeleton itself, you may (at your option) remove this | |
27 | + special exception, which will cause the skeleton and the resulting | |
28 | + Bison output files to be licensed under the GNU General Public | |
29 | + License without this special exception. | |
30 | + | |
31 | + This special exception was added by the Free Software Foundation in | |
32 | + version 2.2 of Bison. */ | |
33 | + | |
34 | +/* C LALR(1) parser skeleton written by Richard Stallman, by | |
35 | + simplifying the original so-called "semantic" parser. */ | |
36 | + | |
37 | +/* All symbols defined below should begin with yy or YY, to avoid | |
38 | + infringing on user name space. This should be done even for local | |
39 | + variables, as they might otherwise be expanded by user macros. | |
40 | + There are some unavoidable exceptions within include files to | |
41 | + define necessary library symbols; they are noted "INFRINGES ON | |
42 | + USER NAME SPACE" below. */ | |
43 | + | |
44 | +/* Identify Bison output. */ | |
45 | +#define YYBISON 1 | |
46 | + | |
47 | +/* Bison version. */ | |
48 | +#define YYBISON_VERSION "2.4.3" | |
49 | + | |
50 | +/* Skeleton name. */ | |
51 | +#define YYSKELETON_NAME "yacc.c" | |
52 | + | |
53 | +/* Pure parsers. */ | |
54 | +#define YYPURE 0 | |
55 | + | |
56 | +/* Push parsers. */ | |
57 | +#define YYPUSH 0 | |
58 | + | |
59 | +/* Pull parsers. */ | |
60 | +#define YYPULL 1 | |
61 | + | |
62 | +/* Using locations. */ | |
63 | +#define YYLSP_NEEDED 0 | |
64 | + | |
65 | +/* Substitute the variable and function names. */ | |
66 | +#define yyparse perf_pmu_parse | |
67 | +#define yylex perf_pmu_lex | |
68 | +#define yyerror perf_pmu_error | |
69 | +#define yylval perf_pmu_lval | |
70 | +#define yychar perf_pmu_char | |
71 | +#define yydebug perf_pmu_debug | |
72 | +#define yynerrs perf_pmu_nerrs | |
73 | + | |
74 | + | |
75 | +/* Copy the first part of user declarations. */ | |
76 | + | |
77 | +/* Line 189 of yacc.c */ | |
78 | +#line 6 "util/pmu.y" | |
79 | + | |
80 | + | |
81 | +#include <linux/compiler.h> | |
82 | +#include <linux/list.h> | |
83 | +#include <linux/bitmap.h> | |
84 | +#include <string.h> | |
85 | +#include "pmu.h" | |
86 | + | |
87 | +extern int perf_pmu_lex (void); | |
88 | + | |
89 | +#define ABORT_ON(val) \ | |
90 | +do { \ | |
91 | + if (val) \ | |
92 | + YYABORT; \ | |
93 | +} while (0) | |
94 | + | |
95 | + | |
96 | + | |
97 | +/* Line 189 of yacc.c */ | |
98 | +#line 99 "util/pmu-bison.c" | |
99 | + | |
100 | +/* Enabling traces. */ | |
101 | +#ifndef YYDEBUG | |
102 | +# define YYDEBUG 0 | |
103 | +#endif | |
104 | + | |
105 | +/* Enabling verbose error messages. */ | |
106 | +#ifdef YYERROR_VERBOSE | |
107 | +# undef YYERROR_VERBOSE | |
108 | +# define YYERROR_VERBOSE 1 | |
109 | +#else | |
110 | +# define YYERROR_VERBOSE 0 | |
111 | +#endif | |
112 | + | |
113 | +/* Enabling the token table. */ | |
114 | +#ifndef YYTOKEN_TABLE | |
115 | +# define YYTOKEN_TABLE 0 | |
116 | +#endif | |
117 | + | |
118 | + | |
119 | +/* Tokens. */ | |
120 | +#ifndef YYTOKENTYPE | |
121 | +# define YYTOKENTYPE | |
122 | + /* Put the tokens into the symbol table, so that GDB and other debuggers | |
123 | + know about them. */ | |
124 | + enum yytokentype { | |
125 | + PP_CONFIG = 258, | |
126 | + PP_CONFIG1 = 259, | |
127 | + PP_CONFIG2 = 260, | |
128 | + PP_VALUE = 261, | |
129 | + PP_ERROR = 262 | |
130 | + }; | |
131 | +#endif | |
132 | + | |
133 | + | |
134 | + | |
135 | +#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED | |
136 | +typedef union YYSTYPE | |
137 | +{ | |
138 | + | |
139 | +/* Line 214 of yacc.c */ | |
140 | +#line 31 "util/pmu.y" | |
141 | + | |
142 | + unsigned long num; | |
143 | + DECLARE_BITMAP(bits, PERF_PMU_FORMAT_BITS); | |
144 | + | |
145 | + | |
146 | + | |
147 | +/* Line 214 of yacc.c */ | |
148 | +#line 149 "util/pmu-bison.c" | |
149 | +} YYSTYPE; | |
150 | +# define YYSTYPE_IS_TRIVIAL 1 | |
151 | +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ | |
152 | +# define YYSTYPE_IS_DECLARED 1 | |
153 | +#endif | |
154 | + | |
155 | + | |
156 | +/* Copy the second part of user declarations. */ | |
157 | + | |
158 | + | |
159 | +/* Line 264 of yacc.c */ | |
160 | +#line 161 "util/pmu-bison.c" | |
161 | + | |
162 | +#ifdef short | |
163 | +# undef short | |
164 | +#endif | |
165 | + | |
166 | +#ifdef YYTYPE_UINT8 | |
167 | +typedef YYTYPE_UINT8 yytype_uint8; | |
168 | +#else | |
169 | +typedef unsigned char yytype_uint8; | |
170 | +#endif | |
171 | + | |
172 | +#ifdef YYTYPE_INT8 | |
173 | +typedef YYTYPE_INT8 yytype_int8; | |
174 | +#elif (defined __STDC__ || defined __C99__FUNC__ \ | |
175 | + || defined __cplusplus || defined _MSC_VER) | |
176 | +typedef signed char yytype_int8; | |
177 | +#else | |
178 | +typedef short int yytype_int8; | |
179 | +#endif | |
180 | + | |
181 | +#ifdef YYTYPE_UINT16 | |
182 | +typedef YYTYPE_UINT16 yytype_uint16; | |
183 | +#else | |
184 | +typedef unsigned short int yytype_uint16; | |
185 | +#endif | |
186 | + | |
187 | +#ifdef YYTYPE_INT16 | |
188 | +typedef YYTYPE_INT16 yytype_int16; | |
189 | +#else | |
190 | +typedef short int yytype_int16; | |
191 | +#endif | |
192 | + | |
193 | +#ifndef YYSIZE_T | |
194 | +# ifdef __SIZE_TYPE__ | |
195 | +# define YYSIZE_T __SIZE_TYPE__ | |
196 | +# elif defined size_t | |
197 | +# define YYSIZE_T size_t | |
198 | +# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ | |
199 | + || defined __cplusplus || defined _MSC_VER) | |
200 | +# include <stddef.h> /* INFRINGES ON USER NAME SPACE */ | |
201 | +# define YYSIZE_T size_t | |
202 | +# else | |
203 | +# define YYSIZE_T unsigned int | |
204 | +# endif | |
205 | +#endif | |
206 | + | |
207 | +#define YYSIZE_MAXIMUM ((YYSIZE_T) -1) | |
208 | + | |
209 | +#ifndef YY_ | |
210 | +# if defined YYENABLE_NLS && YYENABLE_NLS | |
211 | +# if ENABLE_NLS | |
212 | +# include <libintl.h> /* INFRINGES ON USER NAME SPACE */ | |
213 | +# define YY_(msgid) dgettext ("bison-runtime", msgid) | |
214 | +# endif | |
215 | +# endif | |
216 | +# ifndef YY_ | |
217 | +# define YY_(msgid) msgid | |
218 | +# endif | |
219 | +#endif | |
220 | + | |
221 | +/* Suppress unused-variable warnings by "using" E. */ | |
222 | +#if ! defined lint || defined __GNUC__ | |
223 | +# define YYUSE(e) ((void) (e)) | |
224 | +#else | |
225 | +# define YYUSE(e) /* empty */ | |
226 | +#endif | |
227 | + | |
228 | +/* Identity function, used to suppress warnings about constant conditions. */ | |
229 | +#ifndef lint | |
230 | +# define YYID(n) (n) | |
231 | +#else | |
232 | +#if (defined __STDC__ || defined __C99__FUNC__ \ | |
233 | + || defined __cplusplus || defined _MSC_VER) | |
234 | +static int | |
235 | +YYID (int yyi) | |
236 | +#else | |
237 | +static int | |
238 | +YYID (yyi) | |
239 | + int yyi; | |
240 | +#endif | |
241 | +{ | |
242 | + return yyi; | |
243 | +} | |
244 | +#endif | |
245 | + | |
246 | +#if ! defined yyoverflow || YYERROR_VERBOSE | |
247 | + | |
248 | +/* The parser invokes alloca or malloc; define the necessary symbols. */ | |
249 | + | |
250 | +# ifdef YYSTACK_USE_ALLOCA | |
251 | +# if YYSTACK_USE_ALLOCA | |
252 | +# ifdef __GNUC__ | |
253 | +# define YYSTACK_ALLOC __builtin_alloca | |
254 | +# elif defined __BUILTIN_VA_ARG_INCR | |
255 | +# include <alloca.h> /* INFRINGES ON USER NAME SPACE */ | |
256 | +# elif defined _AIX | |
257 | +# define YYSTACK_ALLOC __alloca | |
258 | +# elif defined _MSC_VER | |
259 | +# include <malloc.h> /* INFRINGES ON USER NAME SPACE */ | |
260 | +# define alloca _alloca | |
261 | +# else | |
262 | +# define YYSTACK_ALLOC alloca | |
263 | +# if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ | |
264 | + || defined __cplusplus || defined _MSC_VER) | |
265 | +# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */ | |
266 | +# ifndef _STDLIB_H | |
267 | +# define _STDLIB_H 1 | |
268 | +# endif | |
269 | +# endif | |
270 | +# endif | |
271 | +# endif | |
272 | +# endif | |
273 | + | |
274 | +# ifdef YYSTACK_ALLOC | |
275 | + /* Pacify GCC's `empty if-body' warning. */ | |
276 | +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) | |
277 | +# ifndef YYSTACK_ALLOC_MAXIMUM | |
278 | + /* The OS might guarantee only one guard page at the bottom of the stack, | |
279 | + and a page size can be as small as 4096 bytes. So we cannot safely | |
280 | + invoke alloca (N) if N exceeds 4096. Use a slightly smaller number | |
281 | + to allow for a few compiler-allocated temporary stack slots. */ | |
282 | +# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ | |
283 | +# endif | |
284 | +# else | |
285 | +# define YYSTACK_ALLOC YYMALLOC | |
286 | +# define YYSTACK_FREE YYFREE | |
287 | +# ifndef YYSTACK_ALLOC_MAXIMUM | |
288 | +# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM | |
289 | +# endif | |
290 | +# if (defined __cplusplus && ! defined _STDLIB_H \ | |
291 | + && ! ((defined YYMALLOC || defined malloc) \ | |
292 | + && (defined YYFREE || defined free))) | |
293 | +# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */ | |
294 | +# ifndef _STDLIB_H | |
295 | +# define _STDLIB_H 1 | |
296 | +# endif | |
297 | +# endif | |
298 | +# ifndef YYMALLOC | |
299 | +# define YYMALLOC malloc | |
300 | +# if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ | |
301 | + || defined __cplusplus || defined _MSC_VER) | |
302 | +void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ | |
303 | +# endif | |
304 | +# endif | |
305 | +# ifndef YYFREE | |
306 | +# define YYFREE free | |
307 | +# if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ | |
308 | + || defined __cplusplus || defined _MSC_VER) | |
309 | +void free (void *); /* INFRINGES ON USER NAME SPACE */ | |
310 | +# endif | |
311 | +# endif | |
312 | +# endif | |
313 | +#endif /* ! defined yyoverflow || YYERROR_VERBOSE */ | |
314 | + | |
315 | + | |
316 | +#if (! defined yyoverflow \ | |
317 | + && (! defined __cplusplus \ | |
318 | + || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) | |
319 | + | |
320 | +/* A type that is properly aligned for any stack member. */ | |
321 | +union yyalloc | |
322 | +{ | |
323 | + yytype_int16 yyss_alloc; | |
324 | + YYSTYPE yyvs_alloc; | |
325 | +}; | |
326 | + | |
327 | +/* The size of the maximum gap between one aligned stack and the next. */ | |
328 | +# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) | |
329 | + | |
330 | +/* The size of an array large to enough to hold all stacks, each with | |
331 | + N elements. */ | |
332 | +# define YYSTACK_BYTES(N) \ | |
333 | + ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ | |
334 | + + YYSTACK_GAP_MAXIMUM) | |
335 | + | |
336 | +/* Copy COUNT objects from FROM to TO. The source and destination do | |
337 | + not overlap. */ | |
338 | +# ifndef YYCOPY | |
339 | +# if defined __GNUC__ && 1 < __GNUC__ | |
340 | +# define YYCOPY(To, From, Count) \ | |
341 | + __builtin_memcpy (To, From, (Count) * sizeof (*(From))) | |
342 | +# else | |
343 | +# define YYCOPY(To, From, Count) \ | |
344 | + do \ | |
345 | + { \ | |
346 | + YYSIZE_T yyi; \ | |
347 | + for (yyi = 0; yyi < (Count); yyi++) \ | |
348 | + (To)[yyi] = (From)[yyi]; \ | |
349 | + } \ | |
350 | + while (YYID (0)) | |
351 | +# endif | |
352 | +# endif | |
353 | + | |
354 | +/* Relocate STACK from its old location to the new one. The | |
355 | + local variables YYSIZE and YYSTACKSIZE give the old and new number of | |
356 | + elements in the stack, and YYPTR gives the new location of the | |
357 | + stack. Advance YYPTR to a properly aligned location for the next | |
358 | + stack. */ | |
359 | +# define YYSTACK_RELOCATE(Stack_alloc, Stack) \ | |
360 | + do \ | |
361 | + { \ | |
362 | + YYSIZE_T yynewbytes; \ | |
363 | + YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ | |
364 | + Stack = &yyptr->Stack_alloc; \ | |
365 | + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ | |
366 | + yyptr += yynewbytes / sizeof (*yyptr); \ | |
367 | + } \ | |
368 | + while (YYID (0)) | |
369 | + | |
370 | +#endif | |
371 | + | |
372 | +/* YYFINAL -- State number of the termination state. */ | |
373 | +#define YYFINAL 9 | |
374 | +/* YYLAST -- Last index in YYTABLE. */ | |
375 | +#define YYLAST 17 | |
376 | + | |
377 | +/* YYNTOKENS -- Number of terminals. */ | |
378 | +#define YYNTOKENS 11 | |
379 | +/* YYNNTS -- Number of nonterminals. */ | |
380 | +#define YYNNTS 5 | |
381 | +/* YYNRULES -- Number of rules. */ | |
382 | +#define YYNRULES 10 | |
383 | +/* YYNRULES -- Number of states. */ | |
384 | +#define YYNSTATES 20 | |
385 | + | |
386 | +/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ | |
387 | +#define YYUNDEFTOK 2 | |
388 | +#define YYMAXUTOK 262 | |
389 | + | |
390 | +#define YYTRANSLATE(YYX) \ | |
391 | + ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) | |
392 | + | |
393 | +/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ | |
394 | +static const yytype_uint8 yytranslate[] = | |
395 | +{ | |
396 | + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
397 | + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
398 | + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
399 | + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
400 | + 2, 2, 2, 2, 9, 10, 2, 2, 2, 2, | |
401 | + 2, 2, 2, 2, 2, 2, 2, 2, 8, 2, | |
402 | + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
403 | + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
404 | + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
405 | + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
406 | + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
407 | + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
408 | + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
409 | + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
410 | + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
411 | + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
412 | + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
413 | + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
414 | + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
415 | + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
416 | + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
417 | + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
418 | + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
419 | + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
420 | + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
421 | + 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, | |
422 | + 5, 6, 7 | |
423 | +}; | |
424 | + | |
425 | +#if YYDEBUG | |
426 | +/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in | |
427 | + YYRHS. */ | |
428 | +static const yytype_uint8 yyprhs[] = | |
429 | +{ | |
430 | + 0, 0, 3, 6, 8, 12, 16, 20, 24, 26, | |
431 | + 30 | |
432 | +}; | |
433 | + | |
434 | +/* YYRHS -- A `-1'-separated list of the rules' RHS. */ | |
435 | +static const yytype_int8 yyrhs[] = | |
436 | +{ | |
437 | + 12, 0, -1, 12, 13, -1, 13, -1, 3, 8, | |
438 | + 14, -1, 4, 8, 14, -1, 5, 8, 14, -1, | |
439 | + 14, 9, 15, -1, 15, -1, 6, 10, 6, -1, | |
440 | + 6, -1 | |
441 | +}; | |
442 | + | |
443 | +/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ | |
444 | +static const yytype_uint8 yyrline[] = | |
445 | +{ | |
446 | + 0, 39, 39, 41, 44, 51, 58, 66, 71, 77, | |
447 | + 82 | |
448 | +}; | |
449 | +#endif | |
450 | + | |
451 | +#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE | |
452 | +/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. | |
453 | + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ | |
454 | +static const char *const yytname[] = | |
455 | +{ | |
456 | + "$end", "error", "$undefined", "PP_CONFIG", "PP_CONFIG1", "PP_CONFIG2", | |
457 | + "PP_VALUE", "PP_ERROR", "':'", "','", "'-'", "$accept", "format", | |
458 | + "format_term", "bits", "bit_term", 0 | |
459 | +}; | |
460 | +#endif | |
461 | + | |
462 | +# ifdef YYPRINT | |
463 | +/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to | |
464 | + token YYLEX-NUM. */ | |
465 | +static const yytype_uint16 yytoknum[] = | |
466 | +{ | |
467 | + 0, 256, 257, 258, 259, 260, 261, 262, 58, 44, | |
468 | + 45 | |
469 | +}; | |
470 | +# endif | |
471 | + | |
472 | +/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ | |
473 | +static const yytype_uint8 yyr1[] = | |
474 | +{ | |
475 | + 0, 11, 12, 12, 13, 13, 13, 14, 14, 15, | |
476 | + 15 | |
477 | +}; | |
478 | + | |
479 | +/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ | |
480 | +static const yytype_uint8 yyr2[] = | |
481 | +{ | |
482 | + 0, 2, 2, 1, 3, 3, 3, 3, 1, 3, | |
483 | + 1 | |
484 | +}; | |
485 | + | |
486 | +/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state | |
487 | + STATE-NUM when YYTABLE doesn't specify something else to do. Zero | |
488 | + means the default is an error. */ | |
489 | +static const yytype_uint8 yydefact[] = | |
490 | +{ | |
491 | + 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, | |
492 | + 2, 10, 4, 8, 5, 6, 0, 0, 9, 7 | |
493 | +}; | |
494 | + | |
495 | +/* YYDEFGOTO[NTERM-NUM]. */ | |
496 | +static const yytype_int8 yydefgoto[] = | |
497 | +{ | |
498 | + -1, 4, 5, 12, 13 | |
499 | +}; | |
500 | + | |
501 | +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing | |
502 | + STATE-NUM. */ | |
503 | +#define YYPACT_NINF -7 | |
504 | +static const yytype_int8 yypact[] = | |
505 | +{ | |
506 | + 3, 1, 2, 4, 0, -7, 5, 5, 5, -7, | |
507 | + -7, 6, 8, -7, 8, 8, 7, 5, -7, -7 | |
508 | +}; | |
509 | + | |
510 | +/* YYPGOTO[NTERM-NUM]. */ | |
511 | +static const yytype_int8 yypgoto[] = | |
512 | +{ | |
513 | + -7, -7, 10, -6, -2 | |
514 | +}; | |
515 | + | |
516 | +/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If | |
517 | + positive, shift that token. If negative, reduce the rule which | |
518 | + number is the opposite. If zero, do what YYDEFACT says. | |
519 | + If YYTABLE_NINF, syntax error. */ | |
520 | +#define YYTABLE_NINF -1 | |
521 | +static const yytype_uint8 yytable[] = | |
522 | +{ | |
523 | + 9, 14, 15, 1, 2, 3, 1, 2, 3, 6, | |
524 | + 7, 11, 8, 18, 10, 19, 16, 17 | |
525 | +}; | |
526 | + | |
527 | +static const yytype_uint8 yycheck[] = | |
528 | +{ | |
529 | + 0, 7, 8, 3, 4, 5, 3, 4, 5, 8, | |
530 | + 8, 6, 8, 6, 4, 17, 10, 9 | |
531 | +}; | |
532 | + | |
533 | +/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing | |
534 | + symbol of state STATE-NUM. */ | |
535 | +static const yytype_uint8 yystos[] = | |
536 | +{ | |
537 | + 0, 3, 4, 5, 12, 13, 8, 8, 8, 0, | |
538 | + 13, 6, 14, 15, 14, 14, 10, 9, 6, 15 | |
539 | +}; | |
540 | + | |
541 | +#define yyerrok (yyerrstatus = 0) | |
542 | +#define yyclearin (yychar = YYEMPTY) | |
543 | +#define YYEMPTY (-2) | |
544 | +#define YYEOF 0 | |
545 | + | |
546 | +#define YYACCEPT goto yyacceptlab | |
547 | +#define YYABORT goto yyabortlab | |
548 | +#define YYERROR goto yyerrorlab | |
549 | + | |
550 | + | |
551 | +/* Like YYERROR except do call yyerror. This remains here temporarily | |
552 | + to ease the transition to the new meaning of YYERROR, for GCC. | |
553 | + Once GCC version 2 has supplanted version 1, this can go. However, | |
554 | + YYFAIL appears to be in use. Nevertheless, it is formally deprecated | |
555 | + in Bison 2.4.2's NEWS entry, where a plan to phase it out is | |
556 | + discussed. */ | |
557 | + | |
558 | +#define YYFAIL goto yyerrlab | |
559 | +#if defined YYFAIL | |
560 | + /* This is here to suppress warnings from the GCC cpp's | |
561 | + -Wunused-macros. Normally we don't worry about that warning, but | |
562 | + some users do, and we want to make it easy for users to remove | |
563 | + YYFAIL uses, which will produce warnings from Bison 2.5. */ | |
564 | +#endif | |
565 | + | |
566 | +#define YYRECOVERING() (!!yyerrstatus) | |
567 | + | |
568 | +#define YYBACKUP(Token, Value) \ | |
569 | +do \ | |
570 | + if (yychar == YYEMPTY && yylen == 1) \ | |
571 | + { \ | |
572 | + yychar = (Token); \ | |
573 | + yylval = (Value); \ | |
574 | + yytoken = YYTRANSLATE (yychar); \ | |
575 | + YYPOPSTACK (1); \ | |
576 | + goto yybackup; \ | |
577 | + } \ | |
578 | + else \ | |
579 | + { \ | |
580 | + yyerror (format, name, YY_("syntax error: cannot back up")); \ | |
581 | + YYERROR; \ | |
582 | + } \ | |
583 | +while (YYID (0)) | |
584 | + | |
585 | + | |
586 | +#define YYTERROR 1 | |
587 | +#define YYERRCODE 256 | |
588 | + | |
589 | + | |
590 | +/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. | |
591 | + If N is 0, then set CURRENT to the empty location which ends | |
592 | + the previous symbol: RHS[0] (always defined). */ | |
593 | + | |
594 | +#define YYRHSLOC(Rhs, K) ((Rhs)[K]) | |
595 | +#ifndef YYLLOC_DEFAULT | |
596 | +# define YYLLOC_DEFAULT(Current, Rhs, N) \ | |
597 | + do \ | |
598 | + if (YYID (N)) \ | |
599 | + { \ | |
600 | + (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ | |
601 | + (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ | |
602 | + (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ | |
603 | + (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ | |
604 | + } \ | |
605 | + else \ | |
606 | + { \ | |
607 | + (Current).first_line = (Current).last_line = \ | |
608 | + YYRHSLOC (Rhs, 0).last_line; \ | |
609 | + (Current).first_column = (Current).last_column = \ | |
610 | + YYRHSLOC (Rhs, 0).last_column; \ | |
611 | + } \ | |
612 | + while (YYID (0)) | |
613 | +#endif | |
614 | + | |
615 | + | |
616 | +/* YY_LOCATION_PRINT -- Print the location on the stream. | |
617 | + This macro was not mandated originally: define only if we know | |
618 | + we won't break user code: when these are the locations we know. */ | |
619 | + | |
620 | +#ifndef YY_LOCATION_PRINT | |
621 | +# if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL | |
622 | +# define YY_LOCATION_PRINT(File, Loc) \ | |
623 | + fprintf (File, "%d.%d-%d.%d", \ | |
624 | + (Loc).first_line, (Loc).first_column, \ | |
625 | + (Loc).last_line, (Loc).last_column) | |
626 | +# else | |
627 | +# define YY_LOCATION_PRINT(File, Loc) ((void) 0) | |
628 | +# endif | |
629 | +#endif | |
630 | + | |
631 | + | |
632 | +/* YYLEX -- calling `yylex' with the right arguments. */ | |
633 | + | |
634 | +#ifdef YYLEX_PARAM | |
635 | +# define YYLEX yylex (YYLEX_PARAM) | |
636 | +#else | |
637 | +# define YYLEX yylex () | |
638 | +#endif | |
639 | + | |
640 | +/* Enable debugging if requested. */ | |
641 | +#if YYDEBUG | |
642 | + | |
643 | +# ifndef YYFPRINTF | |
644 | +# include <stdio.h> /* INFRINGES ON USER NAME SPACE */ | |
645 | +# define YYFPRINTF fprintf | |
646 | +# endif | |
647 | + | |
648 | +# define YYDPRINTF(Args) \ | |
649 | +do { \ | |
650 | + if (yydebug) \ | |
651 | + YYFPRINTF Args; \ | |
652 | +} while (YYID (0)) | |
653 | + | |
654 | +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ | |
655 | +do { \ | |
656 | + if (yydebug) \ | |
657 | + { \ | |
658 | + YYFPRINTF (stderr, "%s ", Title); \ | |
659 | + yy_symbol_print (stderr, \ | |
660 | + Type, Value, format, name); \ | |
661 | + YYFPRINTF (stderr, "\n"); \ | |
662 | + } \ | |
663 | +} while (YYID (0)) | |
664 | + | |
665 | + | |
666 | +/*--------------------------------. | |
667 | +| Print this symbol on YYOUTPUT. | | |
668 | +`--------------------------------*/ | |
669 | + | |
670 | +/*ARGSUSED*/ | |
671 | +#if (defined __STDC__ || defined __C99__FUNC__ \ | |
672 | + || defined __cplusplus || defined _MSC_VER) | |
673 | +static void | |
674 | +yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, struct list_head *format, char *name) | |
675 | +#else | |
676 | +static void | |
677 | +yy_symbol_value_print (yyoutput, yytype, yyvaluep, format, name) | |
678 | + FILE *yyoutput; | |
679 | + int yytype; | |
680 | + YYSTYPE const * const yyvaluep; | |
681 | + struct list_head *format; | |
682 | + char *name; | |
683 | +#endif | |
684 | +{ | |
685 | + if (!yyvaluep) | |
686 | + return; | |
687 | + YYUSE (format); | |
688 | + YYUSE (name); | |
689 | +# ifdef YYPRINT | |
690 | + if (yytype < YYNTOKENS) | |
691 | + YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); | |
692 | +# else | |
693 | + YYUSE (yyoutput); | |
694 | +# endif | |
695 | + switch (yytype) | |
696 | + { | |
697 | + default: | |
698 | + break; | |
699 | + } | |
700 | +} | |
701 | + | |
702 | + | |
703 | +/*--------------------------------. | |
704 | +| Print this symbol on YYOUTPUT. | | |
705 | +`--------------------------------*/ | |
706 | + | |
707 | +#if (defined __STDC__ || defined __C99__FUNC__ \ | |
708 | + || defined __cplusplus || defined _MSC_VER) | |
709 | +static void | |
710 | +yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, struct list_head *format, char *name) | |
711 | +#else | |
712 | +static void | |
713 | +yy_symbol_print (yyoutput, yytype, yyvaluep, format, name) | |
714 | + FILE *yyoutput; | |
715 | + int yytype; | |
716 | + YYSTYPE const * const yyvaluep; | |
717 | + struct list_head *format; | |
718 | + char *name; | |
719 | +#endif | |
720 | +{ | |
721 | + if (yytype < YYNTOKENS) | |
722 | + YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); | |
723 | + else | |
724 | + YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); | |
725 | + | |
726 | + yy_symbol_value_print (yyoutput, yytype, yyvaluep, format, name); | |
727 | + YYFPRINTF (yyoutput, ")"); | |
728 | +} | |
729 | + | |
730 | +/*------------------------------------------------------------------. | |
731 | +| yy_stack_print -- Print the state stack from its BOTTOM up to its | | |
732 | +| TOP (included). | | |
733 | +`------------------------------------------------------------------*/ | |
734 | + | |
735 | +#if (defined __STDC__ || defined __C99__FUNC__ \ | |
736 | + || defined __cplusplus || defined _MSC_VER) | |
737 | +static void | |
738 | +yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop) | |
739 | +#else | |
740 | +static void | |
741 | +yy_stack_print (yybottom, yytop) | |
742 | + yytype_int16 *yybottom; | |
743 | + yytype_int16 *yytop; | |
744 | +#endif | |
745 | +{ | |
746 | + YYFPRINTF (stderr, "Stack now"); | |
747 | + for (; yybottom <= yytop; yybottom++) | |
748 | + { | |
749 | + int yybot = *yybottom; | |
750 | + YYFPRINTF (stderr, " %d", yybot); | |
751 | + } | |
752 | + YYFPRINTF (stderr, "\n"); | |
753 | +} | |
754 | + | |
755 | +# define YY_STACK_PRINT(Bottom, Top) \ | |
756 | +do { \ | |
757 | + if (yydebug) \ | |
758 | + yy_stack_print ((Bottom), (Top)); \ | |
759 | +} while (YYID (0)) | |
760 | + | |
761 | + | |
762 | +/*------------------------------------------------. | |
763 | +| Report that the YYRULE is going to be reduced. | | |
764 | +`------------------------------------------------*/ | |
765 | + | |
766 | +#if (defined __STDC__ || defined __C99__FUNC__ \ | |
767 | + || defined __cplusplus || defined _MSC_VER) | |
768 | +static void | |
769 | +yy_reduce_print (YYSTYPE *yyvsp, int yyrule, struct list_head *format, char *name) | |
770 | +#else | |
771 | +static void | |
772 | +yy_reduce_print (yyvsp, yyrule, format, name) | |
773 | + YYSTYPE *yyvsp; | |
774 | + int yyrule; | |
775 | + struct list_head *format; | |
776 | + char *name; | |
777 | +#endif | |
778 | +{ | |
779 | + int yynrhs = yyr2[yyrule]; | |
780 | + int yyi; | |
781 | + unsigned long int yylno = yyrline[yyrule]; | |
782 | + YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", | |
783 | + yyrule - 1, yylno); | |
784 | + /* The symbols being reduced. */ | |
785 | + for (yyi = 0; yyi < yynrhs; yyi++) | |
786 | + { | |
787 | + YYFPRINTF (stderr, " $%d = ", yyi + 1); | |
788 | + yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], | |
789 | + &(yyvsp[(yyi + 1) - (yynrhs)]) | |
790 | + , format, name); | |
791 | + YYFPRINTF (stderr, "\n"); | |
792 | + } | |
793 | +} | |
794 | + | |
795 | +# define YY_REDUCE_PRINT(Rule) \ | |
796 | +do { \ | |
797 | + if (yydebug) \ | |
798 | + yy_reduce_print (yyvsp, Rule, format, name); \ | |
799 | +} while (YYID (0)) | |
800 | + | |
801 | +/* Nonzero means print parse trace. It is left uninitialized so that | |
802 | + multiple parsers can coexist. */ | |
803 | +int yydebug; | |
804 | +#else /* !YYDEBUG */ | |
805 | +# define YYDPRINTF(Args) | |
806 | +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) | |
807 | +# define YY_STACK_PRINT(Bottom, Top) | |
808 | +# define YY_REDUCE_PRINT(Rule) | |
809 | +#endif /* !YYDEBUG */ | |
810 | + | |
811 | + | |
812 | +/* YYINITDEPTH -- initial size of the parser's stacks. */ | |
813 | +#ifndef YYINITDEPTH | |
814 | +# define YYINITDEPTH 200 | |
815 | +#endif | |
816 | + | |
817 | +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only | |
818 | + if the built-in stack extension method is used). | |
819 | + | |
820 | + Do not make this value too large; the results are undefined if | |
821 | + YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) | |
822 | + evaluated with infinite-precision integer arithmetic. */ | |
823 | + | |
824 | +#ifndef YYMAXDEPTH | |
825 | +# define YYMAXDEPTH 10000 | |
826 | +#endif | |
827 | + | |
828 | + | |
829 | + | |
830 | +#if YYERROR_VERBOSE | |
831 | + | |
832 | +# ifndef yystrlen | |
833 | +# if defined __GLIBC__ && defined _STRING_H | |
834 | +# define yystrlen strlen | |
835 | +# else | |
836 | +/* Return the length of YYSTR. */ | |
837 | +#if (defined __STDC__ || defined __C99__FUNC__ \ | |
838 | + || defined __cplusplus || defined _MSC_VER) | |
839 | +static YYSIZE_T | |
840 | +yystrlen (const char *yystr) | |
841 | +#else | |
842 | +static YYSIZE_T | |
843 | +yystrlen (yystr) | |
844 | + const char *yystr; | |
845 | +#endif | |
846 | +{ | |
847 | + YYSIZE_T yylen; | |
848 | + for (yylen = 0; yystr[yylen]; yylen++) | |
849 | + continue; | |
850 | + return yylen; | |
851 | +} | |
852 | +# endif | |
853 | +# endif | |
854 | + | |
855 | +# ifndef yystpcpy | |
856 | +# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE | |
857 | +# define yystpcpy stpcpy | |
858 | +# else | |
859 | +/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in | |
860 | + YYDEST. */ | |
861 | +#if (defined __STDC__ || defined __C99__FUNC__ \ | |
862 | + || defined __cplusplus || defined _MSC_VER) | |
863 | +static char * | |
864 | +yystpcpy (char *yydest, const char *yysrc) | |
865 | +#else | |
866 | +static char * | |
867 | +yystpcpy (yydest, yysrc) | |
868 | + char *yydest; | |
869 | + const char *yysrc; | |
870 | +#endif | |
871 | +{ | |
872 | + char *yyd = yydest; | |
873 | + const char *yys = yysrc; | |
874 | + | |
875 | + while ((*yyd++ = *yys++) != '\0') | |
876 | + continue; | |
877 | + | |
878 | + return yyd - 1; | |
879 | +} | |
880 | +# endif | |
881 | +# endif | |
882 | + | |
883 | +# ifndef yytnamerr | |
884 | +/* Copy to YYRES the contents of YYSTR after stripping away unnecessary | |
885 | + quotes and backslashes, so that it's suitable for yyerror. The | |
886 | + heuristic is that double-quoting is unnecessary unless the string | |
887 | + contains an apostrophe, a comma, or backslash (other than | |
888 | + backslash-backslash). YYSTR is taken from yytname. If YYRES is | |
889 | + null, do not copy; instead, return the length of what the result | |
890 | + would have been. */ | |
891 | +static YYSIZE_T | |
892 | +yytnamerr (char *yyres, const char *yystr) | |
893 | +{ | |
894 | + if (*yystr == '"') | |
895 | + { | |
896 | + YYSIZE_T yyn = 0; | |
897 | + char const *yyp = yystr; | |
898 | + | |
899 | + for (;;) | |
900 | + switch (*++yyp) | |
901 | + { | |
902 | + case '\'': | |
903 | + case ',': | |
904 | + goto do_not_strip_quotes; | |
905 | + | |
906 | + case '\\': | |
907 | + if (*++yyp != '\\') | |
908 | + goto do_not_strip_quotes; | |
909 | + /* Fall through. */ | |
910 | + default: | |
911 | + if (yyres) | |
912 | + yyres[yyn] = *yyp; | |
913 | + yyn++; | |
914 | + break; | |
915 | + | |
916 | + case '"': | |
917 | + if (yyres) | |
918 | + yyres[yyn] = '\0'; | |
919 | + return yyn; | |
920 | + } | |
921 | + do_not_strip_quotes: ; | |
922 | + } | |
923 | + | |
924 | + if (! yyres) | |
925 | + return yystrlen (yystr); | |
926 | + | |
927 | + return yystpcpy (yyres, yystr) - yyres; | |
928 | +} | |
929 | +# endif | |
930 | + | |
931 | +/* Copy into YYRESULT an error message about the unexpected token | |
932 | + YYCHAR while in state YYSTATE. Return the number of bytes copied, | |
933 | + including the terminating null byte. If YYRESULT is null, do not | |
934 | + copy anything; just return the number of bytes that would be | |
935 | + copied. As a special case, return 0 if an ordinary "syntax error" | |
936 | + message will do. Return YYSIZE_MAXIMUM if overflow occurs during | |
937 | + size calculation. */ | |
938 | +static YYSIZE_T | |
939 | +yysyntax_error (char *yyresult, int yystate, int yychar) | |
940 | +{ | |
941 | + int yyn = yypact[yystate]; | |
942 | + | |
943 | + if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) | |
944 | + return 0; | |
945 | + else | |
946 | + { | |
947 | + int yytype = YYTRANSLATE (yychar); | |
948 | + YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); | |
949 | + YYSIZE_T yysize = yysize0; | |
950 | + YYSIZE_T yysize1; | |
951 | + int yysize_overflow = 0; | |
952 | + enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; | |
953 | + char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; | |
954 | + int yyx; | |
955 | + | |
956 | +# if 0 | |
957 | + /* This is so xgettext sees the translatable formats that are | |
958 | + constructed on the fly. */ | |
959 | + YY_("syntax error, unexpected %s"); | |
960 | + YY_("syntax error, unexpected %s, expecting %s"); | |
961 | + YY_("syntax error, unexpected %s, expecting %s or %s"); | |
962 | + YY_("syntax error, unexpected %s, expecting %s or %s or %s"); | |
963 | + YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); | |
964 | +# endif | |
965 | + char *yyfmt; | |
966 | + char const *yyf; | |
967 | + static char const yyunexpected[] = "syntax error, unexpected %s"; | |
968 | + static char const yyexpecting[] = ", expecting %s"; | |
969 | + static char const yyor[] = " or %s"; | |
970 | + char yyformat[sizeof yyunexpected | |
971 | + + sizeof yyexpecting - 1 | |
972 | + + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) | |
973 | + * (sizeof yyor - 1))]; | |
974 | + char const *yyprefix = yyexpecting; | |
975 | + | |
976 | + /* Start YYX at -YYN if negative to avoid negative indexes in | |
977 | + YYCHECK. */ | |
978 | + int yyxbegin = yyn < 0 ? -yyn : 0; | |
979 | + | |
980 | + /* Stay within bounds of both yycheck and yytname. */ | |
981 | + int yychecklim = YYLAST - yyn + 1; | |
982 | + int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; | |
983 | + int yycount = 1; | |
984 | + | |
985 | + yyarg[0] = yytname[yytype]; | |
986 | + yyfmt = yystpcpy (yyformat, yyunexpected); | |
987 | + | |
988 | + for (yyx = yyxbegin; yyx < yyxend; ++yyx) | |
989 | + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) | |
990 | + { | |
991 | + if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) | |
992 | + { | |
993 | + yycount = 1; | |
994 | + yysize = yysize0; | |
995 | + yyformat[sizeof yyunexpected - 1] = '\0'; | |
996 | + break; | |
997 | + } | |
998 | + yyarg[yycount++] = yytname[yyx]; | |
999 | + yysize1 = yysize + yytnamerr (0, yytname[yyx]); | |
1000 | + yysize_overflow |= (yysize1 < yysize); | |
1001 | + yysize = yysize1; | |
1002 | + yyfmt = yystpcpy (yyfmt, yyprefix); | |
1003 | + yyprefix = yyor; | |
1004 | + } | |
1005 | + | |
1006 | + yyf = YY_(yyformat); | |
1007 | + yysize1 = yysize + yystrlen (yyf); | |
1008 | + yysize_overflow |= (yysize1 < yysize); | |
1009 | + yysize = yysize1; | |
1010 | + | |
1011 | + if (yysize_overflow) | |
1012 | + return YYSIZE_MAXIMUM; | |
1013 | + | |
1014 | + if (yyresult) | |
1015 | + { | |
1016 | + /* Avoid sprintf, as that infringes on the user's name space. | |
1017 | + Don't have undefined behavior even if the translation | |
1018 | + produced a string with the wrong number of "%s"s. */ | |
1019 | + char *yyp = yyresult; | |
1020 | + int yyi = 0; | |
1021 | + while ((*yyp = *yyf) != '\0') | |
1022 | + { | |
1023 | + if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) | |
1024 | + { | |
1025 | + yyp += yytnamerr (yyp, yyarg[yyi++]); | |
1026 | + yyf += 2; | |
1027 | + } | |
1028 | + else | |
1029 | + { | |
1030 | + yyp++; | |
1031 | + yyf++; | |
1032 | + } | |
1033 | + } | |
1034 | + } | |
1035 | + return yysize; | |
1036 | + } | |
1037 | +} | |
1038 | +#endif /* YYERROR_VERBOSE */ | |
1039 | + | |
1040 | + | |
1041 | +/*-----------------------------------------------. | |
1042 | +| Release the memory associated to this symbol. | | |
1043 | +`-----------------------------------------------*/ | |
1044 | + | |
1045 | +/*ARGSUSED*/ | |
1046 | +#if (defined __STDC__ || defined __C99__FUNC__ \ | |
1047 | + || defined __cplusplus || defined _MSC_VER) | |
1048 | +static void | |
1049 | +yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, struct list_head *format, char *name) | |
1050 | +#else | |
1051 | +static void | |
1052 | +yydestruct (yymsg, yytype, yyvaluep, format, name) | |
1053 | + const char *yymsg; | |
1054 | + int yytype; | |
1055 | + YYSTYPE *yyvaluep; | |
1056 | + struct list_head *format; | |
1057 | + char *name; | |
1058 | +#endif | |
1059 | +{ | |
1060 | + YYUSE (yyvaluep); | |
1061 | + YYUSE (format); | |
1062 | + YYUSE (name); | |
1063 | + | |
1064 | + if (!yymsg) | |
1065 | + yymsg = "Deleting"; | |
1066 | + YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); | |
1067 | + | |
1068 | + switch (yytype) | |
1069 | + { | |
1070 | + | |
1071 | + default: | |
1072 | + break; | |
1073 | + } | |
1074 | +} | |
1075 | + | |
1076 | +/* Prevent warnings from -Wmissing-prototypes. */ | |
1077 | +#ifdef YYPARSE_PARAM | |
1078 | +#if defined __STDC__ || defined __cplusplus | |
1079 | +int yyparse (void *YYPARSE_PARAM); | |
1080 | +#else | |
1081 | +int yyparse (); | |
1082 | +#endif | |
1083 | +#else /* ! YYPARSE_PARAM */ | |
1084 | +#if defined __STDC__ || defined __cplusplus | |
1085 | +int yyparse (struct list_head *format, char *name); | |
1086 | +#else | |
1087 | +int yyparse (); | |
1088 | +#endif | |
1089 | +#endif /* ! YYPARSE_PARAM */ | |
1090 | + | |
1091 | + | |
1092 | +/* The lookahead symbol. */ | |
1093 | +int yychar; | |
1094 | + | |
1095 | +/* The semantic value of the lookahead symbol. */ | |
1096 | +YYSTYPE yylval; | |
1097 | + | |
1098 | +/* Number of syntax errors so far. */ | |
1099 | +int yynerrs; | |
1100 | + | |
1101 | + | |
1102 | + | |
1103 | +/*-------------------------. | |
1104 | +| yyparse or yypush_parse. | | |
1105 | +`-------------------------*/ | |
1106 | + | |
1107 | +#ifdef YYPARSE_PARAM | |
1108 | +#if (defined __STDC__ || defined __C99__FUNC__ \ | |
1109 | + || defined __cplusplus || defined _MSC_VER) | |
1110 | +int | |
1111 | +yyparse (void *YYPARSE_PARAM) | |
1112 | +#else | |
1113 | +int | |
1114 | +yyparse (YYPARSE_PARAM) | |
1115 | + void *YYPARSE_PARAM; | |
1116 | +#endif | |
1117 | +#else /* ! YYPARSE_PARAM */ | |
1118 | +#if (defined __STDC__ || defined __C99__FUNC__ \ | |
1119 | + || defined __cplusplus || defined _MSC_VER) | |
1120 | +int | |
1121 | +yyparse (struct list_head *format, char *name) | |
1122 | +#else | |
1123 | +int | |
1124 | +yyparse (format, name) | |
1125 | + struct list_head *format; | |
1126 | + char *name; | |
1127 | +#endif | |
1128 | +#endif | |
1129 | +{ | |
1130 | + | |
1131 | + | |
1132 | + int yystate; | |
1133 | + /* Number of tokens to shift before error messages enabled. */ | |
1134 | + int yyerrstatus; | |
1135 | + | |
1136 | + /* The stacks and their tools: | |
1137 | + `yyss': related to states. | |
1138 | + `yyvs': related to semantic values. | |
1139 | + | |
1140 | + Refer to the stacks thru separate pointers, to allow yyoverflow | |
1141 | + to reallocate them elsewhere. */ | |
1142 | + | |
1143 | + /* The state stack. */ | |
1144 | + yytype_int16 yyssa[YYINITDEPTH]; | |
1145 | + yytype_int16 *yyss; | |
1146 | + yytype_int16 *yyssp; | |
1147 | + | |
1148 | + /* The semantic value stack. */ | |
1149 | + YYSTYPE yyvsa[YYINITDEPTH]; | |
1150 | + YYSTYPE *yyvs; | |
1151 | + YYSTYPE *yyvsp; | |
1152 | + | |
1153 | + YYSIZE_T yystacksize; | |
1154 | + | |
1155 | + int yyn; | |
1156 | + int yyresult; | |
1157 | + /* Lookahead token as an internal (translated) token number. */ | |
1158 | + int yytoken; | |
1159 | + /* The variables used to return semantic value and location from the | |
1160 | + action routines. */ | |
1161 | + YYSTYPE yyval; | |
1162 | + | |
1163 | +#if YYERROR_VERBOSE | |
1164 | + /* Buffer for error messages, and its allocated size. */ | |
1165 | + char yymsgbuf[128]; | |
1166 | + char *yymsg = yymsgbuf; | |
1167 | + YYSIZE_T yymsg_alloc = sizeof yymsgbuf; | |
1168 | +#endif | |
1169 | + | |
1170 | +#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) | |
1171 | + | |
1172 | + /* The number of symbols on the RHS of the reduced rule. | |
1173 | + Keep to zero when no symbol should be popped. */ | |
1174 | + int yylen = 0; | |
1175 | + | |
1176 | + yytoken = 0; | |
1177 | + yyss = yyssa; | |
1178 | + yyvs = yyvsa; | |
1179 | + yystacksize = YYINITDEPTH; | |
1180 | + | |
1181 | + YYDPRINTF ((stderr, "Starting parse\n")); | |
1182 | + | |
1183 | + yystate = 0; | |
1184 | + yyerrstatus = 0; | |
1185 | + yynerrs = 0; | |
1186 | + yychar = YYEMPTY; /* Cause a token to be read. */ | |
1187 | + | |
1188 | + /* Initialize stack pointers. | |
1189 | + Waste one element of value and location stack | |
1190 | + so that they stay on the same level as the state stack. | |
1191 | + The wasted elements are never initialized. */ | |
1192 | + yyssp = yyss; | |
1193 | + yyvsp = yyvs; | |
1194 | + | |
1195 | + goto yysetstate; | |
1196 | + | |
1197 | +/*------------------------------------------------------------. | |
1198 | +| yynewstate -- Push a new state, which is found in yystate. | | |
1199 | +`------------------------------------------------------------*/ | |
1200 | + yynewstate: | |
1201 | + /* In all cases, when you get here, the value and location stacks | |
1202 | + have just been pushed. So pushing a state here evens the stacks. */ | |
1203 | + yyssp++; | |
1204 | + | |
1205 | + yysetstate: | |
1206 | + *yyssp = yystate; | |
1207 | + | |
1208 | + if (yyss + yystacksize - 1 <= yyssp) | |
1209 | + { | |
1210 | + /* Get the current used size of the three stacks, in elements. */ | |
1211 | + YYSIZE_T yysize = yyssp - yyss + 1; | |
1212 | + | |
1213 | +#ifdef yyoverflow | |
1214 | + { | |
1215 | + /* Give user a chance to reallocate the stack. Use copies of | |
1216 | + these so that the &'s don't force the real ones into | |
1217 | + memory. */ | |
1218 | + YYSTYPE *yyvs1 = yyvs; | |
1219 | + yytype_int16 *yyss1 = yyss; | |
1220 | + | |
1221 | + /* Each stack pointer address is followed by the size of the | |
1222 | + data in use in that stack, in bytes. This used to be a | |
1223 | + conditional around just the two extra args, but that might | |
1224 | + be undefined if yyoverflow is a macro. */ | |
1225 | + yyoverflow (YY_("memory exhausted"), | |
1226 | + &yyss1, yysize * sizeof (*yyssp), | |
1227 | + &yyvs1, yysize * sizeof (*yyvsp), | |
1228 | + &yystacksize); | |
1229 | + | |
1230 | + yyss = yyss1; | |
1231 | + yyvs = yyvs1; | |
1232 | + } | |
1233 | +#else /* no yyoverflow */ | |
1234 | +# ifndef YYSTACK_RELOCATE | |
1235 | + goto yyexhaustedlab; | |
1236 | +# else | |
1237 | + /* Extend the stack our own way. */ | |
1238 | + if (YYMAXDEPTH <= yystacksize) | |
1239 | + goto yyexhaustedlab; | |
1240 | + yystacksize *= 2; | |
1241 | + if (YYMAXDEPTH < yystacksize) | |
1242 | + yystacksize = YYMAXDEPTH; | |
1243 | + | |
1244 | + { | |
1245 | + yytype_int16 *yyss1 = yyss; | |
1246 | + union yyalloc *yyptr = | |
1247 | + (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); | |
1248 | + if (! yyptr) | |
1249 | + goto yyexhaustedlab; | |
1250 | + YYSTACK_RELOCATE (yyss_alloc, yyss); | |
1251 | + YYSTACK_RELOCATE (yyvs_alloc, yyvs); | |
1252 | +# undef YYSTACK_RELOCATE | |
1253 | + if (yyss1 != yyssa) | |
1254 | + YYSTACK_FREE (yyss1); | |
1255 | + } | |
1256 | +# endif | |
1257 | +#endif /* no yyoverflow */ | |
1258 | + | |
1259 | + yyssp = yyss + yysize - 1; | |
1260 | + yyvsp = yyvs + yysize - 1; | |
1261 | + | |
1262 | + YYDPRINTF ((stderr, "Stack size increased to %lu\n", | |
1263 | + (unsigned long int) yystacksize)); | |
1264 | + | |
1265 | + if (yyss + yystacksize - 1 <= yyssp) | |
1266 | + YYABORT; | |
1267 | + } | |
1268 | + | |
1269 | + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); | |
1270 | + | |
1271 | + if (yystate == YYFINAL) | |
1272 | + YYACCEPT; | |
1273 | + | |
1274 | + goto yybackup; | |
1275 | + | |
1276 | +/*-----------. | |
1277 | +| yybackup. | | |
1278 | +`-----------*/ | |
1279 | +yybackup: | |
1280 | + | |
1281 | + /* Do appropriate processing given the current state. Read a | |
1282 | + lookahead token if we need one and don't already have one. */ | |
1283 | + | |
1284 | + /* First try to decide what to do without reference to lookahead token. */ | |
1285 | + yyn = yypact[yystate]; | |
1286 | + if (yyn == YYPACT_NINF) | |
1287 | + goto yydefault; | |
1288 | + | |
1289 | + /* Not known => get a lookahead token if don't already have one. */ | |
1290 | + | |
1291 | + /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ | |
1292 | + if (yychar == YYEMPTY) | |
1293 | + { | |
1294 | + YYDPRINTF ((stderr, "Reading a token: ")); | |
1295 | + yychar = YYLEX; | |
1296 | + } | |
1297 | + | |
1298 | + if (yychar <= YYEOF) | |
1299 | + { | |
1300 | + yychar = yytoken = YYEOF; | |
1301 | + YYDPRINTF ((stderr, "Now at end of input.\n")); | |
1302 | + } | |
1303 | + else | |
1304 | + { | |
1305 | + yytoken = YYTRANSLATE (yychar); | |
1306 | + YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); | |
1307 | + } | |
1308 | + | |
1309 | + /* If the proper action on seeing token YYTOKEN is to reduce or to | |
1310 | + detect an error, take that action. */ | |
1311 | + yyn += yytoken; | |
1312 | + if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) | |
1313 | + goto yydefault; | |
1314 | + yyn = yytable[yyn]; | |
1315 | + if (yyn <= 0) | |
1316 | + { | |
1317 | + if (yyn == 0 || yyn == YYTABLE_NINF) | |
1318 | + goto yyerrlab; | |
1319 | + yyn = -yyn; | |
1320 | + goto yyreduce; | |
1321 | + } | |
1322 | + | |
1323 | + /* Count tokens shifted since error; after three, turn off error | |
1324 | + status. */ | |
1325 | + if (yyerrstatus) | |
1326 | + yyerrstatus--; | |
1327 | + | |
1328 | + /* Shift the lookahead token. */ | |
1329 | + YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); | |
1330 | + | |
1331 | + /* Discard the shifted token. */ | |
1332 | + yychar = YYEMPTY; | |
1333 | + | |
1334 | + yystate = yyn; | |
1335 | + *++yyvsp = yylval; | |
1336 | + | |
1337 | + goto yynewstate; | |
1338 | + | |
1339 | + | |
1340 | +/*-----------------------------------------------------------. | |
1341 | +| yydefault -- do the default action for the current state. | | |
1342 | +`-----------------------------------------------------------*/ | |
1343 | +yydefault: | |
1344 | + yyn = yydefact[yystate]; | |
1345 | + if (yyn == 0) | |
1346 | + goto yyerrlab; | |
1347 | + goto yyreduce; | |
1348 | + | |
1349 | + | |
1350 | +/*-----------------------------. | |
1351 | +| yyreduce -- Do a reduction. | | |
1352 | +`-----------------------------*/ | |
1353 | +yyreduce: | |
1354 | + /* yyn is the number of a rule to reduce with. */ | |
1355 | + yylen = yyr2[yyn]; | |
1356 | + | |
1357 | + /* If YYLEN is nonzero, implement the default value of the action: | |
1358 | + `$$ = $1'. | |
1359 | + | |
1360 | + Otherwise, the following line sets YYVAL to garbage. | |
1361 | + This behavior is undocumented and Bison | |
1362 | + users should not rely upon it. Assigning to YYVAL | |
1363 | + unconditionally makes the parser a bit smaller, and it avoids a | |
1364 | + GCC warning that YYVAL may be used uninitialized. */ | |
1365 | + yyval = yyvsp[1-yylen]; | |
1366 | + | |
1367 | + | |
1368 | + YY_REDUCE_PRINT (yyn); | |
1369 | + switch (yyn) | |
1370 | + { | |
1371 | + case 4: | |
1372 | + | |
1373 | +/* Line 1464 of yacc.c */ | |
1374 | +#line 45 "util/pmu.y" | |
1375 | + { | |
1376 | + ABORT_ON(perf_pmu__new_format(format, name, | |
1377 | + PERF_PMU_FORMAT_VALUE_CONFIG, | |
1378 | + (yyvsp[(3) - (3)].bits))); | |
1379 | +;} | |
1380 | + break; | |
1381 | + | |
1382 | + case 5: | |
1383 | + | |
1384 | +/* Line 1464 of yacc.c */ | |
1385 | +#line 52 "util/pmu.y" | |
1386 | + { | |
1387 | + ABORT_ON(perf_pmu__new_format(format, name, | |
1388 | + PERF_PMU_FORMAT_VALUE_CONFIG1, | |
1389 | + (yyvsp[(3) - (3)].bits))); | |
1390 | +;} | |
1391 | + break; | |
1392 | + | |
1393 | + case 6: | |
1394 | + | |
1395 | +/* Line 1464 of yacc.c */ | |
1396 | +#line 59 "util/pmu.y" | |
1397 | + { | |
1398 | + ABORT_ON(perf_pmu__new_format(format, name, | |
1399 | + PERF_PMU_FORMAT_VALUE_CONFIG2, | |
1400 | + (yyvsp[(3) - (3)].bits))); | |
1401 | +;} | |
1402 | + break; | |
1403 | + | |
1404 | + case 7: | |
1405 | + | |
1406 | +/* Line 1464 of yacc.c */ | |
1407 | +#line 67 "util/pmu.y" | |
1408 | + { | |
1409 | + bitmap_or((yyval.bits), (yyvsp[(1) - (3)].bits), (yyvsp[(3) - (3)].bits), 64); | |
1410 | +;} | |
1411 | + break; | |
1412 | + | |
1413 | + case 8: | |
1414 | + | |
1415 | +/* Line 1464 of yacc.c */ | |
1416 | +#line 72 "util/pmu.y" | |
1417 | + { | |
1418 | + memcpy((yyval.bits), (yyvsp[(1) - (1)].bits), sizeof((yyvsp[(1) - (1)].bits))); | |
1419 | +;} | |
1420 | + break; | |
1421 | + | |
1422 | + case 9: | |
1423 | + | |
1424 | +/* Line 1464 of yacc.c */ | |
1425 | +#line 78 "util/pmu.y" | |
1426 | + { | |
1427 | + perf_pmu__set_format((yyval.bits), (yyvsp[(1) - (3)].num), (yyvsp[(3) - (3)].num)); | |
1428 | +;} | |
1429 | + break; | |
1430 | + | |
1431 | + case 10: | |
1432 | + | |
1433 | +/* Line 1464 of yacc.c */ | |
1434 | +#line 83 "util/pmu.y" | |
1435 | + { | |
1436 | + perf_pmu__set_format((yyval.bits), (yyvsp[(1) - (1)].num), 0); | |
1437 | +;} | |
1438 | + break; | |
1439 | + | |
1440 | + | |
1441 | + | |
1442 | +/* Line 1464 of yacc.c */ | |
1443 | +#line 1444 "util/pmu-bison.c" | |
1444 | + default: break; | |
1445 | + } | |
1446 | + YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); | |
1447 | + | |
1448 | + YYPOPSTACK (yylen); | |
1449 | + yylen = 0; | |
1450 | + YY_STACK_PRINT (yyss, yyssp); | |
1451 | + | |
1452 | + *++yyvsp = yyval; | |
1453 | + | |
1454 | + /* Now `shift' the result of the reduction. Determine what state | |
1455 | + that goes to, based on the state we popped back to and the rule | |
1456 | + number reduced by. */ | |
1457 | + | |
1458 | + yyn = yyr1[yyn]; | |
1459 | + | |
1460 | + yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; | |
1461 | + if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) | |
1462 | + yystate = yytable[yystate]; | |
1463 | + else | |
1464 | + yystate = yydefgoto[yyn - YYNTOKENS]; | |
1465 | + | |
1466 | + goto yynewstate; | |
1467 | + | |
1468 | + | |
1469 | +/*------------------------------------. | |
1470 | +| yyerrlab -- here on detecting error | | |
1471 | +`------------------------------------*/ | |
1472 | +yyerrlab: | |
1473 | + /* If not already recovering from an error, report this error. */ | |
1474 | + if (!yyerrstatus) | |
1475 | + { | |
1476 | + ++yynerrs; | |
1477 | +#if ! YYERROR_VERBOSE | |
1478 | + yyerror (format, name, YY_("syntax error")); | |
1479 | +#else | |
1480 | + { | |
1481 | + YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); | |
1482 | + if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) | |
1483 | + { | |
1484 | + YYSIZE_T yyalloc = 2 * yysize; | |
1485 | + if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) | |
1486 | + yyalloc = YYSTACK_ALLOC_MAXIMUM; | |
1487 | + if (yymsg != yymsgbuf) | |
1488 | + YYSTACK_FREE (yymsg); | |
1489 | + yymsg = (char *) YYSTACK_ALLOC (yyalloc); | |
1490 | + if (yymsg) | |
1491 | + yymsg_alloc = yyalloc; | |
1492 | + else | |
1493 | + { | |
1494 | + yymsg = yymsgbuf; | |
1495 | + yymsg_alloc = sizeof yymsgbuf; | |
1496 | + } | |
1497 | + } | |
1498 | + | |
1499 | + if (0 < yysize && yysize <= yymsg_alloc) | |
1500 | + { | |
1501 | + (void) yysyntax_error (yymsg, yystate, yychar); | |
1502 | + yyerror (format, name, yymsg); | |
1503 | + } | |
1504 | + else | |
1505 | + { | |
1506 | + yyerror (format, name, YY_("syntax error")); | |
1507 | + if (yysize != 0) | |
1508 | + goto yyexhaustedlab; | |
1509 | + } | |
1510 | + } | |
1511 | +#endif | |
1512 | + } | |
1513 | + | |
1514 | + | |
1515 | + | |
1516 | + if (yyerrstatus == 3) | |
1517 | + { | |
1518 | + /* If just tried and failed to reuse lookahead token after an | |
1519 | + error, discard it. */ | |
1520 | + | |
1521 | + if (yychar <= YYEOF) | |
1522 | + { | |
1523 | + /* Return failure if at end of input. */ | |
1524 | + if (yychar == YYEOF) | |
1525 | + YYABORT; | |
1526 | + } | |
1527 | + else | |
1528 | + { | |
1529 | + yydestruct ("Error: discarding", | |
1530 | + yytoken, &yylval, format, name); | |
1531 | + yychar = YYEMPTY; | |
1532 | + } | |
1533 | + } | |
1534 | + | |
1535 | + /* Else will try to reuse lookahead token after shifting the error | |
1536 | + token. */ | |
1537 | + goto yyerrlab1; | |
1538 | + | |
1539 | + | |
1540 | +/*---------------------------------------------------. | |
1541 | +| yyerrorlab -- error raised explicitly by YYERROR. | | |
1542 | +`---------------------------------------------------*/ | |
1543 | +yyerrorlab: | |
1544 | + | |
1545 | + /* Pacify compilers like GCC when the user code never invokes | |
1546 | + YYERROR and the label yyerrorlab therefore never appears in user | |
1547 | + code. */ | |
1548 | + if (/*CONSTCOND*/ 0) | |
1549 | + goto yyerrorlab; | |
1550 | + | |
1551 | + /* Do not reclaim the symbols of the rule which action triggered | |
1552 | + this YYERROR. */ | |
1553 | + YYPOPSTACK (yylen); | |
1554 | + yylen = 0; | |
1555 | + YY_STACK_PRINT (yyss, yyssp); | |
1556 | + yystate = *yyssp; | |
1557 | + goto yyerrlab1; | |
1558 | + | |
1559 | + | |
1560 | +/*-------------------------------------------------------------. | |
1561 | +| yyerrlab1 -- common code for both syntax error and YYERROR. | | |
1562 | +`-------------------------------------------------------------*/ | |
1563 | +yyerrlab1: | |
1564 | + yyerrstatus = 3; /* Each real token shifted decrements this. */ | |
1565 | + | |
1566 | + for (;;) | |
1567 | + { | |
1568 | + yyn = yypact[yystate]; | |
1569 | + if (yyn != YYPACT_NINF) | |
1570 | + { | |
1571 | + yyn += YYTERROR; | |
1572 | + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) | |
1573 | + { | |
1574 | + yyn = yytable[yyn]; | |
1575 | + if (0 < yyn) | |
1576 | + break; | |
1577 | + } | |
1578 | + } | |
1579 | + | |
1580 | + /* Pop the current state because it cannot handle the error token. */ | |
1581 | + if (yyssp == yyss) | |
1582 | + YYABORT; | |
1583 | + | |
1584 | + | |
1585 | + yydestruct ("Error: popping", | |
1586 | + yystos[yystate], yyvsp, format, name); | |
1587 | + YYPOPSTACK (1); | |
1588 | + yystate = *yyssp; | |
1589 | + YY_STACK_PRINT (yyss, yyssp); | |
1590 | + } | |
1591 | + | |
1592 | + *++yyvsp = yylval; | |
1593 | + | |
1594 | + | |
1595 | + /* Shift the error token. */ | |
1596 | + YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); | |
1597 | + | |
1598 | + yystate = yyn; | |
1599 | + goto yynewstate; | |
1600 | + | |
1601 | + | |
1602 | +/*-------------------------------------. | |
1603 | +| yyacceptlab -- YYACCEPT comes here. | | |
1604 | +`-------------------------------------*/ | |
1605 | +yyacceptlab: | |
1606 | + yyresult = 0; | |
1607 | + goto yyreturn; | |
1608 | + | |
1609 | +/*-----------------------------------. | |
1610 | +| yyabortlab -- YYABORT comes here. | | |
1611 | +`-----------------------------------*/ | |
1612 | +yyabortlab: | |
1613 | + yyresult = 1; | |
1614 | + goto yyreturn; | |
1615 | + | |
1616 | +#if !defined(yyoverflow) || YYERROR_VERBOSE | |
1617 | +/*-------------------------------------------------. | |
1618 | +| yyexhaustedlab -- memory exhaustion comes here. | | |
1619 | +`-------------------------------------------------*/ | |
1620 | +yyexhaustedlab: | |
1621 | + yyerror (format, name, YY_("memory exhausted")); | |
1622 | + yyresult = 2; | |
1623 | + /* Fall through. */ | |
1624 | +#endif | |
1625 | + | |
1626 | +yyreturn: | |
1627 | + if (yychar != YYEMPTY) | |
1628 | + yydestruct ("Cleanup: discarding lookahead", | |
1629 | + yytoken, &yylval, format, name); | |
1630 | + /* Do not reclaim the symbols of the rule which action triggered | |
1631 | + this YYABORT or YYACCEPT. */ | |
1632 | + YYPOPSTACK (yylen); | |
1633 | + YY_STACK_PRINT (yyss, yyssp); | |
1634 | + while (yyssp != yyss) | |
1635 | + { | |
1636 | + yydestruct ("Cleanup: popping", | |
1637 | + yystos[*yyssp], yyvsp, format, name); | |
1638 | + YYPOPSTACK (1); | |
1639 | + } | |
1640 | +#ifndef yyoverflow | |
1641 | + if (yyss != yyssa) | |
1642 | + YYSTACK_FREE (yyss); | |
1643 | +#endif | |
1644 | +#if YYERROR_VERBOSE | |
1645 | + if (yymsg != yymsgbuf) | |
1646 | + YYSTACK_FREE (yymsg); | |
1647 | +#endif | |
1648 | + /* Make sure YYID is used. */ | |
1649 | + return YYID (yyresult); | |
1650 | +} | |
1651 | + | |
1652 | + | |
1653 | + | |
1654 | +/* Line 1684 of yacc.c */ | |
1655 | +#line 87 "util/pmu.y" | |
1656 | + | |
1657 | + | |
1658 | +void perf_pmu_error(struct list_head *list __used, | |
1659 | + char *name __used, | |
1660 | + char const *msg __used) | |
1661 | +{ | |
1662 | +} |
tools/perf/util/pmu-bison.h
1 | +/* A Bison parser, made by GNU Bison 2.4.3. */ | |
2 | + | |
3 | +/* Skeleton interface for Bison's Yacc-like parsers in C | |
4 | + | |
5 | + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006, | |
6 | + 2009, 2010 Free Software Foundation, Inc. | |
7 | + | |
8 | + This program is free software: you can redistribute it and/or modify | |
9 | + it under the terms of the GNU General Public License as published by | |
10 | + the Free Software Foundation, either version 3 of the License, or | |
11 | + (at your option) any later version. | |
12 | + | |
13 | + This program is distributed in the hope that it will be useful, | |
14 | + but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 | + GNU General Public License for more details. | |
17 | + | |
18 | + You should have received a copy of the GNU General Public License | |
19 | + along with this program. If not, see <http://www.gnu.org/licenses/>. */ | |
20 | + | |
21 | +/* As a special exception, you may create a larger work that contains | |
22 | + part or all of the Bison parser skeleton and distribute that work | |
23 | + under terms of your choice, so long as that work isn't itself a | |
24 | + parser generator using the skeleton or a modified version thereof | |
25 | + as a parser skeleton. Alternatively, if you modify or redistribute | |
26 | + the parser skeleton itself, you may (at your option) remove this | |
27 | + special exception, which will cause the skeleton and the resulting | |
28 | + Bison output files to be licensed under the GNU General Public | |
29 | + License without this special exception. | |
30 | + | |
31 | + This special exception was added by the Free Software Foundation in | |
32 | + version 2.2 of Bison. */ | |
33 | + | |
34 | + | |
35 | +/* Tokens. */ | |
36 | +#ifndef YYTOKENTYPE | |
37 | +# define YYTOKENTYPE | |
38 | + /* Put the tokens into the symbol table, so that GDB and other debuggers | |
39 | + know about them. */ | |
40 | + enum yytokentype { | |
41 | + PP_CONFIG = 258, | |
42 | + PP_CONFIG1 = 259, | |
43 | + PP_CONFIG2 = 260, | |
44 | + PP_VALUE = 261, | |
45 | + PP_ERROR = 262 | |
46 | + }; | |
47 | +#endif | |
48 | + | |
49 | + | |
50 | + | |
51 | +#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED | |
52 | +typedef union YYSTYPE | |
53 | +{ | |
54 | + | |
55 | +/* Line 1685 of yacc.c */ | |
56 | +#line 31 "util/pmu.y" | |
57 | + | |
58 | + unsigned long num; | |
59 | + DECLARE_BITMAP(bits, PERF_PMU_FORMAT_BITS); | |
60 | + | |
61 | + | |
62 | + | |
63 | +/* Line 1685 of yacc.c */ | |
64 | +#line 65 "util/pmu-bison.h" | |
65 | +} YYSTYPE; | |
66 | +# define YYSTYPE_IS_TRIVIAL 1 | |
67 | +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ | |
68 | +# define YYSTYPE_IS_DECLARED 1 | |
69 | +#endif | |
70 | + | |
71 | +extern YYSTYPE perf_pmu_lval; |
tools/perf/util/pmu-flex.c
Changes suppressed. Click to show
1 | + | |
2 | +#line 3 "<stdout>" | |
3 | + | |
4 | +#define YY_INT_ALIGNED short int | |
5 | + | |
6 | +/* A lexical scanner generated by flex */ | |
7 | + | |
8 | +#define yy_create_buffer perf_pmu__create_buffer | |
9 | +#define yy_delete_buffer perf_pmu__delete_buffer | |
10 | +#define yy_flex_debug perf_pmu__flex_debug | |
11 | +#define yy_init_buffer perf_pmu__init_buffer | |
12 | +#define yy_flush_buffer perf_pmu__flush_buffer | |
13 | +#define yy_load_buffer_state perf_pmu__load_buffer_state | |
14 | +#define yy_switch_to_buffer perf_pmu__switch_to_buffer | |
15 | +#define yyin perf_pmu_in | |
16 | +#define yyleng perf_pmu_leng | |
17 | +#define yylex perf_pmu_lex | |
18 | +#define yylineno perf_pmu_lineno | |
19 | +#define yyout perf_pmu_out | |
20 | +#define yyrestart perf_pmu_restart | |
21 | +#define yytext perf_pmu_text | |
22 | +#define yywrap perf_pmu_wrap | |
23 | +#define yyalloc perf_pmu_alloc | |
24 | +#define yyrealloc perf_pmu_realloc | |
25 | +#define yyfree perf_pmu_free | |
26 | + | |
27 | +#define FLEX_SCANNER | |
28 | +#define YY_FLEX_MAJOR_VERSION 2 | |
29 | +#define YY_FLEX_MINOR_VERSION 5 | |
30 | +#define YY_FLEX_SUBMINOR_VERSION 35 | |
31 | +#if YY_FLEX_SUBMINOR_VERSION > 0 | |
32 | +#define FLEX_BETA | |
33 | +#endif | |
34 | + | |
35 | +/* First, we deal with platform-specific or compiler-specific issues. */ | |
36 | + | |
37 | +/* begin standard C headers. */ | |
38 | +#include <stdio.h> | |
39 | +#include <string.h> | |
40 | +#include <errno.h> | |
41 | +#include <stdlib.h> | |
42 | + | |
43 | +/* end standard C headers. */ | |
44 | + | |
45 | +/* flex integer type definitions */ | |
46 | + | |
47 | +#ifndef FLEXINT_H | |
48 | +#define FLEXINT_H | |
49 | + | |
50 | +/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */ | |
51 | + | |
52 | +#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L | |
53 | + | |
54 | +/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, | |
55 | + * if you want the limit (max/min) macros for int types. | |
56 | + */ | |
57 | +#ifndef __STDC_LIMIT_MACROS | |
58 | +#define __STDC_LIMIT_MACROS 1 | |
59 | +#endif | |
60 | + | |
61 | +#include <inttypes.h> | |
62 | +typedef int8_t flex_int8_t; | |
63 | +typedef uint8_t flex_uint8_t; | |
64 | +typedef int16_t flex_int16_t; | |
65 | +typedef uint16_t flex_uint16_t; | |
66 | +typedef int32_t flex_int32_t; | |
67 | +typedef uint32_t flex_uint32_t; | |
68 | +#else | |
69 | +typedef signed char flex_int8_t; | |
70 | +typedef short int flex_int16_t; | |
71 | +typedef int flex_int32_t; | |
72 | +typedef unsigned char flex_uint8_t; | |
73 | +typedef unsigned short int flex_uint16_t; | |
74 | +typedef unsigned int flex_uint32_t; | |
75 | +#endif /* ! C99 */ | |
76 | + | |
77 | +/* Limits of integral types. */ | |
78 | +#ifndef INT8_MIN | |
79 | +#define INT8_MIN (-128) | |
80 | +#endif | |
81 | +#ifndef INT16_MIN | |
82 | +#define INT16_MIN (-32767-1) | |
83 | +#endif | |
84 | +#ifndef INT32_MIN | |
85 | +#define INT32_MIN (-2147483647-1) | |
86 | +#endif | |
87 | +#ifndef INT8_MAX | |
88 | +#define INT8_MAX (127) | |
89 | +#endif | |
90 | +#ifndef INT16_MAX | |
91 | +#define INT16_MAX (32767) | |
92 | +#endif | |
93 | +#ifndef INT32_MAX | |
94 | +#define INT32_MAX (2147483647) | |
95 | +#endif | |
96 | +#ifndef UINT8_MAX | |
97 | +#define UINT8_MAX (255U) | |
98 | +#endif | |
99 | +#ifndef UINT16_MAX | |
100 | +#define UINT16_MAX (65535U) | |
101 | +#endif | |
102 | +#ifndef UINT32_MAX | |
103 | +#define UINT32_MAX (4294967295U) | |
104 | +#endif | |
105 | + | |
106 | +#endif /* ! FLEXINT_H */ | |
107 | + | |
108 | +#ifdef __cplusplus | |
109 | + | |
110 | +/* The "const" storage-class-modifier is valid. */ | |
111 | +#define YY_USE_CONST | |
112 | + | |
113 | +#else /* ! __cplusplus */ | |
114 | + | |
115 | +/* C99 requires __STDC__ to be defined as 1. */ | |
116 | +#if defined (__STDC__) | |
117 | + | |
118 | +#define YY_USE_CONST | |
119 | + | |
120 | +#endif /* defined (__STDC__) */ | |
121 | +#endif /* ! __cplusplus */ | |
122 | + | |
123 | +#ifdef YY_USE_CONST | |
124 | +#define yyconst const | |
125 | +#else | |
126 | +#define yyconst | |
127 | +#endif | |
128 | + | |
129 | +/* Returned upon end-of-file. */ | |
130 | +#define YY_NULL 0 | |
131 | + | |
132 | +/* Promotes a possibly negative, possibly signed char to an unsigned | |
133 | + * integer for use as an array index. If the signed char is negative, | |
134 | + * we want to instead treat it as an 8-bit unsigned char, hence the | |
135 | + * double cast. | |
136 | + */ | |
137 | +#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) | |
138 | + | |
139 | +/* Enter a start condition. This macro really ought to take a parameter, | |
140 | + * but we do it the disgusting crufty way forced on us by the ()-less | |
141 | + * definition of BEGIN. | |
142 | + */ | |
143 | +#define BEGIN (yy_start) = 1 + 2 * | |
144 | + | |
145 | +/* Translate the current start state into a value that can be later handed | |
146 | + * to BEGIN to return to the state. The YYSTATE alias is for lex | |
147 | + * compatibility. | |
148 | + */ | |
149 | +#define YY_START (((yy_start) - 1) / 2) | |
150 | +#define YYSTATE YY_START | |
151 | + | |
152 | +/* Action number for EOF rule of a given start state. */ | |
153 | +#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) | |
154 | + | |
155 | +/* Special action meaning "start processing a new file". */ | |
156 | +#define YY_NEW_FILE perf_pmu_restart(perf_pmu_in ) | |
157 | + | |
158 | +#define YY_END_OF_BUFFER_CHAR 0 | |
159 | + | |
160 | +/* Size of default input buffer. */ | |
161 | +#ifndef YY_BUF_SIZE | |
162 | +#define YY_BUF_SIZE 16384 | |
163 | +#endif | |
164 | + | |
165 | +/* The state buf must be large enough to hold one state per character in the main buffer. | |
166 | + */ | |
167 | +#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) | |
168 | + | |
169 | +#ifndef YY_TYPEDEF_YY_BUFFER_STATE | |
170 | +#define YY_TYPEDEF_YY_BUFFER_STATE | |
171 | +typedef struct yy_buffer_state *YY_BUFFER_STATE; | |
172 | +#endif | |
173 | + | |
174 | +extern int perf_pmu_leng; | |
175 | + | |
176 | +extern FILE *perf_pmu_in, *perf_pmu_out; | |
177 | + | |
178 | +#define EOB_ACT_CONTINUE_SCAN 0 | |
179 | +#define EOB_ACT_END_OF_FILE 1 | |
180 | +#define EOB_ACT_LAST_MATCH 2 | |
181 | + | |
182 | + #define YY_LESS_LINENO(n) | |
183 | + | |
184 | +/* Return all but the first "n" matched characters back to the input stream. */ | |
185 | +#define yyless(n) \ | |
186 | + do \ | |
187 | + { \ | |
188 | + /* Undo effects of setting up perf_pmu_text. */ \ | |
189 | + int yyless_macro_arg = (n); \ | |
190 | + YY_LESS_LINENO(yyless_macro_arg);\ | |
191 | + *yy_cp = (yy_hold_char); \ | |
192 | + YY_RESTORE_YY_MORE_OFFSET \ | |
193 | + (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ | |
194 | + YY_DO_BEFORE_ACTION; /* set up perf_pmu_text again */ \ | |
195 | + } \ | |
196 | + while ( 0 ) | |
197 | + | |
198 | +#define unput(c) yyunput( c, (yytext_ptr) ) | |
199 | + | |
200 | +#ifndef YY_TYPEDEF_YY_SIZE_T | |
201 | +#define YY_TYPEDEF_YY_SIZE_T | |
202 | +typedef size_t yy_size_t; | |
203 | +#endif | |
204 | + | |
205 | +#ifndef YY_STRUCT_YY_BUFFER_STATE | |
206 | +#define YY_STRUCT_YY_BUFFER_STATE | |
207 | +struct yy_buffer_state | |
208 | + { | |
209 | + FILE *yy_input_file; | |
210 | + | |
211 | + char *yy_ch_buf; /* input buffer */ | |
212 | + char *yy_buf_pos; /* current position in input buffer */ | |
213 | + | |
214 | + /* Size of input buffer in bytes, not including room for EOB | |
215 | + * characters. | |
216 | + */ | |
217 | + yy_size_t yy_buf_size; | |
218 | + | |
219 | + /* Number of characters read into yy_ch_buf, not including EOB | |
220 | + * characters. | |
221 | + */ | |
222 | + int yy_n_chars; | |
223 | + | |
224 | + /* Whether we "own" the buffer - i.e., we know we created it, | |
225 | + * and can realloc() it to grow it, and should free() it to | |
226 | + * delete it. | |
227 | + */ | |
228 | + int yy_is_our_buffer; | |
229 | + | |
230 | + /* Whether this is an "interactive" input source; if so, and | |
231 | + * if we're using stdio for input, then we want to use getc() | |
232 | + * instead of fread(), to make sure we stop fetching input after | |
233 | + * each newline. | |
234 | + */ | |
235 | + int yy_is_interactive; | |
236 | + | |
237 | + /* Whether we're considered to be at the beginning of a line. | |
238 | + * If so, '^' rules will be active on the next match, otherwise | |
239 | + * not. | |
240 | + */ | |
241 | + int yy_at_bol; | |
242 | + | |
243 | + int yy_bs_lineno; /**< The line count. */ | |
244 | + int yy_bs_column; /**< The column count. */ | |
245 | + | |
246 | + /* Whether to try to fill the input buffer when we reach the | |
247 | + * end of it. | |
248 | + */ | |
249 | + int yy_fill_buffer; | |
250 | + | |
251 | + int yy_buffer_status; | |
252 | + | |
253 | +#define YY_BUFFER_NEW 0 | |
254 | +#define YY_BUFFER_NORMAL 1 | |
255 | + /* When an EOF's been seen but there's still some text to process | |
256 | + * then we mark the buffer as YY_EOF_PENDING, to indicate that we | |
257 | + * shouldn't try reading from the input source any more. We might | |
258 | + * still have a bunch of tokens to match, though, because of | |
259 | + * possible backing-up. | |
260 | + * | |
261 | + * When we actually see the EOF, we change the status to "new" | |
262 | + * (via perf_pmu_restart()), so that the user can continue scanning by | |
263 | + * just pointing perf_pmu_in at a new input file. | |
264 | + */ | |
265 | +#define YY_BUFFER_EOF_PENDING 2 | |
266 | + | |
267 | + }; | |
268 | +#endif /* !YY_STRUCT_YY_BUFFER_STATE */ | |
269 | + | |
270 | +/* Stack of input buffers. */ | |
271 | +static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ | |
272 | +static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ | |
273 | +static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ | |
274 | + | |
275 | +/* We provide macros for accessing buffer states in case in the | |
276 | + * future we want to put the buffer states in a more general | |
277 | + * "scanner state". | |
278 | + * | |
279 | + * Returns the top of the stack, or NULL. | |
280 | + */ | |
281 | +#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ | |
282 | + ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ | |
283 | + : NULL) | |
284 | + | |
285 | +/* Same as previous macro, but useful when we know that the buffer stack is not | |
286 | + * NULL or when we need an lvalue. For internal use only. | |
287 | + */ | |
288 | +#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] | |
289 | + | |
290 | +/* yy_hold_char holds the character lost when perf_pmu_text is formed. */ | |
291 | +static char yy_hold_char; | |
292 | +static int yy_n_chars; /* number of characters read into yy_ch_buf */ | |
293 | +int perf_pmu_leng; | |
294 | + | |
295 | +/* Points to current character in buffer. */ | |
296 | +static char *yy_c_buf_p = (char *) 0; | |
297 | +static int yy_init = 0; /* whether we need to initialize */ | |
298 | +static int yy_start = 0; /* start state number */ | |
299 | + | |
300 | +/* Flag which is used to allow perf_pmu_wrap()'s to do buffer switches | |
301 | + * instead of setting up a fresh perf_pmu_in. A bit of a hack ... | |
302 | + */ | |
303 | +static int yy_did_buffer_switch_on_eof; | |
304 | + | |
305 | +void perf_pmu_restart (FILE *input_file ); | |
306 | +void perf_pmu__switch_to_buffer (YY_BUFFER_STATE new_buffer ); | |
307 | +YY_BUFFER_STATE perf_pmu__create_buffer (FILE *file,int size ); | |
308 | +void perf_pmu__delete_buffer (YY_BUFFER_STATE b ); | |
309 | +void perf_pmu__flush_buffer (YY_BUFFER_STATE b ); | |
310 | +void perf_pmu_push_buffer_state (YY_BUFFER_STATE new_buffer ); | |
311 | +void perf_pmu_pop_buffer_state (void ); | |
312 | + | |
313 | +static void perf_pmu_ensure_buffer_stack (void ); | |
314 | +static void perf_pmu__load_buffer_state (void ); | |
315 | +static void perf_pmu__init_buffer (YY_BUFFER_STATE b,FILE *file ); | |
316 | + | |
317 | +#define YY_FLUSH_BUFFER perf_pmu__flush_buffer(YY_CURRENT_BUFFER ) | |
318 | + | |
319 | +YY_BUFFER_STATE perf_pmu__scan_buffer (char *base,yy_size_t size ); | |
320 | +YY_BUFFER_STATE perf_pmu__scan_string (yyconst char *yy_str ); | |
321 | +YY_BUFFER_STATE perf_pmu__scan_bytes (yyconst char *bytes,int len ); | |
322 | + | |
323 | +void *perf_pmu_alloc (yy_size_t ); | |
324 | +void *perf_pmu_realloc (void *,yy_size_t ); | |
325 | +void perf_pmu_free (void * ); | |
326 | + | |
327 | +#define yy_new_buffer perf_pmu__create_buffer | |
328 | + | |
329 | +#define yy_set_interactive(is_interactive) \ | |
330 | + { \ | |
331 | + if ( ! YY_CURRENT_BUFFER ){ \ | |
332 | + perf_pmu_ensure_buffer_stack (); \ | |
333 | + YY_CURRENT_BUFFER_LVALUE = \ | |
334 | + perf_pmu__create_buffer(perf_pmu_in,YY_BUF_SIZE ); \ | |
335 | + } \ | |
336 | + YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ | |
337 | + } | |
338 | + | |
339 | +#define yy_set_bol(at_bol) \ | |
340 | + { \ | |
341 | + if ( ! YY_CURRENT_BUFFER ){\ | |
342 | + perf_pmu_ensure_buffer_stack (); \ | |
343 | + YY_CURRENT_BUFFER_LVALUE = \ | |
344 | + perf_pmu__create_buffer(perf_pmu_in,YY_BUF_SIZE ); \ | |
345 | + } \ | |
346 | + YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ | |
347 | + } | |
348 | + | |
349 | +#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) | |
350 | + | |
351 | +/* Begin user sect3 */ | |
352 | + | |
353 | +typedef unsigned char YY_CHAR; | |
354 | + | |
355 | +FILE *perf_pmu_in = (FILE *) 0, *perf_pmu_out = (FILE *) 0; | |
356 | + | |
357 | +typedef int yy_state_type; | |
358 | + | |
359 | +extern int perf_pmu_lineno; | |
360 | + | |
361 | +int perf_pmu_lineno = 1; | |
362 | + | |
363 | +extern char *perf_pmu_text; | |
364 | +#define yytext_ptr perf_pmu_text | |
365 | + | |
366 | +static yy_state_type yy_get_previous_state (void ); | |
367 | +static yy_state_type yy_try_NUL_trans (yy_state_type current_state ); | |
368 | +static int yy_get_next_buffer (void ); | |
369 | +static void yy_fatal_error (yyconst char msg[] ); | |
370 | + | |
371 | +/* Done after the current pattern has been matched and before the | |
372 | + * corresponding action - sets up perf_pmu_text. | |
373 | + */ | |
374 | +#define YY_DO_BEFORE_ACTION \ | |
375 | + (yytext_ptr) = yy_bp; \ | |
376 | + perf_pmu_leng = (size_t) (yy_cp - yy_bp); \ | |
377 | + (yy_hold_char) = *yy_cp; \ | |
378 | + *yy_cp = '\0'; \ | |
379 | + (yy_c_buf_p) = yy_cp; | |
380 | + | |
381 | +#define YY_NUM_RULES 10 | |
382 | +#define YY_END_OF_BUFFER 11 | |
383 | +/* This struct is not used in this scanner, | |
384 | + but its presence is necessary. */ | |
385 | +struct yy_trans_info | |
386 | + { | |
387 | + flex_int32_t yy_verify; | |
388 | + flex_int32_t yy_nxt; | |
389 | + }; | |
390 | +static yyconst flex_int16_t yy_accept[20] = | |
391 | + { 0, | |
392 | + 0, 0, 11, 8, 9, 7, 5, 1, 6, 8, | |
393 | + 1, 0, 0, 0, 0, 2, 3, 4, 0 | |
394 | + } ; | |
395 | + | |
396 | +static yyconst flex_int32_t yy_ec[256] = | |
397 | + { 0, | |
398 | + 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, | |
399 | + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
400 | + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
401 | + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
402 | + 1, 1, 1, 3, 4, 1, 1, 5, 6, 7, | |
403 | + 5, 5, 5, 5, 5, 5, 5, 8, 1, 1, | |
404 | + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
405 | + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
406 | + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
407 | + 1, 1, 1, 1, 1, 1, 1, 1, 9, 1, | |
408 | + | |
409 | + 1, 10, 11, 1, 12, 1, 1, 1, 1, 13, | |
410 | + 14, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
411 | + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
412 | + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
413 | + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
414 | + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
415 | + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
416 | + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
417 | + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
418 | + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
419 | + | |
420 | + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
421 | + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
422 | + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
423 | + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
424 | + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
425 | + 1, 1, 1, 1, 1 | |
426 | + } ; | |
427 | + | |
428 | +static yyconst flex_int32_t yy_meta[15] = | |
429 | + { 0, | |
430 | + 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, | |
431 | + 1, 1, 1, 1 | |
432 | + } ; | |
433 | + | |
434 | +static yyconst flex_int16_t yy_base[21] = | |
435 | + { 0, | |
436 | + 0, 0, 23, 24, 24, 24, 24, 0, 24, 8, | |
437 | + 0, 8, 10, 7, 7, 9, 24, 24, 24, 15 | |
438 | + } ; | |
439 | + | |
440 | +static yyconst flex_int16_t yy_def[21] = | |
441 | + { 0, | |
442 | + 19, 1, 19, 19, 19, 19, 19, 20, 19, 19, | |
443 | + 20, 19, 19, 19, 19, 19, 19, 19, 0, 19 | |
444 | + } ; | |
445 | + | |
446 | +static yyconst flex_int16_t yy_nxt[39] = | |
447 | + { 0, | |
448 | + 4, 5, 6, 7, 8, 8, 8, 9, 10, 4, | |
449 | + 4, 4, 4, 4, 17, 18, 11, 16, 15, 14, | |
450 | + 13, 12, 19, 3, 19, 19, 19, 19, 19, 19, | |
451 | + 19, 19, 19, 19, 19, 19, 19, 19 | |
452 | + } ; | |
453 | + | |
454 | +static yyconst flex_int16_t yy_chk[39] = | |
455 | + { 0, | |
456 | + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
457 | + 1, 1, 1, 1, 16, 16, 20, 15, 14, 13, | |
458 | + 12, 10, 3, 19, 19, 19, 19, 19, 19, 19, | |
459 | + 19, 19, 19, 19, 19, 19, 19, 19 | |
460 | + } ; | |
461 | + | |
462 | +static yy_state_type yy_last_accepting_state; | |
463 | +static char *yy_last_accepting_cpos; | |
464 | + | |
465 | +extern int perf_pmu__flex_debug; | |
466 | +int perf_pmu__flex_debug = 0; | |
467 | + | |
468 | +/* The intent behind this definition is that it'll catch | |
469 | + * any uses of REJECT which flex missed. | |
470 | + */ | |
471 | +#define REJECT reject_used_but_not_detected | |
472 | +#define yymore() yymore_used_but_not_detected | |
473 | +#define YY_MORE_ADJ 0 | |
474 | +#define YY_RESTORE_YY_MORE_OFFSET | |
475 | +char *perf_pmu_text; | |
476 | +#line 1 "util/pmu.l" | |
477 | +#line 4 "util/pmu.l" | |
478 | +#include <stdlib.h> | |
479 | +#include <linux/bitops.h> | |
480 | +#include "pmu.h" | |
481 | +#include "pmu-bison.h" | |
482 | + | |
483 | +static int value(int base) | |
484 | +{ | |
485 | + long num; | |
486 | + | |
487 | + errno = 0; | |
488 | + num = strtoul(perf_pmu_text, NULL, base); | |
489 | + if (errno) | |
490 | + return PP_ERROR; | |
491 | + | |
492 | + perf_pmu_lval.num = num; | |
493 | + return PP_VALUE; | |
494 | +} | |
495 | + | |
496 | +#line 497 "<stdout>" | |
497 | + | |
498 | +#define INITIAL 0 | |
499 | + | |
500 | +#ifndef YY_NO_UNISTD_H | |
501 | +/* Special case for "unistd.h", since it is non-ANSI. We include it way | |
502 | + * down here because we want the user's section 1 to have been scanned first. | |
503 | + * The user has a chance to override it with an option. | |
504 | + */ | |
505 | +#include <unistd.h> | |
506 | +#endif | |
507 | + | |
508 | +#ifndef YY_EXTRA_TYPE | |
509 | +#define YY_EXTRA_TYPE void * | |
510 | +#endif | |
511 | + | |
512 | +static int yy_init_globals (void ); | |
513 | + | |
514 | +/* Accessor methods to globals. | |
515 | + These are made visible to non-reentrant scanners for convenience. */ | |
516 | + | |
517 | +int perf_pmu_lex_destroy (void ); | |
518 | + | |
519 | +int perf_pmu_get_debug (void ); | |
520 | + | |
521 | +void perf_pmu_set_debug (int debug_flag ); | |
522 | + | |
523 | +YY_EXTRA_TYPE perf_pmu_get_extra (void ); | |
524 | + | |
525 | +void perf_pmu_set_extra (YY_EXTRA_TYPE user_defined ); | |
526 | + | |
527 | +FILE *perf_pmu_get_in (void ); | |
528 | + | |
529 | +void perf_pmu_set_in (FILE * in_str ); | |
530 | + | |
531 | +FILE *perf_pmu_get_out (void ); | |
532 | + | |
533 | +void perf_pmu_set_out (FILE * out_str ); | |
534 | + | |
535 | +int perf_pmu_get_leng (void ); | |
536 | + | |
537 | +char *perf_pmu_get_text (void ); | |
538 | + | |
539 | +int perf_pmu_get_lineno (void ); | |
540 | + | |
541 | +void perf_pmu_set_lineno (int line_number ); | |
542 | + | |
543 | +/* Macros after this point can all be overridden by user definitions in | |
544 | + * section 1. | |
545 | + */ | |
546 | + | |
547 | +#ifndef YY_SKIP_YYWRAP | |
548 | +#ifdef __cplusplus | |
549 | +extern "C" int perf_pmu_wrap (void ); | |
550 | +#else | |
551 | +extern int perf_pmu_wrap (void ); | |
552 | +#endif | |
553 | +#endif | |
554 | + | |
555 | + static void yyunput (int c,char *buf_ptr ); | |
556 | + | |
557 | +#ifndef yytext_ptr | |
558 | +static void yy_flex_strncpy (char *,yyconst char *,int ); | |
559 | +#endif | |
560 | + | |
561 | +#ifdef YY_NEED_STRLEN | |
562 | +static int yy_flex_strlen (yyconst char * ); | |
563 | +#endif | |
564 | + | |
565 | +#ifndef YY_NO_INPUT | |
566 | + | |
567 | +#ifdef __cplusplus | |
568 | +static int yyinput (void ); | |
569 | +#else | |
570 | +static int input (void ); | |
571 | +#endif | |
572 | + | |
573 | +#endif | |
574 | + | |
575 | +/* Amount of stuff to slurp up with each read. */ | |
576 | +#ifndef YY_READ_BUF_SIZE | |
577 | +#define YY_READ_BUF_SIZE 8192 | |
578 | +#endif | |
579 | + | |
580 | +/* Copy whatever the last rule matched to the standard output. */ | |
581 | +#ifndef ECHO | |
582 | +/* This used to be an fputs(), but since the string might contain NUL's, | |
583 | + * we now use fwrite(). | |
584 | + */ | |
585 | +#define ECHO do { if (fwrite( perf_pmu_text, perf_pmu_leng, 1, perf_pmu_out )) {} } while (0) | |
586 | +#endif | |
587 | + | |
588 | +/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, | |
589 | + * is returned in "result". | |
590 | + */ | |
591 | +#ifndef YY_INPUT | |
592 | +#define YY_INPUT(buf,result,max_size) \ | |
593 | + if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ | |
594 | + { \ | |
595 | + int c = '*'; \ | |
596 | + unsigned n; \ | |
597 | + for ( n = 0; n < max_size && \ | |
598 | + (c = getc( perf_pmu_in )) != EOF && c != '\n'; ++n ) \ | |
599 | + buf[n] = (char) c; \ | |
600 | + if ( c == '\n' ) \ | |
601 | + buf[n++] = (char) c; \ | |
602 | + if ( c == EOF && ferror( perf_pmu_in ) ) \ | |
603 | + YY_FATAL_ERROR( "input in flex scanner failed" ); \ | |
604 | + result = n; \ | |
605 | + } \ | |
606 | + else \ | |
607 | + { \ | |
608 | + errno=0; \ | |
609 | + while ( (result = fread(buf, 1, max_size, perf_pmu_in))==0 && ferror(perf_pmu_in)) \ | |
610 | + { \ | |
611 | + if( errno != EINTR) \ | |
612 | + { \ | |
613 | + YY_FATAL_ERROR( "input in flex scanner failed" ); \ | |
614 | + break; \ | |
615 | + } \ | |
616 | + errno=0; \ | |
617 | + clearerr(perf_pmu_in); \ | |
618 | + } \ | |
619 | + }\ | |
620 | +\ | |
621 | + | |
622 | +#endif | |
623 | + | |
624 | +/* No semi-colon after return; correct usage is to write "yyterminate();" - | |
625 | + * we don't want an extra ';' after the "return" because that will cause | |
626 | + * some compilers to complain about unreachable statements. | |
627 | + */ | |
628 | +#ifndef yyterminate | |
629 | +#define yyterminate() return YY_NULL | |
630 | +#endif | |
631 | + | |
632 | +/* Number of entries by which start-condition stack grows. */ | |
633 | +#ifndef YY_START_STACK_INCR | |
634 | +#define YY_START_STACK_INCR 25 | |
635 | +#endif | |
636 | + | |
637 | +/* Report a fatal error. */ | |
638 | +#ifndef YY_FATAL_ERROR | |
639 | +#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) | |
640 | +#endif | |
641 | + | |
642 | +/* end tables serialization structures and prototypes */ | |
643 | + | |
644 | +/* Default declaration of generated scanner - a define so the user can | |
645 | + * easily add parameters. | |
646 | + */ | |
647 | +#ifndef YY_DECL | |
648 | +#define YY_DECL_IS_OURS 1 | |
649 | + | |
650 | +extern int perf_pmu_lex (void); | |
651 | + | |
652 | +#define YY_DECL int perf_pmu_lex (void) | |
653 | +#endif /* !YY_DECL */ | |
654 | + | |
655 | +/* Code executed at the beginning of each rule, after perf_pmu_text and perf_pmu_leng | |
656 | + * have been set up. | |
657 | + */ | |
658 | +#ifndef YY_USER_ACTION | |
659 | +#define YY_USER_ACTION | |
660 | +#endif | |
661 | + | |
662 | +/* Code executed at the end of each rule. */ | |
663 | +#ifndef YY_BREAK | |
664 | +#define YY_BREAK break; | |
665 | +#endif | |
666 | + | |
667 | +#define YY_RULE_SETUP \ | |
668 | + YY_USER_ACTION | |
669 | + | |
670 | +/** The main scanner function which does all the work. | |
671 | + */ | |
672 | +YY_DECL | |
673 | +{ | |
674 | + register yy_state_type yy_current_state; | |
675 | + register char *yy_cp, *yy_bp; | |
676 | + register int yy_act; | |
677 | + | |
678 | +#line 26 "util/pmu.l" | |
679 | + | |
680 | + | |
681 | +#line 682 "<stdout>" | |
682 | + | |
683 | + if ( !(yy_init) ) | |
684 | + { | |
685 | + (yy_init) = 1; | |
686 | + | |
687 | +#ifdef YY_USER_INIT | |
688 | + YY_USER_INIT; | |
689 | +#endif | |
690 | + | |
691 | + if ( ! (yy_start) ) | |
692 | + (yy_start) = 1; /* first start state */ | |
693 | + | |
694 | + if ( ! perf_pmu_in ) | |
695 | + perf_pmu_in = stdin; | |
696 | + | |
697 | + if ( ! perf_pmu_out ) | |
698 | + perf_pmu_out = stdout; | |
699 | + | |
700 | + if ( ! YY_CURRENT_BUFFER ) { | |
701 | + perf_pmu_ensure_buffer_stack (); | |
702 | + YY_CURRENT_BUFFER_LVALUE = | |
703 | + perf_pmu__create_buffer(perf_pmu_in,YY_BUF_SIZE ); | |
704 | + } | |
705 | + | |
706 | + perf_pmu__load_buffer_state( ); | |
707 | + } | |
708 | + | |
709 | + while ( 1 ) /* loops until end-of-file is reached */ | |
710 | + { | |
711 | + yy_cp = (yy_c_buf_p); | |
712 | + | |
713 | + /* Support of perf_pmu_text. */ | |
714 | + *yy_cp = (yy_hold_char); | |
715 | + | |
716 | + /* yy_bp points to the position in yy_ch_buf of the start of | |
717 | + * the current run. | |
718 | + */ | |
719 | + yy_bp = yy_cp; | |
720 | + | |
721 | + yy_current_state = (yy_start); | |
722 | +yy_match: | |
723 | + do | |
724 | + { | |
725 | + register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; | |
726 | + if ( yy_accept[yy_current_state] ) | |
727 | + { | |
728 | + (yy_last_accepting_state) = yy_current_state; | |
729 | + (yy_last_accepting_cpos) = yy_cp; | |
730 | + } | |
731 | + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) | |
732 | + { | |
733 | + yy_current_state = (int) yy_def[yy_current_state]; | |
734 | + if ( yy_current_state >= 20 ) | |
735 | + yy_c = yy_meta[(unsigned int) yy_c]; | |
736 | + } | |
737 | + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; | |
738 | + ++yy_cp; | |
739 | + } | |
740 | + while ( yy_base[yy_current_state] != 24 ); | |
741 | + | |
742 | +yy_find_action: | |
743 | + yy_act = yy_accept[yy_current_state]; | |
744 | + if ( yy_act == 0 ) | |
745 | + { /* have to back up */ | |
746 | + yy_cp = (yy_last_accepting_cpos); | |
747 | + yy_current_state = (yy_last_accepting_state); | |
748 | + yy_act = yy_accept[yy_current_state]; | |
749 | + } | |
750 | + | |
751 | + YY_DO_BEFORE_ACTION; | |
752 | + | |
753 | +do_action: /* This label is used only to access EOF actions. */ | |
754 | + | |
755 | + switch ( yy_act ) | |
756 | + { /* beginning of action switch */ | |
757 | + case 0: /* must back up */ | |
758 | + /* undo the effects of YY_DO_BEFORE_ACTION */ | |
759 | + *yy_cp = (yy_hold_char); | |
760 | + yy_cp = (yy_last_accepting_cpos); | |
761 | + yy_current_state = (yy_last_accepting_state); | |
762 | + goto yy_find_action; | |
763 | + | |
764 | +case 1: | |
765 | +YY_RULE_SETUP | |
766 | +#line 28 "util/pmu.l" | |
767 | +{ return value(10); } | |
768 | + YY_BREAK | |
769 | +case 2: | |
770 | +YY_RULE_SETUP | |
771 | +#line 29 "util/pmu.l" | |
772 | +{ return PP_CONFIG; } | |
773 | + YY_BREAK | |
774 | +case 3: | |
775 | +YY_RULE_SETUP | |
776 | +#line 30 "util/pmu.l" | |
777 | +{ return PP_CONFIG1; } | |
778 | + YY_BREAK | |
779 | +case 4: | |
780 | +YY_RULE_SETUP | |
781 | +#line 31 "util/pmu.l" | |
782 | +{ return PP_CONFIG2; } | |
783 | + YY_BREAK | |
784 | +case 5: | |
785 | +YY_RULE_SETUP | |
786 | +#line 32 "util/pmu.l" | |
787 | +{ return '-'; } | |
788 | + YY_BREAK | |
789 | +case 6: | |
790 | +YY_RULE_SETUP | |
791 | +#line 33 "util/pmu.l" | |
792 | +{ return ':'; } | |
793 | + YY_BREAK | |
794 | +case 7: | |
795 | +YY_RULE_SETUP | |
796 | +#line 34 "util/pmu.l" | |
797 | +{ return ','; } | |
798 | + YY_BREAK | |
799 | +case 8: | |
800 | +YY_RULE_SETUP | |
801 | +#line 35 "util/pmu.l" | |
802 | +{ ; } | |
803 | + YY_BREAK | |
804 | +case 9: | |
805 | +/* rule 9 can match eol */ | |
806 | +YY_RULE_SETUP | |
807 | +#line 36 "util/pmu.l" | |
808 | +{ ; } | |
809 | + YY_BREAK | |
810 | +case 10: | |
811 | +YY_RULE_SETUP | |
812 | +#line 38 "util/pmu.l" | |
813 | +ECHO; | |
814 | + YY_BREAK | |
815 | +#line 816 "<stdout>" | |
816 | +case YY_STATE_EOF(INITIAL): | |
817 | + yyterminate(); | |
818 | + | |
819 | + case YY_END_OF_BUFFER: | |
820 | + { | |
821 | + /* Amount of text matched not including the EOB char. */ | |
822 | + int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; | |
823 | + | |
824 | + /* Undo the effects of YY_DO_BEFORE_ACTION. */ | |
825 | + *yy_cp = (yy_hold_char); | |
826 | + YY_RESTORE_YY_MORE_OFFSET | |
827 | + | |
828 | + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) | |
829 | + { | |
830 | + /* We're scanning a new file or input source. It's | |
831 | + * possible that this happened because the user | |
832 | + * just pointed perf_pmu_in at a new source and called | |
833 | + * perf_pmu_lex(). If so, then we have to assure | |
834 | + * consistency between YY_CURRENT_BUFFER and our | |
835 | + * globals. Here is the right place to do so, because | |
836 | + * this is the first action (other than possibly a | |
837 | + * back-up) that will match for the new input source. | |
838 | + */ | |
839 | + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; | |
840 | + YY_CURRENT_BUFFER_LVALUE->yy_input_file = perf_pmu_in; | |
841 | + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; | |
842 | + } | |
843 | + | |
844 | + /* Note that here we test for yy_c_buf_p "<=" to the position | |
845 | + * of the first EOB in the buffer, since yy_c_buf_p will | |
846 | + * already have been incremented past the NUL character | |
847 | + * (since all states make transitions on EOB to the | |
848 | + * end-of-buffer state). Contrast this with the test | |
849 | + * in input(). | |
850 | + */ | |
851 | + if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) | |
852 | + { /* This was really a NUL. */ | |
853 | + yy_state_type yy_next_state; | |
854 | + | |
855 | + (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; | |
856 | + | |
857 | + yy_current_state = yy_get_previous_state( ); | |
858 | + | |
859 | + /* Okay, we're now positioned to make the NUL | |
860 | + * transition. We couldn't have | |
861 | + * yy_get_previous_state() go ahead and do it | |
862 | + * for us because it doesn't know how to deal | |
863 | + * with the possibility of jamming (and we don't | |
864 | + * want to build jamming into it because then it | |
865 | + * will run more slowly). | |
866 | + */ | |
867 | + | |
868 | + yy_next_state = yy_try_NUL_trans( yy_current_state ); | |
869 | + | |
870 | + yy_bp = (yytext_ptr) + YY_MORE_ADJ; | |
871 | + | |
872 | + if ( yy_next_state ) | |
873 | + { | |
874 | + /* Consume the NUL. */ | |
875 | + yy_cp = ++(yy_c_buf_p); | |
876 | + yy_current_state = yy_next_state; | |
877 | + goto yy_match; | |
878 | + } | |
879 | + | |
880 | + else | |
881 | + { | |
882 | + yy_cp = (yy_c_buf_p); | |
883 | + goto yy_find_action; | |
884 | + } | |
885 | + } | |
886 | + | |
887 | + else switch ( yy_get_next_buffer( ) ) | |
888 | + { | |
889 | + case EOB_ACT_END_OF_FILE: | |
890 | + { | |
891 | + (yy_did_buffer_switch_on_eof) = 0; | |
892 | + | |
893 | + if ( perf_pmu_wrap( ) ) | |
894 | + { | |
895 | + /* Note: because we've taken care in | |
896 | + * yy_get_next_buffer() to have set up | |
897 | + * perf_pmu_text, we can now set up | |
898 | + * yy_c_buf_p so that if some total | |
899 | + * hoser (like flex itself) wants to | |
900 | + * call the scanner after we return the | |
901 | + * YY_NULL, it'll still work - another | |
902 | + * YY_NULL will get returned. | |
903 | + */ | |
904 | + (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; | |
905 | + | |
906 | + yy_act = YY_STATE_EOF(YY_START); | |
907 | + goto do_action; | |
908 | + } | |
909 | + | |
910 | + else | |
911 | + { | |
912 | + if ( ! (yy_did_buffer_switch_on_eof) ) | |
913 | + YY_NEW_FILE; | |
914 | + } | |
915 | + break; | |
916 | + } | |
917 | + | |
918 | + case EOB_ACT_CONTINUE_SCAN: | |
919 | + (yy_c_buf_p) = | |
920 | + (yytext_ptr) + yy_amount_of_matched_text; | |
921 | + | |
922 | + yy_current_state = yy_get_previous_state( ); | |
923 | + | |
924 | + yy_cp = (yy_c_buf_p); | |
925 | + yy_bp = (yytext_ptr) + YY_MORE_ADJ; | |
926 | + goto yy_match; | |
927 | + | |
928 | + case EOB_ACT_LAST_MATCH: | |
929 | + (yy_c_buf_p) = | |
930 | + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; | |
931 | + | |
932 | + yy_current_state = yy_get_previous_state( ); | |
933 | + | |
934 | + yy_cp = (yy_c_buf_p); | |
935 | + yy_bp = (yytext_ptr) + YY_MORE_ADJ; | |
936 | + goto yy_find_action; | |
937 | + } | |
938 | + break; | |
939 | + } | |
940 | + | |
941 | + default: | |
942 | + YY_FATAL_ERROR( | |
943 | + "fatal flex scanner internal error--no action found" ); | |
944 | + } /* end of action switch */ | |
945 | + } /* end of scanning one token */ | |
946 | +} /* end of perf_pmu_lex */ | |
947 | + | |
948 | +/* yy_get_next_buffer - try to read in a new buffer | |
949 | + * | |
950 | + * Returns a code representing an action: | |
951 | + * EOB_ACT_LAST_MATCH - | |
952 | + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position | |
953 | + * EOB_ACT_END_OF_FILE - end of file | |
954 | + */ | |
955 | +static int yy_get_next_buffer (void) | |
956 | +{ | |
957 | + register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; | |
958 | + register char *source = (yytext_ptr); | |
959 | + register int number_to_move, i; | |
960 | + int ret_val; | |
961 | + | |
962 | + if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) | |
963 | + YY_FATAL_ERROR( | |
964 | + "fatal flex scanner internal error--end of buffer missed" ); | |
965 | + | |
966 | + if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) | |
967 | + { /* Don't try to fill the buffer, so this is an EOF. */ | |
968 | + if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) | |
969 | + { | |
970 | + /* We matched a single character, the EOB, so | |
971 | + * treat this as a final EOF. | |
972 | + */ | |
973 | + return EOB_ACT_END_OF_FILE; | |
974 | + } | |
975 | + | |
976 | + else | |
977 | + { | |
978 | + /* We matched some text prior to the EOB, first | |
979 | + * process it. | |
980 | + */ | |
981 | + return EOB_ACT_LAST_MATCH; | |
982 | + } | |
983 | + } | |
984 | + | |
985 | + /* Try to read more data. */ | |
986 | + | |
987 | + /* First move last chars to start of buffer. */ | |
988 | + number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; | |
989 | + | |
990 | + for ( i = 0; i < number_to_move; ++i ) | |
991 | + *(dest++) = *(source++); | |
992 | + | |
993 | + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) | |
994 | + /* don't do the read, it's not guaranteed to return an EOF, | |
995 | + * just force an EOF | |
996 | + */ | |
997 | + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; | |
998 | + | |
999 | + else | |
1000 | + { | |
1001 | + int num_to_read = | |
1002 | + YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; | |
1003 | + | |
1004 | + while ( num_to_read <= 0 ) | |
1005 | + { /* Not enough room in the buffer - grow it. */ | |
1006 | + | |
1007 | + /* just a shorter name for the current buffer */ | |
1008 | + YY_BUFFER_STATE b = YY_CURRENT_BUFFER; | |
1009 | + | |
1010 | + int yy_c_buf_p_offset = | |
1011 | + (int) ((yy_c_buf_p) - b->yy_ch_buf); | |
1012 | + | |
1013 | + if ( b->yy_is_our_buffer ) | |
1014 | + { | |
1015 | + int new_size = b->yy_buf_size * 2; | |
1016 | + | |
1017 | + if ( new_size <= 0 ) | |
1018 | + b->yy_buf_size += b->yy_buf_size / 8; | |
1019 | + else | |
1020 | + b->yy_buf_size *= 2; | |
1021 | + | |
1022 | + b->yy_ch_buf = (char *) | |
1023 | + /* Include room in for 2 EOB chars. */ | |
1024 | + perf_pmu_realloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); | |
1025 | + } | |
1026 | + else | |
1027 | + /* Can't grow it, we don't own it. */ | |
1028 | + b->yy_ch_buf = 0; | |
1029 | + | |
1030 | + if ( ! b->yy_ch_buf ) | |
1031 | + YY_FATAL_ERROR( | |
1032 | + "fatal error - scanner input buffer overflow" ); | |
1033 | + | |
1034 | + (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; | |
1035 | + | |
1036 | + num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - | |
1037 | + number_to_move - 1; | |
1038 | + | |
1039 | + } | |
1040 | + | |
1041 | + if ( num_to_read > YY_READ_BUF_SIZE ) | |
1042 | + num_to_read = YY_READ_BUF_SIZE; | |
1043 | + | |
1044 | + /* Read in more data. */ | |
1045 | + YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), | |
1046 | + (yy_n_chars), (size_t) num_to_read ); | |
1047 | + | |
1048 | + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); | |
1049 | + } | |
1050 | + | |
1051 | + if ( (yy_n_chars) == 0 ) | |
1052 | + { | |
1053 | + if ( number_to_move == YY_MORE_ADJ ) | |
1054 | + { | |
1055 | + ret_val = EOB_ACT_END_OF_FILE; | |
1056 | + perf_pmu_restart(perf_pmu_in ); | |
1057 | + } | |
1058 | + | |
1059 | + else | |
1060 | + { | |
1061 | + ret_val = EOB_ACT_LAST_MATCH; | |
1062 | + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = | |
1063 | + YY_BUFFER_EOF_PENDING; | |
1064 | + } | |
1065 | + } | |
1066 | + | |
1067 | + else | |
1068 | + ret_val = EOB_ACT_CONTINUE_SCAN; | |
1069 | + | |
1070 | + if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { | |
1071 | + /* Extend the array by 50%, plus the number we really need. */ | |
1072 | + yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); | |
1073 | + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) perf_pmu_realloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); | |
1074 | + if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) | |
1075 | + YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); | |
1076 | + } | |
1077 | + | |
1078 | + (yy_n_chars) += number_to_move; | |
1079 | + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; | |
1080 | + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; | |
1081 | + | |
1082 | + (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; | |
1083 | + | |
1084 | + return ret_val; | |
1085 | +} | |
1086 | + | |
1087 | +/* yy_get_previous_state - get the state just before the EOB char was reached */ | |
1088 | + | |
1089 | + static yy_state_type yy_get_previous_state (void) | |
1090 | +{ | |
1091 | + register yy_state_type yy_current_state; | |
1092 | + register char *yy_cp; | |
1093 | + | |
1094 | + yy_current_state = (yy_start); | |
1095 | + | |
1096 | + for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) | |
1097 | + { | |
1098 | + register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); | |
1099 | + if ( yy_accept[yy_current_state] ) | |
1100 | + { | |
1101 | + (yy_last_accepting_state) = yy_current_state; | |
1102 | + (yy_last_accepting_cpos) = yy_cp; | |
1103 | + } | |
1104 | + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) | |
1105 | + { | |
1106 | + yy_current_state = (int) yy_def[yy_current_state]; | |
1107 | + if ( yy_current_state >= 20 ) | |
1108 | + yy_c = yy_meta[(unsigned int) yy_c]; | |
1109 | + } | |
1110 | + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; | |
1111 | + } | |
1112 | + | |
1113 | + return yy_current_state; | |
1114 | +} | |
1115 | + | |
1116 | +/* yy_try_NUL_trans - try to make a transition on the NUL character | |
1117 | + * | |
1118 | + * synopsis | |
1119 | + * next_state = yy_try_NUL_trans( current_state ); | |
1120 | + */ | |
1121 | + static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) | |
1122 | +{ | |
1123 | + register int yy_is_jam; | |
1124 | + register char *yy_cp = (yy_c_buf_p); | |
1125 | + | |
1126 | + register YY_CHAR yy_c = 1; | |
1127 | + if ( yy_accept[yy_current_state] ) | |
1128 | + { | |
1129 | + (yy_last_accepting_state) = yy_current_state; | |
1130 | + (yy_last_accepting_cpos) = yy_cp; | |
1131 | + } | |
1132 | + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) | |
1133 | + { | |
1134 | + yy_current_state = (int) yy_def[yy_current_state]; | |
1135 | + if ( yy_current_state >= 20 ) | |
1136 | + yy_c = yy_meta[(unsigned int) yy_c]; | |
1137 | + } | |
1138 | + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; | |
1139 | + yy_is_jam = (yy_current_state == 19); | |
1140 | + | |
1141 | + return yy_is_jam ? 0 : yy_current_state; | |
1142 | +} | |
1143 | + | |
1144 | + static void yyunput (int c, register char * yy_bp ) | |
1145 | +{ | |
1146 | + register char *yy_cp; | |
1147 | + | |
1148 | + yy_cp = (yy_c_buf_p); | |
1149 | + | |
1150 | + /* undo effects of setting up perf_pmu_text */ | |
1151 | + *yy_cp = (yy_hold_char); | |
1152 | + | |
1153 | + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) | |
1154 | + { /* need to shift things up to make room */ | |
1155 | + /* +2 for EOB chars. */ | |
1156 | + register int number_to_move = (yy_n_chars) + 2; | |
1157 | + register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ | |
1158 | + YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; | |
1159 | + register char *source = | |
1160 | + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; | |
1161 | + | |
1162 | + while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) | |
1163 | + *--dest = *--source; | |
1164 | + | |
1165 | + yy_cp += (int) (dest - source); | |
1166 | + yy_bp += (int) (dest - source); | |
1167 | + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = | |
1168 | + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; | |
1169 | + | |
1170 | + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) | |
1171 | + YY_FATAL_ERROR( "flex scanner push-back overflow" ); | |
1172 | + } | |
1173 | + | |
1174 | + *--yy_cp = (char) c; | |
1175 | + | |
1176 | + (yytext_ptr) = yy_bp; | |
1177 | + (yy_hold_char) = *yy_cp; | |
1178 | + (yy_c_buf_p) = yy_cp; | |
1179 | +} | |
1180 | + | |
1181 | +#ifndef YY_NO_INPUT | |
1182 | +#ifdef __cplusplus | |
1183 | + static int yyinput (void) | |
1184 | +#else | |
1185 | + static int input (void) | |
1186 | +#endif | |
1187 | + | |
1188 | +{ | |
1189 | + int c; | |
1190 | + | |
1191 | + *(yy_c_buf_p) = (yy_hold_char); | |
1192 | + | |
1193 | + if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) | |
1194 | + { | |
1195 | + /* yy_c_buf_p now points to the character we want to return. | |
1196 | + * If this occurs *before* the EOB characters, then it's a | |
1197 | + * valid NUL; if not, then we've hit the end of the buffer. | |
1198 | + */ | |
1199 | + if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) | |
1200 | + /* This was really a NUL. */ | |
1201 | + *(yy_c_buf_p) = '\0'; | |
1202 | + | |
1203 | + else | |
1204 | + { /* need more input */ | |
1205 | + int offset = (yy_c_buf_p) - (yytext_ptr); | |
1206 | + ++(yy_c_buf_p); | |
1207 | + | |
1208 | + switch ( yy_get_next_buffer( ) ) | |
1209 | + { | |
1210 | + case EOB_ACT_LAST_MATCH: | |
1211 | + /* This happens because yy_g_n_b() | |
1212 | + * sees that we've accumulated a | |
1213 | + * token and flags that we need to | |
1214 | + * try matching the token before | |
1215 | + * proceeding. But for input(), | |
1216 | + * there's no matching to consider. | |
1217 | + * So convert the EOB_ACT_LAST_MATCH | |
1218 | + * to EOB_ACT_END_OF_FILE. | |
1219 | + */ | |
1220 | + | |
1221 | + /* Reset buffer status. */ | |
1222 | + perf_pmu_restart(perf_pmu_in ); | |
1223 | + | |
1224 | + /*FALLTHROUGH*/ | |
1225 | + | |
1226 | + case EOB_ACT_END_OF_FILE: | |
1227 | + { | |
1228 | + if ( perf_pmu_wrap( ) ) | |
1229 | + return EOF; | |
1230 | + | |
1231 | + if ( ! (yy_did_buffer_switch_on_eof) ) | |
1232 | + YY_NEW_FILE; | |
1233 | +#ifdef __cplusplus | |
1234 | + return yyinput(); | |
1235 | +#else | |
1236 | + return input(); | |
1237 | +#endif | |
1238 | + } | |
1239 | + | |
1240 | + case EOB_ACT_CONTINUE_SCAN: | |
1241 | + (yy_c_buf_p) = (yytext_ptr) + offset; | |
1242 | + break; | |
1243 | + } | |
1244 | + } | |
1245 | + } | |
1246 | + | |
1247 | + c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ | |
1248 | + *(yy_c_buf_p) = '\0'; /* preserve perf_pmu_text */ | |
1249 | + (yy_hold_char) = *++(yy_c_buf_p); | |
1250 | + | |
1251 | + return c; | |
1252 | +} | |
1253 | +#endif /* ifndef YY_NO_INPUT */ | |
1254 | + | |
1255 | +/** Immediately switch to a different input stream. | |
1256 | + * @param input_file A readable stream. | |
1257 | + * | |
1258 | + * @note This function does not reset the start condition to @c INITIAL . | |
1259 | + */ | |
1260 | + void perf_pmu_restart (FILE * input_file ) | |
1261 | +{ | |
1262 | + | |
1263 | + if ( ! YY_CURRENT_BUFFER ){ | |
1264 | + perf_pmu_ensure_buffer_stack (); | |
1265 | + YY_CURRENT_BUFFER_LVALUE = | |
1266 | + perf_pmu__create_buffer(perf_pmu_in,YY_BUF_SIZE ); | |
1267 | + } | |
1268 | + | |
1269 | + perf_pmu__init_buffer(YY_CURRENT_BUFFER,input_file ); | |
1270 | + perf_pmu__load_buffer_state( ); | |
1271 | +} | |
1272 | + | |
1273 | +/** Switch to a different input buffer. | |
1274 | + * @param new_buffer The new input buffer. | |
1275 | + * | |
1276 | + */ | |
1277 | + void perf_pmu__switch_to_buffer (YY_BUFFER_STATE new_buffer ) | |
1278 | +{ | |
1279 | + | |
1280 | + /* TODO. We should be able to replace this entire function body | |
1281 | + * with | |
1282 | + * perf_pmu_pop_buffer_state(); | |
1283 | + * perf_pmu_push_buffer_state(new_buffer); | |
1284 | + */ | |
1285 | + perf_pmu_ensure_buffer_stack (); | |
1286 | + if ( YY_CURRENT_BUFFER == new_buffer ) | |
1287 | + return; | |
1288 | + | |
1289 | + if ( YY_CURRENT_BUFFER ) | |
1290 | + { | |
1291 | + /* Flush out information for old buffer. */ | |
1292 | + *(yy_c_buf_p) = (yy_hold_char); | |
1293 | + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); | |
1294 | + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); | |
1295 | + } | |
1296 | + | |
1297 | + YY_CURRENT_BUFFER_LVALUE = new_buffer; | |
1298 | + perf_pmu__load_buffer_state( ); | |
1299 | + | |
1300 | + /* We don't actually know whether we did this switch during | |
1301 | + * EOF (perf_pmu_wrap()) processing, but the only time this flag | |
1302 | + * is looked at is after perf_pmu_wrap() is called, so it's safe | |
1303 | + * to go ahead and always set it. | |
1304 | + */ | |
1305 | + (yy_did_buffer_switch_on_eof) = 1; | |
1306 | +} | |
1307 | + | |
1308 | +static void perf_pmu__load_buffer_state (void) | |
1309 | +{ | |
1310 | + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; | |
1311 | + (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; | |
1312 | + perf_pmu_in = YY_CURRENT_BUFFER_LVALUE->yy_input_file; | |
1313 | + (yy_hold_char) = *(yy_c_buf_p); | |
1314 | +} | |
1315 | + | |
1316 | +/** Allocate and initialize an input buffer state. | |
1317 | + * @param file A readable stream. | |
1318 | + * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. | |
1319 | + * | |
1320 | + * @return the allocated buffer state. | |
1321 | + */ | |
1322 | + YY_BUFFER_STATE perf_pmu__create_buffer (FILE * file, int size ) | |
1323 | +{ | |
1324 | + YY_BUFFER_STATE b; | |
1325 | + | |
1326 | + b = (YY_BUFFER_STATE) perf_pmu_alloc(sizeof( struct yy_buffer_state ) ); | |
1327 | + if ( ! b ) | |
1328 | + YY_FATAL_ERROR( "out of dynamic memory in perf_pmu__create_buffer()" ); | |
1329 | + | |
1330 | + b->yy_buf_size = size; | |
1331 | + | |
1332 | + /* yy_ch_buf has to be 2 characters longer than the size given because | |
1333 | + * we need to put in 2 end-of-buffer characters. | |
1334 | + */ | |
1335 | + b->yy_ch_buf = (char *) perf_pmu_alloc(b->yy_buf_size + 2 ); | |
1336 | + if ( ! b->yy_ch_buf ) | |
1337 | + YY_FATAL_ERROR( "out of dynamic memory in perf_pmu__create_buffer()" ); | |
1338 | + | |
1339 | + b->yy_is_our_buffer = 1; | |
1340 | + | |
1341 | + perf_pmu__init_buffer(b,file ); | |
1342 | + | |
1343 | + return b; | |
1344 | +} | |
1345 | + | |
1346 | +/** Destroy the buffer. | |
1347 | + * @param b a buffer created with perf_pmu__create_buffer() | |
1348 | + * | |
1349 | + */ | |
1350 | + void perf_pmu__delete_buffer (YY_BUFFER_STATE b ) | |
1351 | +{ | |
1352 | + | |
1353 | + if ( ! b ) | |
1354 | + return; | |
1355 | + | |
1356 | + if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ | |
1357 | + YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; | |
1358 | + | |
1359 | + if ( b->yy_is_our_buffer ) | |
1360 | + perf_pmu_free((void *) b->yy_ch_buf ); | |
1361 | + | |
1362 | + perf_pmu_free((void *) b ); | |
1363 | +} | |
1364 | + | |
1365 | +#ifndef __cplusplus | |
1366 | +extern int isatty (int ); | |
1367 | +#endif /* __cplusplus */ | |
1368 | + | |
1369 | +/* Initializes or reinitializes a buffer. | |
1370 | + * This function is sometimes called more than once on the same buffer, | |
1371 | + * such as during a perf_pmu_restart() or at EOF. | |
1372 | + */ | |
1373 | + static void perf_pmu__init_buffer (YY_BUFFER_STATE b, FILE * file ) | |
1374 | + | |
1375 | +{ | |
1376 | + int oerrno = errno; | |
1377 | + | |
1378 | + perf_pmu__flush_buffer(b ); | |
1379 | + | |
1380 | + b->yy_input_file = file; | |
1381 | + b->yy_fill_buffer = 1; | |
1382 | + | |
1383 | + /* If b is the current buffer, then perf_pmu__init_buffer was _probably_ | |
1384 | + * called from perf_pmu_restart() or through yy_get_next_buffer. | |
1385 | + * In that case, we don't want to reset the lineno or column. | |
1386 | + */ | |
1387 | + if (b != YY_CURRENT_BUFFER){ | |
1388 | + b->yy_bs_lineno = 1; | |
1389 | + b->yy_bs_column = 0; | |
1390 | + } | |
1391 | + | |
1392 | + b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; | |
1393 | + | |
1394 | + errno = oerrno; | |
1395 | +} | |
1396 | + | |
1397 | +/** Discard all buffered characters. On the next scan, YY_INPUT will be called. | |
1398 | + * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. | |
1399 | + * | |
1400 | + */ | |
1401 | + void perf_pmu__flush_buffer (YY_BUFFER_STATE b ) | |
1402 | +{ | |
1403 | + if ( ! b ) | |
1404 | + return; | |
1405 | + | |
1406 | + b->yy_n_chars = 0; | |
1407 | + | |
1408 | + /* We always need two end-of-buffer characters. The first causes | |
1409 | + * a transition to the end-of-buffer state. The second causes | |
1410 | + * a jam in that state. | |
1411 | + */ | |
1412 | + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; | |
1413 | + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; | |
1414 | + | |
1415 | + b->yy_buf_pos = &b->yy_ch_buf[0]; | |
1416 | + | |
1417 | + b->yy_at_bol = 1; | |
1418 | + b->yy_buffer_status = YY_BUFFER_NEW; | |
1419 | + | |
1420 | + if ( b == YY_CURRENT_BUFFER ) | |
1421 | + perf_pmu__load_buffer_state( ); | |
1422 | +} | |
1423 | + | |
1424 | +/** Pushes the new state onto the stack. The new state becomes | |
1425 | + * the current state. This function will allocate the stack | |
1426 | + * if necessary. | |
1427 | + * @param new_buffer The new state. | |
1428 | + * | |
1429 | + */ | |
1430 | +void perf_pmu_push_buffer_state (YY_BUFFER_STATE new_buffer ) | |
1431 | +{ | |
1432 | + if (new_buffer == NULL) | |
1433 | + return; | |
1434 | + | |
1435 | + perf_pmu_ensure_buffer_stack(); | |
1436 | + | |
1437 | + /* This block is copied from perf_pmu__switch_to_buffer. */ | |
1438 | + if ( YY_CURRENT_BUFFER ) | |
1439 | + { | |
1440 | + /* Flush out information for old buffer. */ | |
1441 | + *(yy_c_buf_p) = (yy_hold_char); | |
1442 | + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); | |
1443 | + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); | |
1444 | + } | |
1445 | + | |
1446 | + /* Only push if top exists. Otherwise, replace top. */ | |
1447 | + if (YY_CURRENT_BUFFER) | |
1448 | + (yy_buffer_stack_top)++; | |
1449 | + YY_CURRENT_BUFFER_LVALUE = new_buffer; | |
1450 | + | |
1451 | + /* copied from perf_pmu__switch_to_buffer. */ | |
1452 | + perf_pmu__load_buffer_state( ); | |
1453 | + (yy_did_buffer_switch_on_eof) = 1; | |
1454 | +} | |
1455 | + | |
1456 | +/** Removes and deletes the top of the stack, if present. | |
1457 | + * The next element becomes the new top. | |
1458 | + * | |
1459 | + */ | |
1460 | +void perf_pmu_pop_buffer_state (void) | |
1461 | +{ | |
1462 | + if (!YY_CURRENT_BUFFER) | |
1463 | + return; | |
1464 | + | |
1465 | + perf_pmu__delete_buffer(YY_CURRENT_BUFFER ); | |
1466 | + YY_CURRENT_BUFFER_LVALUE = NULL; | |
1467 | + if ((yy_buffer_stack_top) > 0) | |
1468 | + --(yy_buffer_stack_top); | |
1469 | + | |
1470 | + if (YY_CURRENT_BUFFER) { | |
1471 | + perf_pmu__load_buffer_state( ); | |
1472 | + (yy_did_buffer_switch_on_eof) = 1; | |
1473 | + } | |
1474 | +} | |
1475 | + | |
1476 | +/* Allocates the stack if it does not exist. | |
1477 | + * Guarantees space for at least one push. | |
1478 | + */ | |
1479 | +static void perf_pmu_ensure_buffer_stack (void) | |
1480 | +{ | |
1481 | + int num_to_alloc; | |
1482 | + | |
1483 | + if (!(yy_buffer_stack)) { | |
1484 | + | |
1485 | + /* First allocation is just for 2 elements, since we don't know if this | |
1486 | + * scanner will even need a stack. We use 2 instead of 1 to avoid an | |
1487 | + * immediate realloc on the next call. | |
1488 | + */ | |
1489 | + num_to_alloc = 1; | |
1490 | + (yy_buffer_stack) = (struct yy_buffer_state**)perf_pmu_alloc | |
1491 | + (num_to_alloc * sizeof(struct yy_buffer_state*) | |
1492 | + ); | |
1493 | + if ( ! (yy_buffer_stack) ) | |
1494 | + YY_FATAL_ERROR( "out of dynamic memory in perf_pmu_ensure_buffer_stack()" ); | |
1495 | + | |
1496 | + memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); | |
1497 | + | |
1498 | + (yy_buffer_stack_max) = num_to_alloc; | |
1499 | + (yy_buffer_stack_top) = 0; | |
1500 | + return; | |
1501 | + } | |
1502 | + | |
1503 | + if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ | |
1504 | + | |
1505 | + /* Increase the buffer to prepare for a possible push. */ | |
1506 | + int grow_size = 8 /* arbitrary grow size */; | |
1507 | + | |
1508 | + num_to_alloc = (yy_buffer_stack_max) + grow_size; | |
1509 | + (yy_buffer_stack) = (struct yy_buffer_state**)perf_pmu_realloc | |
1510 | + ((yy_buffer_stack), | |
1511 | + num_to_alloc * sizeof(struct yy_buffer_state*) | |
1512 | + ); | |
1513 | + if ( ! (yy_buffer_stack) ) | |
1514 | + YY_FATAL_ERROR( "out of dynamic memory in perf_pmu_ensure_buffer_stack()" ); | |
1515 | + | |
1516 | + /* zero only the new slots.*/ | |
1517 | + memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); | |
1518 | + (yy_buffer_stack_max) = num_to_alloc; | |
1519 | + } | |
1520 | +} | |
1521 | + | |
1522 | +/** Setup the input buffer state to scan directly from a user-specified character buffer. | |
1523 | + * @param base the character buffer | |
1524 | + * @param size the size in bytes of the character buffer | |
1525 | + * | |
1526 | + * @return the newly allocated buffer state object. | |
1527 | + */ | |
1528 | +YY_BUFFER_STATE perf_pmu__scan_buffer (char * base, yy_size_t size ) | |
1529 | +{ | |
1530 | + YY_BUFFER_STATE b; | |
1531 | + | |
1532 | + if ( size < 2 || | |
1533 | + base[size-2] != YY_END_OF_BUFFER_CHAR || | |
1534 | + base[size-1] != YY_END_OF_BUFFER_CHAR ) | |
1535 | + /* They forgot to leave room for the EOB's. */ | |
1536 | + return 0; | |
1537 | + | |
1538 | + b = (YY_BUFFER_STATE) perf_pmu_alloc(sizeof( struct yy_buffer_state ) ); | |
1539 | + if ( ! b ) | |
1540 | + YY_FATAL_ERROR( "out of dynamic memory in perf_pmu__scan_buffer()" ); | |
1541 | + | |
1542 | + b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ | |
1543 | + b->yy_buf_pos = b->yy_ch_buf = base; | |
1544 | + b->yy_is_our_buffer = 0; | |
1545 | + b->yy_input_file = 0; | |
1546 | + b->yy_n_chars = b->yy_buf_size; | |
1547 | + b->yy_is_interactive = 0; | |
1548 | + b->yy_at_bol = 1; | |
1549 | + b->yy_fill_buffer = 0; | |
1550 | + b->yy_buffer_status = YY_BUFFER_NEW; | |
1551 | + | |
1552 | + perf_pmu__switch_to_buffer(b ); | |
1553 | + | |
1554 | + return b; | |
1555 | +} | |
1556 | + | |
1557 | +/** Setup the input buffer state to scan a string. The next call to perf_pmu_lex() will | |
1558 | + * scan from a @e copy of @a str. | |
1559 | + * @param yystr a NUL-terminated string to scan | |
1560 | + * | |
1561 | + * @return the newly allocated buffer state object. | |
1562 | + * @note If you want to scan bytes that may contain NUL values, then use | |
1563 | + * perf_pmu__scan_bytes() instead. | |
1564 | + */ | |
1565 | +YY_BUFFER_STATE perf_pmu__scan_string (yyconst char * yystr ) | |
1566 | +{ | |
1567 | + | |
1568 | + return perf_pmu__scan_bytes(yystr,strlen(yystr) ); | |
1569 | +} | |
1570 | + | |
1571 | +/** Setup the input buffer state to scan the given bytes. The next call to perf_pmu_lex() will | |
1572 | + * scan from a @e copy of @a bytes. | |
1573 | + * @param bytes the byte buffer to scan | |
1574 | + * @param len the number of bytes in the buffer pointed to by @a bytes. | |
1575 | + * | |
1576 | + * @return the newly allocated buffer state object. | |
1577 | + */ | |
1578 | +YY_BUFFER_STATE perf_pmu__scan_bytes (yyconst char * yybytes, int _yybytes_len ) | |
1579 | +{ | |
1580 | + YY_BUFFER_STATE b; | |
1581 | + char *buf; | |
1582 | + yy_size_t n; | |
1583 | + int i; | |
1584 | + | |
1585 | + /* Get memory for full buffer, including space for trailing EOB's. */ | |
1586 | + n = _yybytes_len + 2; | |
1587 | + buf = (char *) perf_pmu_alloc(n ); | |
1588 | + if ( ! buf ) | |
1589 | + YY_FATAL_ERROR( "out of dynamic memory in perf_pmu__scan_bytes()" ); | |
1590 | + | |
1591 | + for ( i = 0; i < _yybytes_len; ++i ) | |
1592 | + buf[i] = yybytes[i]; | |
1593 | + | |
1594 | + buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; | |
1595 | + | |
1596 | + b = perf_pmu__scan_buffer(buf,n ); | |
1597 | + if ( ! b ) | |
1598 | + YY_FATAL_ERROR( "bad buffer in perf_pmu__scan_bytes()" ); | |
1599 | + | |
1600 | + /* It's okay to grow etc. this buffer, and we should throw it | |
1601 | + * away when we're done. | |
1602 | + */ | |
1603 | + b->yy_is_our_buffer = 1; | |
1604 | + | |
1605 | + return b; | |
1606 | +} | |
1607 | + | |
1608 | +#ifndef YY_EXIT_FAILURE | |
1609 | +#define YY_EXIT_FAILURE 2 | |
1610 | +#endif | |
1611 | + | |
1612 | +static void yy_fatal_error (yyconst char* msg ) | |
1613 | +{ | |
1614 | + (void) fprintf( stderr, "%s\n", msg ); | |
1615 | + exit( YY_EXIT_FAILURE ); | |
1616 | +} | |
1617 | + | |
1618 | +/* Redefine yyless() so it works in section 3 code. */ | |
1619 | + | |
1620 | +#undef yyless | |
1621 | +#define yyless(n) \ | |
1622 | + do \ | |
1623 | + { \ | |
1624 | + /* Undo effects of setting up perf_pmu_text. */ \ | |
1625 | + int yyless_macro_arg = (n); \ | |
1626 | + YY_LESS_LINENO(yyless_macro_arg);\ | |
1627 | + perf_pmu_text[perf_pmu_leng] = (yy_hold_char); \ | |
1628 | + (yy_c_buf_p) = perf_pmu_text + yyless_macro_arg; \ | |
1629 | + (yy_hold_char) = *(yy_c_buf_p); \ | |
1630 | + *(yy_c_buf_p) = '\0'; \ | |
1631 | + perf_pmu_leng = yyless_macro_arg; \ | |
1632 | + } \ | |
1633 | + while ( 0 ) | |
1634 | + | |
1635 | +/* Accessor methods (get/set functions) to struct members. */ | |
1636 | + | |
1637 | +/** Get the current line number. | |
1638 | + * | |
1639 | + */ | |
1640 | +int perf_pmu_get_lineno (void) | |
1641 | +{ | |
1642 | + | |
1643 | + return perf_pmu_lineno; | |
1644 | +} | |
1645 | + | |
1646 | +/** Get the input stream. | |
1647 | + * | |
1648 | + */ | |
1649 | +FILE *perf_pmu_get_in (void) | |
1650 | +{ | |
1651 | + return perf_pmu_in; | |
1652 | +} | |
1653 | + | |
1654 | +/** Get the output stream. | |
1655 | + * | |
1656 | + */ | |
1657 | +FILE *perf_pmu_get_out (void) | |
1658 | +{ | |
1659 | + return perf_pmu_out; | |
1660 | +} | |
1661 | + | |
1662 | +/** Get the length of the current token. | |
1663 | + * | |
1664 | + */ | |
1665 | +int perf_pmu_get_leng (void) | |
1666 | +{ | |
1667 | + return perf_pmu_leng; | |
1668 | +} | |
1669 | + | |
1670 | +/** Get the current token. | |
1671 | + * | |
1672 | + */ | |
1673 | + | |
1674 | +char *perf_pmu_get_text (void) | |
1675 | +{ | |
1676 | + return perf_pmu_text; | |
1677 | +} | |
1678 | + | |
1679 | +/** Set the current line number. | |
1680 | + * @param line_number | |
1681 | + * | |
1682 | + */ | |
1683 | +void perf_pmu_set_lineno (int line_number ) | |
1684 | +{ | |
1685 | + | |
1686 | + perf_pmu_lineno = line_number; | |
1687 | +} | |
1688 | + | |
1689 | +/** Set the input stream. This does not discard the current | |
1690 | + * input buffer. | |
1691 | + * @param in_str A readable stream. | |
1692 | + * | |
1693 | + * @see perf_pmu__switch_to_buffer | |
1694 | + */ | |
1695 | +void perf_pmu_set_in (FILE * in_str ) | |
1696 | +{ | |
1697 | + perf_pmu_in = in_str ; | |
1698 | +} | |
1699 | + | |
1700 | +void perf_pmu_set_out (FILE * out_str ) | |
1701 | +{ | |
1702 | + perf_pmu_out = out_str ; | |
1703 | +} | |
1704 | + | |
1705 | +int perf_pmu_get_debug (void) | |
1706 | +{ | |
1707 | + return perf_pmu__flex_debug; | |
1708 | +} | |
1709 | + | |
1710 | +void perf_pmu_set_debug (int bdebug ) | |
1711 | +{ | |
1712 | + perf_pmu__flex_debug = bdebug ; | |
1713 | +} | |
1714 | + | |
1715 | +static int yy_init_globals (void) | |
1716 | +{ | |
1717 | + /* Initialization is the same as for the non-reentrant scanner. | |
1718 | + * This function is called from perf_pmu_lex_destroy(), so don't allocate here. | |
1719 | + */ | |
1720 | + | |
1721 | + (yy_buffer_stack) = 0; | |
1722 | + (yy_buffer_stack_top) = 0; | |
1723 | + (yy_buffer_stack_max) = 0; | |
1724 | + (yy_c_buf_p) = (char *) 0; | |
1725 | + (yy_init) = 0; | |
1726 | + (yy_start) = 0; | |
1727 | + | |
1728 | +/* Defined in main.c */ | |
1729 | +#ifdef YY_STDINIT | |
1730 | + perf_pmu_in = stdin; | |
1731 | + perf_pmu_out = stdout; | |
1732 | +#else | |
1733 | + perf_pmu_in = (FILE *) 0; | |
1734 | + perf_pmu_out = (FILE *) 0; | |
1735 | +#endif | |
1736 | + | |
1737 | + /* For future reference: Set errno on error, since we are called by | |
1738 | + * perf_pmu_lex_init() | |
1739 | + */ | |
1740 | + return 0; | |
1741 | +} | |
1742 | + | |
1743 | +/* perf_pmu_lex_destroy is for both reentrant and non-reentrant scanners. */ | |
1744 | +int perf_pmu_lex_destroy (void) | |
1745 | +{ | |
1746 | + | |
1747 | + /* Pop the buffer stack, destroying each element. */ | |
1748 | + while(YY_CURRENT_BUFFER){ | |
1749 | + perf_pmu__delete_buffer(YY_CURRENT_BUFFER ); | |
1750 | + YY_CURRENT_BUFFER_LVALUE = NULL; | |
1751 | + perf_pmu_pop_buffer_state(); | |
1752 | + } | |
1753 | + | |
1754 | + /* Destroy the stack itself. */ | |
1755 | + perf_pmu_free((yy_buffer_stack) ); | |
1756 | + (yy_buffer_stack) = NULL; | |
1757 | + | |
1758 | + /* Reset the globals. This is important in a non-reentrant scanner so the next time | |
1759 | + * perf_pmu_lex() is called, initialization will occur. */ | |
1760 | + yy_init_globals( ); | |
1761 | + | |
1762 | + return 0; | |
1763 | +} | |
1764 | + | |
1765 | +/* | |
1766 | + * Internal utility routines. | |
1767 | + */ | |
1768 | + | |
1769 | +#ifndef yytext_ptr | |
1770 | +static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) | |
1771 | +{ | |
1772 | + register int i; | |
1773 | + for ( i = 0; i < n; ++i ) | |
1774 | + s1[i] = s2[i]; | |
1775 | +} | |
1776 | +#endif | |
1777 | + | |
1778 | +#ifdef YY_NEED_STRLEN | |
1779 | +static int yy_flex_strlen (yyconst char * s ) | |
1780 | +{ | |
1781 | + register int n; | |
1782 | + for ( n = 0; s[n]; ++n ) | |
1783 | + ; | |
1784 | + | |
1785 | + return n; | |
1786 | +} | |
1787 | +#endif | |
1788 | + | |
1789 | +void *perf_pmu_alloc (yy_size_t size ) | |
1790 | +{ | |
1791 | + return (void *) malloc( size ); | |
1792 | +} | |
1793 | + | |
1794 | +void *perf_pmu_realloc (void * ptr, yy_size_t size ) | |
1795 | +{ | |
1796 | + /* The cast to (char *) in the following accommodates both | |
1797 | + * implementations that use char* generic pointers, and those | |
1798 | + * that use void* generic pointers. It works with the latter | |
1799 | + * because both ANSI C and C++ allow castless assignment from | |
1800 | + * any pointer type to void*, and deal with argument conversions | |
1801 | + * as though doing an assignment. | |
1802 | + */ | |
1803 | + return (void *) realloc( (char *) ptr, size ); | |
1804 | +} | |
1805 | + | |
1806 | +void perf_pmu_free (void * ptr ) | |
1807 | +{ | |
1808 | + free( (char *) ptr ); /* see perf_pmu_realloc() for (char *) cast */ | |
1809 | +} | |
1810 | + | |
1811 | +#define YYTABLES_NAME "yytables" | |
1812 | + | |
1813 | +#line 38 "util/pmu.l" | |
1814 | + | |
1815 | + | |
1816 | + | |
1817 | +int perf_pmu_wrap(void) | |
1818 | +{ | |
1819 | + return 1; | |
1820 | +} |
tools/perf/util/pmu-flex.h
1 | +#ifndef perf_pmu_HEADER_H | |
2 | +#define perf_pmu_HEADER_H 1 | |
3 | +#define perf_pmu_IN_HEADER 1 | |
4 | + | |
5 | +#line 6 "util/pmu-flex.h" | |
6 | + | |
7 | +#define YY_INT_ALIGNED short int | |
8 | + | |
9 | +/* A lexical scanner generated by flex */ | |
10 | + | |
11 | +#define FLEX_SCANNER | |
12 | +#define YY_FLEX_MAJOR_VERSION 2 | |
13 | +#define YY_FLEX_MINOR_VERSION 5 | |
14 | +#define YY_FLEX_SUBMINOR_VERSION 35 | |
15 | +#if YY_FLEX_SUBMINOR_VERSION > 0 | |
16 | +#define FLEX_BETA | |
17 | +#endif | |
18 | + | |
19 | +/* First, we deal with platform-specific or compiler-specific issues. */ | |
20 | + | |
21 | +/* begin standard C headers. */ | |
22 | +#include <stdio.h> | |
23 | +#include <string.h> | |
24 | +#include <errno.h> | |
25 | +#include <stdlib.h> | |
26 | + | |
27 | +/* end standard C headers. */ | |
28 | + | |
29 | +/* flex integer type definitions */ | |
30 | + | |
31 | +#ifndef FLEXINT_H | |
32 | +#define FLEXINT_H | |
33 | + | |
34 | +/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */ | |
35 | + | |
36 | +#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L | |
37 | + | |
38 | +/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, | |
39 | + * if you want the limit (max/min) macros for int types. | |
40 | + */ | |
41 | +#ifndef __STDC_LIMIT_MACROS | |
42 | +#define __STDC_LIMIT_MACROS 1 | |
43 | +#endif | |
44 | + | |
45 | +#include <inttypes.h> | |
46 | +typedef int8_t flex_int8_t; | |
47 | +typedef uint8_t flex_uint8_t; | |
48 | +typedef int16_t flex_int16_t; | |
49 | +typedef uint16_t flex_uint16_t; | |
50 | +typedef int32_t flex_int32_t; | |
51 | +typedef uint32_t flex_uint32_t; | |
52 | +#else | |
53 | +typedef signed char flex_int8_t; | |
54 | +typedef short int flex_int16_t; | |
55 | +typedef int flex_int32_t; | |
56 | +typedef unsigned char flex_uint8_t; | |
57 | +typedef unsigned short int flex_uint16_t; | |
58 | +typedef unsigned int flex_uint32_t; | |
59 | +#endif /* ! C99 */ | |
60 | + | |
61 | +/* Limits of integral types. */ | |
62 | +#ifndef INT8_MIN | |
63 | +#define INT8_MIN (-128) | |
64 | +#endif | |
65 | +#ifndef INT16_MIN | |
66 | +#define INT16_MIN (-32767-1) | |
67 | +#endif | |
68 | +#ifndef INT32_MIN | |
69 | +#define INT32_MIN (-2147483647-1) | |
70 | +#endif | |
71 | +#ifndef INT8_MAX | |
72 | +#define INT8_MAX (127) | |
73 | +#endif | |
74 | +#ifndef INT16_MAX | |
75 | +#define INT16_MAX (32767) | |
76 | +#endif | |
77 | +#ifndef INT32_MAX | |
78 | +#define INT32_MAX (2147483647) | |
79 | +#endif | |
80 | +#ifndef UINT8_MAX | |
81 | +#define UINT8_MAX (255U) | |
82 | +#endif | |
83 | +#ifndef UINT16_MAX | |
84 | +#define UINT16_MAX (65535U) | |
85 | +#endif | |
86 | +#ifndef UINT32_MAX | |
87 | +#define UINT32_MAX (4294967295U) | |
88 | +#endif | |
89 | + | |
90 | +#endif /* ! FLEXINT_H */ | |
91 | + | |
92 | +#ifdef __cplusplus | |
93 | + | |
94 | +/* The "const" storage-class-modifier is valid. */ | |
95 | +#define YY_USE_CONST | |
96 | + | |
97 | +#else /* ! __cplusplus */ | |
98 | + | |
99 | +/* C99 requires __STDC__ to be defined as 1. */ | |
100 | +#if defined (__STDC__) | |
101 | + | |
102 | +#define YY_USE_CONST | |
103 | + | |
104 | +#endif /* defined (__STDC__) */ | |
105 | +#endif /* ! __cplusplus */ | |
106 | + | |
107 | +#ifdef YY_USE_CONST | |
108 | +#define yyconst const | |
109 | +#else | |
110 | +#define yyconst | |
111 | +#endif | |
112 | + | |
113 | +/* Size of default input buffer. */ | |
114 | +#ifndef YY_BUF_SIZE | |
115 | +#define YY_BUF_SIZE 16384 | |
116 | +#endif | |
117 | + | |
118 | +#ifndef YY_TYPEDEF_YY_BUFFER_STATE | |
119 | +#define YY_TYPEDEF_YY_BUFFER_STATE | |
120 | +typedef struct yy_buffer_state *YY_BUFFER_STATE; | |
121 | +#endif | |
122 | + | |
123 | +extern int perf_pmu_leng; | |
124 | + | |
125 | +extern FILE *perf_pmu_in, *perf_pmu_out; | |
126 | + | |
127 | +#ifndef YY_TYPEDEF_YY_SIZE_T | |
128 | +#define YY_TYPEDEF_YY_SIZE_T | |
129 | +typedef size_t yy_size_t; | |
130 | +#endif | |
131 | + | |
132 | +#ifndef YY_STRUCT_YY_BUFFER_STATE | |
133 | +#define YY_STRUCT_YY_BUFFER_STATE | |
134 | +struct yy_buffer_state | |
135 | + { | |
136 | + FILE *yy_input_file; | |
137 | + | |
138 | + char *yy_ch_buf; /* input buffer */ | |
139 | + char *yy_buf_pos; /* current position in input buffer */ | |
140 | + | |
141 | + /* Size of input buffer in bytes, not including room for EOB | |
142 | + * characters. | |
143 | + */ | |
144 | + yy_size_t yy_buf_size; | |
145 | + | |
146 | + /* Number of characters read into yy_ch_buf, not including EOB | |
147 | + * characters. | |
148 | + */ | |
149 | + int yy_n_chars; | |
150 | + | |
151 | + /* Whether we "own" the buffer - i.e., we know we created it, | |
152 | + * and can realloc() it to grow it, and should free() it to | |
153 | + * delete it. | |
154 | + */ | |
155 | + int yy_is_our_buffer; | |
156 | + | |
157 | + /* Whether this is an "interactive" input source; if so, and | |
158 | + * if we're using stdio for input, then we want to use getc() | |
159 | + * instead of fread(), to make sure we stop fetching input after | |
160 | + * each newline. | |
161 | + */ | |
162 | + int yy_is_interactive; | |
163 | + | |
164 | + /* Whether we're considered to be at the beginning of a line. | |
165 | + * If so, '^' rules will be active on the next match, otherwise | |
166 | + * not. | |
167 | + */ | |
168 | + int yy_at_bol; | |
169 | + | |
170 | + int yy_bs_lineno; /**< The line count. */ | |
171 | + int yy_bs_column; /**< The column count. */ | |
172 | + | |
173 | + /* Whether to try to fill the input buffer when we reach the | |
174 | + * end of it. | |
175 | + */ | |
176 | + int yy_fill_buffer; | |
177 | + | |
178 | + int yy_buffer_status; | |
179 | + | |
180 | + }; | |
181 | +#endif /* !YY_STRUCT_YY_BUFFER_STATE */ | |
182 | + | |
183 | +void perf_pmu_restart (FILE *input_file ); | |
184 | +void perf_pmu__switch_to_buffer (YY_BUFFER_STATE new_buffer ); | |
185 | +YY_BUFFER_STATE perf_pmu__create_buffer (FILE *file,int size ); | |
186 | +void perf_pmu__delete_buffer (YY_BUFFER_STATE b ); | |
187 | +void perf_pmu__flush_buffer (YY_BUFFER_STATE b ); | |
188 | +void perf_pmu_push_buffer_state (YY_BUFFER_STATE new_buffer ); | |
189 | +void perf_pmu_pop_buffer_state (void ); | |
190 | + | |
191 | +YY_BUFFER_STATE perf_pmu__scan_buffer (char *base,yy_size_t size ); | |
192 | +YY_BUFFER_STATE perf_pmu__scan_string (yyconst char *yy_str ); | |
193 | +YY_BUFFER_STATE perf_pmu__scan_bytes (yyconst char *bytes,int len ); | |
194 | + | |
195 | +void *perf_pmu_alloc (yy_size_t ); | |
196 | +void *perf_pmu_realloc (void *,yy_size_t ); | |
197 | +void perf_pmu_free (void * ); | |
198 | + | |
199 | +/* Begin user sect3 */ | |
200 | + | |
201 | +extern int perf_pmu_lineno; | |
202 | + | |
203 | +extern char *perf_pmu_text; | |
204 | +#define yytext_ptr perf_pmu_text | |
205 | + | |
206 | +#ifdef YY_HEADER_EXPORT_START_CONDITIONS | |
207 | +#define INITIAL 0 | |
208 | + | |
209 | +#endif | |
210 | + | |
211 | +#ifndef YY_NO_UNISTD_H | |
212 | +/* Special case for "unistd.h", since it is non-ANSI. We include it way | |
213 | + * down here because we want the user's section 1 to have been scanned first. | |
214 | + * The user has a chance to override it with an option. | |
215 | + */ | |
216 | +#include <unistd.h> | |
217 | +#endif | |
218 | + | |
219 | +#ifndef YY_EXTRA_TYPE | |
220 | +#define YY_EXTRA_TYPE void * | |
221 | +#endif | |
222 | + | |
223 | +/* Accessor methods to globals. | |
224 | + These are made visible to non-reentrant scanners for convenience. */ | |
225 | + | |
226 | +int perf_pmu_lex_destroy (void ); | |
227 | + | |
228 | +int perf_pmu_get_debug (void ); | |
229 | + | |
230 | +void perf_pmu_set_debug (int debug_flag ); | |
231 | + | |
232 | +YY_EXTRA_TYPE perf_pmu_get_extra (void ); | |
233 | + | |
234 | +void perf_pmu_set_extra (YY_EXTRA_TYPE user_defined ); | |
235 | + | |
236 | +FILE *perf_pmu_get_in (void ); | |
237 | + | |
238 | +void perf_pmu_set_in (FILE * in_str ); | |
239 | + | |
240 | +FILE *perf_pmu_get_out (void ); | |
241 | + | |
242 | +void perf_pmu_set_out (FILE * out_str ); | |
243 | + | |
244 | +int perf_pmu_get_leng (void ); | |
245 | + | |
246 | +char *perf_pmu_get_text (void ); | |
247 | + | |
248 | +int perf_pmu_get_lineno (void ); | |
249 | + | |
250 | +void perf_pmu_set_lineno (int line_number ); | |
251 | + | |
252 | +/* Macros after this point can all be overridden by user definitions in | |
253 | + * section 1. | |
254 | + */ | |
255 | + | |
256 | +#ifndef YY_SKIP_YYWRAP | |
257 | +#ifdef __cplusplus | |
258 | +extern "C" int perf_pmu_wrap (void ); | |
259 | +#else | |
260 | +extern int perf_pmu_wrap (void ); | |
261 | +#endif | |
262 | +#endif | |
263 | + | |
264 | +#ifndef yytext_ptr | |
265 | +static void yy_flex_strncpy (char *,yyconst char *,int ); | |
266 | +#endif | |
267 | + | |
268 | +#ifdef YY_NEED_STRLEN | |
269 | +static int yy_flex_strlen (yyconst char * ); | |
270 | +#endif | |
271 | + | |
272 | +#ifndef YY_NO_INPUT | |
273 | + | |
274 | +#endif | |
275 | + | |
276 | +/* Amount of stuff to slurp up with each read. */ | |
277 | +#ifndef YY_READ_BUF_SIZE | |
278 | +#define YY_READ_BUF_SIZE 8192 | |
279 | +#endif | |
280 | + | |
281 | +/* Number of entries by which start-condition stack grows. */ | |
282 | +#ifndef YY_START_STACK_INCR | |
283 | +#define YY_START_STACK_INCR 25 | |
284 | +#endif | |
285 | + | |
286 | +/* Default declaration of generated scanner - a define so the user can | |
287 | + * easily add parameters. | |
288 | + */ | |
289 | +#ifndef YY_DECL | |
290 | +#define YY_DECL_IS_OURS 1 | |
291 | + | |
292 | +extern int perf_pmu_lex (void); | |
293 | + | |
294 | +#define YY_DECL int perf_pmu_lex (void) | |
295 | +#endif /* !YY_DECL */ | |
296 | + | |
297 | +/* yy_get_previous_state - get the state just before the EOB char was reached */ | |
298 | + | |
299 | +#undef YY_NEW_FILE | |
300 | +#undef YY_FLUSH_BUFFER | |
301 | +#undef yy_set_bol | |
302 | +#undef yy_new_buffer | |
303 | +#undef yy_set_interactive | |
304 | +#undef YY_DO_BEFORE_ACTION | |
305 | + | |
306 | +#ifdef YY_DECL_IS_OURS | |
307 | +#undef YY_DECL_IS_OURS | |
308 | +#undef YY_DECL | |
309 | +#endif | |
310 | + | |
311 | +#line 38 "util/pmu.l" | |
312 | + | |
313 | + | |
314 | +#line 315 "util/pmu-flex.h" | |
315 | +#undef perf_pmu_IN_HEADER | |
316 | +#endif /* perf_pmu_HEADER_H */ |
tools/perf/util/pmu.c
1 | + | |
2 | +#include <linux/list.h> | |
3 | +#include <sys/types.h> | |
4 | +#include <sys/stat.h> | |
5 | +#include <unistd.h> | |
6 | +#include <stdio.h> | |
7 | +#include <dirent.h> | |
8 | +#include "sysfs.h" | |
9 | +#include "util.h" | |
10 | +#include "pmu.h" | |
11 | +#include "parse-events.h" | |
12 | + | |
13 | +int perf_pmu_parse(struct list_head *list, char *name); | |
14 | +extern FILE *perf_pmu_in; | |
15 | + | |
16 | +static LIST_HEAD(pmus); | |
17 | + | |
18 | +/* | |
19 | + * Parse & process all the sysfs attributes located under | |
20 | + * the directory specified in 'dir' parameter. | |
21 | + */ | |
22 | +static int pmu_format_parse(char *dir, struct list_head *head) | |
23 | +{ | |
24 | + struct dirent *evt_ent; | |
25 | + DIR *format_dir; | |
26 | + int ret = 0; | |
27 | + | |
28 | + format_dir = opendir(dir); | |
29 | + if (!format_dir) | |
30 | + return -EINVAL; | |
31 | + | |
32 | + while (!ret && (evt_ent = readdir(format_dir))) { | |
33 | + char path[PATH_MAX]; | |
34 | + char *name = evt_ent->d_name; | |
35 | + FILE *file; | |
36 | + | |
37 | + if (!strcmp(name, ".") || !strcmp(name, "..")) | |
38 | + continue; | |
39 | + | |
40 | + snprintf(path, PATH_MAX, "%s/%s", dir, name); | |
41 | + | |
42 | + ret = -EINVAL; | |
43 | + file = fopen(path, "r"); | |
44 | + if (!file) | |
45 | + break; | |
46 | + | |
47 | + perf_pmu_in = file; | |
48 | + ret = perf_pmu_parse(head, name); | |
49 | + fclose(file); | |
50 | + } | |
51 | + | |
52 | + closedir(format_dir); | |
53 | + return ret; | |
54 | +} | |
55 | + | |
56 | +/* | |
57 | + * Reading/parsing the default pmu format definition, which should be | |
58 | + * located at: | |
59 | + * /sys/bus/event_source/devices/<dev>/format as sysfs group attributes. | |
60 | + */ | |
61 | +static int pmu_format(char *name, struct list_head *format) | |
62 | +{ | |
63 | + struct stat st; | |
64 | + char path[PATH_MAX]; | |
65 | + const char *sysfs; | |
66 | + | |
67 | + sysfs = sysfs_find_mountpoint(); | |
68 | + if (!sysfs) | |
69 | + return -1; | |
70 | + | |
71 | + snprintf(path, PATH_MAX, | |
72 | + "%s/bus/event_source/devices/%s/format", sysfs, name); | |
73 | + | |
74 | + if (stat(path, &st) < 0) | |
75 | + return -1; | |
76 | + | |
77 | + if (pmu_format_parse(path, format)) | |
78 | + return -1; | |
79 | + | |
80 | + return 0; | |
81 | +} | |
82 | + | |
83 | +/* | |
84 | + * Reading/parsing the default pmu type value, which should be | |
85 | + * located at: | |
86 | + * /sys/bus/event_source/devices/<dev>/type as sysfs attribute. | |
87 | + */ | |
88 | +static int pmu_type(char *name, __u32 *type) | |
89 | +{ | |
90 | + struct stat st; | |
91 | + char path[PATH_MAX]; | |
92 | + const char *sysfs; | |
93 | + FILE *file; | |
94 | + int ret = 0; | |
95 | + | |
96 | + sysfs = sysfs_find_mountpoint(); | |
97 | + if (!sysfs) | |
98 | + return -1; | |
99 | + | |
100 | + snprintf(path, PATH_MAX, | |
101 | + "%s/bus/event_source/devices/%s/type", sysfs, name); | |
102 | + | |
103 | + if (stat(path, &st) < 0) | |
104 | + return -1; | |
105 | + | |
106 | + file = fopen(path, "r"); | |
107 | + if (!file) | |
108 | + return -EINVAL; | |
109 | + | |
110 | + if (1 != fscanf(file, "%u", type)) | |
111 | + ret = -1; | |
112 | + | |
113 | + fclose(file); | |
114 | + return ret; | |
115 | +} | |
116 | + | |
117 | +static struct perf_pmu *pmu_lookup(char *name) | |
118 | +{ | |
119 | + struct perf_pmu *pmu; | |
120 | + LIST_HEAD(format); | |
121 | + __u32 type; | |
122 | + | |
123 | + /* | |
124 | + * The pmu data we store & need consists of the pmu | |
125 | + * type value and format definitions. Load both right | |
126 | + * now. | |
127 | + */ | |
128 | + if (pmu_format(name, &format)) | |
129 | + return NULL; | |
130 | + | |
131 | + if (pmu_type(name, &type)) | |
132 | + return NULL; | |
133 | + | |
134 | + pmu = zalloc(sizeof(*pmu)); | |
135 | + if (!pmu) | |
136 | + return NULL; | |
137 | + | |
138 | + INIT_LIST_HEAD(&pmu->format); | |
139 | + list_splice(&format, &pmu->format); | |
140 | + pmu->name = strdup(name); | |
141 | + pmu->type = type; | |
142 | + return pmu; | |
143 | +} | |
144 | + | |
145 | +static struct perf_pmu *pmu_find(char *name) | |
146 | +{ | |
147 | + struct perf_pmu *pmu; | |
148 | + | |
149 | + list_for_each_entry(pmu, &pmus, list) | |
150 | + if (!strcmp(pmu->name, name)) | |
151 | + return pmu; | |
152 | + | |
153 | + return NULL; | |
154 | +} | |
155 | + | |
156 | +struct perf_pmu *perf_pmu__find(char *name) | |
157 | +{ | |
158 | + struct perf_pmu *pmu; | |
159 | + | |
160 | + /* | |
161 | + * Once PMU is loaded it stays in the list, | |
162 | + * so we keep us from multiple reading/parsing | |
163 | + * the pmu format definitions. | |
164 | + */ | |
165 | + pmu = pmu_find(name); | |
166 | + if (pmu) | |
167 | + return pmu; | |
168 | + | |
169 | + return pmu_lookup(name); | |
170 | +} | |
171 | + | |
172 | +static struct perf_pmu__format* | |
173 | +pmu_find_format(struct list_head *formats, char *name) | |
174 | +{ | |
175 | + struct perf_pmu__format *format; | |
176 | + | |
177 | + list_for_each_entry(format, formats, list) | |
178 | + if (!strcmp(format->name, name)) | |
179 | + return format; | |
180 | + | |
181 | + return NULL; | |
182 | +} | |
183 | + | |
184 | +/* | |
185 | + * Returns value based on the format definition (format parameter) | |
186 | + * and unformated value (value parameter). | |
187 | + * | |
188 | + * TODO maybe optimize a little ;) | |
189 | + */ | |
190 | +static __u64 pmu_format_value(unsigned long *format, __u64 value) | |
191 | +{ | |
192 | + unsigned long fbit, vbit; | |
193 | + __u64 v = 0; | |
194 | + | |
195 | + for (fbit = 0, vbit = 0; fbit < PERF_PMU_FORMAT_BITS; fbit++) { | |
196 | + | |
197 | + if (!test_bit(fbit, format)) | |
198 | + continue; | |
199 | + | |
200 | + if (!(value & (1llu << vbit++))) | |
201 | + continue; | |
202 | + | |
203 | + v |= (1llu << fbit); | |
204 | + } | |
205 | + | |
206 | + return v; | |
207 | +} | |
208 | + | |
209 | +/* | |
210 | + * Setup one of config[12] attr members based on the | |
211 | + * user input data - temr parameter. | |
212 | + */ | |
213 | +static int pmu_config_term(struct list_head *formats, | |
214 | + struct perf_event_attr *attr, | |
215 | + struct parse_events__term *term) | |
216 | +{ | |
217 | + struct perf_pmu__format *format; | |
218 | + __u64 *vp; | |
219 | + | |
220 | + /* | |
221 | + * Support only for hardcoded and numnerial terms. | |
222 | + * Hardcoded terms should be already in, so nothing | |
223 | + * to be done for them. | |
224 | + */ | |
225 | + if (parse_events__is_hardcoded_term(term)) | |
226 | + return 0; | |
227 | + | |
228 | + if (term->type != PARSE_EVENTS__TERM_TYPE_NUM) | |
229 | + return -EINVAL; | |
230 | + | |
231 | + format = pmu_find_format(formats, term->config); | |
232 | + if (!format) | |
233 | + return -EINVAL; | |
234 | + | |
235 | + switch (format->value) { | |
236 | + case PERF_PMU_FORMAT_VALUE_CONFIG: | |
237 | + vp = &attr->config; | |
238 | + break; | |
239 | + case PERF_PMU_FORMAT_VALUE_CONFIG1: | |
240 | + vp = &attr->config1; | |
241 | + break; | |
242 | + case PERF_PMU_FORMAT_VALUE_CONFIG2: | |
243 | + vp = &attr->config2; | |
244 | + break; | |
245 | + default: | |
246 | + return -EINVAL; | |
247 | + } | |
248 | + | |
249 | + *vp |= pmu_format_value(format->bits, term->val.num); | |
250 | + return 0; | |
251 | +} | |
252 | + | |
253 | +static int pmu_config(struct list_head *formats, struct perf_event_attr *attr, | |
254 | + struct list_head *head_terms) | |
255 | +{ | |
256 | + struct parse_events__term *term, *h; | |
257 | + | |
258 | + list_for_each_entry_safe(term, h, head_terms, list) | |
259 | + if (pmu_config_term(formats, attr, term)) | |
260 | + return -EINVAL; | |
261 | + | |
262 | + return 0; | |
263 | +} | |
264 | + | |
265 | +/* | |
266 | + * Configures event's 'attr' parameter based on the: | |
267 | + * 1) users input - specified in terms parameter | |
268 | + * 2) pmu format definitions - specified by pmu parameter | |
269 | + */ | |
270 | +int perf_pmu__config(struct perf_pmu *pmu, struct perf_event_attr *attr, | |
271 | + struct list_head *head_terms) | |
272 | +{ | |
273 | + attr->type = pmu->type; | |
274 | + return pmu_config(&pmu->format, attr, head_terms); | |
275 | +} | |
276 | + | |
277 | +int perf_pmu__new_format(struct list_head *list, char *name, | |
278 | + int config, unsigned long *bits) | |
279 | +{ | |
280 | + struct perf_pmu__format *format; | |
281 | + | |
282 | + format = zalloc(sizeof(*format)); | |
283 | + if (!format) | |
284 | + return -ENOMEM; | |
285 | + | |
286 | + format->name = strdup(name); | |
287 | + format->value = config; | |
288 | + memcpy(format->bits, bits, sizeof(format->bits)); | |
289 | + | |
290 | + list_add_tail(&format->list, list); | |
291 | + return 0; | |
292 | +} | |
293 | + | |
294 | +void perf_pmu__set_format(unsigned long *bits, long from, long to) | |
295 | +{ | |
296 | + long b; | |
297 | + | |
298 | + if (!to) | |
299 | + to = from; | |
300 | + | |
301 | + memset(bits, 0, BITS_TO_LONGS(PERF_PMU_FORMAT_BITS)); | |
302 | + for (b = from; b <= to; b++) | |
303 | + set_bit(b, bits); | |
304 | +} | |
305 | + | |
306 | +/* Simulated format definitions. */ | |
307 | +static struct test_format { | |
308 | + const char *name; | |
309 | + const char *value; | |
310 | +} test_formats[] = { | |
311 | + { "krava01", "config:0-1,62-63\n", }, | |
312 | + { "krava02", "config:10-17\n", }, | |
313 | + { "krava03", "config:5\n", }, | |
314 | + { "krava11", "config1:0,2,4,6,8,20-28\n", }, | |
315 | + { "krava12", "config1:63\n", }, | |
316 | + { "krava13", "config1:45-47\n", }, | |
317 | + { "krava21", "config2:0-3,10-13,20-23,30-33,40-43,50-53,60-63\n", }, | |
318 | + { "krava22", "config2:8,18,48,58\n", }, | |
319 | + { "krava23", "config2:28-29,38\n", }, | |
320 | +}; | |
321 | + | |
322 | +#define TEST_FORMATS_CNT (sizeof(test_formats) / sizeof(struct test_format)) | |
323 | + | |
324 | +/* Simulated users input. */ | |
325 | +static struct parse_events__term test_terms[] = { | |
326 | + { | |
327 | + .config = (char *) "krava01", | |
328 | + .val.num = 15, | |
329 | + .type = PARSE_EVENTS__TERM_TYPE_NUM, | |
330 | + }, | |
331 | + { | |
332 | + .config = (char *) "krava02", | |
333 | + .val.num = 170, | |
334 | + .type = PARSE_EVENTS__TERM_TYPE_NUM, | |
335 | + }, | |
336 | + { | |
337 | + .config = (char *) "krava03", | |
338 | + .val.num = 1, | |
339 | + .type = PARSE_EVENTS__TERM_TYPE_NUM, | |
340 | + }, | |
341 | + { | |
342 | + .config = (char *) "krava11", | |
343 | + .val.num = 27, | |
344 | + .type = PARSE_EVENTS__TERM_TYPE_NUM, | |
345 | + }, | |
346 | + { | |
347 | + .config = (char *) "krava12", | |
348 | + .val.num = 1, | |
349 | + .type = PARSE_EVENTS__TERM_TYPE_NUM, | |
350 | + }, | |
351 | + { | |
352 | + .config = (char *) "krava13", | |
353 | + .val.num = 2, | |
354 | + .type = PARSE_EVENTS__TERM_TYPE_NUM, | |
355 | + }, | |
356 | + { | |
357 | + .config = (char *) "krava21", | |
358 | + .val.num = 119, | |
359 | + .type = PARSE_EVENTS__TERM_TYPE_NUM, | |
360 | + }, | |
361 | + { | |
362 | + .config = (char *) "krava22", | |
363 | + .val.num = 11, | |
364 | + .type = PARSE_EVENTS__TERM_TYPE_NUM, | |
365 | + }, | |
366 | + { | |
367 | + .config = (char *) "krava23", | |
368 | + .val.num = 2, | |
369 | + .type = PARSE_EVENTS__TERM_TYPE_NUM, | |
370 | + }, | |
371 | +}; | |
372 | +#define TERMS_CNT (sizeof(test_terms) / sizeof(struct parse_events__term)) | |
373 | + | |
374 | +/* | |
375 | + * Prepare format directory data, exported by kernel | |
376 | + * at /sys/bus/event_source/devices/<dev>/format. | |
377 | + */ | |
378 | +static char *test_format_dir_get(void) | |
379 | +{ | |
380 | + static char dir[PATH_MAX]; | |
381 | + unsigned int i; | |
382 | + | |
383 | + snprintf(dir, PATH_MAX, "/tmp/perf-pmu-test-format-XXXXXX"); | |
384 | + if (!mkdtemp(dir)) | |
385 | + return NULL; | |
386 | + | |
387 | + for (i = 0; i < TEST_FORMATS_CNT; i++) { | |
388 | + static char name[PATH_MAX]; | |
389 | + struct test_format *format = &test_formats[i]; | |
390 | + FILE *file; | |
391 | + | |
392 | + snprintf(name, PATH_MAX, "%s/%s", dir, format->name); | |
393 | + | |
394 | + file = fopen(name, "w"); | |
395 | + if (!file) | |
396 | + return NULL; | |
397 | + | |
398 | + if (1 != fwrite(format->value, strlen(format->value), 1, file)) | |
399 | + break; | |
400 | + | |
401 | + fclose(file); | |
402 | + } | |
403 | + | |
404 | + return dir; | |
405 | +} | |
406 | + | |
407 | +/* Cleanup format directory. */ | |
408 | +static int test_format_dir_put(char *dir) | |
409 | +{ | |
410 | + char buf[PATH_MAX]; | |
411 | + snprintf(buf, PATH_MAX, "rm -f %s/*\n", dir); | |
412 | + if (system(buf)) | |
413 | + return -1; | |
414 | + | |
415 | + snprintf(buf, PATH_MAX, "rmdir %s\n", dir); | |
416 | + return system(buf); | |
417 | +} | |
418 | + | |
419 | +static struct list_head *test_terms_list(void) | |
420 | +{ | |
421 | + static LIST_HEAD(terms); | |
422 | + unsigned int i; | |
423 | + | |
424 | + for (i = 0; i < TERMS_CNT; i++) | |
425 | + list_add_tail(&test_terms[i].list, &terms); | |
426 | + | |
427 | + return &terms; | |
428 | +} | |
429 | + | |
430 | +#undef TERMS_CNT | |
431 | + | |
432 | +int perf_pmu__test(void) | |
433 | +{ | |
434 | + char *format = test_format_dir_get(); | |
435 | + LIST_HEAD(formats); | |
436 | + struct list_head *terms = test_terms_list(); | |
437 | + int ret; | |
438 | + | |
439 | + if (!format) | |
440 | + return -EINVAL; | |
441 | + | |
442 | + do { | |
443 | + struct perf_event_attr attr; | |
444 | + | |
445 | + memset(&attr, 0, sizeof(attr)); | |
446 | + | |
447 | + ret = pmu_format_parse(format, &formats); | |
448 | + if (ret) | |
449 | + break; | |
450 | + | |
451 | + ret = pmu_config(&formats, &attr, terms); | |
452 | + if (ret) | |
453 | + break; | |
454 | + | |
455 | + ret = -EINVAL; | |
456 | + | |
457 | + if (attr.config != 0xc00000000002a823) | |
458 | + break; | |
459 | + if (attr.config1 != 0x8000400000000145) | |
460 | + break; | |
461 | + if (attr.config2 != 0x0400000020041d07) | |
462 | + break; | |
463 | + | |
464 | + ret = 0; | |
465 | + } while (0); | |
466 | + | |
467 | + test_format_dir_put(format); | |
468 | + return ret; | |
469 | +} |
tools/perf/util/pmu.h
1 | +#ifndef __PMU_H | |
2 | +#define __PMU_H | |
3 | + | |
4 | +#include <linux/bitops.h> | |
5 | +#include "../../../include/linux/perf_event.h" | |
6 | + | |
7 | +enum { | |
8 | + PERF_PMU_FORMAT_VALUE_CONFIG, | |
9 | + PERF_PMU_FORMAT_VALUE_CONFIG1, | |
10 | + PERF_PMU_FORMAT_VALUE_CONFIG2, | |
11 | +}; | |
12 | + | |
13 | +#define PERF_PMU_FORMAT_BITS 64 | |
14 | + | |
15 | +struct perf_pmu__format { | |
16 | + char *name; | |
17 | + int value; | |
18 | + DECLARE_BITMAP(bits, PERF_PMU_FORMAT_BITS); | |
19 | + struct list_head list; | |
20 | +}; | |
21 | + | |
22 | +struct perf_pmu { | |
23 | + char *name; | |
24 | + __u32 type; | |
25 | + struct list_head format; | |
26 | + struct list_head list; | |
27 | +}; | |
28 | + | |
29 | +struct perf_pmu *perf_pmu__find(char *name); | |
30 | +int perf_pmu__config(struct perf_pmu *pmu, struct perf_event_attr *attr, | |
31 | + struct list_head *head_terms); | |
32 | + | |
33 | +int perf_pmu_wrap(void); | |
34 | +void perf_pmu_error(struct list_head *list, char *name, char const *msg); | |
35 | + | |
36 | +int perf_pmu__new_format(struct list_head *list, char *name, | |
37 | + int config, unsigned long *bits); | |
38 | +void perf_pmu__set_format(unsigned long *bits, long from, long to); | |
39 | + | |
40 | +int perf_pmu__test(void); | |
41 | +#endif /* __PMU_H */ |
tools/perf/util/pmu.l
1 | +%option prefix="perf_pmu_" | |
2 | + | |
3 | +%{ | |
4 | +#include <stdlib.h> | |
5 | +#include <linux/bitops.h> | |
6 | +#include "pmu.h" | |
7 | +#include "pmu-bison.h" | |
8 | + | |
9 | +static int value(int base) | |
10 | +{ | |
11 | + long num; | |
12 | + | |
13 | + errno = 0; | |
14 | + num = strtoul(perf_pmu_text, NULL, base); | |
15 | + if (errno) | |
16 | + return PP_ERROR; | |
17 | + | |
18 | + perf_pmu_lval.num = num; | |
19 | + return PP_VALUE; | |
20 | +} | |
21 | + | |
22 | +%} | |
23 | + | |
24 | +num_dec [0-9]+ | |
25 | + | |
26 | +%% | |
27 | + | |
28 | +{num_dec} { return value(10); } | |
29 | +config { return PP_CONFIG; } | |
30 | +config1 { return PP_CONFIG1; } | |
31 | +config2 { return PP_CONFIG2; } | |
32 | +- { return '-'; } | |
33 | +: { return ':'; } | |
34 | +, { return ','; } | |
35 | +. { ; } | |
36 | +\n { ; } | |
37 | + | |
38 | +%% | |
39 | + | |
40 | +int perf_pmu_wrap(void) | |
41 | +{ | |
42 | + return 1; | |
43 | +} |
tools/perf/util/pmu.y
1 | + | |
2 | +%name-prefix "perf_pmu_" | |
3 | +%parse-param {struct list_head *format} | |
4 | +%parse-param {char *name} | |
5 | + | |
6 | +%{ | |
7 | + | |
8 | +#include <linux/compiler.h> | |
9 | +#include <linux/list.h> | |
10 | +#include <linux/bitmap.h> | |
11 | +#include <string.h> | |
12 | +#include "pmu.h" | |
13 | + | |
14 | +extern int perf_pmu_lex (void); | |
15 | + | |
16 | +#define ABORT_ON(val) \ | |
17 | +do { \ | |
18 | + if (val) \ | |
19 | + YYABORT; \ | |
20 | +} while (0) | |
21 | + | |
22 | +%} | |
23 | + | |
24 | +%token PP_CONFIG PP_CONFIG1 PP_CONFIG2 | |
25 | +%token PP_VALUE PP_ERROR | |
26 | +%type <num> PP_VALUE | |
27 | +%type <bits> bit_term | |
28 | +%type <bits> bits | |
29 | + | |
30 | +%union | |
31 | +{ | |
32 | + unsigned long num; | |
33 | + DECLARE_BITMAP(bits, PERF_PMU_FORMAT_BITS); | |
34 | +} | |
35 | + | |
36 | +%% | |
37 | + | |
38 | +format: | |
39 | +format format_term | |
40 | +| | |
41 | +format_term | |
42 | + | |
43 | +format_term: | |
44 | +PP_CONFIG ':' bits | |
45 | +{ | |
46 | + ABORT_ON(perf_pmu__new_format(format, name, | |
47 | + PERF_PMU_FORMAT_VALUE_CONFIG, | |
48 | + $3)); | |
49 | +} | |
50 | +| | |
51 | +PP_CONFIG1 ':' bits | |
52 | +{ | |
53 | + ABORT_ON(perf_pmu__new_format(format, name, | |
54 | + PERF_PMU_FORMAT_VALUE_CONFIG1, | |
55 | + $3)); | |
56 | +} | |
57 | +| | |
58 | +PP_CONFIG2 ':' bits | |
59 | +{ | |
60 | + ABORT_ON(perf_pmu__new_format(format, name, | |
61 | + PERF_PMU_FORMAT_VALUE_CONFIG2, | |
62 | + $3)); | |
63 | +} | |
64 | + | |
65 | +bits: | |
66 | +bits ',' bit_term | |
67 | +{ | |
68 | + bitmap_or($$, $1, $3, 64); | |
69 | +} | |
70 | +| | |
71 | +bit_term | |
72 | +{ | |
73 | + memcpy($$, $1, sizeof($1)); | |
74 | +} | |
75 | + | |
76 | +bit_term: | |
77 | +PP_VALUE '-' PP_VALUE | |
78 | +{ | |
79 | + perf_pmu__set_format($$, $1, $3); | |
80 | +} | |
81 | +| | |
82 | +PP_VALUE | |
83 | +{ | |
84 | + perf_pmu__set_format($$, $1, 0); | |
85 | +} | |
86 | + | |
87 | +%% | |
88 | + | |
89 | +void perf_pmu_error(struct list_head *list __used, | |
90 | + char *name __used, | |
91 | + char const *msg __used) | |
92 | +{ | |
93 | +} |