| // SPDX-License-Identifier: GPL-2.0 |
| #include <stdio.h> |
| #include "pmu.h" |
| #include "topdown.h" |
| |
| int topdown_filter_events(const char **attr, char **str, bool use_group) |
| { |
| int off = 0; |
| int i; |
| int len = 0; |
| char *s; |
| |
| for (i = 0; attr[i]; i++) { |
| if (pmu_have_event("cpu", attr[i])) { |
| len += strlen(attr[i]) + 1; |
| attr[i - off] = attr[i]; |
| } else |
| off++; |
| } |
| attr[i - off] = NULL; |
| |
| *str = malloc(len + 1 + 2); |
| if (!*str) |
| return -1; |
| s = *str; |
| if (i - off == 0) { |
| *s = 0; |
| return 0; |
| } |
| if (use_group) |
| *s++ = '{'; |
| for (i = 0; attr[i]; i++) { |
| strcpy(s, attr[i]); |
| s += strlen(s); |
| *s++ = ','; |
| } |
| if (use_group) { |
| s[-1] = '}'; |
| *s = 0; |
| } else |
| s[-1] = 0; |
| return 0; |
| } |
| |
| __weak bool arch_topdown_check_group(bool *warn) |
| { |
| *warn = false; |
| return false; |
| } |
| |
| __weak void arch_topdown_group_warn(void) |
| { |
| } |
| |
| __weak bool arch_topdown_sample_read(struct evsel *leader __maybe_unused) |
| { |
| return false; |
| } |