[PATCH 34/64] perf tools: Add flex support for parse_events_error

2015-04-28 Thread Arnaldo Carvalho de Melo
From: Jiri Olsa 

Allowing flex parser to report back event parsing error, like:

  $ perf record -e cycles,cache-mises ls
  event syntax error: '..es,cache-mises'
 \___ parser error
  ...

Signed-off-by: Jiri Olsa 
Cc: David Ahern 
Cc: Namhyung Kim 
Cc: Paul Mackerras 
Cc: Peter Zijlstra 
Link: 
http://lkml.kernel.org/r/1429729824-13932-3-git-send-email-jo...@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo 
---
 tools/perf/util/parse-events.h |  1 -
 tools/perf/util/parse-events.l | 37 +
 tools/perf/util/parse-events.y |  7 ---
 3 files changed, 37 insertions(+), 8 deletions(-)

diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
index 5ac2ffa0a145..eb12bcd12642 100644
--- a/tools/perf/util/parse-events.h
+++ b/tools/perf/util/parse-events.h
@@ -122,7 +122,6 @@ perf_pmu__parse_check(const char *name);
 void parse_events__set_leader(char *name, struct list_head *list);
 void parse_events_update_lists(struct list_head *list_event,
   struct list_head *list_all);
-void parse_events_error(void *data, void *scanner, char const *msg);
 void parse_events_evlist_error(struct parse_events_evlist *data,
   int idx, const char *str);
 
diff --git a/tools/perf/util/parse-events.l b/tools/perf/util/parse-events.l
index 8895cf3132ab..330dd2d35f5a 100644
--- a/tools/perf/util/parse-events.l
+++ b/tools/perf/util/parse-events.l
@@ -3,6 +3,8 @@
 %option bison-bridge
 %option prefix="parse_events_"
 %option stack
+%option bison-locations
+%option yylineno
 
 %{
 #include 
@@ -51,6 +53,18 @@ static int str(yyscan_t scanner, int token)
return token;
 }
 
+#define REWIND(__alloc)\
+do {   \
+   YYSTYPE *__yylval = parse_events_get_lval(yyscanner);   \
+   char *text = parse_events_get_text(yyscanner);  \
+   \
+   if (__alloc)\
+   __yylval->str = strdup(text);   \
+   \
+   yycolumn -= strlen(text);   \
+   yyless(0);  \
+} while (0)
+
 static int pmu_str_check(yyscan_t scanner)
 {
YYSTYPE *yylval = parse_events_get_lval(scanner);
@@ -85,6 +99,13 @@ static int term(yyscan_t scanner, int type)
return PE_TERM;
 }
 
+#define YY_USER_ACTION \
+do {   \
+   yylloc->last_column  = yylloc->first_column;\
+   yylloc->first_column = yycolumn;\
+   yycolumn += yyleng; \
+} while (0);
+
 %}
 
 %x mem
@@ -119,6 +140,12 @@ modifier_bp[rwx]{1,3}
 
if (start_token) {
parse_events_set_extra(NULL, yyscanner);
+   /*
+* The flex parser does not init locations variable
+* via the scan_string interface, so we need do the
+* init in here.
+*/
+   yycolumn = 0;
return start_token;
}
  }
@@ -127,19 +154,21 @@ modifier_bp   [rwx]{1,3}
 {
 
 {group}{
-   BEGIN(INITIAL); yyless(0);
+   BEGIN(INITIAL);
+   REWIND(0);
}
 
 {event_pmu}|
 {event}{
-   str(yyscanner, PE_EVENT_NAME);
-   BEGIN(INITIAL); yyless(0);
+   BEGIN(INITIAL);
+   REWIND(1);
return PE_EVENT_NAME;
}
 
 .  |
 <>{
-   BEGIN(INITIAL); yyless(0);
+   BEGIN(INITIAL);
+   REWIND(0);
}
 
 }
diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y
index 72def077dbbf..14521ce534d9 100644
--- a/tools/perf/util/parse-events.y
+++ b/tools/perf/util/parse-events.y
@@ -2,6 +2,7 @@
 %parse-param {void *_data}
 %parse-param {void *scanner}
 %lex-param {void* scanner}
+%locations
 
 %{
 
@@ -14,8 +15,6 @@
 #include "parse-events.h"
 #include "parse-events-bison.h"
 
-extern int parse_events_lex (YYSTYPE* lvalp, void* scanner);
-
 #define ABORT_ON(val) \
 do { \
if (val) \
@@ -520,7 +519,9 @@ sep_slash_dc: '/' | ':' |
 
 %%
 
-void parse_events_error(void *data __maybe_unused, void *scanner 
__maybe_unused,
+void parse_events_error(YYLTYPE *loc, void *data,
+   void *scanner __maybe_unused,
char const *msg __maybe_unused)
 {
+   parse_events_evlist_error(data, loc->last_column, 

[PATCH 34/64] perf tools: Add flex support for parse_events_error

2015-04-28 Thread Arnaldo Carvalho de Melo
From: Jiri Olsa jo...@kernel.org

Allowing flex parser to report back event parsing error, like:

  $ perf record -e cycles,cache-mises ls
  event syntax error: '..es,cache-mises'
 \___ parser error
  ...

Signed-off-by: Jiri Olsa jo...@kernel.org
Cc: David Ahern dsah...@gmail.com
Cc: Namhyung Kim namhy...@kernel.org
Cc: Paul Mackerras pau...@samba.org
Cc: Peter Zijlstra a.p.zijls...@chello.nl
Link: 
http://lkml.kernel.org/r/1429729824-13932-3-git-send-email-jo...@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo a...@redhat.com
---
 tools/perf/util/parse-events.h |  1 -
 tools/perf/util/parse-events.l | 37 +
 tools/perf/util/parse-events.y |  7 ---
 3 files changed, 37 insertions(+), 8 deletions(-)

diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
index 5ac2ffa0a145..eb12bcd12642 100644
--- a/tools/perf/util/parse-events.h
+++ b/tools/perf/util/parse-events.h
@@ -122,7 +122,6 @@ perf_pmu__parse_check(const char *name);
 void parse_events__set_leader(char *name, struct list_head *list);
 void parse_events_update_lists(struct list_head *list_event,
   struct list_head *list_all);
-void parse_events_error(void *data, void *scanner, char const *msg);
 void parse_events_evlist_error(struct parse_events_evlist *data,
   int idx, const char *str);
 
diff --git a/tools/perf/util/parse-events.l b/tools/perf/util/parse-events.l
index 8895cf3132ab..330dd2d35f5a 100644
--- a/tools/perf/util/parse-events.l
+++ b/tools/perf/util/parse-events.l
@@ -3,6 +3,8 @@
 %option bison-bridge
 %option prefix=parse_events_
 %option stack
+%option bison-locations
+%option yylineno
 
 %{
 #include errno.h
@@ -51,6 +53,18 @@ static int str(yyscan_t scanner, int token)
return token;
 }
 
+#define REWIND(__alloc)\
+do {   \
+   YYSTYPE *__yylval = parse_events_get_lval(yyscanner);   \
+   char *text = parse_events_get_text(yyscanner);  \
+   \
+   if (__alloc)\
+   __yylval-str = strdup(text);   \
+   \
+   yycolumn -= strlen(text);   \
+   yyless(0);  \
+} while (0)
+
 static int pmu_str_check(yyscan_t scanner)
 {
YYSTYPE *yylval = parse_events_get_lval(scanner);
@@ -85,6 +99,13 @@ static int term(yyscan_t scanner, int type)
return PE_TERM;
 }
 
+#define YY_USER_ACTION \
+do {   \
+   yylloc-last_column  = yylloc-first_column;\
+   yylloc-first_column = yycolumn;\
+   yycolumn += yyleng; \
+} while (0);
+
 %}
 
 %x mem
@@ -119,6 +140,12 @@ modifier_bp[rwx]{1,3}
 
if (start_token) {
parse_events_set_extra(NULL, yyscanner);
+   /*
+* The flex parser does not init locations variable
+* via the scan_string interface, so we need do the
+* init in here.
+*/
+   yycolumn = 0;
return start_token;
}
  }
@@ -127,19 +154,21 @@ modifier_bp   [rwx]{1,3}
 event{
 
 {group}{
-   BEGIN(INITIAL); yyless(0);
+   BEGIN(INITIAL);
+   REWIND(0);
}
 
 {event_pmu}|
 {event}{
-   str(yyscanner, PE_EVENT_NAME);
-   BEGIN(INITIAL); yyless(0);
+   BEGIN(INITIAL);
+   REWIND(1);
return PE_EVENT_NAME;
}
 
 .  |
 EOF{
-   BEGIN(INITIAL); yyless(0);
+   BEGIN(INITIAL);
+   REWIND(0);
}
 
 }
diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y
index 72def077dbbf..14521ce534d9 100644
--- a/tools/perf/util/parse-events.y
+++ b/tools/perf/util/parse-events.y
@@ -2,6 +2,7 @@
 %parse-param {void *_data}
 %parse-param {void *scanner}
 %lex-param {void* scanner}
+%locations
 
 %{
 
@@ -14,8 +15,6 @@
 #include parse-events.h
 #include parse-events-bison.h
 
-extern int parse_events_lex (YYSTYPE* lvalp, void* scanner);
-
 #define ABORT_ON(val) \
 do { \
if (val) \
@@ -520,7 +519,9 @@ sep_slash_dc: '/' | ':' |
 
 %%
 
-void parse_events_error(void *data __maybe_unused, void *scanner 
__maybe_unused,
+void parse_events_error(YYLTYPE *loc, void *data,
+   void *scanner