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