Lines Matching +full:dont +full:- +full:validate

1 // SPDX-License-Identifier: GPL-2.0
13 #include <subcmd/parse-options.h>
14 #include "parse-events.h"
20 #include <util/parse-events-bison.h>
21 #include <util/parse-events-flex.h>
25 #include "util/parse-branch-options.h"
28 #include "util/bpf-filter.h"
42 .symbol = "cpu-cycles",
50 .symbol = "cache-references",
54 .symbol = "cache-misses",
58 .symbol = "branch-instructions",
62 .symbol = "branch-misses",
66 .symbol = "bus-cycles",
70 .symbol = "stalled-cycles-frontend",
71 .alias = "idle-cycles-frontend",
74 .symbol = "stalled-cycles-backend",
75 .alias = "idle-cycles-backend",
78 .symbol = "ref-cycles",
85 .symbol = "cpu-clock",
89 .symbol = "task-clock",
93 .symbol = "page-faults",
97 .symbol = "context-switches",
101 .symbol = "cpu-migrations",
105 .symbol = "minor-faults",
109 .symbol = "major-faults",
113 .symbol = "alignment-faults",
117 .symbol = "emulation-faults",
125 .symbol = "bpf-output",
129 .symbol = "cgroup-switches",
147 return "hardware-cache"; in event_type()
164 if (term->type_term == type_term) in get_config_str()
165 return term->val.str; in get_config_str()
181 * fix_raw - For each raw term see if there is an event (aka alias) in pmu that
185 * a raw hex encoding of 0xead. The fix-up is done late so the PMU of
187 * ahead-of-time.
198 if (term->type_term != PARSE_EVENTS__TERM_TYPE_RAW) in fix_raw()
201 if (perf_pmu__have_event(pmu, term->val.str)) { in fix_raw()
202 zfree(&term->config); in fix_raw()
203 term->config = term->val.str; in fix_raw()
204 term->type_val = PARSE_EVENTS__TERM_TYPE_NUM; in fix_raw()
205 term->type_term = PARSE_EVENTS__TERM_TYPE_USER; in fix_raw()
206 term->val.num = 1; in fix_raw()
207 term->no_value = true; in fix_raw()
211 zfree(&term->config); in fix_raw()
212 term->config = strdup("config"); in fix_raw()
214 num = strtoull(term->val.str + 1, NULL, 16); in fix_raw()
216 free(term->val.str); in fix_raw()
217 term->type_val = PARSE_EVENTS__TERM_TYPE_NUM; in fix_raw()
218 term->type_term = PARSE_EVENTS__TERM_TYPE_CONFIG; in fix_raw()
219 term->val.num = num; in fix_raw()
220 term->no_value = false; in fix_raw()
233 struct perf_cpu_map *cpus = pmu ? perf_cpu_map__get(pmu->cpus) : in __add_event()
239 if (pmu && (attr->type == PERF_TYPE_RAW || attr->type >= PERF_TYPE_MAX)) { in __add_event()
240 perf_pmu__warn_invalid_config(pmu, attr->config, name, in __add_event()
242 perf_pmu__warn_invalid_config(pmu, attr->config1, name, in __add_event()
244 perf_pmu__warn_invalid_config(pmu, attr->config2, name, in __add_event()
246 perf_pmu__warn_invalid_config(pmu, attr->config3, name, in __add_event()
259 evsel->core.cpus = cpus; in __add_event()
260 evsel->core.own_cpus = perf_cpu_map__get(cpus); in __add_event()
261 evsel->core.requires_cpu = pmu ? pmu->is_uncore : false; in __add_event()
262 evsel->core.is_pmu_core = pmu ? pmu->is_core : false; in __add_event()
263 evsel->auto_merge_stats = auto_merge_stats; in __add_event()
264 evsel->pmu = pmu; in __add_event()
265 evsel->pmu_name = pmu ? strdup(pmu->name) : NULL; in __add_event()
268 evsel->name = strdup(name); in __add_event()
271 evsel->metric_id = strdup(metric_id); in __add_event()
274 list_splice_init(config_terms, &evsel->config_terms); in __add_event()
277 list_add_tail(&evsel->core.node, list); in __add_event()
297 /*auto_merge_stats=*/false, /*cpu_list=*/NULL) ? 0 : -ENOMEM; in add_event()
314 return -ENOMEM; in add_event_tool()
315 evsel->tool_event = tool_event; in add_event_tool()
319 free((char *)evsel->unit); in add_event_tool()
320 evsel->unit = strdup("ns"); in add_event_tool()
326 * parse_aliases - search names for entries beginning or equalling str ignoring
337 *longest = -1; in parse_aliases()
349 return -1; in parse_aliases()
364 * parse_events__decode_legacy_cache - Search name for the legacy cache event
375 int len, cache_type = -1, cache_op = -1, cache_result = -1; in parse_events__decode_legacy_cache()
380 if (cache_type == -1) in parse_events__decode_legacy_cache()
381 return -EINVAL; in parse_events__decode_legacy_cache()
389 return -EINVAL; in parse_events__decode_legacy_cache()
404 return -EINVAL; in parse_events__decode_legacy_cache()
415 if (cache_op == -1) in parse_events__decode_legacy_cache()
421 if (cache_result == -1) in parse_events__decode_legacy_cache()
431 * parse_events__filter_pmu - returns false if a wildcard PMU should be
437 if (parse_state->pmu_filter == NULL) in parse_events__filter_pmu()
440 return strcmp(parse_state->pmu_filter, pmu->name) != 0; in parse_events__filter_pmu()
464 ret = parse_events__decode_legacy_cache(name, pmu->type, &attr.config); in parse_events_add_cache()
471 if (config_attr(&attr, head_config, parse_state->error, config_term_common)) in parse_events_add_cache()
472 return -EINVAL; in parse_events_add_cache()
475 return -ENOMEM; in parse_events_add_cache()
481 return -ENOMEM; in parse_events_add_cache()
485 return found_supported ? 0 : -EINVAL; in parse_events_add_cache()
529 tracepoint_error(err, PTR_ERR(evsel), sys_name, evt_name, loc->first_column); in add_tracepoint()
537 return -ENOMEM; in add_tracepoint()
538 list_splice(&config_terms, &evsel->config_terms); in add_tracepoint()
541 list_add_tail(&evsel->core.node, list); in add_tracepoint()
557 tracepoint_error(err, errno, sys_name, evt_name, loc->first_column); in add_tracepoint_multi_event()
558 return -1; in add_tracepoint_multi_event()
563 tracepoint_error(err, errno, sys_name, evt_name, loc->first_column); in add_tracepoint_multi_event()
564 return -1; in add_tracepoint_multi_event()
568 if (!strcmp(evt_ent->d_name, ".") in add_tracepoint_multi_event()
569 || !strcmp(evt_ent->d_name, "..") in add_tracepoint_multi_event()
570 || !strcmp(evt_ent->d_name, "enable") in add_tracepoint_multi_event()
571 || !strcmp(evt_ent->d_name, "filter")) in add_tracepoint_multi_event()
574 if (!strglobmatch(evt_ent->d_name, evt_name)) in add_tracepoint_multi_event()
579 ret = add_tracepoint(list, idx, sys_name, evt_ent->d_name, in add_tracepoint_multi_event()
584 tracepoint_error(err, ENOENT, sys_name, evt_name, loc->first_column); in add_tracepoint_multi_event()
585 ret = -1; in add_tracepoint_multi_event()
616 tracepoint_error(err, errno, sys_name, evt_name, loc->first_column); in add_tracepoint_multi_sys()
617 return -1; in add_tracepoint_multi_sys()
621 if (!strcmp(events_ent->d_name, ".") in add_tracepoint_multi_sys()
622 || !strcmp(events_ent->d_name, "..") in add_tracepoint_multi_sys()
623 || !strcmp(events_ent->d_name, "enable") in add_tracepoint_multi_sys()
624 || !strcmp(events_ent->d_name, "header_event") in add_tracepoint_multi_sys()
625 || !strcmp(events_ent->d_name, "header_page")) in add_tracepoint_multi_sys()
628 if (!strglobmatch(events_ent->d_name, sys_name)) in add_tracepoint_multi_sys()
631 ret = add_tracepoint_event(list, idx, events_ent->d_name, in add_tracepoint_multi_sys()
651 if (attr->bp_type & bit) \ in parse_breakpoint_type()
652 return -EINVAL; \ in parse_breakpoint_type()
654 attr->bp_type |= bit; \ in parse_breakpoint_type()
668 return -EINVAL; in parse_breakpoint_type()
674 if (!attr->bp_type) /* Default */ in parse_breakpoint_type()
675 attr->bp_type = HW_BREAKPOINT_R | HW_BREAKPOINT_W; in parse_breakpoint_type()
693 return -EINVAL; in parse_events_add_breakpoint()
709 if (config_attr(&attr, head_config, parse_state->error, in parse_events_add_breakpoint()
711 return -EINVAL; in parse_events_add_breakpoint()
714 return -ENOMEM; in parse_events_add_breakpoint()
719 return add_event(list, &parse_state->idx, &attr, name, /*mertic_id=*/NULL, in parse_events_add_breakpoint()
727 if (type == term->type_val) in check_type_val()
731 parse_events_error__handle(err, term->err_val, in check_type_val()
737 return -EINVAL; in check_type_val()
745 * Update according to parse-events.l in config_term_name()
758 [PARSE_EVENTS__TERM_TYPE_CALLGRAPH] = "call-graph", in config_term_name()
759 [PARSE_EVENTS__TERM_TYPE_STACKSIZE] = "stack-size", in config_term_name()
760 [PARSE_EVENTS__TERM_TYPE_NOINHERIT] = "no-inherit", in config_term_name()
762 [PARSE_EVENTS__TERM_TYPE_MAX_STACK] = "max-stack", in config_term_name()
765 [PARSE_EVENTS__TERM_TYPE_NOOVERWRITE] = "no-overwrite", in config_term_name()
766 [PARSE_EVENTS__TERM_TYPE_DRV_CFG] = "driver-config", in config_term_name()
768 [PARSE_EVENTS__TERM_TYPE_AUX_OUTPUT] = "aux-output", in config_term_name()
769 [PARSE_EVENTS__TERM_TYPE_AUX_SAMPLE_SIZE] = "aux-sample-size", in config_term_name()
770 [PARSE_EVENTS__TERM_TYPE_METRIC_ID] = "metric-id", in config_term_name()
772 [PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE] = "legacy-cache", in config_term_name()
787 parse_events_error__handle(err, -1, in config_term_avail()
829 parse_events_error__handle(err, -1, err_str, NULL); in config_term_avail()
846 return -EINVAL; \ in config_term_common()
849 switch (term->type_term) { in config_term_common()
852 attr->config = term->val.num; in config_term_common()
856 attr->config1 = term->val.num; in config_term_common()
860 attr->config2 = term->val.num; in config_term_common()
864 attr->config3 = term->val.num; in config_term_common()
874 if (strcmp(term->val.str, "no") && in config_term_common()
875 parse_branch_str(term->val.str, in config_term_common()
876 &attr->branch_sample_type)) { in config_term_common()
877 parse_events_error__handle(err, term->err_val, in config_term_common()
880 return -EINVAL; in config_term_common()
885 if (term->val.num > 1) { in config_term_common()
886 parse_events_error__handle(err, term->err_val, in config_term_common()
889 return -EINVAL; in config_term_common()
927 if ((unsigned int)term->val.num > 1) { in config_term_common()
928 parse_events_error__handle(err, term->err_val, in config_term_common()
931 return -EINVAL; in config_term_common()
939 if (term->val.num > UINT_MAX) { in config_term_common()
940 parse_events_error__handle(err, term->err_val, in config_term_common()
943 return -EINVAL; in config_term_common()
951 parse_events_error__handle(err, term->err_term, in config_term_common()
952 strdup(config_term_name(term->type_term)), in config_term_common()
954 return -EINVAL; in config_term_common()
966 if (!config_term_avail(term->type_term, err)) in config_term_common()
967 return -EINVAL; in config_term_common()
976 if (term->type_term == PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE) { in config_term_pmu()
977 const struct perf_pmu *pmu = perf_pmus__find_by_type(attr->type); in config_term_pmu()
982 if (asprintf(&err_str, "Failed to find PMU for type %d", attr->type) >= 0) in config_term_pmu()
983 parse_events_error__handle(err, term->err_term, in config_term_pmu()
985 return -EINVAL; in config_term_pmu()
988 attr->type = PERF_TYPE_HW_CACHE; in config_term_pmu()
989 return parse_events__decode_legacy_cache(term->config, pmu->type, in config_term_pmu()
990 &attr->config); in config_term_pmu()
992 term->type_term = PARSE_EVENTS__TERM_TYPE_USER; in config_term_pmu()
994 if (term->type_term == PARSE_EVENTS__TERM_TYPE_HARDWARE) { in config_term_pmu()
995 const struct perf_pmu *pmu = perf_pmus__find_by_type(attr->type); in config_term_pmu()
1000 if (asprintf(&err_str, "Failed to find PMU for type %d", attr->type) >= 0) in config_term_pmu()
1001 parse_events_error__handle(err, term->err_term, in config_term_pmu()
1003 return -EINVAL; in config_term_pmu()
1005 attr->type = PERF_TYPE_HARDWARE; in config_term_pmu()
1006 attr->config = term->val.num; in config_term_pmu()
1008 attr->config |= (__u64)pmu->type << PERF_PMU_TYPE_SHIFT; in config_term_pmu()
1011 if (term->type_term == PARSE_EVENTS__TERM_TYPE_USER || in config_term_pmu()
1012 term->type_term == PARSE_EVENTS__TERM_TYPE_DRV_CFG) { in config_term_pmu()
1014 * Always succeed for sysfs terms, as we dont know in config_term_pmu()
1027 switch (term->type_term) { in config_term_tracepoint()
1057 parse_events_error__handle(err, term->err_term, in config_term_tracepoint()
1058 strdup(config_term_name(term->type_term)), in config_term_tracepoint()
1059 strdup("valid terms: call-graph,stack-size\n")); in config_term_tracepoint()
1061 return -EINVAL; in config_term_tracepoint()
1077 return -EINVAL; in config_attr()
1090 return -ENOMEM; \ in get_config_terms()
1092 INIT_LIST_HEAD(&__t->list); \ in get_config_terms()
1093 __t->type = EVSEL__CONFIG_TERM_ ## __type; \ in get_config_terms()
1094 __t->weak = __weak; \ in get_config_terms()
1095 list_add_tail(&__t->list, head_terms) in get_config_terms()
1100 __t->val.__name = __val; \ in get_config_terms()
1106 __t->val.str = strdup(__val); \ in get_config_terms()
1107 if (!__t->val.str) { \ in get_config_terms()
1109 return -ENOMEM; \ in get_config_terms()
1111 __t->free_str = true; \ in get_config_terms()
1117 switch (term->type_term) { in get_config_terms()
1119 ADD_CONFIG_TERM_VAL(PERIOD, period, term->val.num, term->weak); in get_config_terms()
1122 ADD_CONFIG_TERM_VAL(FREQ, freq, term->val.num, term->weak); in get_config_terms()
1125 ADD_CONFIG_TERM_VAL(TIME, time, term->val.num, term->weak); in get_config_terms()
1128 ADD_CONFIG_TERM_STR(CALLGRAPH, term->val.str, term->weak); in get_config_terms()
1131 ADD_CONFIG_TERM_STR(BRANCH, term->val.str, term->weak); in get_config_terms()
1135 term->val.num, term->weak); in get_config_terms()
1139 term->val.num ? 1 : 0, term->weak); in get_config_terms()
1143 term->val.num ? 0 : 1, term->weak); in get_config_terms()
1147 term->val.num, term->weak); in get_config_terms()
1151 term->val.num, term->weak); in get_config_terms()
1155 term->val.num ? 1 : 0, term->weak); in get_config_terms()
1159 term->val.num ? 0 : 1, term->weak); in get_config_terms()
1162 ADD_CONFIG_TERM_STR(DRV_CFG, term->val.str, term->weak); in get_config_terms()
1166 term->val.num ? true : false, term->weak); in get_config_terms()
1170 term->val.num ? 1 : 0, term->weak); in get_config_terms()
1174 term->val.num, term->weak); in get_config_terms()
1195 * each bit of attr->config that the user has changed.
1205 switch (term->type_term) { in get_config_chgs()
1207 type = perf_pmu__format_type(pmu, term->config); in get_config_chgs()
1210 bits |= perf_pmu__format_bits(pmu, term->config); in get_config_chgs()
1263 return -EINVAL; in parse_events_add_tracepoint()
1278 parse_events_error__handle(err, loc->first_column, strdup("unsupported tracepoint"), in parse_events_add_tracepoint()
1280 return -1; in parse_events_add_tracepoint()
1303 if (config_attr(&attr, head_config, parse_state->error, in __parse_events_add_numeric()
1305 return -EINVAL; in __parse_events_add_numeric()
1308 return -ENOMEM; in __parse_events_add_numeric()
1313 ret = __add_event(list, &parse_state->idx, &attr, /*init_attr*/true, name, in __parse_events_add_numeric()
1315 /*cpu_list=*/NULL) ? 0 : -ENOMEM; in __parse_events_add_numeric()
1339 type, pmu->type, in parse_events_add_numeric()
1355 return add_event_tool(list, &parse_state->idx, tool_event); in parse_events_add_tool()
1363 if (term->type == EVSEL__CONFIG_TERM_PERCORE) in config_term_percore()
1364 return term->val.percore; in config_term_percore()
1379 struct parse_events_error *err = parse_state->error; in parse_events_add_pmu()
1383 pmu = parse_state->fake_pmu ?: perf_pmus__find(name); in parse_events_add_pmu()
1391 parse_events_error__handle(err, loc->first_column, err_str, NULL); in parse_events_add_pmu()
1392 return -EINVAL; in parse_events_add_pmu()
1399 if (pmu->selectable && !head_config) { in parse_events_add_pmu()
1412 if (pmu->default_config) { in parse_events_add_pmu()
1413 memcpy(&attr, pmu->default_config, in parse_events_add_pmu()
1418 attr.type = pmu->type; in parse_events_add_pmu()
1421 evsel = __add_event(list, &parse_state->idx, &attr, in parse_events_add_pmu()
1426 return evsel ? 0 : -ENOMEM; in parse_events_add_pmu()
1429 if (!parse_state->fake_pmu && perf_pmu__check_alias(pmu, head_config, &info, err)) in parse_events_add_pmu()
1430 return -EINVAL; in parse_events_add_pmu()
1445 if (config_attr(&attr, head_config, parse_state->error, config_term_pmu)) in parse_events_add_pmu()
1446 return -EINVAL; in parse_events_add_pmu()
1449 return -ENOMEM; in parse_events_add_pmu()
1452 * When using default config, record which bits of attr->config were in parse_events_add_pmu()
1455 if (pmu->default_config && get_config_chgs(pmu, head_config, &config_terms)) in parse_events_add_pmu()
1456 return -ENOMEM; in parse_events_add_pmu()
1458 if (!parse_state->fake_pmu && perf_pmu__config(pmu, &attr, head_config, parse_state->error)) { in parse_events_add_pmu()
1460 return -EINVAL; in parse_events_add_pmu()
1463 evsel = __add_event(list, &parse_state->idx, &attr, /*init_attr=*/true, in parse_events_add_pmu()
1468 return -ENOMEM; in parse_events_add_pmu()
1470 if (evsel->name) in parse_events_add_pmu()
1471 evsel->use_config_name = true; in parse_events_add_pmu()
1473 evsel->percore = config_term_percore(&evsel->config_terms); in parse_events_add_pmu()
1475 if (parse_state->fake_pmu) in parse_events_add_pmu()
1478 free((char *)evsel->unit); in parse_events_add_pmu()
1479 evsel->unit = strdup(info.unit); in parse_events_add_pmu()
1480 evsel->scale = info.scale; in parse_events_add_pmu()
1481 evsel->per_pkg = info.per_pkg; in parse_events_add_pmu()
1482 evsel->snapshot = info.snapshot; in parse_events_add_pmu()
1518 list_add_tail(&term->list, head); in parse_events_multi_pmu_add()
1538 if (!parse_events_add_pmu(parse_state, list, pmu->name, in parse_events_multi_pmu_add()
1544 pr_debug("%s -> %s/%s/\n", str, pmu->name, sb.buf); in parse_events_multi_pmu_add()
1551 if (parse_state->fake_pmu) { in parse_events_multi_pmu_add()
1558 pr_debug("%s -> %s/%s/\n", str, "fake_pmu", sb.buf); in parse_events_multi_pmu_add()
1571 return ok ? 0 : -1; in parse_events_multi_pmu_add()
1590 __perf_evlist__set_leader(list, &leader->core); in parse_events__set_leader()
1591 leader->group_name = name; in parse_events__set_leader()
1627 int eu = evsel ? evsel->core.attr.exclude_user : 0; in get_event_modifier()
1628 int ek = evsel ? evsel->core.attr.exclude_kernel : 0; in get_event_modifier()
1629 int eh = evsel ? evsel->core.attr.exclude_hv : 0; in get_event_modifier()
1630 int eH = evsel ? evsel->core.attr.exclude_host : 0; in get_event_modifier()
1631 int eG = evsel ? evsel->core.attr.exclude_guest : 0; in get_event_modifier()
1632 int eI = evsel ? evsel->core.attr.exclude_idle : 0; in get_event_modifier()
1633 int precise = evsel ? evsel->core.attr.precise_ip : 0; in get_event_modifier()
1636 int pinned = evsel ? evsel->core.attr.pinned : 0; in get_event_modifier()
1637 int exclusive = evsel ? evsel->core.attr.exclusive : 0; in get_event_modifier()
1640 int exclude_GH = evsel ? evsel->exclude_GH : 0; in get_event_modifier()
1697 * 0 - SAMPLE_IP can have arbitrary skid in get_event_modifier()
1698 * 1 - SAMPLE_IP must have constant skid in get_event_modifier()
1699 * 2 - SAMPLE_IP requested to have 0 skid in get_event_modifier()
1700 * 3 - SAMPLE_IP must have 0 skid in get_event_modifier()
1705 return -EINVAL; in get_event_modifier()
1707 mod->eu = eu; in get_event_modifier()
1708 mod->ek = ek; in get_event_modifier()
1709 mod->eh = eh; in get_event_modifier()
1710 mod->eH = eH; in get_event_modifier()
1711 mod->eG = eG; in get_event_modifier()
1712 mod->eI = eI; in get_event_modifier()
1713 mod->precise = precise; in get_event_modifier()
1714 mod->precise_max = precise_max; in get_event_modifier()
1715 mod->exclude_GH = exclude_GH; in get_event_modifier()
1716 mod->sample_read = sample_read; in get_event_modifier()
1717 mod->pinned = pinned; in get_event_modifier()
1718 mod->weak = weak; in get_event_modifier()
1719 mod->bpf_counter = bpf_counter; in get_event_modifier()
1720 mod->exclusive = exclusive; in get_event_modifier()
1726 * Basic modifier sanity check to validate it contains only one
1734 if (strlen(str) > (sizeof("ukhGHpppPSDIWeb") - 1)) in check_modifier()
1735 return -1; in check_modifier()
1739 return -1; in check_modifier()
1755 return -EINVAL; in parse_events__modifier_event()
1758 return -EINVAL; in parse_events__modifier_event()
1762 return -EINVAL; in parse_events__modifier_event()
1764 evsel->core.attr.exclude_user = mod.eu; in parse_events__modifier_event()
1765 evsel->core.attr.exclude_kernel = mod.ek; in parse_events__modifier_event()
1766 evsel->core.attr.exclude_hv = mod.eh; in parse_events__modifier_event()
1767 evsel->core.attr.precise_ip = mod.precise; in parse_events__modifier_event()
1768 evsel->core.attr.exclude_host = mod.eH; in parse_events__modifier_event()
1769 evsel->core.attr.exclude_guest = mod.eG; in parse_events__modifier_event()
1770 evsel->core.attr.exclude_idle = mod.eI; in parse_events__modifier_event()
1771 evsel->exclude_GH = mod.exclude_GH; in parse_events__modifier_event()
1772 evsel->sample_read = mod.sample_read; in parse_events__modifier_event()
1773 evsel->precise_max = mod.precise_max; in parse_events__modifier_event()
1774 evsel->weak_group = mod.weak; in parse_events__modifier_event()
1775 evsel->bpf_counter = mod.bpf_counter; in parse_events__modifier_event()
1778 evsel->core.attr.pinned = mod.pinned; in parse_events__modifier_event()
1779 evsel->core.attr.exclusive = mod.exclusive; in parse_events__modifier_event()
1791 if (!evsel->name) { in parse_events_name()
1792 evsel->name = strdup(name); in parse_events_name()
1793 if (!evsel->name) in parse_events_name()
1794 return -ENOMEM; in parse_events_name()
1873 return -EINVAL; in evsel__compute_group_pmu_name()
1875 group_pmu_name = pmu->name; in evsel__compute_group_pmu_name()
1878 * the pmu_name of the first non-software event to avoid breaking the in evsel__compute_group_pmu_name()
1893 * non-software PMU. for_each_group_(member|evsel) isn't used as in evsel__compute_group_pmu_name()
1898 group_pmu_name = leader_pmu->name; in evsel__compute_group_pmu_name()
1899 } else if (leader->core.nr_members > 1) { in evsel__compute_group_pmu_name()
1911 group_pmu_name = pos_pmu->name; in evsel__compute_group_pmu_name()
1918 evsel->group_pmu_name = strdup(group_pmu_name ?: "fake"); in evsel__compute_group_pmu_name()
1919 return evsel->group_pmu_name ? 0 : -ENOMEM; in evsel__compute_group_pmu_name()
1925 return lhs->core.idx - rhs->core.idx; in arch_evlist__cmp()
1943 * occurs. If both events don't have a group we want to fall-through to in evlist__cmp()
1947 if (lhs_core->leader != lhs_core || lhs_core->nr_members > 1) { in evlist__cmp()
1949 lhs_sort_idx = lhs_core->leader->idx; in evlist__cmp()
1952 lhs_sort_idx = *force_grouped_idx != -1 && arch_evsel__must_be_in_group(lhs) in evlist__cmp()
1954 : lhs_core->idx; in evlist__cmp()
1956 if (rhs_core->leader != rhs_core || rhs_core->nr_members > 1) { in evlist__cmp()
1958 rhs_sort_idx = rhs_core->leader->idx; in evlist__cmp()
1961 rhs_sort_idx = *force_grouped_idx != -1 && arch_evsel__must_be_in_group(rhs) in evlist__cmp()
1963 : rhs_core->idx; in evlist__cmp()
1967 return lhs_sort_idx - rhs_sort_idx; in evlist__cmp()
1971 lhs_pmu_name = lhs->group_pmu_name; in evlist__cmp()
1972 rhs_pmu_name = rhs->group_pmu_name; in evlist__cmp()
1984 int idx = 0, force_grouped_idx = -1; in parse_events__sort_events_and_fix_groups()
2010 pos->core.idx = idx++; in parse_events__sort_events_and_fix_groups()
2013 if (force_grouped_idx == -1 && pos == pos_leader && pos->core.nr_members < 2 && in parse_events__sort_events_and_fix_groups()
2015 force_grouped_idx = pos->core.idx; in parse_events__sort_events_and_fix_groups()
2028 const char *pos_pmu_name = pos->group_pmu_name; in parse_events__sort_events_and_fix_groups()
2030 bool pos_force_grouped = force_grouped_idx != -1 && in parse_events__sort_events_and_fix_groups()
2034 if (pos->core.idx != idx) in parse_events__sort_events_and_fix_groups()
2036 pos->core.idx = idx++; in parse_events__sort_events_and_fix_groups()
2037 pos->core.nr_members = 0; in parse_events__sort_events_and_fix_groups()
2046 cur_leader_pmu_name = cur_leader->group_pmu_name; in parse_events__sort_events_and_fix_groups()
2047 if ((cur_leaders_grp != pos->core.leader && in parse_events__sort_events_and_fix_groups()
2057 cur_leaders_grp = pos->core.leader; in parse_events__sort_events_and_fix_groups()
2074 pos_leader->core.nr_members++; in parse_events__sort_events_and_fix_groups()
2085 .idx = evlist->core.nr_entries, in __parse_events()
2098 return -1; in __parse_events()
2117 last->cmdline_group_boundary = true; in __parse_events()
2123 * There are 2 users - builtin-record and builtin-test objects. in __parse_events()
2124 * Both call evlist__delete in case of error, so we dont in __parse_events()
2148 zfree(&err->str); in parse_events_error__exit()
2149 zfree(&err->help); in parse_events_error__exit()
2150 zfree(&err->first_str); in parse_events_error__exit()
2151 zfree(&err->first_help); in parse_events_error__exit()
2159 switch (err->num_errors) { in parse_events_error__handle()
2161 err->idx = idx; in parse_events_error__handle()
2162 err->str = str; in parse_events_error__handle()
2163 err->help = help; in parse_events_error__handle()
2166 err->first_idx = err->idx; in parse_events_error__handle()
2167 err->idx = idx; in parse_events_error__handle()
2168 err->first_str = err->str; in parse_events_error__handle()
2169 err->str = str; in parse_events_error__handle()
2170 err->first_help = err->help; in parse_events_error__handle()
2171 err->help = help; in parse_events_error__handle()
2175 err->str, err->help ?: "<no help>"); in parse_events_error__handle()
2176 free(err->str); in parse_events_error__handle()
2177 err->str = str; in parse_events_error__handle()
2178 free(err->help); in parse_events_error__handle()
2179 err->help = help; in parse_events_error__handle()
2182 err->num_errors++; in parse_events_error__handle()
2207 /* -2 for extra '' in the final fprintf */ in __parse_events_error__print()
2208 int width = get_term_width() - 2; in __parse_events_error__print()
2224 max_len = width - len_str; in __parse_events_error__print()
2230 cut = err_idx - max_err_idx; in __parse_events_error__print()
2238 if ((len_event - cut) > max_len) { in __parse_events_error__print()
2239 buf[max_len - 1] = buf[max_len - 2] = '.'; in __parse_events_error__print()
2243 idx = len_str + err_idx - cut; in __parse_events_error__print()
2257 if (!err->num_errors) in parse_events_error__print()
2260 __parse_events_error__print(err->idx, err->str, err->help, event); in parse_events_error__print()
2262 if (err->num_errors > 1) { in parse_events_error__print()
2264 __parse_events_error__print(err->first_idx, err->first_str, in parse_events_error__print()
2265 err->first_help, event); in parse_events_error__print()
2274 struct parse_events_option_args *args = opt->value; in parse_events_option()
2279 ret = __parse_events(*args->evlistp, str, args->pmu_filter, &err, in parse_events_option()
2293 struct parse_events_option_args *args = opt->value; in parse_events_option_new_evlist()
2296 if (*args->evlistp == NULL) { in parse_events_option_new_evlist()
2297 *args->evlistp = evlist__new(); in parse_events_option_new_evlist()
2299 if (*args->evlistp == NULL) { in parse_events_option_new_evlist()
2301 return -1; in parse_events_option_new_evlist()
2306 evlist__delete(*args->evlistp); in parse_events_option_new_evlist()
2307 *args->evlistp = NULL; in parse_events_option_new_evlist()
2328 if (evlist->core.nr_entries > 0) in foreach_evsel_in_last_glob()
2334 return -1; in foreach_evsel_in_last_glob()
2338 if (last->core.node.prev == &evlist->core.entries) in foreach_evsel_in_last_glob()
2340 last = list_entry(last->core.node.prev, struct evsel, core.node); in foreach_evsel_in_last_glob()
2341 } while (!last->cmdline_group_boundary); in foreach_evsel_in_last_glob()
2355 "--filter option should follow a -e tracepoint or HW tracer option\n"); in set_filter()
2356 return -1; in set_filter()
2359 if (evsel->core.attr.type == PERF_TYPE_TRACEPOINT) { in set_filter()
2363 return -1; in set_filter()
2370 if (pmu->type == evsel->core.attr.type) { in set_filter()
2380 return perf_bpf_filter__parse(&evsel->bpf_filters, str); in set_filter()
2385 return -1; in set_filter()
2394 struct evlist *evlist = *(struct evlist **)opt->value; in parse_filter()
2405 if (evsel == NULL || evsel->core.attr.type != PERF_TYPE_TRACEPOINT) { in add_exclude_perf_filter()
2407 "--exclude-perf option should follow a -e tracepoint option\n"); in add_exclude_perf_filter()
2408 return -1; in add_exclude_perf_filter()
2416 return -1; in add_exclude_perf_filter()
2426 struct evlist *evlist = *(struct evlist **)opt->value; in exclude_perf()
2434 return term->type_term != PARSE_EVENTS__TERM_TYPE_USER; in parse_events__is_hardcoded_term()
2445 return -ENOMEM; in new_term()
2448 INIT_LIST_HEAD(&term->list); in new_term()
2449 term->weak = false; in new_term()
2451 switch (term->type_val) { in new_term()
2453 term->val.num = num; in new_term()
2456 term->val.str = str; in new_term()
2460 return -EINVAL; in new_term()
2481 .err_term = loc_term ? loc_term->first_column : 0, in parse_events_term__num()
2482 .err_val = loc_val ? loc_val->first_column : 0, in parse_events_term__num()
2500 .err_term = loc_term ? loc_term->first_column : 0, in parse_events_term__str()
2501 .err_val = loc_val ? loc_val->first_column : 0, in parse_events_term__str()
2524 if (term->config) { in parse_events_term__clone()
2525 temp.config = strdup(term->config); in parse_events_term__clone()
2527 return -ENOMEM; in parse_events_term__clone()
2529 if (term->type_val == PARSE_EVENTS__TERM_TYPE_NUM) in parse_events_term__clone()
2530 return new_term(new, &temp, /*str=*/NULL, term->val.num); in parse_events_term__clone()
2532 str = strdup(term->val.str); in parse_events_term__clone()
2534 return -ENOMEM; in parse_events_term__clone()
2540 if (term->type_val != PARSE_EVENTS__TERM_TYPE_NUM) in parse_events_term__delete()
2541 zfree(&term->val.str); in parse_events_term__delete()
2543 zfree(&term->config); in parse_events_term__delete()
2560 return -ENOMEM; in parse_events_copy_term_list()
2567 list_add_tail(&n->list, *new); in parse_events_copy_term_list()
2577 list_del_init(&term->list); in parse_events_terms__purge()
2608 if (term->type_val == PARSE_EVENTS__TERM_TYPE_NUM) in parse_events_term__to_strbuf()
2609 if (term->no_value) { in parse_events_term__to_strbuf()
2610 assert(term->val.num == 1); in parse_events_term__to_strbuf()
2611 ret = strbuf_addf(sb, "%s", term->config); in parse_events_term__to_strbuf()
2613 ret = strbuf_addf(sb, "%s=%#"PRIx64, term->config, term->val.num); in parse_events_term__to_strbuf()
2614 else if (term->type_val == PARSE_EVENTS__TERM_TYPE_STR) { in parse_events_term__to_strbuf()
2615 if (term->config) { in parse_events_term__to_strbuf()
2616 ret = strbuf_addf(sb, "%s=", term->config); in parse_events_term__to_strbuf()
2619 } else if ((unsigned int)term->type_term < __PARSE_EVENTS__TERM_TYPE_NR) { in parse_events_term__to_strbuf()
2620 ret = strbuf_addf(sb, "%s=", config_term_name(term->type_term)); in parse_events_term__to_strbuf()
2624 assert(!term->no_value); in parse_events_term__to_strbuf()
2625 ret = strbuf_addf(sb, "%s", term->val.str); in parse_events_term__to_strbuf()
2636 if (!parse_state->error) in parse_events_evlist_error()
2639 parse_events_error__handle(parse_state->error, idx, strdup(str), NULL); in parse_events_evlist_error()
2676 /* "no-overwrite" is the longest name */ in parse_events_formats_error_string()
2678 (sizeof("no-overwrite") - 1)]; in parse_events_formats_error_string()