Lines Matching +full:long +full:- +full:term

1 // SPDX-License-Identifier: GPL-2.0
10 #include "term.h"
14 #include <subcmd/parse-options.h>
15 #include "parse-events.h"
21 #include <util/parse-events-bison.h>
22 #include <util/parse-events-flex.h>
26 #include "util/parse-branch-options.h"
29 #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()
159 struct parse_events_term *term; in get_config_str() local
164 list_for_each_entry(term, &head_terms->terms, list) in get_config_str()
165 if (term->type_term == type_term) in get_config_str()
166 return term->val.str; in get_config_str()
182 * fix_raw - For each raw term see if there is an event (aka alias) in pmu that
184 * event then change the term to be an event, if not then change it to
185 * be a config term. For example, "read" may be an event of the PMU or
186 * a raw hex encoding of 0xead. The fix-up is done late so the PMU of
188 * ahead-of-time.
189 * @config_terms: the list of terms that may contain a raw term.
194 struct parse_events_term *term; in fix_raw() local
196 list_for_each_entry(term, &config_terms->terms, list) { in fix_raw()
199 if (term->type_term != PARSE_EVENTS__TERM_TYPE_RAW) in fix_raw()
202 if (perf_pmu__have_event(pmu, term->val.str)) { in fix_raw()
203 zfree(&term->config); in fix_raw()
204 term->config = term->val.str; in fix_raw()
205 term->type_val = PARSE_EVENTS__TERM_TYPE_NUM; in fix_raw()
206 term->type_term = PARSE_EVENTS__TERM_TYPE_USER; in fix_raw()
207 term->val.num = 1; in fix_raw()
208 term->no_value = true; in fix_raw()
212 zfree(&term->config); in fix_raw()
213 term->config = strdup("config"); in fix_raw()
215 num = strtoull(term->val.str + 1, NULL, 16); in fix_raw()
217 free(term->val.str); in fix_raw()
218 term->type_val = PARSE_EVENTS__TERM_TYPE_NUM; in fix_raw()
219 term->type_term = PARSE_EVENTS__TERM_TYPE_CONFIG; in fix_raw()
220 term->val.num = num; in fix_raw()
221 term->no_value = false; in fix_raw()
234 struct perf_cpu_map *cpus = perf_cpu_map__is_empty(cpu_list) && pmu ? pmu->cpus : cpu_list; in __add_event()
240 if (pmu && (attr->type == PERF_TYPE_RAW || attr->type >= PERF_TYPE_MAX)) { in __add_event()
241 perf_pmu__warn_invalid_config(pmu, attr->config, name, in __add_event()
243 perf_pmu__warn_invalid_config(pmu, attr->config1, name, in __add_event()
245 perf_pmu__warn_invalid_config(pmu, attr->config2, name, in __add_event()
247 perf_pmu__warn_invalid_config(pmu, attr->config3, name, in __add_event()
260 evsel->core.cpus = cpus; in __add_event()
261 evsel->core.own_cpus = perf_cpu_map__get(cpus); in __add_event()
262 evsel->core.requires_cpu = pmu ? pmu->is_uncore : false; in __add_event()
263 evsel->core.is_pmu_core = pmu ? pmu->is_core : false; in __add_event()
264 evsel->auto_merge_stats = auto_merge_stats; in __add_event()
265 evsel->pmu = pmu; in __add_event()
266 evsel->alternate_hw_config = alternate_hw_config; in __add_event()
269 evsel->name = strdup(name); in __add_event()
272 evsel->metric_id = strdup(metric_id); in __add_event()
275 list_splice_init(config_terms, &evsel->config_terms); in __add_event()
278 list_add_tail(&evsel->core.node, list); in __add_event()
301 alternate_hw_config) ? 0 : -ENOMEM; in add_event()
305 * parse_aliases - search names for entries beginning or equalling str ignoring
316 *longest = -1; in parse_aliases()
328 return -1; in parse_aliases()
332 struct parse_events_term *term,
335 struct parse_events_term *term,
343 * parse_events__decode_legacy_cache - Search name for the legacy cache event
354 int len, cache_type = -1, cache_op = -1, cache_result = -1; in parse_events__decode_legacy_cache()
359 if (cache_type == -1) in parse_events__decode_legacy_cache()
360 return -EINVAL; in parse_events__decode_legacy_cache()
368 return -EINVAL; in parse_events__decode_legacy_cache()
383 return -EINVAL; in parse_events__decode_legacy_cache()
394 if (cache_op == -1) in parse_events__decode_legacy_cache()
400 if (cache_result == -1) in parse_events__decode_legacy_cache()
410 * parse_events__filter_pmu - returns false if a wildcard PMU should be
416 if (parse_state->pmu_filter == NULL) in parse_events__filter_pmu()
419 return strcmp(parse_state->pmu_filter, pmu->name) != 0; in parse_events__filter_pmu()
458 if (!pmu->is_core) { in parse_events_add_cache()
466 ret = parse_events__decode_legacy_cache(name, pmu->type, &attr.config); in parse_events_add_cache()
473 if (config_attr(&attr, parsed_terms, parse_state->error, in parse_events_add_cache()
475 return -EINVAL; in parse_events_add_cache()
478 return -ENOMEM; in parse_events_add_cache()
485 return -ENOMEM; in parse_events_add_cache()
489 return found_supported ? 0 : -EINVAL; in parse_events_add_cache()
530 struct evsel *evsel = evsel__newtp_idx(sys_name, evt_name, parse_state->idx++, in add_tracepoint()
531 !parse_state->fake_tp); in add_tracepoint()
534 tracepoint_error(err, PTR_ERR(evsel), sys_name, evt_name, loc->first_column); in add_tracepoint()
542 return -ENOMEM; in add_tracepoint()
543 list_splice(&config_terms, &evsel->config_terms); in add_tracepoint()
546 list_add_tail(&evsel->core.node, list); in add_tracepoint()
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()
569 tracepoint_error(err, errno, sys_name, evt_name, loc->first_column); in add_tracepoint_multi_event()
570 return -1; in add_tracepoint_multi_event()
574 if (!strcmp(evt_ent->d_name, ".") in add_tracepoint_multi_event()
575 || !strcmp(evt_ent->d_name, "..") in add_tracepoint_multi_event()
576 || !strcmp(evt_ent->d_name, "enable") in add_tracepoint_multi_event()
577 || !strcmp(evt_ent->d_name, "filter")) in add_tracepoint_multi_event()
580 if (!strglobmatch(evt_ent->d_name, evt_name)) in add_tracepoint_multi_event()
585 ret = add_tracepoint(parse_state, list, sys_name, evt_ent->d_name, in add_tracepoint_multi_event()
590 tracepoint_error(err, ENOENT, sys_name, evt_name, loc->first_column); in add_tracepoint_multi_event()
591 ret = -1; in add_tracepoint_multi_event()
624 tracepoint_error(err, errno, sys_name, evt_name, loc->first_column); in add_tracepoint_multi_sys()
625 return -1; in add_tracepoint_multi_sys()
629 if (!strcmp(events_ent->d_name, ".") in add_tracepoint_multi_sys()
630 || !strcmp(events_ent->d_name, "..") in add_tracepoint_multi_sys()
631 || !strcmp(events_ent->d_name, "enable") in add_tracepoint_multi_sys()
632 || !strcmp(events_ent->d_name, "header_event") in add_tracepoint_multi_sys()
633 || !strcmp(events_ent->d_name, "header_page")) in add_tracepoint_multi_sys()
636 if (!strglobmatch(events_ent->d_name, sys_name)) in add_tracepoint_multi_sys()
639 ret = add_tracepoint_event(parse_state, list, events_ent->d_name, in add_tracepoint_multi_sys()
656 len = perf_env__kernel_is_64_bit(&env) ? sizeof(u64) : sizeof(long); in default_breakpoint_len()
663 return sizeof(long); in default_breakpoint_len()
678 if (attr->bp_type & bit) \ in parse_breakpoint_type()
679 return -EINVAL; \ in parse_breakpoint_type()
681 attr->bp_type |= bit; \ in parse_breakpoint_type()
695 return -EINVAL; in parse_breakpoint_type()
701 if (!attr->bp_type) /* Default */ in parse_breakpoint_type()
702 attr->bp_type = HW_BREAKPOINT_R | HW_BREAKPOINT_W; in parse_breakpoint_type()
720 return -EINVAL; in parse_events_add_breakpoint()
736 if (config_attr(&attr, head_config, parse_state->error, in parse_events_add_breakpoint()
738 return -EINVAL; in parse_events_add_breakpoint()
741 return -ENOMEM; in parse_events_add_breakpoint()
746 return add_event(list, &parse_state->idx, &attr, name, /*mertic_id=*/NULL, in parse_events_add_breakpoint()
750 static int check_type_val(struct parse_events_term *term, in check_type_val() argument
754 if (type == term->type_val) in check_type_val()
758 parse_events_error__handle(err, term->err_val, in check_type_val()
764 return -EINVAL; in check_type_val()
772 * Update according to parse-events.l in parse_events__term_type_str()
775 [PARSE_EVENTS__TERM_TYPE_USER] = "<sysfs term>", in parse_events__term_type_str()
785 [PARSE_EVENTS__TERM_TYPE_CALLGRAPH] = "call-graph", in parse_events__term_type_str()
786 [PARSE_EVENTS__TERM_TYPE_STACKSIZE] = "stack-size", in parse_events__term_type_str()
787 [PARSE_EVENTS__TERM_TYPE_NOINHERIT] = "no-inherit", in parse_events__term_type_str()
789 [PARSE_EVENTS__TERM_TYPE_MAX_STACK] = "max-stack", in parse_events__term_type_str()
792 [PARSE_EVENTS__TERM_TYPE_NOOVERWRITE] = "no-overwrite", in parse_events__term_type_str()
793 [PARSE_EVENTS__TERM_TYPE_DRV_CFG] = "driver-config", in parse_events__term_type_str()
795 [PARSE_EVENTS__TERM_TYPE_AUX_OUTPUT] = "aux-output", in parse_events__term_type_str()
796 [PARSE_EVENTS__TERM_TYPE_AUX_ACTION] = "aux-action", in parse_events__term_type_str()
797 [PARSE_EVENTS__TERM_TYPE_AUX_SAMPLE_SIZE] = "aux-sample-size", in parse_events__term_type_str()
798 [PARSE_EVENTS__TERM_TYPE_METRIC_ID] = "metric-id", in parse_events__term_type_str()
800 [PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE] = "legacy-cache", in parse_events__term_type_str()
804 return "unknown term"; in parse_events__term_type_str()
815 parse_events_error__handle(err, -1, in config_term_avail()
858 parse_events_error__handle(err, -1, err_str, NULL); in config_term_avail()
869 struct parse_events_term *term, in config_term_common() argument
874 if (check_type_val(term, err, PARSE_EVENTS__TERM_TYPE_ ## type)) \ in config_term_common()
875 return -EINVAL; \ in config_term_common()
878 switch (term->type_term) { in config_term_common()
881 attr->config = term->val.num; in config_term_common()
885 attr->config1 = term->val.num; in config_term_common()
889 attr->config2 = term->val.num; in config_term_common()
893 attr->config3 = term->val.num; in config_term_common()
903 if (strcmp(term->val.str, "no") && in config_term_common()
904 parse_branch_str(term->val.str, in config_term_common()
905 &attr->branch_sample_type)) { in config_term_common()
906 parse_events_error__handle(err, term->err_val, in config_term_common()
909 return -EINVAL; in config_term_common()
914 if (term->val.num > 1) { in config_term_common()
915 parse_events_error__handle(err, term->err_val, in config_term_common()
918 return -EINVAL; in config_term_common()
956 if ((unsigned int)term->val.num > 1) { in config_term_common()
957 parse_events_error__handle(err, term->err_val, in config_term_common()
960 return -EINVAL; in config_term_common()
971 if (term->val.num > UINT_MAX) { in config_term_common()
972 parse_events_error__handle(err, term->err_val, in config_term_common()
975 return -EINVAL; in config_term_common()
983 parse_events_error__handle(err, term->err_term, in config_term_common()
984 strdup(parse_events__term_type_str(term->type_term)), in config_term_common()
986 return -EINVAL; in config_term_common()
990 * Check term availability after basic checking so in config_term_common()
994 * user will see "'<sysfs term>' is not usable in 'perf stat'" in config_term_common()
995 * if an invalid config term is provided for legacy events in config_term_common()
998 if (!config_term_avail(term->type_term, err)) in config_term_common()
999 return -EINVAL; in config_term_common()
1005 struct parse_events_term *term, in config_term_pmu() argument
1008 if (term->type_term == PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE) { in config_term_pmu()
1009 struct perf_pmu *pmu = perf_pmus__find_by_type(attr->type); in config_term_pmu()
1014 if (asprintf(&err_str, "Failed to find PMU for type %d", attr->type) >= 0) in config_term_pmu()
1015 parse_events_error__handle(err, term->err_term, in config_term_pmu()
1017 return -EINVAL; in config_term_pmu()
1025 !perf_pmu__have_event(pmu, term->config)) { in config_term_pmu()
1026 attr->type = PERF_TYPE_HW_CACHE; in config_term_pmu()
1027 return parse_events__decode_legacy_cache(term->config, pmu->type, in config_term_pmu()
1028 &attr->config); in config_term_pmu()
1030 term->type_term = PARSE_EVENTS__TERM_TYPE_USER; in config_term_pmu()
1031 term->no_value = true; in config_term_pmu()
1034 if (term->type_term == PARSE_EVENTS__TERM_TYPE_HARDWARE) { in config_term_pmu()
1035 struct perf_pmu *pmu = perf_pmus__find_by_type(attr->type); in config_term_pmu()
1040 if (asprintf(&err_str, "Failed to find PMU for type %d", attr->type) >= 0) in config_term_pmu()
1041 parse_events_error__handle(err, term->err_term, in config_term_pmu()
1043 return -EINVAL; in config_term_pmu()
1049 if (perf_pmu__have_event(pmu, term->config)) { in config_term_pmu()
1050 term->type_term = PARSE_EVENTS__TERM_TYPE_USER; in config_term_pmu()
1051 term->no_value = true; in config_term_pmu()
1052 term->alternate_hw_config = true; in config_term_pmu()
1054 attr->type = PERF_TYPE_HARDWARE; in config_term_pmu()
1055 attr->config = term->val.num; in config_term_pmu()
1057 attr->config |= (__u64)pmu->type << PERF_PMU_TYPE_SHIFT; in config_term_pmu()
1061 if (term->type_term == PARSE_EVENTS__TERM_TYPE_USER || in config_term_pmu()
1062 term->type_term == PARSE_EVENTS__TERM_TYPE_DRV_CFG) { in config_term_pmu()
1069 return config_term_common(attr, term, err); in config_term_pmu()
1073 struct parse_events_term *term, in config_term_tracepoint() argument
1076 switch (term->type_term) { in config_term_tracepoint()
1088 return config_term_common(attr, term, err); in config_term_tracepoint()
1107 parse_events_error__handle(err, term->err_term, in config_term_tracepoint()
1108 strdup(parse_events__term_type_str(term->type_term)), in config_term_tracepoint()
1109 strdup("valid terms: call-graph,stack-size\n") in config_term_tracepoint()
1112 return -EINVAL; in config_term_tracepoint()
1123 struct parse_events_term *term; in config_attr() local
1125 list_for_each_entry(term, &head->terms, list) in config_attr()
1126 if (config_term(attr, term, err)) in config_attr()
1127 return -EINVAL; in config_attr()
1140 return -ENOMEM; \ in get_config_terms()
1142 INIT_LIST_HEAD(&__t->list); \ in get_config_terms()
1143 __t->type = EVSEL__CONFIG_TERM_ ## __type; \ in get_config_terms()
1144 __t->weak = __weak; \ in get_config_terms()
1145 list_add_tail(&__t->list, head_terms) in get_config_terms()
1150 __t->val.__name = __val; \ in get_config_terms()
1156 __t->val.str = strdup(__val); \ in get_config_terms()
1157 if (!__t->val.str) { \ in get_config_terms()
1159 return -ENOMEM; \ in get_config_terms()
1161 __t->free_str = true; \ in get_config_terms()
1164 struct parse_events_term *term; in get_config_terms() local
1166 list_for_each_entry(term, &head_config->terms, list) { in get_config_terms()
1167 switch (term->type_term) { in get_config_terms()
1169 ADD_CONFIG_TERM_VAL(PERIOD, period, term->val.num, term->weak); in get_config_terms()
1172 ADD_CONFIG_TERM_VAL(FREQ, freq, term->val.num, term->weak); in get_config_terms()
1175 ADD_CONFIG_TERM_VAL(TIME, time, term->val.num, term->weak); in get_config_terms()
1178 ADD_CONFIG_TERM_STR(CALLGRAPH, term->val.str, term->weak); in get_config_terms()
1181 ADD_CONFIG_TERM_STR(BRANCH, term->val.str, term->weak); in get_config_terms()
1185 term->val.num, term->weak); in get_config_terms()
1189 term->val.num ? 1 : 0, term->weak); in get_config_terms()
1193 term->val.num ? 0 : 1, term->weak); in get_config_terms()
1197 term->val.num, term->weak); in get_config_terms()
1201 term->val.num, term->weak); in get_config_terms()
1205 term->val.num ? 1 : 0, term->weak); in get_config_terms()
1209 term->val.num ? 0 : 1, term->weak); in get_config_terms()
1212 ADD_CONFIG_TERM_STR(DRV_CFG, term->val.str, term->weak); in get_config_terms()
1216 term->val.num ? true : false, term->weak); in get_config_terms()
1220 term->val.num ? 1 : 0, term->weak); in get_config_terms()
1223 ADD_CONFIG_TERM_STR(AUX_ACTION, term->val.str, term->weak); in get_config_terms()
1227 term->val.num, term->weak); in get_config_terms()
1248 * each bit of attr->config that the user has changed.
1253 struct parse_events_term *term; in get_config_chgs() local
1257 list_for_each_entry(term, &head_config->terms, list) { in get_config_chgs()
1258 switch (term->type_term) { in get_config_chgs()
1260 type = perf_pmu__format_type(pmu, term->config); in get_config_chgs()
1263 bits |= perf_pmu__format_bits(pmu, term->config); in get_config_chgs()
1318 return -EINVAL; in parse_events_add_tracepoint()
1348 if (config_attr(&attr, head_config, parse_state->error, in __parse_events_add_numeric()
1350 return -EINVAL; in __parse_events_add_numeric()
1353 return -ENOMEM; in __parse_events_add_numeric()
1358 ret = __add_event(list, &parse_state->idx, &attr, /*init_attr*/true, name, in __parse_events_add_numeric()
1361 ) == NULL ? -ENOMEM : 0; in __parse_events_add_numeric()
1385 type, pmu->type, in parse_events_add_numeric()
1399 struct evsel_config_term *term; in config_term_percore() local
1401 list_for_each_entry(term, config_terms, list) { in config_term_percore()
1402 if (term->type == EVSEL__CONFIG_TERM_PERCORE) in config_term_percore()
1403 return term->val.percore; in config_term_percore()
1417 struct parse_events_error *err = parse_state->error; in parse_events_add_pmu()
1426 if (pmu->selectable && const_parsed_terms && in parse_events_add_pmu()
1427 list_empty(&const_parsed_terms->terms)) { in parse_events_add_pmu()
1428 strbuf_addf(&sb, "%s//", pmu->name); in parse_events_add_pmu()
1430 strbuf_addf(&sb, "%s/", pmu->name); in parse_events_add_pmu()
1439 if (pmu->perf_event_attr_init_default) in parse_events_add_pmu()
1440 pmu->perf_event_attr_init_default(pmu, &attr); in parse_events_add_pmu()
1442 attr.type = pmu->type; in parse_events_add_pmu()
1444 if (!const_parsed_terms || list_empty(&const_parsed_terms->terms)) { in parse_events_add_pmu()
1445 evsel = __add_event(list, &parse_state->idx, &attr, in parse_events_add_pmu()
1450 return evsel ? 0 : -ENOMEM; in parse_events_add_pmu()
1463 if (config_attr(&attr, &parsed_terms, parse_state->error, config_term_pmu)) { in parse_events_add_pmu()
1465 return -EINVAL; in parse_events_add_pmu()
1473 return -EINVAL; in parse_events_add_pmu()
1481 fprintf(stderr, "..after resolving event: %s/%s/\n", pmu->name, sb.buf); in parse_events_add_pmu()
1487 config_attr(&attr, &parsed_terms, parse_state->error, config_term_pmu)) { in parse_events_add_pmu()
1489 return -EINVAL; in parse_events_add_pmu()
1494 return -ENOMEM; in parse_events_add_pmu()
1498 * When using default config, record which bits of attr->config were in parse_events_add_pmu()
1501 if (pmu->perf_event_attr_init_default && in parse_events_add_pmu()
1504 return -ENOMEM; in parse_events_add_pmu()
1509 parse_state->error)) { in parse_events_add_pmu()
1512 return -EINVAL; in parse_events_add_pmu()
1515 evsel = __add_event(list, &parse_state->idx, &attr, /*init_attr=*/true, in parse_events_add_pmu()
1522 return -ENOMEM; in parse_events_add_pmu()
1525 if (evsel->name) in parse_events_add_pmu()
1526 evsel->use_config_name = true; in parse_events_add_pmu()
1528 evsel->percore = config_term_percore(&evsel->config_terms); in parse_events_add_pmu()
1531 free((char *)evsel->unit); in parse_events_add_pmu()
1532 evsel->unit = strdup(info.unit); in parse_events_add_pmu()
1533 evsel->scale = info.scale; in parse_events_add_pmu()
1534 evsel->per_pkg = info.per_pkg; in parse_events_add_pmu()
1535 evsel->snapshot = info.snapshot; in parse_events_add_pmu()
1544 struct parse_events_term *term; in parse_events_multi_pmu_add() local
1566 if (parse_events_term__num(&term, in parse_events_multi_pmu_add()
1573 list_add_tail(&term->list, &parsed_terms.terms); in parse_events_multi_pmu_add()
1598 pr_debug("%s -> %s/%s/\n", event_name, pmu->name, sb.buf); in parse_events_multi_pmu_add()
1604 if (parse_state->fake_pmu) { in parse_events_multi_pmu_add()
1611 pr_debug("%s -> fake/%s/\n", event_name, sb.buf); in parse_events_multi_pmu_add()
1624 return ok ? 0 : -1; in parse_events_multi_pmu_add()
1640 return -ENOMEM; in parse_events_multi_pmu_add_or_add_pmu()
1651 if (parse_state->fake_pmu) { in parse_events_multi_pmu_add_or_add_pmu()
1671 parse_state->wild_card_pmus = true; in parse_events_multi_pmu_add_or_add_pmu()
1686 parse_events_error__handle(parse_state->error, loc->first_column, in parse_events_multi_pmu_add_or_add_pmu()
1690 return -EINVAL; in parse_events_multi_pmu_add_or_add_pmu()
1703 __perf_evlist__set_leader(list, &leader->core); in parse_events__set_leader()
1704 zfree(&leader->group_name); in parse_events__set_leader()
1705 leader->group_name = name; in parse_events__set_leader()
1717 parse_events_error__handle(parse_state->error, loc->first_column, in parse_events__modifier_list()
1719 return -EINVAL; in parse_events__modifier_list()
1724 int eu = group ? evsel->core.attr.exclude_user : 0; in parse_events__modifier_list()
1725 int ek = group ? evsel->core.attr.exclude_kernel : 0; in parse_events__modifier_list()
1726 int eh = group ? evsel->core.attr.exclude_hv : 0; in parse_events__modifier_list()
1727 int eH = group ? evsel->core.attr.exclude_host : 0; in parse_events__modifier_list()
1728 int eG = group ? evsel->core.attr.exclude_guest : 0; in parse_events__modifier_list()
1730 int exclude_GH = group ? evsel->exclude_GH : 0; in parse_events__modifier_list()
1759 evsel->core.attr.exclude_user = eu; in parse_events__modifier_list()
1760 evsel->core.attr.exclude_kernel = ek; in parse_events__modifier_list()
1761 evsel->core.attr.exclude_hv = eh; in parse_events__modifier_list()
1762 evsel->core.attr.exclude_host = eH; in parse_events__modifier_list()
1763 evsel->core.attr.exclude_guest = eG; in parse_events__modifier_list()
1764 evsel->exclude_GH = exclude_GH; in parse_events__modifier_list()
1768 u8 precise = evsel->core.attr.precise_ip + mod.precise; in parse_events__modifier_list()
1772 * 0 - SAMPLE_IP can have arbitrary skid in parse_events__modifier_list()
1773 * 1 - SAMPLE_IP must have constant skid in parse_events__modifier_list()
1774 * 2 - SAMPLE_IP requested to have 0 skid in parse_events__modifier_list()
1775 * 3 - SAMPLE_IP must have 0 skid in parse_events__modifier_list()
1785 parse_events_error__handle(parse_state->error, in parse_events__modifier_list()
1786 loc->first_column, in parse_events__modifier_list()
1789 return -EINVAL; in parse_events__modifier_list()
1791 evsel->core.attr.precise_ip = precise; in parse_events__modifier_list()
1794 evsel->precise_max = 1; in parse_events__modifier_list()
1796 evsel->core.attr.exclude_idle = 1; in parse_events__modifier_list()
1798 evsel->sample_read = 1; in parse_events__modifier_list()
1800 evsel->core.attr.pinned = 1; in parse_events__modifier_list()
1802 evsel->core.attr.exclusive = 1; in parse_events__modifier_list()
1804 evsel->weak_group = true; in parse_events__modifier_list()
1806 evsel->bpf_counter = true; in parse_events__modifier_list()
1808 evsel->retire_lat = true; in parse_events__modifier_list()
1833 if (!evsel->name) { in parse_events__set_default_name()
1834 evsel->name = used_name ? strdup(name) : name; in parse_events__set_default_name()
1836 if (!evsel->name) in parse_events__set_default_name()
1837 return -ENOMEM; in parse_events__set_default_name()
1889 list_splice(&parse_state.terms->terms, &terms->terms); in parse_events_terms()
1913 return -EINVAL; in evsel__compute_group_pmu_name()
1915 group_pmu_name = pmu->name; in evsel__compute_group_pmu_name()
1918 * the pmu_name of the first non-software event to avoid breaking the in evsel__compute_group_pmu_name()
1933 * non-software PMU. for_each_group_(member|evsel) isn't used as in evsel__compute_group_pmu_name()
1938 group_pmu_name = leader_pmu->name; in evsel__compute_group_pmu_name()
1939 } else if (leader->core.nr_members > 1) { in evsel__compute_group_pmu_name()
1951 group_pmu_name = pos_pmu->name; in evsel__compute_group_pmu_name()
1958 evsel->group_pmu_name = strdup(group_pmu_name); in evsel__compute_group_pmu_name()
1959 return evsel->group_pmu_name ? 0 : -ENOMEM; in evsel__compute_group_pmu_name()
1965 return lhs->core.idx - rhs->core.idx; in arch_evlist__cmp()
1983 * occurs. If both events don't have a group we want to fall-through to in evlist__cmp()
1987 if (lhs_core->leader != lhs_core || lhs_core->nr_members > 1) { in evlist__cmp()
1989 lhs_sort_idx = lhs_core->leader->idx; in evlist__cmp()
1992 lhs_sort_idx = *force_grouped_idx != -1 && arch_evsel__must_be_in_group(lhs) in evlist__cmp()
1994 : lhs_core->idx; in evlist__cmp()
1996 if (rhs_core->leader != rhs_core || rhs_core->nr_members > 1) { in evlist__cmp()
1998 rhs_sort_idx = rhs_core->leader->idx; in evlist__cmp()
2001 rhs_sort_idx = *force_grouped_idx != -1 && arch_evsel__must_be_in_group(rhs) in evlist__cmp()
2003 : rhs_core->idx; in evlist__cmp()
2007 return lhs_sort_idx - rhs_sort_idx; in evlist__cmp()
2011 lhs_pmu_name = lhs->group_pmu_name; in evlist__cmp()
2012 rhs_pmu_name = rhs->group_pmu_name; in evlist__cmp()
2024 int idx = 0, force_grouped_idx = -1; in parse_events__sort_events_and_fix_groups()
2050 pos->core.idx = idx++; in parse_events__sort_events_and_fix_groups()
2053 if (force_grouped_idx == -1 && pos == pos_leader && pos->core.nr_members < 2 && in parse_events__sort_events_and_fix_groups()
2055 force_grouped_idx = pos->core.idx; in parse_events__sort_events_and_fix_groups()
2068 const char *pos_pmu_name = pos->group_pmu_name; in parse_events__sort_events_and_fix_groups()
2070 bool pos_force_grouped = force_grouped_idx != -1 && in parse_events__sort_events_and_fix_groups()
2074 if (pos->core.idx != idx) in parse_events__sort_events_and_fix_groups()
2076 pos->core.idx = idx++; in parse_events__sort_events_and_fix_groups()
2077 pos->core.nr_members = 0; in parse_events__sort_events_and_fix_groups()
2086 cur_leader_pmu_name = cur_leader->group_pmu_name; in parse_events__sort_events_and_fix_groups()
2087 if ((cur_leaders_grp != pos->core.leader && in parse_events__sort_events_and_fix_groups()
2097 cur_leaders_grp = pos->core.leader; in parse_events__sort_events_and_fix_groups()
2114 pos_leader->core.nr_members++; in parse_events__sort_events_and_fix_groups()
2125 .idx = evlist->core.nr_entries, in __parse_events()
2139 return -1; in __parse_events()
2158 last->cmdline_group_boundary = true; in __parse_events()
2164 * There are 2 users - builtin-record and builtin-test objects. in __parse_events()
2195 INIT_LIST_HEAD(&err->list); in parse_events_error__init()
2202 list_for_each_entry_safe(pos, tmp, &err->list, list) { in parse_events_error__exit()
2203 zfree(&pos->str); in parse_events_error__exit()
2204 zfree(&pos->help); in parse_events_error__exit()
2205 list_del_init(&pos->list); in parse_events_error__exit()
2224 entry->idx = idx; in parse_events_error__handle()
2225 entry->str = str; in parse_events_error__handle()
2226 entry->help = help; in parse_events_error__handle()
2227 list_add(&entry->list, &err->list); in parse_events_error__handle()
2251 /* -2 for extra '' in the final fprintf */ in __parse_events_error__print()
2252 int width = get_term_width() - 2; in __parse_events_error__print()
2268 max_len = width - len_str; in __parse_events_error__print()
2274 cut = err_idx - max_err_idx; in __parse_events_error__print()
2282 if ((len_event - cut) > max_len) { in __parse_events_error__print()
2283 buf[max_len - 1] = buf[max_len - 2] = '.'; in __parse_events_error__print()
2287 idx = len_str + err_idx - cut; in __parse_events_error__print()
2304 list_for_each_entry(pos, &err->list, list) { in parse_events_error__print()
2307 __parse_events_error__print(pos->idx, pos->str, pos->help, event); in parse_events_error__print()
2321 list_for_each_entry(pos, &err->list, list) { in parse_events_error__contains()
2322 if (strstr(pos->str, needle) != NULL) in parse_events_error__contains()
2333 struct parse_events_option_args *args = opt->value; in parse_events_option()
2338 ret = __parse_events(*args->evlistp, str, args->pmu_filter, &err, in parse_events_option()
2353 struct parse_events_option_args *args = opt->value; in parse_events_option_new_evlist()
2356 if (*args->evlistp == NULL) { in parse_events_option_new_evlist()
2357 *args->evlistp = evlist__new(); in parse_events_option_new_evlist()
2359 if (*args->evlistp == NULL) { in parse_events_option_new_evlist()
2361 return -1; in parse_events_option_new_evlist()
2366 evlist__delete(*args->evlistp); in parse_events_option_new_evlist()
2367 *args->evlistp = NULL; in parse_events_option_new_evlist()
2388 if (evlist->core.nr_entries > 0) in foreach_evsel_in_last_glob()
2394 return -1; in foreach_evsel_in_last_glob()
2398 if (last->core.node.prev == &evlist->core.entries) in foreach_evsel_in_last_glob()
2400 last = list_entry(last->core.node.prev, struct evsel, core.node); in foreach_evsel_in_last_glob()
2401 } while (!last->cmdline_group_boundary); in foreach_evsel_in_last_glob()
2415 "--filter option should follow a -e tracepoint or HW tracer option\n"); in set_filter()
2416 return -1; in set_filter()
2419 if (evsel->core.attr.type == PERF_TYPE_TRACEPOINT) { in set_filter()
2423 return -1; in set_filter()
2430 if (pmu->type == evsel->core.attr.type) { in set_filter()
2440 return perf_bpf_filter__parse(&evsel->bpf_filters, str); in set_filter()
2445 return -1; in set_filter()
2454 struct evlist *evlist = *(struct evlist **)opt->value; in parse_filter()
2465 if (evsel == NULL || evsel->core.attr.type != PERF_TYPE_TRACEPOINT) { in add_exclude_perf_filter()
2467 "--exclude-perf option should follow a -e tracepoint option\n"); in add_exclude_perf_filter()
2468 return -1; in add_exclude_perf_filter()
2476 return -1; in add_exclude_perf_filter()
2486 struct evlist *evlist = *(struct evlist **)opt->value; in exclude_perf()
2492 int parse_events__is_hardcoded_term(struct parse_events_term *term) in parse_events__is_hardcoded_term() argument
2494 return term->type_term != PARSE_EVENTS__TERM_TYPE_USER; in parse_events__is_hardcoded_term()
2501 struct parse_events_term *term; in new_term() local
2503 term = malloc(sizeof(*term)); in new_term()
2504 if (!term) in new_term()
2505 return -ENOMEM; in new_term()
2507 *term = *temp; in new_term()
2508 INIT_LIST_HEAD(&term->list); in new_term()
2509 term->weak = false; in new_term()
2511 switch (term->type_val) { in new_term()
2513 term->val.num = num; in new_term()
2516 term->val.str = str; in new_term()
2519 free(term); in new_term()
2520 return -EINVAL; in new_term()
2523 *_term = term; in new_term()
2527 int parse_events_term__num(struct parse_events_term **term, in parse_events_term__num() argument
2541 .err_term = loc_term ? loc_term->first_column : 0, in parse_events_term__num()
2542 .err_val = loc_val ? loc_val->first_column : 0, in parse_events_term__num()
2545 return new_term(term, &temp, /*str=*/NULL, num); in parse_events_term__num()
2548 int parse_events_term__str(struct parse_events_term **term, in parse_events_term__str() argument
2560 .err_term = loc_term ? loc_term->first_column : 0, in parse_events_term__str()
2561 .err_val = loc_val ? loc_val->first_column : 0, in parse_events_term__str()
2564 return new_term(term, &temp, str, /*num=*/0); in parse_events_term__str()
2567 int parse_events_term__term(struct parse_events_term **term, in parse_events_term__term() argument
2572 return parse_events_term__str(term, term_lhs, NULL, in parse_events_term__term()
2578 const struct parse_events_term *term) in parse_events_term__clone() argument
2581 struct parse_events_term temp = *term; in parse_events_term__clone()
2584 if (term->config) { in parse_events_term__clone()
2585 temp.config = strdup(term->config); in parse_events_term__clone()
2587 return -ENOMEM; in parse_events_term__clone()
2589 if (term->type_val == PARSE_EVENTS__TERM_TYPE_NUM) in parse_events_term__clone()
2590 return new_term(new, &temp, /*str=*/NULL, term->val.num); in parse_events_term__clone()
2592 str = strdup(term->val.str); in parse_events_term__clone()
2595 return -ENOMEM; in parse_events_term__clone()
2600 void parse_events_term__delete(struct parse_events_term *term) in parse_events_term__delete() argument
2602 if (term->type_val != PARSE_EVENTS__TERM_TYPE_NUM) in parse_events_term__delete()
2603 zfree(&term->val.str); in parse_events_term__delete()
2605 zfree(&term->config); in parse_events_term__delete()
2606 free(term); in parse_events_term__delete()
2612 struct parse_events_term *term; in parse_events_terms__copy() local
2614 list_for_each_entry (term, &src->terms, list) { in parse_events_terms__copy()
2618 ret = parse_events_term__clone(&n, term); in parse_events_terms__copy()
2622 list_add_tail(&n->list, &dest->terms); in parse_events_terms__copy()
2629 INIT_LIST_HEAD(&terms->terms); in parse_events_terms__init()
2634 struct parse_events_term *term, *h; in parse_events_terms__exit() local
2636 list_for_each_entry_safe(term, h, &terms->terms, list) { in parse_events_terms__exit()
2637 list_del_init(&term->list); in parse_events_terms__exit()
2638 parse_events_term__delete(term); in parse_events_terms__exit()
2652 struct parse_events_term *term; in parse_events_terms__to_strbuf() local
2658 list_for_each_entry(term, &terms->terms, list) { in parse_events_terms__to_strbuf()
2668 if (term->type_val == PARSE_EVENTS__TERM_TYPE_NUM) in parse_events_terms__to_strbuf()
2669 if (term->no_value) { in parse_events_terms__to_strbuf()
2670 assert(term->val.num == 1); in parse_events_terms__to_strbuf()
2671 ret = strbuf_addf(sb, "%s", term->config); in parse_events_terms__to_strbuf()
2673 ret = strbuf_addf(sb, "%s=%#"PRIx64, term->config, term->val.num); in parse_events_terms__to_strbuf()
2674 else if (term->type_val == PARSE_EVENTS__TERM_TYPE_STR) { in parse_events_terms__to_strbuf()
2675 if (term->config) { in parse_events_terms__to_strbuf()
2676 ret = strbuf_addf(sb, "%s=", term->config); in parse_events_terms__to_strbuf()
2679 } else if ((unsigned int)term->type_term < __PARSE_EVENTS__TERM_TYPE_NR) { in parse_events_terms__to_strbuf()
2681 parse_events__term_type_str(term->type_term)); in parse_events_terms__to_strbuf()
2685 assert(!term->no_value); in parse_events_terms__to_strbuf()
2686 ret = strbuf_addf(sb, "%s", term->val.str); in parse_events_terms__to_strbuf()
2728 /* "no-overwrite" is the longest name */ in parse_events_formats_error_string()
2730 (sizeof("no-overwrite") - 1)]; in parse_events_formats_error_string()