diff options
Diffstat (limited to 'tools')
-rw-r--r-- | tools/perf/util/parse-events.c | 1 | ||||
-rw-r--r-- | tools/perf/util/parse-events.l | 25 |
2 files changed, 24 insertions, 2 deletions
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index 4025e18765c4..59324e7b3d8e 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c | |||
@@ -787,6 +787,7 @@ int parse_events(struct perf_evlist *evlist, const char *str, int unset __used) | |||
787 | 787 | ||
788 | parse_events__flush_buffer(buffer); | 788 | parse_events__flush_buffer(buffer); |
789 | parse_events__delete_buffer(buffer); | 789 | parse_events__delete_buffer(buffer); |
790 | parse_events_lex_destroy(); | ||
790 | 791 | ||
791 | if (!ret) { | 792 | if (!ret) { |
792 | int entries = idx - evlist->nr_entries; | 793 | int entries = idx - evlist->nr_entries; |
diff --git a/tools/perf/util/parse-events.l b/tools/perf/util/parse-events.l index 1fcf1bbc5458..331d28a08dcb 100644 --- a/tools/perf/util/parse-events.l +++ b/tools/perf/util/parse-events.l | |||
@@ -1,5 +1,6 @@ | |||
1 | 1 | ||
2 | %option prefix="parse_events_" | 2 | %option prefix="parse_events_" |
3 | %option stack | ||
3 | 4 | ||
4 | %{ | 5 | %{ |
5 | #include <errno.h> | 6 | #include <errno.h> |
@@ -50,6 +51,8 @@ static int term(int type) | |||
50 | 51 | ||
51 | %} | 52 | %} |
52 | 53 | ||
54 | %x mem | ||
55 | |||
53 | num_dec [0-9]+ | 56 | num_dec [0-9]+ |
54 | num_hex 0x[a-fA-F0-9]+ | 57 | num_hex 0x[a-fA-F0-9]+ |
55 | num_raw_hex [a-fA-F0-9]+ | 58 | num_raw_hex [a-fA-F0-9]+ |
@@ -105,13 +108,12 @@ config2 { return term(PARSE_EVENTS__TERM_TYPE_CONFIG2); } | |||
105 | period { return term(PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD); } | 108 | period { return term(PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD); } |
106 | branch_type { return term(PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE); } | 109 | branch_type { return term(PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE); } |
107 | 110 | ||
108 | mem: { return PE_PREFIX_MEM; } | 111 | mem: { BEGIN(mem); return PE_PREFIX_MEM; } |
109 | r{num_raw_hex} { return raw(); } | 112 | r{num_raw_hex} { return raw(); } |
110 | {num_dec} { return value(10); } | 113 | {num_dec} { return value(10); } |
111 | {num_hex} { return value(16); } | 114 | {num_hex} { return value(16); } |
112 | 115 | ||
113 | {modifier_event} { return str(PE_MODIFIER_EVENT); } | 116 | {modifier_event} { return str(PE_MODIFIER_EVENT); } |
114 | {modifier_bp} { return str(PE_MODIFIER_BP); } | ||
115 | {name} { return str(PE_NAME); } | 117 | {name} { return str(PE_NAME); } |
116 | "/" { return '/'; } | 118 | "/" { return '/'; } |
117 | - { return '-'; } | 119 | - { return '-'; } |
@@ -119,6 +121,25 @@ r{num_raw_hex} { return raw(); } | |||
119 | : { return ':'; } | 121 | : { return ':'; } |
120 | = { return '='; } | 122 | = { return '='; } |
121 | 123 | ||
124 | <mem>{ | ||
125 | {modifier_bp} { return str(PE_MODIFIER_BP); } | ||
126 | : { return ':'; } | ||
127 | {num_dec} { return value(10); } | ||
128 | {num_hex} { return value(16); } | ||
129 | /* | ||
130 | * We need to separate 'mem:' scanner part, in order to get specific | ||
131 | * modifier bits parsed out. Otherwise we would need to handle PE_NAME | ||
132 | * and we'd need to parse it manually. During the escape from <mem> | ||
133 | * state we need to put the escaping char back, so we dont miss it. | ||
134 | */ | ||
135 | . { unput(*parse_events_text); BEGIN(INITIAL); } | ||
136 | /* | ||
137 | * We destroy the scanner after reaching EOF, | ||
138 | * but anyway just to be sure get back to INIT state. | ||
139 | */ | ||
140 | <<EOF>> { BEGIN(INITIAL); } | ||
141 | } | ||
142 | |||
122 | %% | 143 | %% |
123 | 144 | ||
124 | int parse_events_wrap(void) | 145 | int parse_events_wrap(void) |