| %define api.pure full | |
| %parse-param {void *format} | |
| %parse-param {void *scanner} | |
| %lex-param {void* scanner} | |
| %{ | |
| #ifndef NDEBUG | |
| #define YYDEBUG 1 | |
| #endif | |
| #include <linux/compiler.h> | |
| #include <linux/list.h> | |
| #include <linux/bitmap.h> | |
| #include <string.h> | |
| #include "pmu.h" | |
| #include "pmu-bison.h" | |
| int perf_pmu_lex(YYSTYPE * yylval_param , void *yyscanner); | |
| #define ABORT_ON(val) \ | |
| do { \ | |
| if (val) \ | |
| YYABORT; \ | |
| } while (0) | |
| static void perf_pmu_error(void *format, void *scanner, const char *msg); | |
| static void perf_pmu__set_format(unsigned long *bits, long from, long to) | |
| { | |
| long b; | |
| if (!to) | |
| to = from; | |
| memset(bits, 0, BITS_TO_BYTES(PERF_PMU_FORMAT_BITS)); | |
| for (b = from; b <= to; b++) | |
| __set_bit(b, bits); | |
| } | |
| %} | |
| %token PP_CONFIG | |
| %token PP_VALUE PP_ERROR | |
| %type <num> PP_VALUE | |
| %type <bits> bit_term | |
| %type <bits> bits | |
| %union | |
| { | |
| unsigned long num; | |
| DECLARE_BITMAP(bits, PERF_PMU_FORMAT_BITS); | |
| } | |
| %% | |
| format: | |
| format format_term | |
| | | |
| format_term | |
| format_term: | |
| PP_CONFIG ':' bits | |
| { | |
| perf_pmu_format__set_value(format, PERF_PMU_FORMAT_VALUE_CONFIG, $3); | |
| } | |
| | | |
| PP_CONFIG PP_VALUE ':' bits | |
| { | |
| perf_pmu_format__set_value(format, $2, $4); | |
| } | |
| bits: | |
| bits ',' bit_term | |
| { | |
| bitmap_or($$, $1, $3, 64); | |
| } | |
| | | |
| bit_term | |
| { | |
| memcpy($$, $1, sizeof($1)); | |
| } | |
| bit_term: | |
| PP_VALUE '-' PP_VALUE | |
| { | |
| perf_pmu__set_format($$, $1, $3); | |
| } | |
| | | |
| PP_VALUE | |
| { | |
| perf_pmu__set_format($$, $1, 0); | |
| } | |
| %% | |
| static void perf_pmu_error(void *format __maybe_unused, | |
| void *scanner __maybe_unused, | |
| const char *msg __maybe_unused) | |
| { | |
| } |