aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tools/perf/util/evlist.c7
-rw-r--r--tools/perf/util/evlist.h1
-rw-r--r--tools/perf/util/evsel.h6
-rw-r--r--tools/perf/util/parse-events.c1
-rw-r--r--tools/perf/util/parse-events.h1
-rw-r--r--tools/perf/util/parse-events.y10
6 files changed, 25 insertions, 1 deletions
diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c
index dc8aee97a488..eddd5ebcd690 100644
--- a/tools/perf/util/evlist.c
+++ b/tools/perf/util/evlist.c
@@ -117,6 +117,9 @@ void __perf_evlist__set_leader(struct list_head *list)
117 struct perf_evsel *evsel, *leader; 117 struct perf_evsel *evsel, *leader;
118 118
119 leader = list_entry(list->next, struct perf_evsel, node); 119 leader = list_entry(list->next, struct perf_evsel, node);
120 evsel = list_entry(list->prev, struct perf_evsel, node);
121
122 leader->nr_members = evsel->idx - leader->idx + 1;
120 123
121 list_for_each_entry(evsel, list, node) { 124 list_for_each_entry(evsel, list, node) {
122 if (evsel != leader) 125 if (evsel != leader)
@@ -126,8 +129,10 @@ void __perf_evlist__set_leader(struct list_head *list)
126 129
127void perf_evlist__set_leader(struct perf_evlist *evlist) 130void perf_evlist__set_leader(struct perf_evlist *evlist)
128{ 131{
129 if (evlist->nr_entries) 132 if (evlist->nr_entries) {
133 evlist->nr_groups = evlist->nr_entries > 1 ? 1 : 0;
130 __perf_evlist__set_leader(&evlist->entries); 134 __perf_evlist__set_leader(&evlist->entries);
135 }
131} 136}
132 137
133int perf_evlist__add_default(struct perf_evlist *evlist) 138int perf_evlist__add_default(struct perf_evlist *evlist)
diff --git a/tools/perf/util/evlist.h b/tools/perf/util/evlist.h
index 457e2350d21d..73579a25a93e 100644
--- a/tools/perf/util/evlist.h
+++ b/tools/perf/util/evlist.h
@@ -21,6 +21,7 @@ struct perf_evlist {
21 struct list_head entries; 21 struct list_head entries;
22 struct hlist_head heads[PERF_EVLIST__HLIST_SIZE]; 22 struct hlist_head heads[PERF_EVLIST__HLIST_SIZE];
23 int nr_entries; 23 int nr_entries;
24 int nr_groups;
24 int nr_fds; 25 int nr_fds;
25 int nr_mmaps; 26 int nr_mmaps;
26 int mmap_len; 27 int mmap_len;
diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h
index cbf42322a27e..c9031ebf196e 100644
--- a/tools/perf/util/evsel.h
+++ b/tools/perf/util/evsel.h
@@ -74,6 +74,7 @@ struct perf_evsel {
74 bool needs_swap; 74 bool needs_swap;
75 /* parse modifier helper */ 75 /* parse modifier helper */
76 int exclude_GH; 76 int exclude_GH;
77 int nr_members;
77 struct perf_evsel *leader; 78 struct perf_evsel *leader;
78 char *group_name; 79 char *group_name;
79}; 80};
@@ -259,4 +260,9 @@ bool perf_evsel__fallback(struct perf_evsel *evsel, int err,
259int perf_evsel__open_strerror(struct perf_evsel *evsel, 260int perf_evsel__open_strerror(struct perf_evsel *evsel,
260 struct perf_target *target, 261 struct perf_target *target,
261 int err, char *msg, size_t size); 262 int err, char *msg, size_t size);
263
264static inline int perf_evsel__group_idx(struct perf_evsel *evsel)
265{
266 return evsel->idx - evsel->leader->idx;
267}
262#endif /* __PERF_EVSEL_H */ 268#endif /* __PERF_EVSEL_H */
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index 02f6421f03a0..4e0f5c2a9fda 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -884,6 +884,7 @@ int parse_events(struct perf_evlist *evlist, const char *str)
884 if (!ret) { 884 if (!ret) {
885 int entries = data.idx - evlist->nr_entries; 885 int entries = data.idx - evlist->nr_entries;
886 perf_evlist__splice_list_tail(evlist, &data.list, entries); 886 perf_evlist__splice_list_tail(evlist, &data.list, entries);
887 evlist->nr_groups += data.nr_groups;
887 return 0; 888 return 0;
888 } 889 }
889 890
diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
index 2cd2c42a69c5..8a4859315fd9 100644
--- a/tools/perf/util/parse-events.h
+++ b/tools/perf/util/parse-events.h
@@ -64,6 +64,7 @@ struct parse_events_term {
64struct parse_events_evlist { 64struct parse_events_evlist {
65 struct list_head list; 65 struct list_head list;
66 int idx; 66 int idx;
67 int nr_groups;
67}; 68};
68 69
69struct parse_events_terms { 70struct parse_events_terms {
diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y
index 9d43c86176ff..4de2fdca98c8 100644
--- a/tools/perf/util/parse-events.y
+++ b/tools/perf/util/parse-events.y
@@ -23,6 +23,14 @@ do { \
23 YYABORT; \ 23 YYABORT; \
24} while (0) 24} while (0)
25 25
26static inc_group_count(struct list_head *list,
27 struct parse_events_evlist *data)
28{
29 /* Count groups only have more than 1 members */
30 if (!list_is_last(list->next, list))
31 data->nr_groups++;
32}
33
26%} 34%}
27 35
28%token PE_START_EVENTS PE_START_TERMS 36%token PE_START_EVENTS PE_START_TERMS
@@ -123,6 +131,7 @@ PE_NAME '{' events '}'
123{ 131{
124 struct list_head *list = $3; 132 struct list_head *list = $3;
125 133
134 inc_group_count(list, _data);
126 parse_events__set_leader($1, list); 135 parse_events__set_leader($1, list);
127 $$ = list; 136 $$ = list;
128} 137}
@@ -131,6 +140,7 @@ PE_NAME '{' events '}'
131{ 140{
132 struct list_head *list = $2; 141 struct list_head *list = $2;
133 142
143 inc_group_count(list, _data);
134 parse_events__set_leader(NULL, list); 144 parse_events__set_leader(NULL, list);
135 $$ = list; 145 $$ = list;
136} 146}