topdown.c (1171B)
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 7int 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}