From: Andi Kleen <a...@linux.intel.com> Extend the parser/lexer to allow generic event names like "instructions" as a sysfs supplied PMU event name.
This resolves the problem that cpu/instructions/ gives a parse error, even when the kernel supplies a "instructions" event This is useful to add sysfs specified qualifiers to these events, for example cpu/instructions,intx=1/ and needed for the TSX events Simply extend the grammar to handle this case. The lexer needs minor changes to save the original string. v2: Remove bogus returns in grammar. Signed-off-by: Andi Kleen <a...@linux.intel.com> --- tools/perf/util/parse-events.l | 3 ++- tools/perf/util/parse-events.y | 27 +++++++++++++++++++++++---- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/tools/perf/util/parse-events.l b/tools/perf/util/parse-events.l index c2e5142..dd3a901 100644 --- a/tools/perf/util/parse-events.l +++ b/tools/perf/util/parse-events.l @@ -55,7 +55,8 @@ static int sym(yyscan_t scanner, int type, int config) { YYSTYPE *yylval = parse_events_get_lval(scanner); - yylval->num = (type << 16) + config; + yylval->namenum.num = (type << 16) + config; + yylval->namenum.name = strdup(parse_events_get_text(scanner)); return type == PERF_TYPE_HARDWARE ? PE_VALUE_SYM_HW : PE_VALUE_SYM_SW; } diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y index cd88209..25f0123 100644 --- a/tools/perf/util/parse-events.y +++ b/tools/perf/util/parse-events.y @@ -34,8 +34,8 @@ do { \ %token PE_PREFIX_MEM PE_PREFIX_RAW PE_PREFIX_GROUP %token PE_ERROR %type <num> PE_VALUE -%type <num> PE_VALUE_SYM_HW -%type <num> PE_VALUE_SYM_SW +%type <namenum> PE_VALUE_SYM_HW +%type <namenum> PE_VALUE_SYM_SW %type <num> PE_RAW %type <num> PE_TERM %type <str> PE_NAME @@ -65,6 +65,7 @@ do { \ %union { + struct { char *name; u64 num; } namenum; char *str; u64 num; struct list_head *head; @@ -195,9 +196,9 @@ PE_NAME '/' event_config '/' } value_sym: -PE_VALUE_SYM_HW +PE_VALUE_SYM_HW { free($1.name); $$ = $1.num; } | -PE_VALUE_SYM_SW +PE_VALUE_SYM_SW { free($1.name); $$ = $1.num; } event_legacy_symbol: value_sym '/' event_config '/' @@ -361,6 +362,24 @@ PE_NAME $$ = term; } | +PE_VALUE_SYM_HW +{ + struct parse_events__term *term; + + ABORT_ON(parse_events__term_num(&term, PARSE_EVENTS__TERM_TYPE_USER, + $1.name, 1)); + $$ = term; +} +| +PE_VALUE_SYM_SW +{ + struct parse_events__term *term; + + ABORT_ON(parse_events__term_num(&term, PARSE_EVENTS__TERM_TYPE_USER, + $1.name, 1)); + $$ = term; +} +| PE_TERM '=' PE_NAME { struct parse_events__term *term; -- 1.7.7.6 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/