diff options
Diffstat (limited to 'tools')
| -rw-r--r-- | tools/perf/util/parse-events.c | 28 | ||||
| -rw-r--r-- | tools/perf/util/parse-events.h | 5 | ||||
| -rw-r--r-- | tools/perf/util/parse-events.l | 13 | ||||
| -rw-r--r-- | tools/perf/util/parse-events.y | 12 |
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 | ||
| 791 | static int parse_events__scanner(const char *str, void *data) | 792 | static 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 | */ | ||
| 818 | int 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 | |||
| 814 | int parse_events(struct perf_evlist *evlist, const char *str, int unset __used) | 836 | int 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); |
| 34 | extern int parse_events(struct perf_evlist *evlist, const char *str, | 34 | extern int parse_events(struct perf_evlist *evlist, const char *str, |
| 35 | int unset); | 35 | int unset); |
| 36 | extern int parse_events_terms(struct list_head *terms, const char *str); | ||
| 36 | extern int parse_filter(const struct option *opt, const char *str, int unset); | 37 | extern 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 | ||
| 72 | struct parse_events_data__terms { | ||
| 73 | struct list_head *terms; | ||
| 74 | }; | ||
| 75 | |||
| 71 | int parse_events__is_hardcoded_term(struct parse_events__term *term); | 76 | int parse_events__is_hardcoded_term(struct parse_events__term *term); |
| 72 | int parse_events__term_num(struct parse_events__term **_term, | 77 | int 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} | |||
| 79 | modifier_bp [rwx] | 79 | modifier_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 | |||
| 82 | cpu-cycles|cycles { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_CPU_CYCLES); } | 95 | cpu-cycles|cycles { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_CPU_CYCLES); } |
| 83 | stalled-cycles-frontend|idle-cycles-frontend { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_STALLED_CYCLES_FRONTEND); } | 96 | stalled-cycles-frontend|idle-cycles-frontend { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_STALLED_CYCLES_FRONTEND); } |
| 84 | stalled-cycles-backend|idle-cycles-backend { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_STALLED_CYCLES_BACKEND); } | 97 | stalled-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 | ||
| 64 | start: | ||
| 65 | PE_START_EVENTS events | ||
| 66 | | | ||
| 67 | PE_START_TERMS terms | ||
| 68 | |||
| 63 | events: | 69 | events: |
| 64 | events ',' event | event | 70 | events ',' event | event |
| 65 | 71 | ||
| @@ -209,6 +215,12 @@ PE_RAW | |||
| 209 | $$ = list; | 215 | $$ = list; |
| 210 | } | 216 | } |
| 211 | 217 | ||
| 218 | terms: event_config | ||
| 219 | { | ||
| 220 | struct parse_events_data__terms *data = _data; | ||
| 221 | data->terms = $1; | ||
| 222 | } | ||
| 223 | |||
| 212 | event_config: | 224 | event_config: |
| 213 | event_config ',' event_term | 225 | event_config ',' event_term |
| 214 | { | 226 | { |
