1e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 2e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng%option reentrant 3e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng%option bison-bridge 4e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng%option prefix="parse_events_" 5e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng%option stack 6e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 7e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng%{ 8e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <errno.h> 9e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "../perf.h" 10e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "parse-events-bison.h" 11e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "parse-events.h" 12e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 13e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengchar *parse_events_get_text(yyscan_t yyscanner); 14e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen ChengYYSTYPE *parse_events_get_lval(yyscan_t yyscanner); 15e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 16e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic int __value(YYSTYPE *yylval, char *str, int base, int token) 17e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 18e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng u64 num; 19e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 20e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng errno = 0; 21e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng num = strtoull(str, NULL, base); 22e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (errno) 23e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return PE_ERROR; 24e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 25e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng yylval->num = num; 26e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return token; 27e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 28e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 29e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic int value(yyscan_t scanner, int base) 30e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 31e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng YYSTYPE *yylval = parse_events_get_lval(scanner); 32e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char *text = parse_events_get_text(scanner); 33e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 34e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return __value(yylval, text, base, PE_VALUE); 35e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 36e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 37e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic int raw(yyscan_t scanner) 38e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 39e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng YYSTYPE *yylval = parse_events_get_lval(scanner); 40e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char *text = parse_events_get_text(scanner); 41e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 42e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return __value(yylval, text + 1, 16, PE_RAW); 43e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 44e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 45e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic int str(yyscan_t scanner, int token) 46e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 47e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng YYSTYPE *yylval = parse_events_get_lval(scanner); 48e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char *text = parse_events_get_text(scanner); 49e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 50e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng yylval->str = strdup(text); 51e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return token; 52e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 53e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 54e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic int sym(yyscan_t scanner, int type, int config) 55e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 56e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng YYSTYPE *yylval = parse_events_get_lval(scanner); 57e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 58e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng yylval->num = (type << 16) + config; 59e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return type == PERF_TYPE_HARDWARE ? PE_VALUE_SYM_HW : PE_VALUE_SYM_SW; 60e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 61e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 62e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic int term(yyscan_t scanner, int type) 63e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 64e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng YYSTYPE *yylval = parse_events_get_lval(scanner); 65e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 66e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng yylval->num = type; 67e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return PE_TERM; 68e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 69e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 70e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng%} 71e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 72e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng%x mem 73e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng%s config 74e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng%x event 75e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 76e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chenggroup [^,{}/]*[{][^}]*[}][^,{}/]* 77e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengevent_pmu [^,{}/]+[/][^/]*[/][^,{}/]* 78e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengevent [^,{}/]+ 79e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 80e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengnum_dec [0-9]+ 81e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengnum_hex 0x[a-fA-F0-9]+ 82e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengnum_raw_hex [a-fA-F0-9]+ 83e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengname [a-zA-Z_*?][a-zA-Z0-9_*?]* 84e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengname_minus [a-zA-Z_*?][a-zA-Z0-9\-_*?]* 85e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* If you add a modifier you need to update check_modifier() */ 86e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengmodifier_event [ukhpGHSD]+ 87e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengmodifier_bp [rwx]{1,3} 88e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 89e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng%% 90e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 91e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng%{ 92e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng { 93e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int start_token; 94e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 95e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng start_token = parse_events_get_extra(yyscanner); 96e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 97e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (start_token == PE_START_TERMS) 98e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng BEGIN(config); 99e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng else if (start_token == PE_START_EVENTS) 100e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng BEGIN(event); 101e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 102e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (start_token) { 103e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng parse_events_set_extra(NULL, yyscanner); 104e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return start_token; 105e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 106e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 107e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng%} 108e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 109e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng<event>{ 110e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 111e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{group} { 112e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng BEGIN(INITIAL); yyless(0); 113e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 114e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 115e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{event_pmu} | 116e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{event} { 117e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng str(yyscanner, PE_EVENT_NAME); 118e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng BEGIN(INITIAL); yyless(0); 119e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return PE_EVENT_NAME; 120e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 121e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 122e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng. | 123e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng<<EOF>> { 124e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng BEGIN(INITIAL); yyless(0); 125e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 126e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 127e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 128e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 129e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengcpu-cycles|cycles { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_CPU_CYCLES); } 130e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstalled-cycles-frontend|idle-cycles-frontend { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_STALLED_CYCLES_FRONTEND); } 131e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstalled-cycles-backend|idle-cycles-backend { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_STALLED_CYCLES_BACKEND); } 132e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chenginstructions { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_INSTRUCTIONS); } 133e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengcache-references { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_CACHE_REFERENCES); } 134e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengcache-misses { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_CACHE_MISSES); } 135e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengbranch-instructions|branches { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_BRANCH_INSTRUCTIONS); } 136e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengbranch-misses { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_BRANCH_MISSES); } 137e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengbus-cycles { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_BUS_CYCLES); } 138e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengref-cycles { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_REF_CPU_CYCLES); } 139e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengcpu-clock { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CPU_CLOCK); } 140e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengtask-clock { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_TASK_CLOCK); } 141e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengpage-faults|faults { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_PAGE_FAULTS); } 142e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengminor-faults { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_PAGE_FAULTS_MIN); } 143e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengmajor-faults { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_PAGE_FAULTS_MAJ); } 144e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengcontext-switches|cs { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CONTEXT_SWITCHES); } 145e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengcpu-migrations|migrations { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CPU_MIGRATIONS); } 146e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengalignment-faults { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_ALIGNMENT_FAULTS); } 147e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengemulation-faults { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_EMULATION_FAULTS); } 148e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengdummy { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_DUMMY); } 149e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 150e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen ChengL1-dcache|l1-d|l1d|L1-data | 151e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen ChengL1-icache|l1-i|l1i|L1-instruction | 152e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen ChengLLC|L2 | 153e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen ChengdTLB|d-tlb|Data-TLB | 154e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen ChengiTLB|i-tlb|Instruction-TLB | 155e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengbranch|branches|bpu|btb|bpc | 156e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengnode { return str(yyscanner, PE_NAME_CACHE_TYPE); } 157e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 158e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengload|loads|read | 159e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstore|stores|write | 160e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengprefetch|prefetches | 161e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengspeculative-read|speculative-load | 162e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengrefs|Reference|ops|access | 163e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengmisses|miss { return str(yyscanner, PE_NAME_CACHE_OP_RESULT); } 164e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 165e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng<config>{ 166e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengconfig { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_CONFIG); } 167e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengconfig1 { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_CONFIG1); } 168e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengconfig2 { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_CONFIG2); } 169e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengname { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_NAME); } 170e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengperiod { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD); } 171e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengbranch_type { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE); } 172e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng, { return ','; } 173e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng"/" { BEGIN(INITIAL); return '/'; } 174e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{name_minus} { return str(yyscanner, PE_NAME); } 175e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 176e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 177e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengmem: { BEGIN(mem); return PE_PREFIX_MEM; } 178e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengr{num_raw_hex} { return raw(yyscanner); } 179e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{num_dec} { return value(yyscanner, 10); } 180e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{num_hex} { return value(yyscanner, 16); } 181e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 182e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{modifier_event} { return str(yyscanner, PE_MODIFIER_EVENT); } 183e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{name} { return str(yyscanner, PE_NAME); } 184e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng"/" { BEGIN(config); return '/'; } 185e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng- { return '-'; } 186e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng, { BEGIN(event); return ','; } 187e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng: { return ':'; } 188e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng"{" { BEGIN(event); return '{'; } 189e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng"}" { return '}'; } 190e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng= { return '='; } 191e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng\n { } 192e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 193e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng<mem>{ 194e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{modifier_bp} { return str(yyscanner, PE_MODIFIER_BP); } 195e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng: { return ':'; } 196e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{num_dec} { return value(yyscanner, 10); } 197e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{num_hex} { return value(yyscanner, 16); } 198e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng /* 199e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * We need to separate 'mem:' scanner part, in order to get specific 200e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * modifier bits parsed out. Otherwise we would need to handle PE_NAME 201e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * and we'd need to parse it manually. During the escape from <mem> 202e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * state we need to put the escaping char back, so we dont miss it. 203e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */ 204e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng. { unput(*yytext); BEGIN(INITIAL); } 205e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng /* 206e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * We destroy the scanner after reaching EOF, 207e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * but anyway just to be sure get back to INIT state. 208e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */ 209e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng<<EOF>> { BEGIN(INITIAL); } 210e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 211e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 212e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng%% 213e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 214e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint parse_events_wrap(void *scanner __maybe_unused) 215e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 216e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return 1; 217e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 218