aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/util
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf/util')
-rw-r--r--tools/perf/util/parse-events.c28
-rw-r--r--tools/perf/util/parse-events.h5
-rw-r--r--tools/perf/util/parse-events.l13
-rw-r--r--tools/perf/util/parse-events.y12
4 files changed, 55 insertions, 3 deletions
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index ca8665e19c0d..d002170adb3f 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -12,6 +12,7 @@
12#include "header.h" 12#include "header.h"
13#include "debugfs.h" 13#include "debugfs.h"
14#include "parse-events-bison.h" 14#include "parse-events-bison.h"
15#define YY_EXTRA_TYPE int
15#include "parse-events-flex.h" 16#include "parse-events-flex.h"
16#include "pmu.h" 17#include "pmu.h"
17 18
@@ -788,13 +789,13 @@ int parse_events_modifier(struct list_head *list, char *str)
788 return 0; 789 return 0;
789} 790}
790 791
791static int parse_events__scanner(const char *str, void *data) 792static int parse_events__scanner(const char *str, void *data, int start_token)
792{ 793{
793 YY_BUFFER_STATE buffer; 794 YY_BUFFER_STATE buffer;
794 void *scanner; 795 void *scanner;
795 int ret; 796 int ret;
796 797
797 ret = parse_events_lex_init(&scanner); 798 ret = parse_events_lex_init_extra(start_token, &scanner);
798 if (ret) 799 if (ret)
799 return ret; 800 return ret;
800 801
@@ -811,6 +812,27 @@ static int parse_events__scanner(const char *str, void *data)
811 return ret; 812 return ret;
812} 813}
813 814
815/*
816 * parse event config string, return a list of event terms.
817 */
818int parse_events_terms(struct list_head *terms, const char *str)
819{
820 struct parse_events_data__terms data = {
821 .terms = NULL,
822 };
823 int ret;
824
825 ret = parse_events__scanner(str, &data, PE_START_TERMS);
826 if (!ret) {
827 list_splice(data.terms, terms);
828 free(data.terms);
829 return 0;
830 }
831
832 parse_events__free_terms(data.terms);
833 return ret;
834}
835
814int parse_events(struct perf_evlist *evlist, const char *str, int unset __used) 836int parse_events(struct perf_evlist *evlist, const char *str, int unset __used)
815{ 837{
816 struct parse_events_data__events data = { 838 struct parse_events_data__events data = {
@@ -819,7 +841,7 @@ int parse_events(struct perf_evlist *evlist, const char *str, int unset __used)
819 }; 841 };
820 int ret; 842 int ret;
821 843
822 ret = parse_events__scanner(str, &data); 844 ret = parse_events__scanner(str, &data, PE_START_EVENTS);
823 if (!ret) { 845 if (!ret) {
824 int entries = data.idx - evlist->nr_entries; 846 int entries = data.idx - evlist->nr_entries;
825 perf_evlist__splice_list_tail(evlist, &data.list, entries); 847 perf_evlist__splice_list_tail(evlist, &data.list, entries);
diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
index fa2b19b862e2..9896edadbe62 100644
--- a/tools/perf/util/parse-events.h
+++ b/tools/perf/util/parse-events.h
@@ -33,6 +33,7 @@ extern int parse_events_option(const struct option *opt, const char *str,
33 int unset); 33 int unset);
34extern int parse_events(struct perf_evlist *evlist, const char *str, 34extern int parse_events(struct perf_evlist *evlist, const char *str,
35 int unset); 35 int unset);
36extern int parse_events_terms(struct list_head *terms, const char *str);
36extern int parse_filter(const struct option *opt, const char *str, int unset); 37extern int parse_filter(const struct option *opt, const char *str, int unset);
37 38
38#define EVENTS_HELP_MAX (128*1024) 39#define EVENTS_HELP_MAX (128*1024)
@@ -68,6 +69,10 @@ struct parse_events_data__events {
68 int idx; 69 int idx;
69}; 70};
70 71
72struct parse_events_data__terms {
73 struct list_head *terms;
74};
75
71int parse_events__is_hardcoded_term(struct parse_events__term *term); 76int parse_events__is_hardcoded_term(struct parse_events__term *term);
72int parse_events__term_num(struct parse_events__term **_term, 77int parse_events__term_num(struct parse_events__term **_term,
73 int type_term, char *config, long num); 78 int type_term, char *config, long num);
diff --git a/tools/perf/util/parse-events.l b/tools/perf/util/parse-events.l
index 329794eea711..488362e14133 100644
--- a/tools/perf/util/parse-events.l
+++ b/tools/perf/util/parse-events.l
@@ -79,6 +79,19 @@ modifier_event [ukhpGH]{1,8}
79modifier_bp [rwx] 79modifier_bp [rwx]
80 80
81%% 81%%
82
83%{
84 {
85 int start_token;
86
87 start_token = (int) parse_events_get_extra(yyscanner);
88 if (start_token) {
89 parse_events_set_extra(NULL, yyscanner);
90 return start_token;
91 }
92 }
93%}
94
82cpu-cycles|cycles { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_CPU_CYCLES); } 95cpu-cycles|cycles { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_CPU_CYCLES); }
83stalled-cycles-frontend|idle-cycles-frontend { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_STALLED_CYCLES_FRONTEND); } 96stalled-cycles-frontend|idle-cycles-frontend { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_STALLED_CYCLES_FRONTEND); }
84stalled-cycles-backend|idle-cycles-backend { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_STALLED_CYCLES_BACKEND); } 97stalled-cycles-backend|idle-cycles-backend { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_STALLED_CYCLES_BACKEND); }
diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y
index 2a93d5c8ccda..9525c455d27f 100644
--- a/tools/perf/util/parse-events.y
+++ b/tools/perf/util/parse-events.y
@@ -25,6 +25,7 @@ do { \
25 25
26%} 26%}
27 27
28%token PE_START_EVENTS PE_START_TERMS
28%token PE_VALUE PE_VALUE_SYM PE_RAW PE_TERM 29%token PE_VALUE PE_VALUE_SYM PE_RAW PE_TERM
29%token PE_NAME 30%token PE_NAME
30%token PE_MODIFIER_EVENT PE_MODIFIER_BP 31%token PE_MODIFIER_EVENT PE_MODIFIER_BP
@@ -60,6 +61,11 @@ do { \
60} 61}
61%% 62%%
62 63
64start:
65PE_START_EVENTS events
66|
67PE_START_TERMS terms
68
63events: 69events:
64events ',' event | event 70events ',' event | event
65 71
@@ -209,6 +215,12 @@ PE_RAW
209 $$ = list; 215 $$ = list;
210} 216}
211 217
218terms: event_config
219{
220 struct parse_events_data__terms *data = _data;
221 data->terms = $1;
222}
223
212event_config: 224event_config:
213event_config ',' event_term 225event_config ',' event_term
214{ 226{