aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorJiri Olsa <jolsa@redhat.com>2012-03-15 15:09:16 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2012-03-16 13:26:06 -0400
commit8f707d843c2f4023490a873dbc182f632a3a5906 (patch)
treee4c6d509756aa869314888de0d5873c4a20a7e92 /tools
parent89812fc81f8d62d70433a8ff63d26819f372e8ec (diff)
perf tools: Add config options support for event parsing
Adding a new rule to the event grammar to be able to specify values of additional attributes of symbolic event. The new syntax for event symbolic definition is: event_legacy_symbol: PE_NAME_SYM '/' event_config '/' | PE_NAME_SYM sep_slash_dc event_config: event_config ',' event_term | event_term event_term: PE_NAME '=' PE_NAME | PE_NAME '=' PE_VALUE PE_NAME sep_slash_dc: '/' | ':' | At the moment the config options are hardcoded to be used for legacy symbol events to define several perf_event_attr fields. It is: 'config' to define perf_event_attr::config 'config1' to define perf_event_attr::config1 'config2' to define perf_event_attr::config2 'period' to define perf_event_attr::sample_period Legacy events could be now specified as: cycles/period=100000/ If term is specified without the value assignment, then 1 is assigned by default. Acked-by: Peter Zijlstra <peterz@infradead.org> Signed-off-by: Jiri Olsa <jolsa@redhat.com> Link: http://lkml.kernel.org/n/tip-mgkavww9790jbt2jdkooyv4q@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools')
-rw-r--r--tools/perf/builtin-test.c22
-rw-r--r--tools/perf/util/parse-events-bison.c310
-rw-r--r--tools/perf/util/parse-events-bison.h23
-rw-r--r--tools/perf/util/parse-events-flex.c713
-rw-r--r--tools/perf/util/parse-events-flex.h2
-rw-r--r--tools/perf/util/parse-events.c99
-rw-r--r--tools/perf/util/parse-events.h31
-rw-r--r--tools/perf/util/parse-events.l19
-rw-r--r--tools/perf/util/parse-events.y94
9 files changed, 866 insertions, 447 deletions
diff --git a/tools/perf/builtin-test.c b/tools/perf/builtin-test.c
index 844c53a49a5a..8b5359506505 100644
--- a/tools/perf/builtin-test.c
+++ b/tools/perf/builtin-test.c
@@ -677,6 +677,24 @@ static int test__checkevent_symbolic_name(struct perf_evlist *evlist)
677 return 0; 677 return 0;
678} 678}
679 679
680static int test__checkevent_symbolic_name_config(struct perf_evlist *evlist)
681{
682 struct perf_evsel *evsel = list_entry(evlist->entries.next,
683 struct perf_evsel, node);
684
685 TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
686 TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
687 TEST_ASSERT_VAL("wrong config",
688 PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
689 TEST_ASSERT_VAL("wrong period",
690 100000 == evsel->attr.sample_period);
691 TEST_ASSERT_VAL("wrong config1",
692 0 == evsel->attr.config1);
693 TEST_ASSERT_VAL("wrong config2",
694 1 == evsel->attr.config2);
695 return 0;
696}
697
680static int test__checkevent_symbolic_alias(struct perf_evlist *evlist) 698static int test__checkevent_symbolic_alias(struct perf_evlist *evlist)
681{ 699{
682 struct perf_evsel *evsel = list_entry(evlist->entries.next, 700 struct perf_evsel *evsel = list_entry(evlist->entries.next,
@@ -884,6 +902,10 @@ static struct test__event_st {
884 .check = test__checkevent_symbolic_name, 902 .check = test__checkevent_symbolic_name,
885 }, 903 },
886 { 904 {
905 .name = "cycles/period=100000,config2/",
906 .check = test__checkevent_symbolic_name_config,
907 },
908 {
887 .name = "faults", 909 .name = "faults",
888 .check = test__checkevent_symbolic_alias, 910 .check = test__checkevent_symbolic_alias,
889 }, 911 },
diff --git a/tools/perf/util/parse-events-bison.c b/tools/perf/util/parse-events-bison.c
index 20fca2635664..ace593a25182 100644
--- a/tools/perf/util/parse-events-bison.c
+++ b/tools/perf/util/parse-events-bison.c
@@ -127,14 +127,15 @@ do { \
127 PE_VALUE = 258, 127 PE_VALUE = 258,
128 PE_VALUE_SYM = 259, 128 PE_VALUE_SYM = 259,
129 PE_RAW = 260, 129 PE_RAW = 260,
130 PE_NAME = 261, 130 PE_TERM = 261,
131 PE_MODIFIER_EVENT = 262, 131 PE_NAME = 262,
132 PE_MODIFIER_BP = 263, 132 PE_MODIFIER_EVENT = 263,
133 PE_NAME_CACHE_TYPE = 264, 133 PE_MODIFIER_BP = 264,
134 PE_NAME_CACHE_OP_RESULT = 265, 134 PE_NAME_CACHE_TYPE = 265,
135 PE_PREFIX_MEM = 266, 135 PE_NAME_CACHE_OP_RESULT = 266,
136 PE_PREFIX_RAW = 267, 136 PE_PREFIX_MEM = 267,
137 PE_ERROR = 268 137 PE_PREFIX_RAW = 268,
138 PE_ERROR = 269
138 }; 139 };
139#endif 140#endif
140 141
@@ -145,15 +146,17 @@ typedef union YYSTYPE
145{ 146{
146 147
147/* Line 214 of yacc.c */ 148/* Line 214 of yacc.c */
148#line 42 "util/parse-events.y" 149#line 45 "util/parse-events.y"
149 150
150 char *str; 151 char *str;
151 unsigned long num; 152 unsigned long num;
153 struct list_head *head;
154 struct parse_events__term *term;
152 155
153 156
154 157
155/* Line 214 of yacc.c */ 158/* Line 214 of yacc.c */
156#line 157 "util/parse-events-bison.c" 159#line 160 "util/parse-events-bison.c"
157} YYSTYPE; 160} YYSTYPE;
158# define YYSTYPE_IS_TRIVIAL 1 161# define YYSTYPE_IS_TRIVIAL 1
159# define yystype YYSTYPE /* obsolescent; will be withdrawn */ 162# define yystype YYSTYPE /* obsolescent; will be withdrawn */
@@ -165,7 +168,7 @@ typedef union YYSTYPE
165 168
166 169
167/* Line 264 of yacc.c */ 170/* Line 264 of yacc.c */
168#line 169 "util/parse-events-bison.c" 171#line 172 "util/parse-events-bison.c"
169 172
170#ifdef short 173#ifdef short
171# undef short 174# undef short
@@ -378,22 +381,22 @@ union yyalloc
378#endif 381#endif
379 382
380/* YYFINAL -- State number of the termination state. */ 383/* YYFINAL -- State number of the termination state. */
381#define YYFINAL 20 384#define YYFINAL 23
382/* YYLAST -- Last index in YYTABLE. */ 385/* YYLAST -- Last index in YYTABLE. */
383#define YYLAST 27 386#define YYLAST 38
384 387
385/* YYNTOKENS -- Number of terminals. */ 388/* YYNTOKENS -- Number of terminals. */
386#define YYNTOKENS 17 389#define YYNTOKENS 20
387/* YYNNTS -- Number of nonterminals. */ 390/* YYNNTS -- Number of nonterminals. */
388#define YYNNTS 11 391#define YYNNTS 14
389/* YYNRULES -- Number of rules. */ 392/* YYNRULES -- Number of rules. */
390#define YYNRULES 22 393#define YYNRULES 33
391/* YYNRULES -- Number of states. */ 394/* YYNRULES -- Number of states. */
392#define YYNSTATES 39 395#define YYNSTATES 53
393 396
394/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ 397/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
395#define YYUNDEFTOK 2 398#define YYUNDEFTOK 2
396#define YYMAXUTOK 268 399#define YYMAXUTOK 269
397 400
398#define YYTRANSLATE(YYX) \ 401#define YYTRANSLATE(YYX) \
399 ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) 402 ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
@@ -405,9 +408,9 @@ static const yytype_uint8 yytranslate[] =
405 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 408 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
406 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 409 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
407 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 410 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
408 2, 2, 2, 2, 14, 15, 2, 2, 2, 2, 411 2, 2, 2, 2, 15, 17, 2, 16, 2, 2,
409 2, 2, 2, 2, 2, 2, 2, 2, 16, 2, 412 2, 2, 2, 2, 2, 2, 2, 2, 18, 2,
410 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 413 2, 19, 2, 2, 2, 2, 2, 2, 2, 2,
411 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 414 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
412 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 415 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
413 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 416 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
@@ -427,7 +430,7 @@ static const yytype_uint8 yytranslate[] =
427 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 430 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
428 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 431 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
429 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, 432 2, 2, 2, 2, 2, 2, 1, 2, 3, 4,
430 5, 6, 7, 8, 9, 10, 11, 12, 13 433 5, 6, 7, 8, 9, 10, 11, 12, 13, 14
431}; 434};
432 435
433#if YYDEBUG 436#if YYDEBUG
@@ -435,29 +438,34 @@ static const yytype_uint8 yytranslate[] =
435 YYRHS. */ 438 YYRHS. */
436static const yytype_uint8 yyprhs[] = 439static const yytype_uint8 yyprhs[] =
437{ 440{
438 0, 0, 3, 7, 9, 12, 14, 17, 20, 22, 441 0, 0, 3, 7, 9, 12, 14, 16, 19, 21,
439 25, 28, 31, 33, 39, 43, 45, 51, 55, 59, 442 24, 27, 30, 35, 38, 44, 48, 50, 56, 60,
440 63, 65, 67 443 64, 68, 70, 74, 76, 80, 84, 86, 90, 92,
444 94, 95, 97, 99
441}; 445};
442 446
443/* YYRHS -- A `-1'-separated list of the rules' RHS. */ 447/* YYRHS -- A `-1'-separated list of the rules' RHS. */
444static const yytype_int8 yyrhs[] = 448static const yytype_int8 yyrhs[] =
445{ 449{
446 18, 0, -1, 18, 14, 19, -1, 19, -1, 20, 450 21, 0, -1, 21, 15, 22, -1, 22, -1, 23,
447 7, -1, 20, -1, 21, 27, -1, 22, 27, -1, 451 8, -1, 23, -1, 24, -1, 25, 32, -1, 26,
448 23, -1, 24, 27, -1, 25, 27, -1, 26, 27, 452 -1, 27, 32, -1, 28, 32, -1, 29, 32, -1,
449 -1, 4, -1, 9, 15, 10, 15, 10, -1, 9, 453 4, 16, 30, 16, -1, 4, 33, -1, 10, 17,
450 15, 10, -1, 9, -1, 11, 3, 16, 8, 27, 454 11, 17, 11, -1, 10, 17, 11, -1, 10, -1,
451 -1, 11, 3, 27, -1, 6, 16, 6, -1, 3, 455 12, 3, 18, 9, 32, -1, 12, 3, 32, -1,
452 16, 3, -1, 5, -1, 16, -1, -1 456 7, 18, 7, -1, 3, 18, 3, -1, 5, -1,
457 30, 15, 31, -1, 31, -1, 7, 19, 7, -1,
458 7, 19, 3, -1, 7, -1, 6, 19, 3, -1,
459 6, -1, 18, -1, -1, 16, -1, 18, -1, -1
453}; 460};
454 461
455/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ 462/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
456static const yytype_uint8 yyrline[] = 463static const yytype_uint8 yyrline[] =
457{ 464{
458 0, 49, 49, 49, 52, 57, 59, 60, 61, 62, 465 0, 54, 54, 54, 57, 62, 64, 65, 66, 67,
459 63, 64, 67, 76, 81, 86, 92, 97, 103, 109, 466 68, 69, 72, 81, 90, 95, 100, 106, 111, 117,
460 115, 120, 120 467 123, 129, 135, 145, 157, 166, 175, 184, 192, 200,
468 200, 202, 202, 202
461}; 469};
462#endif 470#endif
463 471
@@ -467,12 +475,13 @@ static const yytype_uint8 yyrline[] =
467static const char *const yytname[] = 475static const char *const yytname[] =
468{ 476{
469 "$end", "error", "$undefined", "PE_VALUE", "PE_VALUE_SYM", "PE_RAW", 477 "$end", "error", "$undefined", "PE_VALUE", "PE_VALUE_SYM", "PE_RAW",
470 "PE_NAME", "PE_MODIFIER_EVENT", "PE_MODIFIER_BP", "PE_NAME_CACHE_TYPE", 478 "PE_TERM", "PE_NAME", "PE_MODIFIER_EVENT", "PE_MODIFIER_BP",
471 "PE_NAME_CACHE_OP_RESULT", "PE_PREFIX_MEM", "PE_PREFIX_RAW", "PE_ERROR", 479 "PE_NAME_CACHE_TYPE", "PE_NAME_CACHE_OP_RESULT", "PE_PREFIX_MEM",
472 "','", "'-'", "':'", "$accept", "events", "event", "event_def", 480 "PE_PREFIX_RAW", "PE_ERROR", "','", "'/'", "'-'", "':'", "'='",
473 "event_legacy_symbol", "event_legacy_cache", "event_legacy_mem", 481 "$accept", "events", "event", "event_def", "event_legacy_symbol",
474 "event_legacy_tracepoint", "event_legacy_numeric", "event_legacy_raw", 482 "event_legacy_cache", "event_legacy_mem", "event_legacy_tracepoint",
475 "sep_dc", 0 483 "event_legacy_numeric", "event_legacy_raw", "event_config", "event_term",
484 "sep_dc", "sep_slash_dc", 0
476}; 485};
477#endif 486#endif
478 487
@@ -482,24 +491,26 @@ static const char *const yytname[] =
482static const yytype_uint16 yytoknum[] = 491static const yytype_uint16 yytoknum[] =
483{ 492{
484 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, 493 0, 256, 257, 258, 259, 260, 261, 262, 263, 264,
485 265, 266, 267, 268, 44, 45, 58 494 265, 266, 267, 268, 269, 44, 47, 45, 58, 61
486}; 495};
487# endif 496# endif
488 497
489/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ 498/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
490static const yytype_uint8 yyr1[] = 499static const yytype_uint8 yyr1[] =
491{ 500{
492 0, 17, 18, 18, 19, 19, 20, 20, 20, 20, 501 0, 20, 21, 21, 22, 22, 23, 23, 23, 23,
493 20, 20, 21, 22, 22, 22, 23, 23, 24, 25, 502 23, 23, 24, 24, 25, 25, 25, 26, 26, 27,
494 26, 27, 27 503 28, 29, 30, 30, 31, 31, 31, 31, 31, 32,
504 32, 33, 33, 33
495}; 505};
496 506
497/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ 507/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
498static const yytype_uint8 yyr2[] = 508static const yytype_uint8 yyr2[] =
499{ 509{
500 0, 2, 3, 1, 2, 1, 2, 2, 1, 2, 510 0, 2, 3, 1, 2, 1, 1, 2, 1, 2,
501 2, 2, 1, 5, 3, 1, 5, 3, 3, 3, 511 2, 2, 4, 2, 5, 3, 1, 5, 3, 3,
502 1, 1, 0 512 3, 1, 3, 1, 3, 3, 1, 3, 1, 1,
513 0, 1, 1, 0
503}; 514};
504 515
505/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state 516/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
@@ -507,35 +518,39 @@ static const yytype_uint8 yyr2[] =
507 means the default is an error. */ 518 means the default is an error. */
508static const yytype_uint8 yydefact[] = 519static const yytype_uint8 yydefact[] =
509{ 520{
510 0, 0, 12, 20, 0, 15, 0, 0, 3, 5, 521 0, 0, 33, 21, 0, 16, 0, 0, 3, 5,
511 22, 22, 8, 22, 22, 22, 0, 0, 0, 22, 522 6, 30, 8, 30, 30, 30, 0, 31, 32, 13,
512 1, 0, 4, 21, 6, 7, 9, 10, 11, 19, 523 0, 0, 30, 1, 0, 4, 29, 7, 9, 10,
513 18, 14, 21, 17, 2, 0, 22, 13, 16 524 11, 20, 28, 26, 0, 23, 19, 15, 29, 18,
525 2, 0, 0, 0, 12, 0, 30, 27, 25, 24,
526 22, 14, 17
514}; 527};
515 528
516/* YYDEFGOTO[NTERM-NUM]. */ 529/* YYDEFGOTO[NTERM-NUM]. */
517static const yytype_int8 yydefgoto[] = 530static const yytype_int8 yydefgoto[] =
518{ 531{
519 -1, 7, 8, 9, 10, 11, 12, 13, 14, 15, 532 -1, 7, 8, 9, 10, 11, 12, 13, 14, 15,
520 24 533 34, 35, 27, 19
521}; 534};
522 535
523/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing 536/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
524 STATE-NUM. */ 537 STATE-NUM. */
525#define YYPACT_NINF -12 538#define YYPACT_NINF -14
526static const yytype_int8 yypact[] = 539static const yytype_int8 yypact[] =
527{ 540{
528 7, -10, -12, -12, -9, -6, 2, 1, -12, 10, 541 1, -11, -1, -14, -6, 8, 20, 3, -14, 16,
529 -2, -2, -12, -2, -2, -2, 16, 14, 11, 6, 542 -14, -2, -14, -2, -2, -2, 23, 13, -14, -14,
530 -12, 7, -12, -12, -12, -12, -12, -12, -12, -12, 543 21, 18, 9, -14, 1, -14, -14, -14, -14, -14,
531 -12, 8, 18, -12, -12, 17, -2, -12, -12 544 -14, -14, 11, 12, 6, -14, -14, 15, 25, -14,
545 -14, 32, 7, 13, -14, 26, -2, -14, -14, -14,
546 -14, -14, -14
532}; 547};
533 548
534/* YYPGOTO[NTERM-NUM]. */ 549/* YYPGOTO[NTERM-NUM]. */
535static const yytype_int8 yypgoto[] = 550static const yytype_int8 yypgoto[] =
536{ 551{
537 -12, -12, 3, -12, -12, -12, -12, -12, -12, -12, 552 -14, -14, 14, -14, -14, -14, -14, -14, -14, -14,
538 -11 553 -14, -7, -13, -14
539}; 554};
540 555
541/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If 556/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
@@ -545,26 +560,30 @@ static const yytype_int8 yypgoto[] =
545#define YYTABLE_NINF -1 560#define YYTABLE_NINF -1
546static const yytype_uint8 yytable[] = 561static const yytype_uint8 yytable[] =
547{ 562{
548 25, 20, 26, 27, 28, 19, 16, 17, 33, 18, 563 28, 29, 30, 23, 1, 2, 3, 16, 4, 39,
549 1, 2, 3, 4, 23, 21, 5, 22, 6, 29, 564 48, 5, 20, 6, 49, 17, 26, 18, 24, 32,
550 30, 31, 32, 35, 34, 38, 36, 37 565 33, 43, 44, 22, 25, 21, 31, 38, 36, 37,
566 41, 42, 45, 52, 46, 47, 50, 51, 40
551}; 567};
552 568
553static const yytype_uint8 yycheck[] = 569static const yytype_uint8 yycheck[] =
554{ 570{
555 11, 0, 13, 14, 15, 3, 16, 16, 19, 15, 571 13, 14, 15, 0, 3, 4, 5, 18, 7, 22,
556 3, 4, 5, 6, 16, 14, 9, 7, 11, 3, 572 3, 10, 18, 12, 7, 16, 18, 18, 15, 6,
557 6, 10, 16, 15, 21, 36, 8, 10 573 7, 15, 16, 3, 8, 17, 3, 18, 7, 11,
574 19, 19, 17, 46, 9, 3, 43, 11, 24
558}; 575};
559 576
560/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing 577/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
561 symbol of state STATE-NUM. */ 578 symbol of state STATE-NUM. */
562static const yytype_uint8 yystos[] = 579static const yytype_uint8 yystos[] =
563{ 580{
564 0, 3, 4, 5, 6, 9, 11, 18, 19, 20, 581 0, 3, 4, 5, 7, 10, 12, 21, 22, 23,
565 21, 22, 23, 24, 25, 26, 16, 16, 15, 3, 582 24, 25, 26, 27, 28, 29, 18, 16, 18, 33,
566 0, 14, 7, 16, 27, 27, 27, 27, 27, 3, 583 18, 17, 3, 0, 15, 8, 18, 32, 32, 32,
567 6, 10, 16, 27, 19, 15, 8, 10, 27 584 32, 3, 6, 7, 30, 31, 7, 11, 18, 32,
585 22, 19, 19, 15, 16, 17, 9, 3, 3, 7,
586 31, 11, 32
568}; 587};
569 588
570#define yyerrok (yyerrstatus = 0) 589#define yyerrok (yyerrstatus = 0)
@@ -1400,7 +1419,7 @@ yyreduce:
1400 case 4: 1419 case 4:
1401 1420
1402/* Line 1464 of yacc.c */ 1421/* Line 1464 of yacc.c */
1403#line 53 "util/parse-events.y" 1422#line 58 "util/parse-events.y"
1404 { 1423 {
1405 ABORT_ON(parse_events_modifier(list, (yyvsp[(2) - (2)].str))); 1424 ABORT_ON(parse_events_modifier(list, (yyvsp[(2) - (2)].str)));
1406;} 1425;}
@@ -1409,91 +1428,196 @@ yyreduce:
1409 case 12: 1428 case 12:
1410 1429
1411/* Line 1464 of yacc.c */ 1430/* Line 1464 of yacc.c */
1412#line 68 "util/parse-events.y" 1431#line 73 "util/parse-events.y"
1413 { 1432 {
1414 int type = (yyvsp[(1) - (1)].num) >> 16; 1433 int type = (yyvsp[(1) - (4)].num) >> 16;
1415 int config = (yyvsp[(1) - (1)].num) & 255; 1434 int config = (yyvsp[(1) - (4)].num) & 255;
1416 1435
1417 ABORT_ON(parse_events_add_numeric(list, idx, type, config)); 1436 ABORT_ON(parse_events_add_numeric(list, idx, type, config, (yyvsp[(3) - (4)].head)));
1437 parse_events__free_terms((yyvsp[(3) - (4)].head));
1418;} 1438;}
1419 break; 1439 break;
1420 1440
1421 case 13: 1441 case 13:
1422 1442
1423/* Line 1464 of yacc.c */ 1443/* Line 1464 of yacc.c */
1424#line 77 "util/parse-events.y" 1444#line 82 "util/parse-events.y"
1425 { 1445 {
1426 ABORT_ON(parse_events_add_cache(list, idx, (yyvsp[(1) - (5)].str), (yyvsp[(3) - (5)].str), (yyvsp[(5) - (5)].str))); 1446 int type = (yyvsp[(1) - (2)].num) >> 16;
1447 int config = (yyvsp[(1) - (2)].num) & 255;
1448
1449 ABORT_ON(parse_events_add_numeric(list, idx, type, config, NULL));
1427;} 1450;}
1428 break; 1451 break;
1429 1452
1430 case 14: 1453 case 14:
1431 1454
1432/* Line 1464 of yacc.c */ 1455/* Line 1464 of yacc.c */
1433#line 82 "util/parse-events.y" 1456#line 91 "util/parse-events.y"
1434 { 1457 {
1435 ABORT_ON(parse_events_add_cache(list, idx, (yyvsp[(1) - (3)].str), (yyvsp[(3) - (3)].str), NULL)); 1458 ABORT_ON(parse_events_add_cache(list, idx, (yyvsp[(1) - (5)].str), (yyvsp[(3) - (5)].str), (yyvsp[(5) - (5)].str)));
1436;} 1459;}
1437 break; 1460 break;
1438 1461
1439 case 15: 1462 case 15:
1440 1463
1441/* Line 1464 of yacc.c */ 1464/* Line 1464 of yacc.c */
1442#line 87 "util/parse-events.y" 1465#line 96 "util/parse-events.y"
1443 { 1466 {
1444 ABORT_ON(parse_events_add_cache(list, idx, (yyvsp[(1) - (1)].str), NULL, NULL)); 1467 ABORT_ON(parse_events_add_cache(list, idx, (yyvsp[(1) - (3)].str), (yyvsp[(3) - (3)].str), NULL));
1445;} 1468;}
1446 break; 1469 break;
1447 1470
1448 case 16: 1471 case 16:
1449 1472
1450/* Line 1464 of yacc.c */ 1473/* Line 1464 of yacc.c */
1451#line 93 "util/parse-events.y" 1474#line 101 "util/parse-events.y"
1452 { 1475 {
1453 ABORT_ON(parse_events_add_breakpoint(list, idx, (void *) (yyvsp[(2) - (5)].num), (yyvsp[(4) - (5)].str))); 1476 ABORT_ON(parse_events_add_cache(list, idx, (yyvsp[(1) - (1)].str), NULL, NULL));
1454;} 1477;}
1455 break; 1478 break;
1456 1479
1457 case 17: 1480 case 17:
1458 1481
1459/* Line 1464 of yacc.c */ 1482/* Line 1464 of yacc.c */
1460#line 98 "util/parse-events.y" 1483#line 107 "util/parse-events.y"
1461 { 1484 {
1462 ABORT_ON(parse_events_add_breakpoint(list, idx, (void *) (yyvsp[(2) - (3)].num), NULL)); 1485 ABORT_ON(parse_events_add_breakpoint(list, idx, (void *) (yyvsp[(2) - (5)].num), (yyvsp[(4) - (5)].str)));
1463;} 1486;}
1464 break; 1487 break;
1465 1488
1466 case 18: 1489 case 18:
1467 1490
1468/* Line 1464 of yacc.c */ 1491/* Line 1464 of yacc.c */
1469#line 104 "util/parse-events.y" 1492#line 112 "util/parse-events.y"
1470 { 1493 {
1471 ABORT_ON(parse_events_add_tracepoint(list, idx, (yyvsp[(1) - (3)].str), (yyvsp[(3) - (3)].str))); 1494 ABORT_ON(parse_events_add_breakpoint(list, idx, (void *) (yyvsp[(2) - (3)].num), NULL));
1472;} 1495;}
1473 break; 1496 break;
1474 1497
1475 case 19: 1498 case 19:
1476 1499
1477/* Line 1464 of yacc.c */ 1500/* Line 1464 of yacc.c */
1478#line 110 "util/parse-events.y" 1501#line 118 "util/parse-events.y"
1479 { 1502 {
1480 ABORT_ON(parse_events_add_numeric(list, idx, (yyvsp[(1) - (3)].num), (yyvsp[(3) - (3)].num))); 1503 ABORT_ON(parse_events_add_tracepoint(list, idx, (yyvsp[(1) - (3)].str), (yyvsp[(3) - (3)].str)));
1481;} 1504;}
1482 break; 1505 break;
1483 1506
1484 case 20: 1507 case 20:
1485 1508
1486/* Line 1464 of yacc.c */ 1509/* Line 1464 of yacc.c */
1487#line 116 "util/parse-events.y" 1510#line 124 "util/parse-events.y"
1511 {
1512 ABORT_ON(parse_events_add_numeric(list, idx, (yyvsp[(1) - (3)].num), (yyvsp[(3) - (3)].num), NULL));
1513;}
1514 break;
1515
1516 case 21:
1517
1518/* Line 1464 of yacc.c */
1519#line 130 "util/parse-events.y"
1520 {
1521 ABORT_ON(parse_events_add_numeric(list, idx, PERF_TYPE_RAW, (yyvsp[(1) - (1)].num), NULL));
1522;}
1523 break;
1524
1525 case 22:
1526
1527/* Line 1464 of yacc.c */
1528#line 136 "util/parse-events.y"
1488 { 1529 {
1489 ABORT_ON(parse_events_add_numeric(list, idx, PERF_TYPE_RAW, (yyvsp[(1) - (1)].num))); 1530 struct list_head *head = (yyvsp[(1) - (3)].head);
1531 struct parse_events__term *term = (yyvsp[(3) - (3)].term);
1532
1533 ABORT_ON(!head);
1534 list_add_tail(&term->list, head);
1535 (yyval.head) = (yyvsp[(1) - (3)].head);
1536;}
1537 break;
1538
1539 case 23:
1540
1541/* Line 1464 of yacc.c */
1542#line 146 "util/parse-events.y"
1543 {
1544 struct list_head *head = malloc(sizeof(*head));
1545 struct parse_events__term *term = (yyvsp[(1) - (1)].term);
1546
1547 ABORT_ON(!head);
1548 INIT_LIST_HEAD(head);
1549 list_add_tail(&term->list, head);
1550 (yyval.head) = head;
1551;}
1552 break;
1553
1554 case 24:
1555
1556/* Line 1464 of yacc.c */
1557#line 158 "util/parse-events.y"
1558 {
1559 struct parse_events__term *term;
1560
1561 ABORT_ON(parse_events__new_term(&term, PARSE_EVENTS__TERM_TYPE_STR,
1562 (yyvsp[(1) - (3)].str), (yyvsp[(3) - (3)].str), 0));
1563 (yyval.term) = term;
1564;}
1565 break;
1566
1567 case 25:
1568
1569/* Line 1464 of yacc.c */
1570#line 167 "util/parse-events.y"
1571 {
1572 struct parse_events__term *term;
1573
1574 ABORT_ON(parse_events__new_term(&term, PARSE_EVENTS__TERM_TYPE_NUM,
1575 (yyvsp[(1) - (3)].str), NULL, (yyvsp[(3) - (3)].num)));
1576 (yyval.term) = term;
1577;}
1578 break;
1579
1580 case 26:
1581
1582/* Line 1464 of yacc.c */
1583#line 176 "util/parse-events.y"
1584 {
1585 struct parse_events__term *term;
1586
1587 ABORT_ON(parse_events__new_term(&term, PARSE_EVENTS__TERM_TYPE_NUM,
1588 (yyvsp[(1) - (1)].str), NULL, 1));
1589 (yyval.term) = term;
1590;}
1591 break;
1592
1593 case 27:
1594
1595/* Line 1464 of yacc.c */
1596#line 185 "util/parse-events.y"
1597 {
1598 struct parse_events__term *term;
1599
1600 ABORT_ON(parse_events__new_term(&term, (yyvsp[(1) - (3)].num), NULL, NULL, (yyvsp[(3) - (3)].num)));
1601 (yyval.term) = term;
1602;}
1603 break;
1604
1605 case 28:
1606
1607/* Line 1464 of yacc.c */
1608#line 193 "util/parse-events.y"
1609 {
1610 struct parse_events__term *term;
1611
1612 ABORT_ON(parse_events__new_term(&term, (yyvsp[(1) - (1)].num), NULL, NULL, 1));
1613 (yyval.term) = term;
1490;} 1614;}
1491 break; 1615 break;
1492 1616
1493 1617
1494 1618
1495/* Line 1464 of yacc.c */ 1619/* Line 1464 of yacc.c */
1496#line 1497 "util/parse-events-bison.c" 1620#line 1621 "util/parse-events-bison.c"
1497 default: break; 1621 default: break;
1498 } 1622 }
1499 YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); 1623 YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
@@ -1705,7 +1829,7 @@ yyreturn:
1705 1829
1706 1830
1707/* Line 1684 of yacc.c */ 1831/* Line 1684 of yacc.c */
1708#line 122 "util/parse-events.y" 1832#line 204 "util/parse-events.y"
1709 1833
1710 1834
1711void parse_events_error(struct list_head *list __used, int *idx __used, 1835void parse_events_error(struct list_head *list __used, int *idx __used,
diff --git a/tools/perf/util/parse-events-bison.h b/tools/perf/util/parse-events-bison.h
index 097a6323e6a9..c58b76584f92 100644
--- a/tools/perf/util/parse-events-bison.h
+++ b/tools/perf/util/parse-events-bison.h
@@ -41,14 +41,15 @@
41 PE_VALUE = 258, 41 PE_VALUE = 258,
42 PE_VALUE_SYM = 259, 42 PE_VALUE_SYM = 259,
43 PE_RAW = 260, 43 PE_RAW = 260,
44 PE_NAME = 261, 44 PE_TERM = 261,
45 PE_MODIFIER_EVENT = 262, 45 PE_NAME = 262,
46 PE_MODIFIER_BP = 263, 46 PE_MODIFIER_EVENT = 263,
47 PE_NAME_CACHE_TYPE = 264, 47 PE_MODIFIER_BP = 264,
48 PE_NAME_CACHE_OP_RESULT = 265, 48 PE_NAME_CACHE_TYPE = 265,
49 PE_PREFIX_MEM = 266, 49 PE_NAME_CACHE_OP_RESULT = 266,
50 PE_PREFIX_RAW = 267, 50 PE_PREFIX_MEM = 267,
51 PE_ERROR = 268 51 PE_PREFIX_RAW = 268,
52 PE_ERROR = 269
52 }; 53 };
53#endif 54#endif
54 55
@@ -59,15 +60,17 @@ typedef union YYSTYPE
59{ 60{
60 61
61/* Line 1685 of yacc.c */ 62/* Line 1685 of yacc.c */
62#line 42 "util/parse-events.y" 63#line 45 "util/parse-events.y"
63 64
64 char *str; 65 char *str;
65 unsigned long num; 66 unsigned long num;
67 struct list_head *head;
68 struct parse_events__term *term;
66 69
67 70
68 71
69/* Line 1685 of yacc.c */ 72/* Line 1685 of yacc.c */
70#line 71 "util/parse-events-bison.h" 73#line 74 "util/parse-events-bison.h"
71} YYSTYPE; 74} YYSTYPE;
72# define YYSTYPE_IS_TRIVIAL 1 75# define YYSTYPE_IS_TRIVIAL 1
73# define yystype YYSTYPE /* obsolescent; will be withdrawn */ 76# define yystype YYSTYPE /* obsolescent; will be withdrawn */
diff --git a/tools/perf/util/parse-events-flex.c b/tools/perf/util/parse-events-flex.c
index 9e77ed6a0ecf..34cfc85c4f79 100644
--- a/tools/perf/util/parse-events-flex.c
+++ b/tools/perf/util/parse-events-flex.c
@@ -378,8 +378,8 @@ static void yy_fatal_error (yyconst char msg[] );
378 *yy_cp = '\0'; \ 378 *yy_cp = '\0'; \
379 (yy_c_buf_p) = yy_cp; 379 (yy_c_buf_p) = yy_cp;
380 380
381#define YY_NUM_RULES 44 381#define YY_NUM_RULES 49
382#define YY_END_OF_BUFFER 45 382#define YY_END_OF_BUFFER 50
383/* This struct is not used in this scanner, 383/* This struct is not used in this scanner,
384 but its presence is necessary. */ 384 but its presence is necessary. */
385struct yy_trans_info 385struct yy_trans_info
@@ -387,55 +387,56 @@ struct yy_trans_info
387 flex_int32_t yy_verify; 387 flex_int32_t yy_verify;
388 flex_int32_t yy_nxt; 388 flex_int32_t yy_nxt;
389 }; 389 };
390static yyconst flex_int16_t yy_accept[425] = 390static yyconst flex_int16_t yy_accept[440] =
391 { 0, 391 { 0,
392 0, 0, 45, 44, 38, 41, 40, 39, 34, 34, 392 0, 0, 50, 49, 43, 46, 45, 44, 39, 39,
393 42, 43, 38, 38, 38, 38, 38, 38, 38, 38, 393 47, 48, 43, 43, 43, 43, 43, 43, 43, 43,
394 38, 38, 36, 38, 38, 38, 38, 38, 36, 37, 394 43, 43, 41, 43, 43, 43, 43, 43, 41, 42,
395 38, 38, 37, 37, 38, 34, 0, 38, 38, 38, 395 43, 43, 42, 42, 43, 39, 0, 43, 43, 43,
396 21, 38, 38, 38, 38, 38, 38, 38, 38, 38, 396 21, 43, 43, 43, 43, 43, 43, 43, 43, 43,
397 38, 38, 15, 38, 0, 38, 38, 38, 36, 0, 397 43, 43, 15, 43, 0, 43, 43, 43, 41, 0,
398 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 398 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
399 38, 38, 33, 33, 38, 38, 38, 38, 35, 38, 399 43, 43, 43, 38, 38, 43, 43, 43, 43, 40,
400 38, 0, 38, 38, 38, 24, 38, 38, 38, 38, 400 43, 43, 0, 43, 43, 43, 24, 43, 43, 43,
401 38, 38, 0, 38, 38, 38, 36, 0, 38, 38, 401 43, 43, 43, 0, 43, 43, 43, 41, 0, 43,
402 402
403 38, 0, 19, 20, 38, 38, 38, 38, 38, 38, 403 43, 43, 0, 19, 20, 43, 43, 43, 43, 43,
404 38, 30, 38, 38, 33, 33, 38, 38, 38, 38, 404 43, 43, 30, 43, 43, 43, 38, 38, 43, 43,
405 38, 38, 38, 0, 0, 38, 38, 38, 38, 0, 405 43, 43, 43, 43, 43, 0, 0, 43, 43, 43,
406 38, 38, 0, 38, 0, 22, 38, 38, 36, 0, 406 43, 0, 43, 43, 43, 0, 43, 0, 22, 43,
407 23, 38, 38, 19, 20, 26, 38, 32, 38, 38, 407 43, 41, 0, 23, 43, 43, 19, 20, 26, 43,
408 31, 25, 38, 38, 26, 38, 38, 38, 38, 38, 408 37, 43, 43, 31, 25, 43, 43, 43, 26, 43,
409 0, 38, 0, 0, 0, 0, 38, 38, 38, 38, 409 43, 43, 43, 43, 0, 43, 0, 0, 0, 0,
410 0, 38, 38, 0, 0, 38, 22, 38, 38, 36, 410 43, 43, 43, 43, 0, 43, 43, 43, 0, 0,
411 23, 0, 38, 26, 38, 38, 38, 38, 0, 38, 411 43, 22, 43, 43, 41, 23, 0, 43, 26, 43,
412 38, 38, 27, 0, 27, 0, 38, 0, 0, 0, 412 43, 43, 43, 0, 43, 43, 43, 43, 27, 0,
413 413
414 0, 38, 38, 24, 0, 0, 38, 0, 0, 0, 414 27, 0, 43, 0, 0, 0, 0, 43, 43, 24,
415 1, 38, 12, 0, 38, 0, 38, 0, 31, 0, 415 0, 0, 32, 43, 0, 0, 0, 1, 43, 12,
416 38, 38, 38, 0, 0, 38, 0, 0, 0, 38, 416 0, 43, 0, 43, 0, 31, 0, 35, 43, 43,
417 38, 0, 38, 0, 0, 0, 38, 0, 0, 0, 417 43, 0, 0, 43, 0, 0, 0, 43, 43, 0,
418 38, 0, 38, 0, 38, 0, 0, 38, 38, 38, 418 43, 43, 0, 0, 0, 33, 34, 43, 0, 0,
419 0, 38, 0, 0, 0, 38, 38, 0, 0, 7, 419 0, 43, 0, 43, 0, 43, 0, 0, 43, 43,
420 0, 0, 0, 0, 0, 0, 0, 38, 0, 38, 420 43, 0, 43, 0, 0, 0, 43, 43, 0, 0,
421 0, 38, 0, 0, 28, 38, 0, 0, 38, 0, 421 43, 7, 0, 0, 0, 0, 0, 0, 0, 43,
422 38, 0, 0, 0, 0, 0, 0, 10, 0, 0, 422 0, 43, 0, 43, 0, 0, 28, 43, 0, 0,
423 38, 0, 38, 0, 38, 0, 0, 38, 38, 0, 423 43, 0, 43, 0, 0, 43, 0, 0, 0, 0,
424 424
425 0, 38, 0, 0, 0, 0, 9, 0, 0, 0, 425 10, 0, 0, 43, 0, 43, 0, 43, 0, 0,
426 1, 0, 0, 0, 38, 0, 16, 0, 0, 28, 426 43, 43, 0, 0, 43, 0, 0, 0, 0, 43,
427 38, 0, 11, 38, 0, 0, 0, 0, 0, 0, 427 9, 0, 0, 0, 1, 0, 0, 0, 43, 0,
428 0, 0, 0, 0, 38, 0, 0, 12, 38, 0, 428 16, 0, 0, 28, 43, 0, 11, 43, 0, 0,
429 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 429 0, 0, 36, 0, 0, 0, 0, 0, 0, 43,
430 0, 4, 14, 13, 0, 0, 0, 0, 0, 0, 430 0, 0, 12, 43, 0, 0, 0, 0, 0, 0,
431 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 431 6, 0, 0, 0, 0, 0, 4, 14, 13, 0,
432 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 432 0, 0, 0, 0, 0, 8, 0, 0, 0, 0,
433 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 433 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
434 0, 0, 17, 0, 5, 15, 18, 0, 0, 29, 434 16, 0, 0, 0, 0, 0, 0, 0, 0, 0,
435 435
436 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 436 0, 0, 0, 0, 0, 0, 0, 17, 0, 5,
437 0, 0, 7, 3, 0, 0, 0, 2, 0, 0, 437 15, 18, 0, 0, 29, 0, 0, 0, 0, 0,
438 0, 0, 0, 0 438 0, 0, 0, 0, 0, 0, 0, 7, 3, 0,
439 0, 0, 2, 0, 0, 0, 0, 0, 0
439 } ; 440 } ;
440 441
441static yyconst flex_int32_t yy_ec[256] = 442static yyconst flex_int32_t yy_ec[256] =
@@ -449,11 +450,11 @@ static yyconst flex_int32_t yy_ec[256] =
449 11, 1, 2, 1, 12, 13, 14, 15, 12, 12, 450 11, 1, 2, 1, 12, 13, 14, 15, 12, 12,
450 2, 2, 16, 2, 2, 17, 2, 2, 2, 2, 451 2, 2, 16, 2, 2, 17, 2, 2, 2, 2,
451 2, 18, 2, 19, 2, 2, 2, 2, 2, 2, 452 2, 18, 2, 19, 2, 2, 2, 2, 2, 2,
452 1, 1, 1, 1, 2, 1, 20, 21, 22, 23, 453 1, 1, 1, 1, 20, 1, 21, 22, 23, 24,
453 454
454 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 455 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
455 34, 35, 2, 36, 37, 38, 39, 40, 41, 42, 456 35, 36, 2, 37, 38, 39, 40, 41, 42, 43,
456 43, 2, 1, 1, 1, 1, 1, 1, 1, 1, 457 44, 2, 1, 1, 1, 1, 1, 1, 1, 1,
457 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 458 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
458 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 459 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
459 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 460 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -470,241 +471,249 @@ static yyconst flex_int32_t yy_ec[256] =
470 1, 1, 1, 1, 1 471 1, 1, 1, 1, 1
471 } ; 472 } ;
472 473
473static yyconst flex_int32_t yy_meta[44] = 474static yyconst flex_int32_t yy_meta[45] =
474 { 0, 475 { 0,
475 1, 2, 1, 1, 1, 3, 3, 3, 3, 1, 476 1, 2, 1, 1, 1, 3, 3, 3, 3, 1,
476 1, 3, 3, 3, 3, 2, 2, 2, 2, 3, 477 1, 3, 3, 3, 3, 2, 2, 2, 2, 2,
477 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 478 3, 3, 3, 3, 3, 3, 2, 2, 2, 2,
478 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 479 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
479 2, 2, 2 480 2, 2, 2, 2
480 } ; 481 } ;
481 482
482static yyconst flex_int16_t yy_base[427] = 483static yyconst flex_int16_t yy_base[442] =
483 { 0, 484 { 0,
484 0, 0, 494, 495, 0, 495, 495, 495, 38, 42, 485 0, 0, 510, 511, 0, 511, 511, 511, 39, 43,
485 495, 495, 473, 459, 45, 467, 32, 20, 40, 53, 486 511, 511, 488, 474, 46, 482, 32, 20, 37, 57,
486 458, 469, 34, 62, 58, 58, 454, 452, 64, 98, 487 473, 484, 34, 64, 59, 64, 469, 467, 78, 113,
487 32, 466, 449, 0, 0, 81, 0, 446, 446, 478, 488 41, 481, 464, 0, 0, 104, 0, 461, 461, 494,
488 0, 467, 455, 457, 450, 54, 457, 455, 438, 452, 489 0, 483, 470, 472, 465, 44, 472, 470, 453, 467,
489 440, 433, 0, 449, 432, 452, 429, 428, 97, 428, 490 455, 448, 0, 464, 447, 468, 444, 443, 64, 443,
490 448, 433, 426, 105, 442, 432, 428, 104, 436, 421, 491 464, 448, 441, 67, 457, 447, 443, 52, 451, 436,
491 431, 432, 431, 77, 430, 95, 416, 424, 0, 431, 492 446, 435, 446, 445, 76, 444, 95, 430, 438, 0,
492 412, 103, 425, 424, 421, 0, 413, 441, 417, 405, 493 445, 426, 100, 439, 438, 435, 0, 427, 456, 431,
493 438, 410, 409, 426, 407, 406, 108, 405, 422, 410, 494 105, 454, 425, 424, 442, 422, 421, 112, 420, 438,
494 495
495 395, 111, 0, 0, 409, 397, 420, 393, 394, 390, 496 425, 410, 117, 0, 0, 424, 412, 436, 408, 409,
496 402, 0, 401, 399, 93, 116, 401, 391, 385, 390, 497 405, 417, 0, 416, 411, 413, 83, 107, 415, 405,
497 381, 414, 381, 76, 46, 380, 378, 381, 391, 390, 498 399, 404, 395, 429, 395, 126, 119, 394, 392, 395,
498 387, 386, 120, 385, 387, 0, 387, 368, 119, 384, 499 405, 404, 401, 396, 399, 100, 398, 400, 0, 400,
499 0, 400, 367, 495, 495, 365, 365, 495, 380, 363, 500 381, 123, 397, 0, 414, 380, 511, 511, 378, 378,
500 374, 0, 393, 372, 371, 355, 362, 368, 387, 366, 501 511, 393, 376, 387, 0, 407, 375, 384, 383, 367,
501 370, 349, 349, 366, 365, 347, 359, 345, 349, 353, 502 374, 380, 400, 378, 383, 361, 361, 378, 377, 359,
502 336, 374, 335, 113, 348, 338, 495, 336, 336, 0, 503 371, 357, 361, 365, 348, 387, 363, 346, 73, 359,
503 495, 350, 332, 0, 366, 331, 364, 330, 341, 327, 504 349, 511, 347, 347, 0, 511, 361, 343, 0, 378,
504 333, 339, 325, 339, 0, 343, 337, 338, 335, 334, 505 342, 376, 341, 352, 353, 337, 343, 349, 335, 349,
505 506
506 317, 321, 329, 121, 330, 119, 313, 316, 327, 322, 507 0, 354, 347, 348, 345, 344, 327, 331, 339, 146,
507 0, 319, 0, 303, 323, 319, 315, 317, 0, 321, 508 340, 123, 150, 323, 326, 337, 332, 0, 329, 0,
508 318, 319, 315, 306, 323, 297, 307, 306, 296, 309, 509 313, 333, 329, 325, 327, 0, 331, 0, 328, 329,
509 297, 129, 292, 297, 299, 302, 321, 302, 292, 286, 510 325, 316, 334, 307, 317, 316, 306, 319, 307, 132,
510 287, 298, 281, 298, 283, 296, 276, 287, 275, 308, 511 301, 301, 306, 308, 311, 0, 0, 331, 311, 301,
511 277, 282, 285, 284, 268, 282, 267, 271, 275, 0, 512 295, 296, 307, 290, 307, 292, 305, 285, 296, 284,
512 278, 264, 275, 262, 268, 273, 276, 262, 263, 265, 513 318, 286, 291, 294, 293, 277, 291, 276, 280, 284,
513 253, 258, 251, 258, 264, 259, 264, 263, 250, 261, 514 268, 0, 286, 272, 283, 270, 276, 281, 284, 270,
514 278, 244, 243, 242, 241, 253, 235, 495, 238, 236, 515 271, 273, 261, 266, 259, 266, 272, 267, 272, 271,
515 269, 248, 237, 239, 232, 237, 229, 229, 225, 221, 516 258, 269, 287, 252, 251, 252, 249, 248, 260, 242,
516 517
517 233, 229, 223, 235, 221, 221, 495, 233, 220, 227, 518 511, 245, 243, 277, 255, 244, 246, 239, 244, 236,
518 495, 226, 228, 215, 218, 212, 0, 211, 211, 0, 519 236, 232, 228, 240, 236, 230, 242, 228, 228, 240,
519 223, 224, 495, 241, 216, 223, 206, 217, 203, 215, 520 511, 239, 226, 233, 511, 232, 234, 221, 224, 218,
520 200, 203, 216, 231, 197, 196, 195, 495, 227, 199, 521 0, 217, 217, 0, 229, 230, 511, 248, 222, 229,
521 210, 194, 188, 187, 188, 495, 191, 201, 189, 182, 522 212, 223, 0, 209, 221, 206, 209, 222, 238, 203,
522 138, 0, 495, 495, 129, 196, 202, 185, 186, 194, 523 202, 201, 511, 234, 205, 217, 200, 194, 193, 194,
523 495, 193, 187, 176, 181, 191, 174, 175, 184, 170, 524 511, 197, 207, 195, 188, 142, 0, 511, 511, 130,
524 193, 167, 166, 179, 178, 495, 163, 178, 165, 178, 525 202, 209, 191, 192, 200, 511, 199, 193, 182, 187,
525 177, 192, 158, 166, 156, 155, 154, 160, 156, 165, 526 197, 180, 181, 190, 176, 200, 173, 172, 185, 184,
526 164, 141, 495, 152, 495, 495, 495, 161, 146, 495, 527 511, 169, 184, 171, 184, 183, 199, 164, 172, 162,
527 528
528 163, 146, 148, 147, 155, 156, 143, 139, 152, 141, 529 161, 160, 166, 162, 171, 170, 147, 511, 158, 511,
529 143, 139, 495, 495, 148, 146, 131, 495, 131, 126, 530 511, 511, 167, 152, 511, 169, 152, 154, 153, 161,
530 125, 81, 85, 495, 165, 68 531 162, 149, 145, 158, 147, 149, 145, 511, 511, 154,
532 152, 137, 511, 138, 145, 131, 53, 54, 511, 172,
533 66
531 } ; 534 } ;
532 535
533static yyconst flex_int16_t yy_def[427] = 536static yyconst flex_int16_t yy_def[442] =
534 { 0, 537 { 0,
535 424, 1, 424, 424, 425, 424, 424, 424, 424, 424, 538 439, 1, 439, 439, 440, 439, 439, 439, 439, 439,
536 424, 424, 425, 425, 425, 425, 425, 425, 425, 425, 539 439, 439, 440, 440, 440, 440, 440, 440, 440, 440,
537 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 540 440, 440, 440, 440, 440, 440, 440, 440, 440, 440,
538 425, 425, 425, 425, 425, 424, 426, 425, 425, 425, 541 440, 440, 440, 440, 440, 439, 441, 440, 440, 440,
539 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 542 440, 440, 440, 440, 440, 440, 440, 440, 440, 440,
540 425, 425, 425, 425, 424, 425, 425, 425, 425, 424, 543 440, 440, 440, 440, 439, 440, 440, 440, 440, 439,
541 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 544 440, 440, 440, 440, 440, 440, 440, 440, 440, 440,
542 425, 425, 30, 30, 425, 425, 425, 425, 426, 425, 545 440, 440, 440, 30, 30, 440, 440, 440, 440, 441,
543 425, 424, 425, 425, 425, 425, 425, 425, 425, 425, 546 440, 440, 439, 440, 440, 440, 440, 440, 440, 440,
544 425, 425, 424, 425, 425, 425, 425, 424, 425, 425, 547 440, 440, 440, 439, 440, 440, 440, 440, 439, 440,
545 548
546 425, 424, 425, 425, 425, 425, 425, 425, 425, 425, 549 440, 440, 439, 440, 440, 440, 440, 440, 440, 440,
547 425, 425, 425, 425, 30, 30, 425, 425, 425, 425, 550 440, 440, 440, 440, 440, 440, 30, 30, 440, 440,
548 425, 425, 425, 424, 424, 425, 425, 425, 425, 424, 551 440, 440, 440, 440, 440, 439, 439, 440, 440, 440,
549 425, 425, 424, 425, 424, 425, 425, 425, 425, 424, 552 440, 439, 440, 440, 440, 439, 440, 439, 440, 440,
550 425, 425, 425, 424, 424, 425, 425, 424, 425, 425, 553 440, 440, 439, 440, 440, 440, 439, 439, 440, 440,
551 425, 425, 425, 425, 30, 425, 425, 425, 425, 425, 554 439, 440, 440, 440, 440, 440, 440, 440, 30, 440,
552 424, 425, 424, 424, 424, 424, 425, 425, 425, 425, 555 440, 440, 440, 440, 439, 440, 439, 439, 439, 439,
553 424, 425, 425, 424, 424, 425, 424, 425, 425, 425, 556 440, 440, 440, 440, 439, 440, 440, 440, 439, 439,
554 424, 424, 425, 425, 425, 425, 425, 425, 424, 425, 557 440, 439, 440, 440, 440, 439, 439, 440, 440, 440,
555 425, 425, 425, 424, 425, 424, 425, 424, 424, 424, 558 440, 440, 440, 439, 440, 440, 440, 440, 440, 439,
556 559
557 424, 425, 425, 425, 424, 424, 425, 424, 424, 424, 560 440, 439, 440, 439, 439, 439, 439, 440, 440, 440,
558 425, 425, 425, 424, 425, 424, 425, 424, 425, 424, 561 439, 439, 440, 440, 439, 439, 439, 440, 440, 440,
559 425, 425, 425, 424, 424, 425, 424, 424, 424, 425, 562 439, 440, 439, 440, 439, 440, 439, 440, 440, 440,
560 425, 424, 425, 424, 424, 424, 425, 424, 424, 424, 563 440, 439, 439, 440, 439, 439, 439, 440, 440, 439,
561 425, 424, 425, 424, 425, 424, 424, 425, 425, 425, 564 440, 440, 439, 439, 439, 440, 440, 440, 439, 439,
562 424, 425, 424, 424, 424, 425, 425, 424, 424, 425, 565 439, 440, 439, 440, 439, 440, 439, 439, 440, 440,
563 424, 424, 424, 424, 424, 424, 424, 425, 424, 425, 566 440, 439, 440, 439, 439, 439, 440, 440, 439, 439,
564 424, 425, 424, 424, 425, 425, 424, 424, 425, 424, 567 440, 440, 439, 439, 439, 439, 439, 439, 439, 440,
565 425, 424, 424, 424, 424, 424, 424, 424, 424, 424, 568 439, 440, 439, 440, 439, 439, 440, 440, 439, 439,
566 425, 424, 425, 424, 425, 424, 424, 425, 425, 424, 569 440, 439, 440, 439, 439, 440, 439, 439, 439, 439,
567 570
568 424, 425, 424, 424, 424, 424, 424, 424, 424, 424, 571 439, 439, 439, 440, 439, 440, 439, 440, 439, 439,
569 424, 424, 424, 424, 425, 424, 425, 424, 424, 425, 572 440, 440, 439, 439, 440, 439, 439, 439, 439, 440,
570 425, 424, 424, 425, 424, 424, 424, 424, 424, 424, 573 439, 439, 439, 439, 439, 439, 439, 439, 440, 439,
571 424, 424, 424, 424, 425, 424, 424, 424, 425, 424, 574 440, 439, 439, 440, 440, 439, 439, 440, 439, 439,
572 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 575 439, 439, 440, 439, 439, 439, 439, 439, 439, 440,
573 424, 425, 424, 424, 424, 424, 424, 424, 424, 424, 576 439, 439, 439, 440, 439, 439, 439, 439, 439, 439,
574 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 577 439, 439, 439, 439, 439, 439, 440, 439, 439, 439,
575 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 578 439, 439, 439, 439, 439, 439, 439, 439, 439, 439,
576 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 579 439, 439, 439, 439, 439, 439, 439, 439, 439, 439,
577 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 580 439, 439, 439, 439, 439, 439, 439, 439, 439, 439,
578 581
579 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 582 439, 439, 439, 439, 439, 439, 439, 439, 439, 439,
580 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 583 439, 439, 439, 439, 439, 439, 439, 439, 439, 439,
581 424, 424, 424, 0, 424, 424 584 439, 439, 439, 439, 439, 439, 439, 439, 439, 439,
585 439, 439, 439, 439, 439, 439, 439, 439, 0, 439,
586 439
582 } ; 587 } ;
583 588
584static yyconst flex_int16_t yy_nxt[539] = 589static yyconst flex_int16_t yy_nxt[556] =
585 { 0, 590 { 0,
586 4, 5, 6, 7, 8, 9, 10, 10, 10, 11, 591 4, 5, 6, 7, 8, 9, 10, 10, 10, 11,
587 12, 5, 5, 5, 13, 14, 15, 16, 5, 17, 592 12, 5, 5, 5, 13, 14, 15, 16, 5, 5,
588 18, 19, 20, 21, 22, 5, 23, 24, 5, 23, 593 17, 18, 19, 20, 21, 22, 5, 23, 24, 5,
589 25, 26, 27, 28, 29, 30, 31, 32, 23, 5, 594 23, 25, 26, 27, 28, 29, 30, 31, 32, 23,
590 33, 34, 5, 36, 36, 36, 36, 36, 36, 36, 595 5, 33, 34, 5, 36, 36, 36, 36, 36, 36,
591 36, 40, 41, 44, 46, 47, 55, 48, 49, 50, 596 36, 36, 40, 41, 44, 46, 47, 50, 48, 49,
592 59, 42, 45, 59, 64, 60, 75, 165, 59, 76, 597 55, 59, 42, 45, 59, 64, 87, 60, 80, 59,
593 79, 56, 59, 51, 52, 86, 53, 66, 166, 37, 598 103, 51, 52, 59, 53, 56, 76, 433, 109, 77,
594 61, 67, 54, 71, 62, 68, 36, 36, 36, 36, 599 54, 37, 61, 87, 66, 110, 438, 62, 67, 111,
595 59, 65, 86, 59, 63, 163, 115, 164, 59, 72, 600 104, 98, 68, 65, 98, 105, 117, 63, 71, 98,
596 601
597 73, 116, 59, 73, 73, 73, 73, 418, 102, 73, 602 74, 118, 72, 98, 215, 59, 159, 74, 59, 36,
598 73, 73, 73, 423, 118, 155, 73, 73, 73, 73, 603 36, 36, 36, 59, 73, 120, 216, 59, 74, 74,
599 73, 74, 73, 97, 232, 124, 97, 103, 119, 108, 604 74, 74, 179, 126, 74, 74, 74, 74, 127, 121,
600 125, 97, 104, 144, 139, 97, 109, 139, 145, 73, 605 134, 74, 180, 74, 74, 74, 74, 75, 74, 142,
601 110, 174, 139, 208, 233, 180, 139, 414, 180, 422, 606 147, 169, 142, 135, 113, 148, 167, 142, 168, 240,
602 235, 175, 112, 180, 236, 209, 258, 180, 366, 368, 607 185, 142, 170, 185, 429, 244, 246, 247, 185, 245,
603 259, 401, 367, 421, 369, 402, 35, 35, 420, 419, 608 269, 383, 185, 381, 270, 241, 384, 382, 416, 437,
604 418, 417, 416, 415, 414, 413, 412, 411, 410, 409, 609 242, 436, 417, 35, 35, 435, 434, 433, 432, 431,
605 408, 407, 406, 405, 404, 403, 400, 400, 399, 398, 610 430, 429, 428, 427, 426, 425, 424, 423, 422, 421,
606 397, 396, 395, 394, 393, 392, 391, 390, 389, 388, 611 420, 419, 418, 415, 415, 414, 413, 412, 411, 410,
607 612
608 387, 386, 385, 384, 383, 181, 382, 381, 380, 379, 613 409, 408, 407, 406, 405, 404, 403, 402, 401, 400,
609 378, 377, 376, 375, 374, 373, 372, 145, 371, 370, 614 399, 398, 186, 397, 396, 395, 394, 393, 392, 391,
610 365, 364, 363, 362, 361, 360, 359, 358, 357, 356, 615 390, 389, 388, 387, 148, 386, 385, 380, 379, 378,
611 355, 354, 353, 352, 351, 350, 349, 348, 347, 346, 616 377, 376, 375, 374, 373, 372, 371, 370, 369, 368,
612 345, 344, 343, 342, 341, 340, 339, 338, 337, 336, 617 367, 366, 365, 364, 363, 362, 361, 360, 359, 358,
613 335, 334, 333, 332, 331, 330, 329, 328, 327, 326, 618 357, 356, 355, 354, 353, 352, 351, 350, 349, 348,
614 325, 324, 323, 322, 321, 320, 319, 318, 317, 316, 619 347, 346, 345, 344, 343, 342, 341, 340, 339, 338,
615 315, 314, 313, 312, 311, 310, 309, 308, 307, 306, 620 337, 336, 335, 334, 333, 332, 331, 330, 329, 328,
616 305, 304, 303, 302, 301, 300, 299, 298, 297, 296, 621 327, 326, 325, 324, 323, 322, 321, 320, 319, 318,
617 295, 294, 293, 292, 291, 290, 289, 288, 287, 286, 622 317, 316, 315, 314, 313, 312, 311, 310, 309, 308,
618 623
619 285, 284, 283, 282, 281, 112, 280, 145, 144, 279, 624 307, 306, 305, 304, 303, 302, 301, 300, 299, 298,
620 278, 277, 276, 275, 274, 273, 272, 271, 270, 269, 625 297, 296, 295, 294, 293, 113, 292, 148, 147, 291,
621 268, 267, 266, 265, 264, 263, 262, 261, 260, 257, 626 290, 289, 288, 287, 286, 285, 284, 283, 282, 281,
622 256, 255, 254, 253, 252, 177, 251, 250, 249, 248, 627 280, 279, 278, 277, 276, 275, 274, 273, 272, 271,
623 247, 246, 245, 244, 243, 242, 241, 240, 239, 238, 628 268, 267, 266, 265, 264, 263, 182, 262, 261, 260,
624 237, 234, 231, 230, 229, 228, 227, 144, 226, 225, 629 259, 258, 257, 256, 255, 254, 253, 252, 251, 250,
625 224, 195, 223, 222, 221, 220, 219, 218, 217, 216, 630 249, 248, 243, 239, 238, 237, 236, 235, 147, 234,
626 215, 214, 213, 212, 211, 210, 207, 206, 205, 204, 631 233, 232, 201, 231, 230, 229, 228, 227, 226, 225,
627 203, 112, 202, 201, 200, 199, 198, 197, 196, 195, 632 224, 223, 222, 221, 220, 219, 218, 217, 214, 213,
628 194, 193, 192, 191, 73, 190, 189, 188, 187, 186, 633 212, 211, 210, 209, 113, 208, 207, 206, 205, 204,
629 634
630 185, 184, 183, 182, 181, 179, 178, 177, 176, 173, 635 203, 202, 201, 200, 199, 198, 197, 74, 196, 195,
631 172, 171, 170, 169, 168, 167, 162, 161, 160, 159, 636 194, 193, 192, 191, 190, 189, 188, 187, 186, 184,
632 158, 157, 156, 154, 153, 152, 151, 150, 149, 148, 637 183, 182, 181, 178, 177, 176, 175, 174, 173, 172,
633 147, 146, 143, 142, 141, 140, 138, 137, 136, 135, 638 171, 166, 165, 164, 163, 162, 161, 160, 158, 157,
634 134, 133, 132, 131, 130, 129, 128, 127, 126, 123, 639 156, 155, 154, 153, 152, 151, 150, 149, 146, 145,
635 122, 121, 120, 117, 73, 114, 113, 112, 111, 107, 640 144, 143, 141, 140, 139, 138, 137, 136, 133, 132,
636 106, 105, 101, 100, 99, 98, 96, 95, 94, 93, 641 131, 130, 129, 128, 125, 124, 123, 122, 119, 74,
637 92, 91, 90, 89, 88, 86, 87, 85, 84, 83, 642 116, 115, 114, 113, 112, 108, 107, 106, 102, 101,
638 41, 82, 81, 80, 78, 77, 70, 69, 58, 57, 643 100, 99, 97, 96, 95, 94, 93, 92, 91, 90,
639 43, 39, 38, 424, 3, 424, 424, 424, 424, 424, 644 89, 87, 88, 86, 85, 84, 41, 83, 82, 81,
640 645
641 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 646 79, 78, 70, 69, 58, 57, 43, 39, 38, 439,
642 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 647 3, 439, 439, 439, 439, 439, 439, 439, 439, 439,
643 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 648 439, 439, 439, 439, 439, 439, 439, 439, 439, 439,
644 424, 424, 424, 424, 424, 424, 424, 424 649 439, 439, 439, 439, 439, 439, 439, 439, 439, 439,
650 439, 439, 439, 439, 439, 439, 439, 439, 439, 439,
651 439, 439, 439, 439, 439
645 } ; 652 } ;
646 653
647static yyconst flex_int16_t yy_chk[539] = 654static yyconst flex_int16_t yy_chk[556] =
648 { 0, 655 { 0,
649 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 656 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
650 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 657 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
651 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 658 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
652 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 659 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
653 1, 1, 1, 9, 9, 9, 9, 10, 10, 10, 660 1, 1, 1, 1, 9, 9, 9, 9, 10, 10,
654 10, 15, 15, 17, 18, 18, 20, 18, 18, 19, 661 10, 10, 15, 15, 17, 18, 18, 19, 18, 18,
655 23, 15, 17, 23, 25, 24, 31, 125, 23, 31, 662 20, 23, 15, 17, 23, 25, 46, 24, 441, 23,
656 426, 20, 23, 19, 19, 46, 19, 26, 125, 9, 663 64, 19, 19, 23, 19, 20, 31, 438, 68, 31,
657 24, 26, 19, 29, 24, 26, 36, 36, 36, 36, 664 19, 9, 24, 46, 26, 68, 437, 24, 26, 68,
658 29, 25, 46, 29, 24, 124, 74, 124, 29, 29, 665 64, 59, 26, 25, 59, 64, 75, 24, 29, 59,
659 666
660 74, 74, 29, 30, 30, 30, 30, 423, 64, 30, 667 75, 75, 29, 59, 179, 29, 117, 117, 29, 36,
661 30, 30, 30, 422, 76, 115, 115, 30, 30, 30, 668 36, 36, 36, 29, 29, 77, 179, 29, 30, 30,
662 30, 30, 30, 59, 204, 82, 59, 64, 76, 68, 669 30, 30, 136, 83, 30, 30, 30, 30, 83, 77,
663 82, 59, 64, 102, 97, 59, 68, 97, 102, 116, 670 91, 118, 136, 30, 30, 30, 30, 30, 30, 98,
664 68, 133, 97, 174, 204, 139, 97, 421, 139, 420, 671 103, 127, 98, 91, 118, 103, 126, 98, 126, 210,
665 206, 133, 116, 139, 206, 174, 232, 139, 351, 355, 672 142, 98, 127, 142, 436, 212, 213, 213, 142, 212,
666 232, 392, 351, 419, 355, 392, 425, 425, 417, 416, 673 240, 370, 142, 366, 240, 210, 370, 366, 407, 435,
667 415, 412, 411, 410, 409, 408, 407, 406, 405, 404, 674 210, 434, 407, 440, 440, 432, 431, 430, 427, 426,
668 403, 402, 401, 399, 398, 394, 391, 390, 389, 388, 675 425, 424, 423, 422, 421, 420, 419, 418, 417, 416,
669 387, 386, 385, 384, 383, 382, 381, 380, 379, 378, 676 414, 413, 409, 406, 405, 404, 403, 402, 401, 400,
670 677
671 377, 375, 374, 373, 372, 371, 370, 369, 368, 367, 678 399, 398, 397, 396, 395, 394, 393, 392, 390, 389,
672 366, 365, 364, 363, 362, 360, 359, 358, 357, 356, 679 388, 387, 386, 385, 384, 383, 382, 381, 380, 379,
673 350, 349, 348, 347, 345, 344, 343, 342, 341, 340, 680 378, 377, 375, 374, 373, 372, 371, 365, 364, 363,
674 339, 337, 336, 335, 334, 333, 332, 331, 330, 329, 681 362, 360, 359, 358, 357, 356, 355, 354, 352, 351,
675 328, 327, 326, 325, 324, 322, 321, 319, 318, 316, 682 350, 349, 348, 347, 346, 345, 344, 342, 341, 340,
676 315, 314, 313, 312, 310, 309, 308, 306, 305, 304, 683 339, 338, 336, 335, 333, 332, 330, 329, 328, 327,
677 303, 302, 301, 300, 299, 298, 297, 296, 295, 294, 684 326, 324, 323, 322, 320, 319, 318, 317, 316, 315,
678 293, 292, 291, 290, 289, 287, 286, 285, 284, 283, 685 314, 313, 312, 311, 310, 309, 308, 307, 306, 305,
679 282, 281, 280, 279, 278, 277, 276, 275, 274, 273, 686 304, 303, 302, 300, 299, 298, 297, 296, 295, 294,
680 272, 271, 270, 269, 268, 267, 266, 265, 264, 263, 687 293, 292, 291, 290, 289, 288, 287, 286, 285, 284,
681 688
682 262, 261, 259, 258, 257, 256, 255, 254, 253, 252, 689 283, 282, 281, 280, 279, 278, 277, 276, 275, 274,
683 251, 250, 249, 248, 247, 246, 245, 244, 243, 242, 690 273, 271, 270, 269, 268, 267, 266, 265, 264, 263,
684 241, 240, 239, 238, 237, 236, 235, 234, 233, 231, 691 262, 261, 260, 259, 258, 257, 256, 255, 254, 253,
685 230, 229, 228, 227, 226, 225, 224, 223, 222, 221, 692 252, 251, 250, 249, 248, 245, 244, 243, 242, 241,
686 220, 218, 217, 216, 215, 214, 212, 210, 209, 208, 693 239, 238, 237, 236, 235, 234, 233, 232, 231, 230,
687 207, 205, 203, 202, 201, 200, 199, 198, 197, 196, 694 229, 227, 225, 224, 223, 222, 221, 219, 217, 216,
688 194, 193, 192, 191, 190, 189, 188, 187, 186, 185, 695 215, 214, 211, 209, 208, 207, 206, 205, 204, 203,
689 183, 182, 179, 178, 176, 175, 173, 172, 171, 170, 696 202, 200, 199, 198, 197, 196, 195, 194, 193, 192,
690 169, 168, 167, 166, 165, 164, 163, 162, 161, 160, 697 191, 190, 188, 187, 184, 183, 181, 180, 178, 177,
691 159, 158, 157, 156, 155, 154, 153, 151, 150, 149, 698 176, 175, 174, 173, 172, 171, 170, 169, 168, 167,
692 699
693 147, 146, 143, 142, 140, 138, 137, 135, 134, 132, 700 166, 165, 164, 163, 162, 161, 160, 159, 158, 157,
694 131, 130, 129, 128, 127, 126, 123, 122, 121, 120, 701 156, 154, 153, 152, 150, 149, 146, 145, 143, 141,
695 119, 118, 117, 114, 113, 111, 110, 109, 108, 107, 702 140, 138, 137, 135, 134, 133, 132, 131, 130, 129,
696 106, 105, 101, 100, 99, 98, 96, 95, 94, 93, 703 128, 125, 124, 123, 122, 121, 120, 119, 116, 115,
697 92, 91, 90, 89, 88, 87, 85, 84, 83, 81, 704 114, 112, 111, 110, 109, 108, 107, 106, 102, 101,
698 80, 78, 77, 75, 73, 72, 71, 70, 69, 67, 705 100, 99, 97, 96, 95, 94, 93, 92, 90, 89,
699 66, 65, 63, 62, 61, 60, 58, 57, 56, 55, 706 88, 86, 85, 84, 82, 81, 79, 78, 76, 74,
700 54, 52, 51, 50, 49, 48, 47, 45, 44, 43, 707 73, 72, 71, 70, 69, 67, 66, 65, 63, 62,
701 42, 40, 39, 38, 33, 32, 28, 27, 22, 21, 708 61, 60, 58, 57, 56, 55, 54, 52, 51, 50,
702 16, 14, 13, 3, 424, 424, 424, 424, 424, 424, 709 49, 48, 47, 45, 44, 43, 42, 40, 39, 38,
703 710
704 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 711 33, 32, 28, 27, 22, 21, 16, 14, 13, 3,
705 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 712 439, 439, 439, 439, 439, 439, 439, 439, 439, 439,
706 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 713 439, 439, 439, 439, 439, 439, 439, 439, 439, 439,
707 424, 424, 424, 424, 424, 424, 424, 424 714 439, 439, 439, 439, 439, 439, 439, 439, 439, 439,
715 439, 439, 439, 439, 439, 439, 439, 439, 439, 439,
716 439, 439, 439, 439, 439
708 } ; 717 } ;
709 718
710static yy_state_type yy_last_accepting_state; 719static yy_state_type yy_last_accepting_state;
@@ -726,6 +735,7 @@ char *parse_events_text;
726#include <errno.h> 735#include <errno.h>
727#include "../perf.h" 736#include "../perf.h"
728#include "parse-events-bison.h" 737#include "parse-events-bison.h"
738#include "parse-events.h"
729 739
730static int __value(char *str, int base, int token) 740static int __value(char *str, int base, int token)
731{ 741{
@@ -762,7 +772,13 @@ static int sym(int type, int config)
762 return PE_VALUE_SYM; 772 return PE_VALUE_SYM;
763} 773}
764 774
765#line 766 "<stdout>" 775static int term(int type)
776{
777 parse_events_lval.num = type;
778 return PE_TERM;
779}
780
781#line 782 "<stdout>"
766 782
767#define INITIAL 0 783#define INITIAL 0
768 784
@@ -944,9 +960,9 @@ YY_DECL
944 register char *yy_cp, *yy_bp; 960 register char *yy_cp, *yy_bp;
945 register int yy_act; 961 register int yy_act;
946 962
947#line 53 "util/parse-events.l" 963#line 60 "util/parse-events.l"
948 964
949#line 950 "<stdout>" 965#line 966 "<stdout>"
950 966
951 if ( !(yy_init) ) 967 if ( !(yy_init) )
952 { 968 {
@@ -999,13 +1015,13 @@ yy_match:
999 while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) 1015 while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
1000 { 1016 {
1001 yy_current_state = (int) yy_def[yy_current_state]; 1017 yy_current_state = (int) yy_def[yy_current_state];
1002 if ( yy_current_state >= 425 ) 1018 if ( yy_current_state >= 440 )
1003 yy_c = yy_meta[(unsigned int) yy_c]; 1019 yy_c = yy_meta[(unsigned int) yy_c];
1004 } 1020 }
1005 yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; 1021 yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
1006 ++yy_cp; 1022 ++yy_cp;
1007 } 1023 }
1008 while ( yy_base[yy_current_state] != 495 ); 1024 while ( yy_base[yy_current_state] != 511 );
1009 1025
1010yy_find_action: 1026yy_find_action:
1011 yy_act = yy_accept[yy_current_state]; 1027 yy_act = yy_accept[yy_current_state];
@@ -1031,192 +1047,223 @@ do_action: /* This label is used only to access EOF actions. */
1031 1047
1032case 1: 1048case 1:
1033YY_RULE_SETUP 1049YY_RULE_SETUP
1034#line 54 "util/parse-events.l" 1050#line 61 "util/parse-events.l"
1035{ return sym(PERF_TYPE_HARDWARE, PERF_COUNT_HW_CPU_CYCLES); } 1051{ return sym(PERF_TYPE_HARDWARE, PERF_COUNT_HW_CPU_CYCLES); }
1036 YY_BREAK 1052 YY_BREAK
1037case 2: 1053case 2:
1038YY_RULE_SETUP 1054YY_RULE_SETUP
1039#line 55 "util/parse-events.l" 1055#line 62 "util/parse-events.l"
1040{ return sym(PERF_TYPE_HARDWARE, PERF_COUNT_HW_STALLED_CYCLES_FRONTEND); } 1056{ return sym(PERF_TYPE_HARDWARE, PERF_COUNT_HW_STALLED_CYCLES_FRONTEND); }
1041 YY_BREAK 1057 YY_BREAK
1042case 3: 1058case 3:
1043YY_RULE_SETUP 1059YY_RULE_SETUP
1044#line 56 "util/parse-events.l" 1060#line 63 "util/parse-events.l"
1045{ return sym(PERF_TYPE_HARDWARE, PERF_COUNT_HW_STALLED_CYCLES_BACKEND); } 1061{ return sym(PERF_TYPE_HARDWARE, PERF_COUNT_HW_STALLED_CYCLES_BACKEND); }
1046 YY_BREAK 1062 YY_BREAK
1047case 4: 1063case 4:
1048YY_RULE_SETUP 1064YY_RULE_SETUP
1049#line 57 "util/parse-events.l" 1065#line 64 "util/parse-events.l"
1050{ return sym(PERF_TYPE_HARDWARE, PERF_COUNT_HW_INSTRUCTIONS); } 1066{ return sym(PERF_TYPE_HARDWARE, PERF_COUNT_HW_INSTRUCTIONS); }
1051 YY_BREAK 1067 YY_BREAK
1052case 5: 1068case 5:
1053YY_RULE_SETUP 1069YY_RULE_SETUP
1054#line 58 "util/parse-events.l" 1070#line 65 "util/parse-events.l"
1055{ return sym(PERF_TYPE_HARDWARE, PERF_COUNT_HW_CACHE_REFERENCES); } 1071{ return sym(PERF_TYPE_HARDWARE, PERF_COUNT_HW_CACHE_REFERENCES); }
1056 YY_BREAK 1072 YY_BREAK
1057case 6: 1073case 6:
1058YY_RULE_SETUP 1074YY_RULE_SETUP
1059#line 59 "util/parse-events.l" 1075#line 66 "util/parse-events.l"
1060{ return sym(PERF_TYPE_HARDWARE, PERF_COUNT_HW_CACHE_MISSES); } 1076{ return sym(PERF_TYPE_HARDWARE, PERF_COUNT_HW_CACHE_MISSES); }
1061 YY_BREAK 1077 YY_BREAK
1062case 7: 1078case 7:
1063YY_RULE_SETUP 1079YY_RULE_SETUP
1064#line 60 "util/parse-events.l" 1080#line 67 "util/parse-events.l"
1065{ return sym(PERF_TYPE_HARDWARE, PERF_COUNT_HW_BRANCH_INSTRUCTIONS); } 1081{ return sym(PERF_TYPE_HARDWARE, PERF_COUNT_HW_BRANCH_INSTRUCTIONS); }
1066 YY_BREAK 1082 YY_BREAK
1067case 8: 1083case 8:
1068YY_RULE_SETUP 1084YY_RULE_SETUP
1069#line 61 "util/parse-events.l" 1085#line 68 "util/parse-events.l"
1070{ return sym(PERF_TYPE_HARDWARE, PERF_COUNT_HW_BRANCH_MISSES); } 1086{ return sym(PERF_TYPE_HARDWARE, PERF_COUNT_HW_BRANCH_MISSES); }
1071 YY_BREAK 1087 YY_BREAK
1072case 9: 1088case 9:
1073YY_RULE_SETUP 1089YY_RULE_SETUP
1074#line 62 "util/parse-events.l" 1090#line 69 "util/parse-events.l"
1075{ return sym(PERF_TYPE_HARDWARE, PERF_COUNT_HW_BUS_CYCLES); } 1091{ return sym(PERF_TYPE_HARDWARE, PERF_COUNT_HW_BUS_CYCLES); }
1076 YY_BREAK 1092 YY_BREAK
1077case 10: 1093case 10:
1078YY_RULE_SETUP 1094YY_RULE_SETUP
1079#line 63 "util/parse-events.l" 1095#line 70 "util/parse-events.l"
1080{ return sym(PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CPU_CLOCK); } 1096{ return sym(PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CPU_CLOCK); }
1081 YY_BREAK 1097 YY_BREAK
1082case 11: 1098case 11:
1083YY_RULE_SETUP 1099YY_RULE_SETUP
1084#line 64 "util/parse-events.l" 1100#line 71 "util/parse-events.l"
1085{ return sym(PERF_TYPE_SOFTWARE, PERF_COUNT_SW_TASK_CLOCK); } 1101{ return sym(PERF_TYPE_SOFTWARE, PERF_COUNT_SW_TASK_CLOCK); }
1086 YY_BREAK 1102 YY_BREAK
1087case 12: 1103case 12:
1088YY_RULE_SETUP 1104YY_RULE_SETUP
1089#line 65 "util/parse-events.l" 1105#line 72 "util/parse-events.l"
1090{ return sym(PERF_TYPE_SOFTWARE, PERF_COUNT_SW_PAGE_FAULTS); } 1106{ return sym(PERF_TYPE_SOFTWARE, PERF_COUNT_SW_PAGE_FAULTS); }
1091 YY_BREAK 1107 YY_BREAK
1092case 13: 1108case 13:
1093YY_RULE_SETUP 1109YY_RULE_SETUP
1094#line 66 "util/parse-events.l" 1110#line 73 "util/parse-events.l"
1095{ return sym(PERF_TYPE_SOFTWARE, PERF_COUNT_SW_PAGE_FAULTS_MIN); } 1111{ return sym(PERF_TYPE_SOFTWARE, PERF_COUNT_SW_PAGE_FAULTS_MIN); }
1096 YY_BREAK 1112 YY_BREAK
1097case 14: 1113case 14:
1098YY_RULE_SETUP 1114YY_RULE_SETUP
1099#line 67 "util/parse-events.l" 1115#line 74 "util/parse-events.l"
1100{ return sym(PERF_TYPE_SOFTWARE, PERF_COUNT_SW_PAGE_FAULTS_MAJ); } 1116{ return sym(PERF_TYPE_SOFTWARE, PERF_COUNT_SW_PAGE_FAULTS_MAJ); }
1101 YY_BREAK 1117 YY_BREAK
1102case 15: 1118case 15:
1103YY_RULE_SETUP 1119YY_RULE_SETUP
1104#line 68 "util/parse-events.l" 1120#line 75 "util/parse-events.l"
1105{ return sym(PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CONTEXT_SWITCHES); } 1121{ return sym(PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CONTEXT_SWITCHES); }
1106 YY_BREAK 1122 YY_BREAK
1107case 16: 1123case 16:
1108YY_RULE_SETUP 1124YY_RULE_SETUP
1109#line 69 "util/parse-events.l" 1125#line 76 "util/parse-events.l"
1110{ return sym(PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CPU_MIGRATIONS); } 1126{ return sym(PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CPU_MIGRATIONS); }
1111 YY_BREAK 1127 YY_BREAK
1112case 17: 1128case 17:
1113YY_RULE_SETUP 1129YY_RULE_SETUP
1114#line 70 "util/parse-events.l" 1130#line 77 "util/parse-events.l"
1115{ return sym(PERF_TYPE_SOFTWARE, PERF_COUNT_SW_ALIGNMENT_FAULTS); } 1131{ return sym(PERF_TYPE_SOFTWARE, PERF_COUNT_SW_ALIGNMENT_FAULTS); }
1116 YY_BREAK 1132 YY_BREAK
1117case 18: 1133case 18:
1118YY_RULE_SETUP 1134YY_RULE_SETUP
1119#line 71 "util/parse-events.l" 1135#line 78 "util/parse-events.l"
1120{ return sym(PERF_TYPE_SOFTWARE, PERF_COUNT_SW_EMULATION_FAULTS); } 1136{ return sym(PERF_TYPE_SOFTWARE, PERF_COUNT_SW_EMULATION_FAULTS); }
1121 YY_BREAK 1137 YY_BREAK
1122case 19: 1138case 19:
1123#line 74 "util/parse-events.l" 1139#line 81 "util/parse-events.l"
1124case 20: 1140case 20:
1125#line 75 "util/parse-events.l" 1141#line 82 "util/parse-events.l"
1126case 21: 1142case 21:
1127#line 76 "util/parse-events.l" 1143#line 83 "util/parse-events.l"
1128case 22: 1144case 22:
1129#line 77 "util/parse-events.l" 1145#line 84 "util/parse-events.l"
1130case 23: 1146case 23:
1131#line 78 "util/parse-events.l" 1147#line 85 "util/parse-events.l"
1132case 24: 1148case 24:
1133#line 79 "util/parse-events.l" 1149#line 86 "util/parse-events.l"
1134case 25: 1150case 25:
1135YY_RULE_SETUP 1151YY_RULE_SETUP
1136#line 79 "util/parse-events.l" 1152#line 86 "util/parse-events.l"
1137{ return str(PE_NAME_CACHE_TYPE); } 1153{ return str(PE_NAME_CACHE_TYPE); }
1138 YY_BREAK 1154 YY_BREAK
1139case 26: 1155case 26:
1140#line 82 "util/parse-events.l" 1156#line 89 "util/parse-events.l"
1141case 27: 1157case 27:
1142#line 83 "util/parse-events.l" 1158#line 90 "util/parse-events.l"
1143case 28: 1159case 28:
1144#line 84 "util/parse-events.l" 1160#line 91 "util/parse-events.l"
1145case 29: 1161case 29:
1146#line 85 "util/parse-events.l" 1162#line 92 "util/parse-events.l"
1147case 30: 1163case 30:
1148#line 86 "util/parse-events.l" 1164#line 93 "util/parse-events.l"
1149case 31: 1165case 31:
1150YY_RULE_SETUP 1166YY_RULE_SETUP
1151#line 86 "util/parse-events.l" 1167#line 93 "util/parse-events.l"
1152{ return str(PE_NAME_CACHE_OP_RESULT); } 1168{ return str(PE_NAME_CACHE_OP_RESULT); }
1153 YY_BREAK 1169 YY_BREAK
1170/*
1171 * These are event config hardcoded term names to be specified
1172 * within xxx/.../ syntax. So far we dont clash with other names,
1173 * so we can put them here directly. In case the we have a conflict
1174 * in future, this needs to go into '//' condition block.
1175 */
1154case 32: 1176case 32:
1155YY_RULE_SETUP 1177YY_RULE_SETUP
1156#line 88 "util/parse-events.l" 1178#line 101 "util/parse-events.l"
1157{ return PE_PREFIX_MEM; } 1179{ return term(PARSE_EVENTS__TERM_TYPE_CONFIG); }
1158 YY_BREAK 1180 YY_BREAK
1159case 33: 1181case 33:
1160YY_RULE_SETUP 1182YY_RULE_SETUP
1161#line 89 "util/parse-events.l" 1183#line 102 "util/parse-events.l"
1162{ return raw(); } 1184{ return term(PARSE_EVENTS__TERM_TYPE_CONFIG1); }
1163 YY_BREAK 1185 YY_BREAK
1164case 34: 1186case 34:
1165YY_RULE_SETUP 1187YY_RULE_SETUP
1166#line 90 "util/parse-events.l" 1188#line 103 "util/parse-events.l"
1167{ return value(10); } 1189{ return term(PARSE_EVENTS__TERM_TYPE_CONFIG2); }
1168 YY_BREAK 1190 YY_BREAK
1169case 35: 1191case 35:
1170YY_RULE_SETUP 1192YY_RULE_SETUP
1171#line 91 "util/parse-events.l" 1193#line 104 "util/parse-events.l"
1172{ return value(16); } 1194{ return term(PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD); }
1173 YY_BREAK 1195 YY_BREAK
1174case 36: 1196case 36:
1175YY_RULE_SETUP 1197YY_RULE_SETUP
1176#line 93 "util/parse-events.l" 1198#line 105 "util/parse-events.l"
1177{ return str(PE_MODIFIER_EVENT); } 1199{ return term(PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE); }
1178 YY_BREAK 1200 YY_BREAK
1179case 37: 1201case 37:
1180YY_RULE_SETUP 1202YY_RULE_SETUP
1181#line 94 "util/parse-events.l" 1203#line 107 "util/parse-events.l"
1182{ return str(PE_MODIFIER_BP); } 1204{ return PE_PREFIX_MEM; }
1183 YY_BREAK 1205 YY_BREAK
1184case 38: 1206case 38:
1185YY_RULE_SETUP 1207YY_RULE_SETUP
1186#line 95 "util/parse-events.l" 1208#line 108 "util/parse-events.l"
1187{ return str(PE_NAME); } 1209{ return raw(); }
1188 YY_BREAK 1210 YY_BREAK
1189case 39: 1211case 39:
1190YY_RULE_SETUP 1212YY_RULE_SETUP
1191#line 96 "util/parse-events.l" 1213#line 109 "util/parse-events.l"
1192{ return '/'; } 1214{ return value(10); }
1193 YY_BREAK 1215 YY_BREAK
1194case 40: 1216case 40:
1195YY_RULE_SETUP 1217YY_RULE_SETUP
1196#line 97 "util/parse-events.l" 1218#line 110 "util/parse-events.l"
1197{ return '-'; } 1219{ return value(16); }
1198 YY_BREAK 1220 YY_BREAK
1199case 41: 1221case 41:
1200YY_RULE_SETUP 1222YY_RULE_SETUP
1201#line 98 "util/parse-events.l" 1223#line 112 "util/parse-events.l"
1202{ return ','; } 1224{ return str(PE_MODIFIER_EVENT); }
1203 YY_BREAK 1225 YY_BREAK
1204case 42: 1226case 42:
1205YY_RULE_SETUP 1227YY_RULE_SETUP
1206#line 99 "util/parse-events.l" 1228#line 113 "util/parse-events.l"
1207{ return ':'; } 1229{ return str(PE_MODIFIER_BP); }
1208 YY_BREAK 1230 YY_BREAK
1209case 43: 1231case 43:
1210YY_RULE_SETUP 1232YY_RULE_SETUP
1211#line 100 "util/parse-events.l" 1233#line 114 "util/parse-events.l"
1212{ return '='; } 1234{ return str(PE_NAME); }
1213 YY_BREAK 1235 YY_BREAK
1214case 44: 1236case 44:
1215YY_RULE_SETUP 1237YY_RULE_SETUP
1216#line 102 "util/parse-events.l" 1238#line 115 "util/parse-events.l"
1239{ return '/'; }
1240 YY_BREAK
1241case 45:
1242YY_RULE_SETUP
1243#line 116 "util/parse-events.l"
1244{ return '-'; }
1245 YY_BREAK
1246case 46:
1247YY_RULE_SETUP
1248#line 117 "util/parse-events.l"
1249{ return ','; }
1250 YY_BREAK
1251case 47:
1252YY_RULE_SETUP
1253#line 118 "util/parse-events.l"
1254{ return ':'; }
1255 YY_BREAK
1256case 48:
1257YY_RULE_SETUP
1258#line 119 "util/parse-events.l"
1259{ return '='; }
1260 YY_BREAK
1261case 49:
1262YY_RULE_SETUP
1263#line 121 "util/parse-events.l"
1217ECHO; 1264ECHO;
1218 YY_BREAK 1265 YY_BREAK
1219#line 1220 "<stdout>" 1266#line 1267 "<stdout>"
1220case YY_STATE_EOF(INITIAL): 1267case YY_STATE_EOF(INITIAL):
1221 yyterminate(); 1268 yyterminate();
1222 1269
@@ -1508,7 +1555,7 @@ static int yy_get_next_buffer (void)
1508 while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) 1555 while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
1509 { 1556 {
1510 yy_current_state = (int) yy_def[yy_current_state]; 1557 yy_current_state = (int) yy_def[yy_current_state];
1511 if ( yy_current_state >= 425 ) 1558 if ( yy_current_state >= 440 )
1512 yy_c = yy_meta[(unsigned int) yy_c]; 1559 yy_c = yy_meta[(unsigned int) yy_c];
1513 } 1560 }
1514 yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; 1561 yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
@@ -1536,11 +1583,11 @@ static int yy_get_next_buffer (void)
1536 while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) 1583 while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
1537 { 1584 {
1538 yy_current_state = (int) yy_def[yy_current_state]; 1585 yy_current_state = (int) yy_def[yy_current_state];
1539 if ( yy_current_state >= 425 ) 1586 if ( yy_current_state >= 440 )
1540 yy_c = yy_meta[(unsigned int) yy_c]; 1587 yy_c = yy_meta[(unsigned int) yy_c];
1541 } 1588 }
1542 yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; 1589 yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
1543 yy_is_jam = (yy_current_state == 424); 1590 yy_is_jam = (yy_current_state == 439);
1544 1591
1545 return yy_is_jam ? 0 : yy_current_state; 1592 return yy_is_jam ? 0 : yy_current_state;
1546} 1593}
@@ -2214,7 +2261,7 @@ void parse_events_free (void * ptr )
2214 2261
2215#define YYTABLES_NAME "yytables" 2262#define YYTABLES_NAME "yytables"
2216 2263
2217#line 102 "util/parse-events.l" 2264#line 121 "util/parse-events.l"
2218 2265
2219 2266
2220 2267
diff --git a/tools/perf/util/parse-events-flex.h b/tools/perf/util/parse-events-flex.h
index b927f9a12c30..ceb9b20d732c 100644
--- a/tools/perf/util/parse-events-flex.h
+++ b/tools/perf/util/parse-events-flex.h
@@ -308,7 +308,7 @@ extern int parse_events_lex (void);
308#undef YY_DECL 308#undef YY_DECL
309#endif 309#endif
310 310
311#line 102 "util/parse-events.l" 311#line 121 "util/parse-events.l"
312 312
313 313
314#line 315 "util/parse-events-flex.h" 314#line 315 "util/parse-events-flex.h"
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index 6e50b914cad4..59f5cf64ef70 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -588,15 +588,60 @@ int parse_events_add_breakpoint(struct list_head *list, int *idx,
588 return add_event(list, idx, &attr, name); 588 return add_event(list, idx, &attr, name);
589} 589}
590 590
591int 591static int config_term(struct perf_event_attr *attr,
592parse_events_add_numeric(struct list_head *list, int *idx, 592 struct parse_events__term *term)
593 unsigned long type, unsigned long config) 593{
594 switch (term->type) {
595 case PARSE_EVENTS__TERM_TYPE_CONFIG:
596 attr->config = term->val.num;
597 break;
598 case PARSE_EVENTS__TERM_TYPE_CONFIG1:
599 attr->config1 = term->val.num;
600 break;
601 case PARSE_EVENTS__TERM_TYPE_CONFIG2:
602 attr->config2 = term->val.num;
603 break;
604 case PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD:
605 attr->sample_period = term->val.num;
606 break;
607 case PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE:
608 /*
609 * TODO uncomment when the field is available
610 * attr->branch_sample_type = term->val.num;
611 */
612 break;
613 default:
614 return -EINVAL;
615 }
616 return 0;
617}
618
619static int config_attr(struct perf_event_attr *attr,
620 struct list_head *head, int fail)
621{
622 struct parse_events__term *term;
623
624 list_for_each_entry(term, head, list)
625 if (config_term(attr, term) && fail)
626 return -EINVAL;
627
628 return 0;
629}
630
631int parse_events_add_numeric(struct list_head *list, int *idx,
632 unsigned long type, unsigned long config,
633 struct list_head *head_config)
594{ 634{
595 struct perf_event_attr attr; 635 struct perf_event_attr attr;
596 636
597 memset(&attr, 0, sizeof(attr)); 637 memset(&attr, 0, sizeof(attr));
598 attr.type = type; 638 attr.type = type;
599 attr.config = config; 639 attr.config = config;
640
641 if (head_config &&
642 config_attr(&attr, head_config, 1))
643 return -EINVAL;
644
600 return add_event(list, idx, &attr, 645 return add_event(list, idx, &attr,
601 (char *) __event_name(type, config)); 646 (char *) __event_name(type, config));
602} 647}
@@ -923,3 +968,51 @@ void print_events(const char *event_glob)
923 968
924 print_tracepoint_events(NULL, NULL); 969 print_tracepoint_events(NULL, NULL);
925} 970}
971
972int parse_events__is_hardcoded_term(struct parse_events__term *term)
973{
974 return term->type <= PARSE_EVENTS__TERM_TYPE_HARDCODED_MAX;
975}
976
977int parse_events__new_term(struct parse_events__term **_term, int type,
978 char *config, char *str, long num)
979{
980 struct parse_events__term *term;
981
982 term = zalloc(sizeof(*term));
983 if (!term)
984 return -ENOMEM;
985
986 INIT_LIST_HEAD(&term->list);
987 term->type = type;
988 term->config = config;
989
990 switch (type) {
991 case PARSE_EVENTS__TERM_TYPE_CONFIG:
992 case PARSE_EVENTS__TERM_TYPE_CONFIG1:
993 case PARSE_EVENTS__TERM_TYPE_CONFIG2:
994 case PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD:
995 case PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE:
996 case PARSE_EVENTS__TERM_TYPE_NUM:
997 term->val.num = num;
998 break;
999 case PARSE_EVENTS__TERM_TYPE_STR:
1000 term->val.str = str;
1001 break;
1002 default:
1003 return -EINVAL;
1004 }
1005
1006 *_term = term;
1007 return 0;
1008}
1009
1010void parse_events__free_terms(struct list_head *terms)
1011{
1012 struct parse_events__term *term, *h;
1013
1014 list_for_each_entry_safe(term, h, terms, list)
1015 free(term);
1016
1017 free(terms);
1018}
diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
index 84d37714f3bc..37a270d91d39 100644
--- a/tools/perf/util/parse-events.h
+++ b/tools/perf/util/parse-events.h
@@ -33,6 +33,34 @@ extern int parse_filter(const struct option *opt, const char *str, int unset);
33 33
34#define EVENTS_HELP_MAX (128*1024) 34#define EVENTS_HELP_MAX (128*1024)
35 35
36enum {
37 PARSE_EVENTS__TERM_TYPE_CONFIG,
38 PARSE_EVENTS__TERM_TYPE_CONFIG1,
39 PARSE_EVENTS__TERM_TYPE_CONFIG2,
40 PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD,
41 PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE,
42 PARSE_EVENTS__TERM_TYPE_NUM,
43 PARSE_EVENTS__TERM_TYPE_STR,
44
45 PARSE_EVENTS__TERM_TYPE_HARDCODED_MAX =
46 PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE,
47};
48
49struct parse_events__term {
50 char *config;
51 union {
52 char *str;
53 long num;
54 } val;
55 int type;
56
57 struct list_head list;
58};
59
60int parse_events__is_hardcoded_term(struct parse_events__term *term);
61int parse_events__new_term(struct parse_events__term **term, int type,
62 char *config, char *str, long num);
63void parse_events__free_terms(struct list_head *terms);
36int parse_events_modifier(struct list_head *list __used, char *str __used); 64int parse_events_modifier(struct list_head *list __used, char *str __used);
37int parse_events_add_tracepoint(struct list_head *list, int *idx, 65int parse_events_add_tracepoint(struct list_head *list, int *idx,
38 char *sys, char *event); 66 char *sys, char *event);
@@ -40,7 +68,8 @@ int parse_events_add_raw(struct perf_evlist *evlist, unsigned long config,
40 unsigned long config1, unsigned long config2, 68 unsigned long config1, unsigned long config2,
41 char *mod); 69 char *mod);
42int parse_events_add_numeric(struct list_head *list, int *idx, 70int parse_events_add_numeric(struct list_head *list, int *idx,
43 unsigned long type, unsigned long config); 71 unsigned long type, unsigned long config,
72 struct list_head *head_config);
44int parse_events_add_cache(struct list_head *list, int *idx, 73int parse_events_add_cache(struct list_head *list, int *idx,
45 char *type, char *op_result1, char *op_result2); 74 char *type, char *op_result1, char *op_result2);
46int parse_events_add_breakpoint(struct list_head *list, int *idx, 75int parse_events_add_breakpoint(struct list_head *list, int *idx,
diff --git a/tools/perf/util/parse-events.l b/tools/perf/util/parse-events.l
index 44dbc359f0ae..ab9eca120feb 100644
--- a/tools/perf/util/parse-events.l
+++ b/tools/perf/util/parse-events.l
@@ -5,6 +5,7 @@
5#include <errno.h> 5#include <errno.h>
6#include "../perf.h" 6#include "../perf.h"
7#include "parse-events-bison.h" 7#include "parse-events-bison.h"
8#include "parse-events.h"
8 9
9static int __value(char *str, int base, int token) 10static int __value(char *str, int base, int token)
10{ 11{
@@ -41,6 +42,12 @@ static int sym(int type, int config)
41 return PE_VALUE_SYM; 42 return PE_VALUE_SYM;
42} 43}
43 44
45static int term(int type)
46{
47 parse_events_lval.num = type;
48 return PE_TERM;
49}
50
44%} 51%}
45 52
46num_dec [0-9]+ 53num_dec [0-9]+
@@ -85,6 +92,18 @@ speculative-read|speculative-load |
85refs|Reference|ops|access | 92refs|Reference|ops|access |
86misses|miss { return str(PE_NAME_CACHE_OP_RESULT); } 93misses|miss { return str(PE_NAME_CACHE_OP_RESULT); }
87 94
95 /*
96 * These are event config hardcoded term names to be specified
97 * within xxx/.../ syntax. So far we dont clash with other names,
98 * so we can put them here directly. In case the we have a conflict
99 * in future, this needs to go into '//' condition block.
100 */
101config { return term(PARSE_EVENTS__TERM_TYPE_CONFIG); }
102config1 { return term(PARSE_EVENTS__TERM_TYPE_CONFIG1); }
103config2 { return term(PARSE_EVENTS__TERM_TYPE_CONFIG2); }
104period { return term(PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD); }
105branch_type { return term(PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE); }
106
88mem: { return PE_PREFIX_MEM; } 107mem: { return PE_PREFIX_MEM; }
89r{num_raw_hex} { return raw(); } 108r{num_raw_hex} { return raw(); }
90{num_dec} { return value(10); } 109{num_dec} { return value(10); }
diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y
index 4b4459e67a0a..c88c08e4e79d 100644
--- a/tools/perf/util/parse-events.y
+++ b/tools/perf/util/parse-events.y
@@ -23,7 +23,7 @@ do { \
23 23
24%} 24%}
25 25
26%token PE_VALUE PE_VALUE_SYM PE_RAW 26%token PE_VALUE PE_VALUE_SYM PE_RAW PE_TERM
27%token PE_NAME 27%token PE_NAME
28%token PE_MODIFIER_EVENT PE_MODIFIER_BP 28%token PE_MODIFIER_EVENT PE_MODIFIER_BP
29%token PE_NAME_CACHE_TYPE PE_NAME_CACHE_OP_RESULT 29%token PE_NAME_CACHE_TYPE PE_NAME_CACHE_OP_RESULT
@@ -32,16 +32,21 @@ do { \
32%type <num> PE_VALUE 32%type <num> PE_VALUE
33%type <num> PE_VALUE_SYM 33%type <num> PE_VALUE_SYM
34%type <num> PE_RAW 34%type <num> PE_RAW
35%type <num> PE_TERM
35%type <str> PE_NAME 36%type <str> PE_NAME
36%type <str> PE_NAME_CACHE_TYPE 37%type <str> PE_NAME_CACHE_TYPE
37%type <str> PE_NAME_CACHE_OP_RESULT 38%type <str> PE_NAME_CACHE_OP_RESULT
38%type <str> PE_MODIFIER_EVENT 39%type <str> PE_MODIFIER_EVENT
39%type <str> PE_MODIFIER_BP 40%type <str> PE_MODIFIER_BP
41%type <head> event_config
42%type <term> event_term
40 43
41%union 44%union
42{ 45{
43 char *str; 46 char *str;
44 unsigned long num; 47 unsigned long num;
48 struct list_head *head;
49 struct parse_events__term *term;
45} 50}
46%% 51%%
47 52
@@ -56,7 +61,7 @@ event_def PE_MODIFIER_EVENT
56| 61|
57event_def 62event_def
58 63
59event_def: event_legacy_symbol sep_dc | 64event_def: event_legacy_symbol |
60 event_legacy_cache sep_dc | 65 event_legacy_cache sep_dc |
61 event_legacy_mem | 66 event_legacy_mem |
62 event_legacy_tracepoint sep_dc | 67 event_legacy_tracepoint sep_dc |
@@ -64,12 +69,21 @@ event_def: event_legacy_symbol sep_dc |
64 event_legacy_raw sep_dc 69 event_legacy_raw sep_dc
65 70
66event_legacy_symbol: 71event_legacy_symbol:
67PE_VALUE_SYM 72PE_VALUE_SYM '/' event_config '/'
68{ 73{
69 int type = $1 >> 16; 74 int type = $1 >> 16;
70 int config = $1 & 255; 75 int config = $1 & 255;
71 76
72 ABORT_ON(parse_events_add_numeric(list, idx, type, config)); 77 ABORT_ON(parse_events_add_numeric(list, idx, type, config, $3));
78 parse_events__free_terms($3);
79}
80|
81PE_VALUE_SYM sep_slash_dc
82{
83 int type = $1 >> 16;
84 int config = $1 & 255;
85
86 ABORT_ON(parse_events_add_numeric(list, idx, type, config, NULL));
73} 87}
74 88
75event_legacy_cache: 89event_legacy_cache:
@@ -108,17 +122,85 @@ PE_NAME ':' PE_NAME
108event_legacy_numeric: 122event_legacy_numeric:
109PE_VALUE ':' PE_VALUE 123PE_VALUE ':' PE_VALUE
110{ 124{
111 ABORT_ON(parse_events_add_numeric(list, idx, $1, $3)); 125 ABORT_ON(parse_events_add_numeric(list, idx, $1, $3, NULL));
112} 126}
113 127
114event_legacy_raw: 128event_legacy_raw:
115PE_RAW 129PE_RAW
116{ 130{
117 ABORT_ON(parse_events_add_numeric(list, idx, PERF_TYPE_RAW, $1)); 131 ABORT_ON(parse_events_add_numeric(list, idx, PERF_TYPE_RAW, $1, NULL));
132}
133
134event_config:
135event_config ',' event_term
136{
137 struct list_head *head = $1;
138 struct parse_events__term *term = $3;
139
140 ABORT_ON(!head);
141 list_add_tail(&term->list, head);
142 $$ = $1;
143}
144|
145event_term
146{
147 struct list_head *head = malloc(sizeof(*head));
148 struct parse_events__term *term = $1;
149
150 ABORT_ON(!head);
151 INIT_LIST_HEAD(head);
152 list_add_tail(&term->list, head);
153 $$ = head;
154}
155
156event_term:
157PE_NAME '=' PE_NAME
158{
159 struct parse_events__term *term;
160
161 ABORT_ON(parse_events__new_term(&term, PARSE_EVENTS__TERM_TYPE_STR,
162 $1, $3, 0));
163 $$ = term;
164}
165|
166PE_NAME '=' PE_VALUE
167{
168 struct parse_events__term *term;
169
170 ABORT_ON(parse_events__new_term(&term, PARSE_EVENTS__TERM_TYPE_NUM,
171 $1, NULL, $3));
172 $$ = term;
173}
174|
175PE_NAME
176{
177 struct parse_events__term *term;
178
179 ABORT_ON(parse_events__new_term(&term, PARSE_EVENTS__TERM_TYPE_NUM,
180 $1, NULL, 1));
181 $$ = term;
182}
183|
184PE_TERM '=' PE_VALUE
185{
186 struct parse_events__term *term;
187
188 ABORT_ON(parse_events__new_term(&term, $1, NULL, NULL, $3));
189 $$ = term;
190}
191|
192PE_TERM
193{
194 struct parse_events__term *term;
195
196 ABORT_ON(parse_events__new_term(&term, $1, NULL, NULL, 1));
197 $$ = term;
118} 198}
119 199
120sep_dc: ':' | 200sep_dc: ':' |
121 201
202sep_slash_dc: '/' | ':' |
203
122%% 204%%
123 205
124void parse_events_error(struct list_head *list __used, int *idx __used, 206void parse_events_error(struct list_head *list __used, int *idx __used,