GNU Linux-libre 5.19-rc6-gnu
[releases.git] / tools / perf / util / topdown.c
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 }