xref: /linux/tools/perf/util/topdown.c (revision 4f3c8320c78cdd11c8fdd23c33787407f719322e)
1 // SPDX-License-Identifier: GPL-2.0
2 #include <stdio.h>
3 #include "pmu.h"
4 #include "topdown.h"
5 
6 int topdown_filter_events(const char **attr, char **str, bool use_group)
7 {
8 	int off = 0;
9 	int i;
10 	int len = 0;
11 	char *s;
12 
13 	for (i = 0; attr[i]; i++) {
14 		if (pmu_have_event("cpu", attr[i])) {
15 			len += strlen(attr[i]) + 1;
16 			attr[i - off] = attr[i];
17 		} else
18 			off++;
19 	}
20 	attr[i - off] = NULL;
21 
22 	*str = malloc(len + 1 + 2);
23 	if (!*str)
24 		return -1;
25 	s = *str;
26 	if (i - off == 0) {
27 		*s = 0;
28 		return 0;
29 	}
30 	if (use_group)
31 		*s++ = '{';
32 	for (i = 0; attr[i]; i++) {
33 		strcpy(s, attr[i]);
34 		s += strlen(s);
35 		*s++ = ',';
36 	}
37 	if (use_group) {
38 		s[-1] = '}';
39 		*s = 0;
40 	} else
41 		s[-1] = 0;
42 	return 0;
43 }
44 
45 __weak bool arch_topdown_check_group(bool *warn)
46 {
47 	*warn = false;
48 	return false;
49 }
50 
51 __weak void arch_topdown_group_warn(void)
52 {
53 }
54 
55 __weak bool arch_topdown_sample_read(struct evsel *leader __maybe_unused)
56 {
57 	return false;
58 }
59