diff options
| -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 ca8665e19c0..d002170adb3 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -12,6 +12,7 @@  #include "header.h"  #include "debugfs.h"  #include "parse-events-bison.h" +#define YY_EXTRA_TYPE int  #include "parse-events-flex.h"  #include "pmu.h" @@ -788,13 +789,13 @@ int parse_events_modifier(struct list_head *list, char *str)  	return 0;  } -static int parse_events__scanner(const char *str, void *data) +static int parse_events__scanner(const char *str, void *data, int start_token)  {  	YY_BUFFER_STATE buffer;  	void *scanner;  	int ret; -	ret = parse_events_lex_init(&scanner); +	ret = parse_events_lex_init_extra(start_token, &scanner);  	if (ret)  		return ret; @@ -811,6 +812,27 @@ static int parse_events__scanner(const char *str, void *data)  	return ret;  } +/* + * parse event config string, return a list of event terms. + */ +int parse_events_terms(struct list_head *terms, const char *str) +{ +	struct parse_events_data__terms data = { +		.terms = NULL, +	}; +	int ret; + +	ret = parse_events__scanner(str, &data, PE_START_TERMS); +	if (!ret) { +		list_splice(data.terms, terms); +		free(data.terms); +		return 0; +	} + +	parse_events__free_terms(data.terms); +	return ret; +} +  int parse_events(struct perf_evlist *evlist, const char *str, int unset __used)  {  	struct parse_events_data__events data = { @@ -819,7 +841,7 @@ int parse_events(struct perf_evlist *evlist, const char *str, int unset __used)  	};  	int ret; -	ret = parse_events__scanner(str, &data); +	ret = parse_events__scanner(str, &data, PE_START_EVENTS);  	if (!ret) {  		int entries = data.idx - evlist->nr_entries;  		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 fa2b19b862e..9896edadbe6 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,  			       int unset);  extern int parse_events(struct perf_evlist *evlist, const char *str,  			int unset); +extern int parse_events_terms(struct list_head *terms, const char *str);  extern int parse_filter(const struct option *opt, const char *str, int unset);  #define EVENTS_HELP_MAX (128*1024) @@ -68,6 +69,10 @@ struct parse_events_data__events {  	int idx;  }; +struct parse_events_data__terms { +	struct list_head *terms; +}; +  int parse_events__is_hardcoded_term(struct parse_events__term *term);  int parse_events__term_num(struct parse_events__term **_term,  			   int type_term, char *config, long num); diff --git a/tools/perf/util/parse-events.l b/tools/perf/util/parse-events.l index 329794eea71..488362e1413 100644 --- a/tools/perf/util/parse-events.l +++ b/tools/perf/util/parse-events.l @@ -79,6 +79,19 @@ modifier_event	[ukhpGH]{1,8}  modifier_bp	[rwx]  %% + +%{ +	{ +		int start_token; + +		start_token = (int) parse_events_get_extra(yyscanner); +		if (start_token) { +			parse_events_set_extra(NULL, yyscanner); +			return start_token; +		} +         } +%} +  cpu-cycles|cycles				{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_CPU_CYCLES); }  stalled-cycles-frontend|idle-cycles-frontend	{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_STALLED_CYCLES_FRONTEND); }  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 2a93d5c8ccd..9525c455d27 100644 --- a/tools/perf/util/parse-events.y +++ b/tools/perf/util/parse-events.y @@ -25,6 +25,7 @@ do { \  %} +%token PE_START_EVENTS PE_START_TERMS  %token PE_VALUE PE_VALUE_SYM PE_RAW PE_TERM  %token PE_NAME  %token PE_MODIFIER_EVENT PE_MODIFIER_BP @@ -60,6 +61,11 @@ do { \  }  %% +start: +PE_START_EVENTS events +| +PE_START_TERMS  terms +  events:  events ',' event | event @@ -209,6 +215,12 @@ PE_RAW  	$$ = list;  } +terms: event_config +{ +	struct parse_events_data__terms *data = _data; +	data->terms = $1; +} +  event_config:  event_config ',' event_term  {  |