diff options
Diffstat (limited to 'tools/perf/util/parse-events.y')
| -rw-r--r-- | tools/perf/util/parse-events.y | 85 | 
1 files changed, 56 insertions, 29 deletions
diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y index cd88209e3c5..afc44c18dfe 100644 --- a/tools/perf/util/parse-events.y +++ b/tools/perf/util/parse-events.y @@ -1,5 +1,4 @@  %pure-parser -%name-prefix "parse_events_"  %parse-param {void *_data}  %parse-param {void *scanner}  %lex-param {void* scanner} @@ -23,6 +22,14 @@ do { \  		YYABORT; \  } while (0) +static inc_group_count(struct list_head *list, +		       struct parse_events_evlist *data) +{ +	/* Count groups only have more than 1 members */ +	if (!list_is_last(list->next, list)) +		data->nr_groups++; +} +  %}  %token PE_START_EVENTS PE_START_TERMS @@ -68,7 +75,7 @@ do { \  	char *str;  	u64 num;  	struct list_head *head; -	struct parse_events__term *term; +	struct parse_events_term *term;  }  %% @@ -79,7 +86,7 @@ PE_START_TERMS  start_terms  start_events: groups  { -	struct parse_events_data__events *data = _data; +	struct parse_events_evlist *data = _data;  	parse_events_update_lists($1, &data->list);  } @@ -123,6 +130,7 @@ PE_NAME '{' events '}'  {  	struct list_head *list = $3; +	inc_group_count(list, _data);  	parse_events__set_leader($1, list);  	$$ = list;  } @@ -131,6 +139,7 @@ PE_NAME '{' events '}'  {  	struct list_head *list = $2; +	inc_group_count(list, _data);  	parse_events__set_leader(NULL, list);  	$$ = list;  } @@ -186,7 +195,7 @@ event_def: event_pmu |  event_pmu:  PE_NAME '/' event_config '/'  { -	struct parse_events_data__events *data = _data; +	struct parse_events_evlist *data = _data;  	struct list_head *list = NULL;  	ABORT_ON(parse_events_add_pmu(&list, &data->idx, $1, $3)); @@ -202,7 +211,7 @@ PE_VALUE_SYM_SW  event_legacy_symbol:  value_sym '/' event_config '/'  { -	struct parse_events_data__events *data = _data; +	struct parse_events_evlist *data = _data;  	struct list_head *list = NULL;  	int type = $1 >> 16;  	int config = $1 & 255; @@ -215,7 +224,7 @@ value_sym '/' event_config '/'  |  value_sym sep_slash_dc  { -	struct parse_events_data__events *data = _data; +	struct parse_events_evlist *data = _data;  	struct list_head *list = NULL;  	int type = $1 >> 16;  	int config = $1 & 255; @@ -228,7 +237,7 @@ value_sym sep_slash_dc  event_legacy_cache:  PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT '-' PE_NAME_CACHE_OP_RESULT  { -	struct parse_events_data__events *data = _data; +	struct parse_events_evlist *data = _data;  	struct list_head *list = NULL;  	ABORT_ON(parse_events_add_cache(&list, &data->idx, $1, $3, $5)); @@ -237,7 +246,7 @@ PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT '-' PE_NAME_CACHE_OP_RESULT  |  PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT  { -	struct parse_events_data__events *data = _data; +	struct parse_events_evlist *data = _data;  	struct list_head *list = NULL;  	ABORT_ON(parse_events_add_cache(&list, &data->idx, $1, $3, NULL)); @@ -246,7 +255,7 @@ PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT  |  PE_NAME_CACHE_TYPE  { -	struct parse_events_data__events *data = _data; +	struct parse_events_evlist *data = _data;  	struct list_head *list = NULL;  	ABORT_ON(parse_events_add_cache(&list, &data->idx, $1, NULL, NULL)); @@ -256,7 +265,7 @@ PE_NAME_CACHE_TYPE  event_legacy_mem:  PE_PREFIX_MEM PE_VALUE ':' PE_MODIFIER_BP sep_dc  { -	struct parse_events_data__events *data = _data; +	struct parse_events_evlist *data = _data;  	struct list_head *list = NULL;  	ABORT_ON(parse_events_add_breakpoint(&list, &data->idx, @@ -266,7 +275,7 @@ PE_PREFIX_MEM PE_VALUE ':' PE_MODIFIER_BP sep_dc  |  PE_PREFIX_MEM PE_VALUE sep_dc  { -	struct parse_events_data__events *data = _data; +	struct parse_events_evlist *data = _data;  	struct list_head *list = NULL;  	ABORT_ON(parse_events_add_breakpoint(&list, &data->idx, @@ -277,7 +286,7 @@ PE_PREFIX_MEM PE_VALUE sep_dc  event_legacy_tracepoint:  PE_NAME ':' PE_NAME  { -	struct parse_events_data__events *data = _data; +	struct parse_events_evlist *data = _data;  	struct list_head *list = NULL;  	ABORT_ON(parse_events_add_tracepoint(&list, &data->idx, $1, $3)); @@ -287,7 +296,7 @@ PE_NAME ':' PE_NAME  event_legacy_numeric:  PE_VALUE ':' PE_VALUE  { -	struct parse_events_data__events *data = _data; +	struct parse_events_evlist *data = _data;  	struct list_head *list = NULL;  	ABORT_ON(parse_events_add_numeric(&list, &data->idx, (u32)$1, $3, NULL)); @@ -297,7 +306,7 @@ PE_VALUE ':' PE_VALUE  event_legacy_raw:  PE_RAW  { -	struct parse_events_data__events *data = _data; +	struct parse_events_evlist *data = _data;  	struct list_head *list = NULL;  	ABORT_ON(parse_events_add_numeric(&list, &data->idx, @@ -307,7 +316,7 @@ PE_RAW  start_terms: event_config  { -	struct parse_events_data__terms *data = _data; +	struct parse_events_terms *data = _data;  	data->terms = $1;  } @@ -315,7 +324,7 @@ event_config:  event_config ',' event_term  {  	struct list_head *head = $1; -	struct parse_events__term *term = $3; +	struct parse_events_term *term = $3;  	ABORT_ON(!head);  	list_add_tail(&term->list, head); @@ -325,7 +334,7 @@ event_config ',' event_term  event_term  {  	struct list_head *head = malloc(sizeof(*head)); -	struct parse_events__term *term = $1; +	struct parse_events_term *term = $1;  	ABORT_ON(!head);  	INIT_LIST_HEAD(head); @@ -336,52 +345,70 @@ event_term  event_term:  PE_NAME '=' PE_NAME  { -	struct parse_events__term *term; +	struct parse_events_term *term; -	ABORT_ON(parse_events__term_str(&term, PARSE_EVENTS__TERM_TYPE_USER, +	ABORT_ON(parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_USER,  					$1, $3));  	$$ = term;  }  |  PE_NAME '=' PE_VALUE  { -	struct parse_events__term *term; +	struct parse_events_term *term; -	ABORT_ON(parse_events__term_num(&term, PARSE_EVENTS__TERM_TYPE_USER, +	ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,  					$1, $3));  	$$ = term;  }  | +PE_NAME '=' PE_VALUE_SYM_HW +{ +	struct parse_events_term *term; +	int config = $3 & 255; + +	ABORT_ON(parse_events_term__sym_hw(&term, $1, config)); +	$$ = term; +} +|  PE_NAME  { -	struct parse_events__term *term; +	struct parse_events_term *term; -	ABORT_ON(parse_events__term_num(&term, PARSE_EVENTS__TERM_TYPE_USER, +	ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,  					$1, 1));  	$$ = term;  }  | +PE_VALUE_SYM_HW +{ +	struct parse_events_term *term; +	int config = $1 & 255; + +	ABORT_ON(parse_events_term__sym_hw(&term, NULL, config)); +	$$ = term; +} +|  PE_TERM '=' PE_NAME  { -	struct parse_events__term *term; +	struct parse_events_term *term; -	ABORT_ON(parse_events__term_str(&term, (int)$1, NULL, $3)); +	ABORT_ON(parse_events_term__str(&term, (int)$1, NULL, $3));  	$$ = term;  }  |  PE_TERM '=' PE_VALUE  { -	struct parse_events__term *term; +	struct parse_events_term *term; -	ABORT_ON(parse_events__term_num(&term, (int)$1, NULL, $3)); +	ABORT_ON(parse_events_term__num(&term, (int)$1, NULL, $3));  	$$ = term;  }  |  PE_TERM  { -	struct parse_events__term *term; +	struct parse_events_term *term; -	ABORT_ON(parse_events__term_num(&term, (int)$1, NULL, 1)); +	ABORT_ON(parse_events_term__num(&term, (int)$1, NULL, 1));  	$$ = term;  }  |