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