• Home
  • Raw
  • Download

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

1 // SPDX-License-Identifier: GPL-2.0
11 #include "term.h"
15 #include <subcmd/parse-options.h>
16 #include "parse-events.h"
17 #include <subcmd/exec-cmd.h>
23 #include "bpf-loader.h"
26 #include "parse-events-bison.h"
28 #include "parse-events-flex.h"
32 #include "probe-file.h"
34 #include "util/parse-branch-options.h"
50 * -1 means failed to init, don't try anymore
57 .symbol = "cpu-cycles",
65 .symbol = "cache-references",
69 .symbol = "cache-misses",
73 .symbol = "branch-instructions",
77 .symbol = "branch-misses",
81 .symbol = "bus-cycles",
85 .symbol = "stalled-cycles-frontend",
86 .alias = "idle-cycles-frontend",
89 .symbol = "stalled-cycles-backend",
90 .alias = "idle-cycles-backend",
93 .symbol = "ref-cycles",
100 .symbol = "cpu-clock",
104 .symbol = "task-clock",
108 .symbol = "page-faults",
112 .symbol = "context-switches",
116 .symbol = "cpu-migrations",
120 .symbol = "minor-faults",
124 .symbol = "major-faults",
128 .symbol = "alignment-faults",
132 .symbol = "emulation-faults",
140 .symbol = "bpf-output",
155 if (sys_dirent->d_type == DT_DIR && \
156 (strcmp(sys_dirent->d_name, ".")) && \
157 (strcmp(sys_dirent->d_name, "..")))
164 snprintf(evt_path, MAXPATHLEN, "%s/%s/id", dir_path, evt_dir->d_name); in tp_event_has_id()
167 return -EINVAL; in tp_event_has_id()
175 if (evt_dirent->d_type == DT_DIR && \
176 (strcmp(evt_dirent->d_name, ".")) && \
177 (strcmp(evt_dirent->d_name, "..")) && \
199 dir_path = get_events_file(sys_dirent->d_name); in tracepoint_id_to_path()
209 evt_dirent->d_name); in tracepoint_id_to_path()
226 path->system = malloc(MAX_EVENT_LENGTH); in tracepoint_id_to_path()
227 if (!path->system) { in tracepoint_id_to_path()
231 path->name = malloc(MAX_EVENT_LENGTH); in tracepoint_id_to_path()
232 if (!path->name) { in tracepoint_id_to_path()
233 zfree(&path->system); in tracepoint_id_to_path()
237 strncpy(path->system, sys_dirent->d_name, in tracepoint_id_to_path()
239 strncpy(path->name, evt_dirent->d_name, in tracepoint_id_to_path()
263 path->system = strndup(name, str - name); in tracepoint_name_to_path()
264 path->name = strdup(str+1); in tracepoint_name_to_path()
266 if (path->system == NULL || path->name == NULL) { in tracepoint_name_to_path()
267 zfree(&path->system); in tracepoint_name_to_path()
268 zfree(&path->name); in tracepoint_name_to_path()
288 return "hardware-cache"; in event_type()
297 static int parse_events__is_name_term(struct parse_events_term *term) in parse_events__is_name_term() argument
299 return term->type_term == PARSE_EVENTS__TERM_TYPE_NAME; in parse_events__is_name_term()
304 struct parse_events_term *term; in get_config_name() local
309 list_for_each_entry(term, head_terms, list) in get_config_name()
310 if (parse_events__is_name_term(term)) in get_config_name()
311 return term->val.str; in get_config_name()
323 struct cpu_map *cpus = pmu ? pmu->cpus : NULL; in __add_event()
332 evsel->cpus = cpu_map__get(cpus); in __add_event()
333 evsel->own_cpus = cpu_map__get(cpus); in __add_event()
334 evsel->system_wide = pmu ? pmu->is_uncore : false; in __add_event()
335 evsel->auto_merge_stats = auto_merge_stats; in __add_event()
338 evsel->name = strdup(name); in __add_event()
341 list_splice(config_terms, &evsel->config_terms); in __add_event()
343 list_add_tail(&evsel->node, list); in __add_event()
351 return __add_event(list, idx, attr, name, NULL, config_terms, false) ? 0 : -ENOMEM; in add_event()
357 int n, longest = -1; in parse_aliases()
369 return -1; in parse_aliases()
373 struct parse_events_term *term,
376 struct parse_events_term *term,
391 int cache_type = -1, cache_op = -1, cache_result = -1; in parse_events_add_cache()
396 * No fallback - if we cannot get a clear cache type in parse_events_add_cache()
401 if (cache_type == -1) in parse_events_add_cache()
402 return -EINVAL; in parse_events_add_cache()
410 n += snprintf(name + n, MAX_NAME_LEN - n, "-%s", str); in parse_events_add_cache()
412 if (cache_op == -1) { in parse_events_add_cache()
417 return -EINVAL; in parse_events_add_cache()
422 if (cache_result == -1) { in parse_events_add_cache()
433 if (cache_op == -1) in parse_events_add_cache()
439 if (cache_result == -1) in parse_events_add_cache()
449 return -EINVAL; in parse_events_add_cache()
452 return -ENOMEM; in parse_events_add_cache()
473 e->str = strdup("can't access trace events"); in tracepoint_error()
476 e->str = strdup("unknown tracepoint"); in tracepoint_error()
479 e->str = strdup("failed to add tracepoint"); in tracepoint_error()
484 e->help = strdup(help); in tracepoint_error()
504 return -ENOMEM; in add_tracepoint()
505 list_splice(&config_terms, &evsel->config_terms); in add_tracepoint()
508 list_add_tail(&evsel->node, list); in add_tracepoint()
525 return -1; in add_tracepoint_multi_event()
531 return -1; in add_tracepoint_multi_event()
535 if (!strcmp(evt_ent->d_name, ".") in add_tracepoint_multi_event()
536 || !strcmp(evt_ent->d_name, "..") in add_tracepoint_multi_event()
537 || !strcmp(evt_ent->d_name, "enable") in add_tracepoint_multi_event()
538 || !strcmp(evt_ent->d_name, "filter")) in add_tracepoint_multi_event()
541 if (!strglobmatch(evt_ent->d_name, evt_name)) in add_tracepoint_multi_event()
546 ret = add_tracepoint(list, idx, sys_name, evt_ent->d_name, in add_tracepoint_multi_event()
552 ret = -1; in add_tracepoint_multi_event()
584 return -1; in add_tracepoint_multi_sys()
588 if (!strcmp(events_ent->d_name, ".") in add_tracepoint_multi_sys()
589 || !strcmp(events_ent->d_name, "..") in add_tracepoint_multi_sys()
590 || !strcmp(events_ent->d_name, "enable") in add_tracepoint_multi_sys()
591 || !strcmp(events_ent->d_name, "header_event") in add_tracepoint_multi_sys()
592 || !strcmp(events_ent->d_name, "header_page")) in add_tracepoint_multi_sys()
595 if (!strglobmatch(events_ent->d_name, sys_name)) in add_tracepoint_multi_sys()
598 ret = add_tracepoint_event(list, idx, events_ent->d_name, in add_tracepoint_multi_sys()
617 struct parse_events_state *parse_state = param->parse_state; in add_bpf_event()
618 struct list_head *list = param->list; in add_bpf_event()
625 err = parse_events_add_tracepoint(&new_evsels, &parse_state->idx, group, in add_bpf_event()
626 event, parse_state->error, in add_bpf_event()
627 param->head_config); in add_bpf_event()
634 list_del(&evsel->node); in add_bpf_event()
644 pos->bpf_fd = fd; in add_bpf_event()
663 err = -EINVAL; in parse_events_load_bpf_obj()
698 parse_state->error->help = strdup("(add -v to see detail)"); in parse_events_load_bpf_obj()
699 parse_state->error->str = strdup(errbuf); in parse_events_load_bpf_obj()
708 struct parse_events_term *term; in parse_events_config_bpf() local
714 list_for_each_entry(term, head_config, list) { in parse_events_config_bpf()
718 if (term->type_term != PARSE_EVENTS__TERM_TYPE_USER) { in parse_events_config_bpf()
720 "Invalid config term for BPF object"); in parse_events_config_bpf()
721 errbuf[BUFSIZ - 1] = '\0'; in parse_events_config_bpf()
723 parse_state->error->idx = term->err_term; in parse_events_config_bpf()
724 parse_state->error->str = strdup(errbuf); in parse_events_config_bpf()
725 return -EINVAL; in parse_events_config_bpf()
728 err = bpf__config_obj(obj, term, parse_state->evlist, &error_pos); in parse_events_config_bpf()
730 bpf__strerror_config_obj(obj, term, parse_state->evlist, in parse_events_config_bpf()
733 parse_state->error->help = strdup( in parse_events_config_bpf()
739 " \t(add -v to see detail)"); in parse_events_config_bpf()
740 parse_state->error->str = strdup(errbuf); in parse_events_config_bpf()
741 if (err == -BPF_LOADER_ERRNO__OBJCONF_MAP_VALUE) in parse_events_config_bpf()
742 parse_state->error->idx = term->err_val; in parse_events_config_bpf()
744 parse_state->error->idx = term->err_term + error_pos; in parse_events_config_bpf()
753 * perf record -e bpf.c/call-graph=fp,map:array.value[0]=1/ ...
754 * 'call-graph=fp' is 'evt config', should be applied to each
765 struct parse_events_term *term, *temp; in split_bpf_config_terms() local
768 * Currectly, all possible user config term in split_bpf_config_terms()
775 list_for_each_entry_safe(term, temp, evt_head_config, list) in split_bpf_config_terms()
776 if (!parse_events__is_hardcoded_term(term)) in split_bpf_config_terms()
777 list_move_tail(&term->list, obj_head_config); in split_bpf_config_terms()
799 if (err == -ENOTSUP) in parse_events_load_bpf()
805 -err, errbuf, in parse_events_load_bpf()
808 parse_state->error->help = strdup("(add -v to see detail)"); in parse_events_load_bpf()
809 parse_state->error->str = strdup(errbuf); in parse_events_load_bpf()
838 if (attr->bp_type & bit) \ in parse_breakpoint_type()
839 return -EINVAL; \ in parse_breakpoint_type()
841 attr->bp_type |= bit; \ in parse_breakpoint_type()
855 return -EINVAL; in parse_breakpoint_type()
861 if (!attr->bp_type) /* Default */ in parse_breakpoint_type()
862 attr->bp_type = HW_BREAKPOINT_R | HW_BREAKPOINT_W; in parse_breakpoint_type()
873 attr.bp_addr = (unsigned long) ptr; in parse_events_add_breakpoint()
876 return -EINVAL; in parse_events_add_breakpoint()
881 len = sizeof(long); in parse_events_add_breakpoint()
894 static int check_type_val(struct parse_events_term *term, in check_type_val() argument
898 if (type == term->type_val) in check_type_val()
902 err->idx = term->err_val; in check_type_val()
904 err->str = strdup("expected numeric value"); in check_type_val()
906 err->str = strdup("expected string value"); in check_type_val()
908 return -EINVAL; in check_type_val()
912 * Update according to parse-events.l
915 [PARSE_EVENTS__TERM_TYPE_USER] = "<sysfs term>",
924 [PARSE_EVENTS__TERM_TYPE_CALLGRAPH] = "call-graph",
925 [PARSE_EVENTS__TERM_TYPE_STACKSIZE] = "stack-size",
926 [PARSE_EVENTS__TERM_TYPE_NOINHERIT] = "no-inherit",
928 [PARSE_EVENTS__TERM_TYPE_MAX_STACK] = "max-stack",
930 [PARSE_EVENTS__TERM_TYPE_NOOVERWRITE] = "no-overwrite",
931 [PARSE_EVENTS__TERM_TYPE_DRV_CFG] = "driver-config",
940 err->str = strdup("Invalid term_type"); in config_term_avail()
958 if (asprintf(&err->str, "'%s' is not usable in 'perf stat'", in config_term_avail()
960 err->str = NULL; in config_term_avail()
971 struct parse_events_term *term, in config_term_common() argument
976 if (check_type_val(term, err, PARSE_EVENTS__TERM_TYPE_ ## type)) \ in config_term_common()
977 return -EINVAL; \ in config_term_common()
980 switch (term->type_term) { in config_term_common()
983 attr->config = term->val.num; in config_term_common()
987 attr->config1 = term->val.num; in config_term_common()
991 attr->config2 = term->val.num; in config_term_common()
1001 if (strcmp(term->val.str, "no") && in config_term_common()
1002 parse_branch_str(term->val.str, &attr->branch_sample_type)) { in config_term_common()
1003 err->str = strdup("invalid branch sample type"); in config_term_common()
1004 err->idx = term->err_val; in config_term_common()
1005 return -EINVAL; in config_term_common()
1010 if (term->val.num > 1) { in config_term_common()
1011 err->str = strdup("expected 0 or 1"); in config_term_common()
1012 err->idx = term->err_val; in config_term_common()
1013 return -EINVAL; in config_term_common()
1041 err->str = strdup("unknown term"); in config_term_common()
1042 err->idx = term->err_term; in config_term_common()
1043 err->help = parse_events_formats_error_string(NULL); in config_term_common()
1044 return -EINVAL; in config_term_common()
1048 * Check term availbility after basic checking so in config_term_common()
1052 * user will see "'<sysfs term>' is not usable in 'perf stat'" in config_term_common()
1053 * if an invalid config term is provided for legacy events in config_term_common()
1056 if (!config_term_avail(term->type_term, err)) in config_term_common()
1057 return -EINVAL; in config_term_common()
1063 struct parse_events_term *term, in config_term_pmu() argument
1066 if (term->type_term == PARSE_EVENTS__TERM_TYPE_USER || in config_term_pmu()
1067 term->type_term == PARSE_EVENTS__TERM_TYPE_DRV_CFG) in config_term_pmu()
1074 return config_term_common(attr, term, err); in config_term_pmu()
1078 struct parse_events_term *term, in config_term_tracepoint() argument
1081 switch (term->type_term) { in config_term_tracepoint()
1089 return config_term_common(attr, term, err); in config_term_tracepoint()
1092 err->idx = term->err_term; in config_term_tracepoint()
1093 err->str = strdup("unknown term"); in config_term_tracepoint()
1094 err->help = strdup("valid terms: call-graph,stack-size\n"); in config_term_tracepoint()
1096 return -EINVAL; in config_term_tracepoint()
1107 struct parse_events_term *term; in config_attr() local
1109 list_for_each_entry(term, head, list) in config_attr()
1110 if (config_term(attr, term, err)) in config_attr()
1111 return -EINVAL; in config_attr()
1125 return -ENOMEM; \ in get_config_terms()
1127 INIT_LIST_HEAD(&__t->list); \ in get_config_terms()
1128 __t->type = PERF_EVSEL__CONFIG_TERM_ ## __type; \ in get_config_terms()
1129 __t->val.__name = __val; \ in get_config_terms()
1130 __t->weak = term->weak; \ in get_config_terms()
1131 list_add_tail(&__t->list, head_terms); \ in get_config_terms()
1134 struct parse_events_term *term; in get_config_terms() local
1136 list_for_each_entry(term, head_config, list) { in get_config_terms()
1137 switch (term->type_term) { in get_config_terms()
1139 ADD_CONFIG_TERM(PERIOD, period, term->val.num); in get_config_terms()
1142 ADD_CONFIG_TERM(FREQ, freq, term->val.num); in get_config_terms()
1145 ADD_CONFIG_TERM(TIME, time, term->val.num); in get_config_terms()
1148 ADD_CONFIG_TERM(CALLGRAPH, callgraph, term->val.str); in get_config_terms()
1151 ADD_CONFIG_TERM(BRANCH, branch, term->val.str); in get_config_terms()
1154 ADD_CONFIG_TERM(STACK_USER, stack_user, term->val.num); in get_config_terms()
1157 ADD_CONFIG_TERM(INHERIT, inherit, term->val.num ? 1 : 0); in get_config_terms()
1160 ADD_CONFIG_TERM(INHERIT, inherit, term->val.num ? 0 : 1); in get_config_terms()
1163 ADD_CONFIG_TERM(MAX_STACK, max_stack, term->val.num); in get_config_terms()
1166 ADD_CONFIG_TERM(OVERWRITE, overwrite, term->val.num ? 1 : 0); in get_config_terms()
1169 ADD_CONFIG_TERM(OVERWRITE, overwrite, term->val.num ? 0 : 1); in get_config_terms()
1172 ADD_CONFIG_TERM(DRV_CFG, drv_cfg, term->val.str); in get_config_terms()
1192 return -EINVAL; in parse_events_add_tracepoint()
1216 if (config_attr(&attr, head_config, parse_state->error, in parse_events_add_numeric()
1218 return -EINVAL; in parse_events_add_numeric()
1221 return -ENOMEM; in parse_events_add_numeric()
1224 return add_event(list, &parse_state->idx, &attr, in parse_events_add_numeric()
1238 struct parse_events_error *err = parse_state->error; in parse_events_add_pmu()
1244 if (asprintf(&err->str, in parse_events_add_pmu()
1247 err->str = NULL; in parse_events_add_pmu()
1248 return -EINVAL; in parse_events_add_pmu()
1251 if (pmu->default_config) { in parse_events_add_pmu()
1252 memcpy(&attr, pmu->default_config, in parse_events_add_pmu()
1258 use_uncore_alias = (pmu->is_uncore && use_alias); in parse_events_add_pmu()
1261 attr.type = pmu->type; in parse_events_add_pmu()
1262 evsel = __add_event(list, &parse_state->idx, &attr, NULL, pmu, NULL, auto_merge_stats); in parse_events_add_pmu()
1264 evsel->pmu_name = name ? strdup(name) : NULL; in parse_events_add_pmu()
1265 evsel->use_uncore_alias = use_uncore_alias; in parse_events_add_pmu()
1268 return -ENOMEM; in parse_events_add_pmu()
1273 return -EINVAL; in parse_events_add_pmu()
1279 if (config_attr(&attr, head_config, parse_state->error, config_term_pmu)) in parse_events_add_pmu()
1280 return -EINVAL; in parse_events_add_pmu()
1283 return -ENOMEM; in parse_events_add_pmu()
1285 if (perf_pmu__config(pmu, &attr, head_config, parse_state->error)) { in parse_events_add_pmu()
1289 list_del_init(&pos->list); in parse_events_add_pmu()
1292 return -EINVAL; in parse_events_add_pmu()
1295 evsel = __add_event(list, &parse_state->idx, &attr, in parse_events_add_pmu()
1299 evsel->unit = info.unit; in parse_events_add_pmu()
1300 evsel->scale = info.scale; in parse_events_add_pmu()
1301 evsel->per_pkg = info.per_pkg; in parse_events_add_pmu()
1302 evsel->snapshot = info.snapshot; in parse_events_add_pmu()
1303 evsel->metric_expr = info.metric_expr; in parse_events_add_pmu()
1304 evsel->metric_name = info.metric_name; in parse_events_add_pmu()
1305 evsel->pmu_name = name ? strdup(name) : NULL; in parse_events_add_pmu()
1306 evsel->use_uncore_alias = use_uncore_alias; in parse_events_add_pmu()
1309 return evsel ? 0 : -ENOMEM; in parse_events_add_pmu()
1316 struct parse_events_term *term; in parse_events_multi_pmu_add() local
1325 return -1; in parse_events_multi_pmu_add()
1330 list_for_each_entry(alias, &pmu->aliases, list) { in parse_events_multi_pmu_add()
1331 if (!strcasecmp(alias->name, str)) { in parse_events_multi_pmu_add()
1334 return -1; in parse_events_multi_pmu_add()
1336 if (parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER, in parse_events_multi_pmu_add()
1338 return -1; in parse_events_multi_pmu_add()
1339 list_add_tail(&term->list, head); in parse_events_multi_pmu_add()
1342 pmu->name, head, in parse_events_multi_pmu_add()
1344 pr_debug("%s -> %s/%s/\n", str, in parse_events_multi_pmu_add()
1345 pmu->name, alias->str); in parse_events_multi_pmu_add()
1354 return -1; in parse_events_multi_pmu_add()
1379 if ((end_a - pmu_name_a) != (end_b - pmu_name_b)) in is_same_uncore_block()
1382 return (strncmp(pmu_name_a, pmu_name_b, end_a - pmu_name_a) == 0); in is_same_uncore_block()
1396 total_members = evsel->idx - leader->idx + 1; in parse_events__set_leader_for_uncore_aliase()
1410 if (!evsel->use_uncore_alias) in parse_events__set_leader_for_uncore_aliase()
1414 if (!is_same_uncore_block(leader->pmu_name, evsel->pmu_name)) in parse_events__set_leader_for_uncore_aliase()
1425 !strcmp(leader->pmu_name, evsel->pmu_name)) { in parse_events__set_leader_for_uncore_aliase()
1436 parse_state->nr_groups--; in parse_events__set_leader_for_uncore_aliase()
1456 evsel->leader = (struct perf_evsel *) leaders[i++]; in parse_events__set_leader_for_uncore_aliase()
1462 evsel->nr_members = total_members / nr_pmu; in parse_events__set_leader_for_uncore_aliase()
1463 evsel->group_name = name ? strdup(name) : NULL; in parse_events__set_leader_for_uncore_aliase()
1467 parse_state->nr_groups += nr_pmu - 1; in parse_events__set_leader_for_uncore_aliase()
1490 leader = list_entry(list->next, struct perf_evsel, node); in parse_events__set_leader()
1491 leader->group_name = name ? strdup(name) : NULL; in parse_events__set_leader()
1525 int eu = evsel ? evsel->attr.exclude_user : 0; in get_event_modifier()
1526 int ek = evsel ? evsel->attr.exclude_kernel : 0; in get_event_modifier()
1527 int eh = evsel ? evsel->attr.exclude_hv : 0; in get_event_modifier()
1528 int eH = evsel ? evsel->attr.exclude_host : 0; in get_event_modifier()
1529 int eG = evsel ? evsel->attr.exclude_guest : 0; in get_event_modifier()
1530 int eI = evsel ? evsel->attr.exclude_idle : 0; in get_event_modifier()
1531 int precise = evsel ? evsel->attr.precise_ip : 0; in get_event_modifier()
1534 int pinned = evsel ? evsel->attr.pinned : 0; in get_event_modifier()
1537 int exclude_GH = evsel ? evsel->exclude_GH : 0; in get_event_modifier()
1587 * 0 - SAMPLE_IP can have arbitrary skid in get_event_modifier()
1588 * 1 - SAMPLE_IP must have constant skid in get_event_modifier()
1589 * 2 - SAMPLE_IP requested to have 0 skid in get_event_modifier()
1590 * 3 - SAMPLE_IP must have 0 skid in get_event_modifier()
1595 return -EINVAL; in get_event_modifier()
1597 mod->eu = eu; in get_event_modifier()
1598 mod->ek = ek; in get_event_modifier()
1599 mod->eh = eh; in get_event_modifier()
1600 mod->eH = eH; in get_event_modifier()
1601 mod->eG = eG; in get_event_modifier()
1602 mod->eI = eI; in get_event_modifier()
1603 mod->precise = precise; in get_event_modifier()
1604 mod->precise_max = precise_max; in get_event_modifier()
1605 mod->exclude_GH = exclude_GH; in get_event_modifier()
1606 mod->sample_read = sample_read; in get_event_modifier()
1607 mod->pinned = pinned; in get_event_modifier()
1608 mod->weak = weak; in get_event_modifier()
1622 if (strlen(str) > (sizeof("ukhGHpppPSDIW") - 1)) in check_modifier()
1623 return -1; in check_modifier()
1627 return -1; in check_modifier()
1643 return -EINVAL; in parse_events__modifier_event()
1646 return -EINVAL; in parse_events__modifier_event()
1650 return -EINVAL; in parse_events__modifier_event()
1652 evsel->attr.exclude_user = mod.eu; in parse_events__modifier_event()
1653 evsel->attr.exclude_kernel = mod.ek; in parse_events__modifier_event()
1654 evsel->attr.exclude_hv = mod.eh; in parse_events__modifier_event()
1655 evsel->attr.precise_ip = mod.precise; in parse_events__modifier_event()
1656 evsel->attr.exclude_host = mod.eH; in parse_events__modifier_event()
1657 evsel->attr.exclude_guest = mod.eG; in parse_events__modifier_event()
1658 evsel->attr.exclude_idle = mod.eI; in parse_events__modifier_event()
1659 evsel->exclude_GH = mod.exclude_GH; in parse_events__modifier_event()
1660 evsel->sample_read = mod.sample_read; in parse_events__modifier_event()
1661 evsel->precise_max = mod.precise_max; in parse_events__modifier_event()
1662 evsel->weak_group = mod.weak; in parse_events__modifier_event()
1665 evsel->attr.pinned = mod.pinned; in parse_events__modifier_event()
1676 if (!evsel->name) in parse_events_name()
1677 evsel->name = strdup(name); in parse_events_name()
1689 return strcasecmp(pmu1->symbol, pmu2->symbol); in comp_pmu()
1700 zfree(&p->symbol); in perf_pmu__parse_cleanup()
1709 p->symbol = str; \
1710 if (!p->symbol) \
1712 p->type = stype; \
1728 list_for_each_entry(alias, &pmu->aliases, list) { in perf_pmu__parse_init()
1729 if (strchr(alias->name, '-')) in perf_pmu__parse_init()
1736 perf_pmu_events_list_num = -1; in perf_pmu__parse_init()
1747 list_for_each_entry(alias, &pmu->aliases, list) { in perf_pmu__parse_init()
1749 char *tmp = strchr(alias->name, '-'); in perf_pmu__parse_init()
1752 SET_SYMBOL(strndup(alias->name, tmp - alias->name), in perf_pmu__parse_init()
1758 SET_SYMBOL(strdup(alias->name), PMU_EVENT_SYMBOL); in perf_pmu__parse_init()
1780 * name "cpu" could be prefix of cpu-cycles or cpu// events. in perf_pmu__parse_check()
1781 * cpu-cycles has been handled by hardcode. in perf_pmu__parse_check()
1792 return r ? r->type : PMU_EVENT_SYMBOL_ERR; in perf_pmu__parse_check()
1844 .idx = evlist->nr_entries, in parse_events()
1855 return -1; in parse_events()
1866 evlist->nr_groups += parse_state.nr_groups; in parse_events()
1868 last->cmdline_group_boundary = true; in parse_events()
1874 * There are 2 users - builtin-record and builtin-test objects. in parse_events()
1898 if (err->str) { in parse_events_print_error()
1899 /* -2 for extra '' in the final fprintf */ in parse_events_print_error()
1900 int width = get_term_width() - 2; in parse_events_print_error()
1916 max_len = width - len_str; in parse_events_print_error()
1921 if (err->idx > max_err_idx) in parse_events_print_error()
1922 cut = err->idx - max_err_idx; in parse_events_print_error()
1930 if ((len_event - cut) > max_len) { in parse_events_print_error()
1931 buf[max_len - 1] = buf[max_len - 2] = '.'; in parse_events_print_error()
1935 idx = len_str + err->idx - cut; in parse_events_print_error()
1940 fprintf(stderr, "%*s\\___ %s\n", idx + 1, "", err->str); in parse_events_print_error()
1941 if (err->help) in parse_events_print_error()
1942 fprintf(stderr, "\n%s\n", err->help); in parse_events_print_error()
1943 zfree(&err->str); in parse_events_print_error()
1944 zfree(&err->help); in parse_events_print_error()
1953 struct perf_evlist *evlist = *(struct perf_evlist **)opt->value; in parse_events_option()
1980 if (evlist->nr_entries > 0) in foreach_evsel_in_last_glob()
1986 return -1; in foreach_evsel_in_last_glob()
1990 if (last->node.prev == &evlist->entries) in foreach_evsel_in_last_glob()
1992 last = list_entry(last->node.prev, struct perf_evsel, node); in foreach_evsel_in_last_glob()
1993 } while (!last->cmdline_group_boundary); in foreach_evsel_in_last_glob()
2007 "--filter option should follow a -e tracepoint or HW tracer option\n"); in set_filter()
2008 return -1; in set_filter()
2011 if (evsel->attr.type == PERF_TYPE_TRACEPOINT) { in set_filter()
2015 return -1; in set_filter()
2022 if (pmu->type == evsel->attr.type) { in set_filter()
2034 return -1; in set_filter()
2040 return -1; in set_filter()
2049 struct perf_evlist *evlist = *(struct perf_evlist **)opt->value; in parse_filter()
2060 if (evsel == NULL || evsel->attr.type != PERF_TYPE_TRACEPOINT) { in add_exclude_perf_filter()
2062 "--exclude-perf option should follow a -e tracepoint option\n"); in add_exclude_perf_filter()
2063 return -1; in add_exclude_perf_filter()
2071 return -1; in add_exclude_perf_filter()
2081 struct perf_evlist *evlist = *(struct perf_evlist **)opt->value; in exclude_perf()
2132 !strglobmatch(sys_dirent->d_name, subsys_glob)) in print_tracepoint_events()
2135 dir_path = get_events_file(sys_dirent->d_name); in print_tracepoint_events()
2144 !strglobmatch(evt_dirent->d_name, event_glob)) in print_tracepoint_events()
2153 sys_dirent->d_name, evt_dirent->d_name); in print_tracepoint_events()
2179 printf(" %-50s [%s]\n", evt_list[evt_i++], in print_tracepoint_events()
2219 dir_path = get_events_file(sys_dirent->d_name); in is_valid_tracepoint()
2228 sys_dirent->d_name, evt_dirent->d_name); in is_valid_tracepoint()
2263 if (open_return == -EACCES) { in is_event_supported()
2267 * Re-run with exclude_kernel set; we don't do that in is_event_supported()
2271 evsel->attr.exclude_kernel = 1; in is_event_supported()
2304 pcache = probe_cache__new(nd->s, NULL); in print_sdt_events()
2307 list_for_each_entry(ent, &pcache->entries, node) { in print_sdt_events()
2308 if (!ent->sdt) in print_sdt_events()
2311 !strglobmatch(ent->pev.group, subsys_glob)) in print_sdt_events()
2314 !strglobmatch(ent->pev.event, event_glob)) in print_sdt_events()
2316 ret = asprintf(&buf, "%s:%s@%s", ent->pev.group, in print_sdt_events()
2317 ent->pev.event, nd->s); in print_sdt_events()
2326 buf = strchr(nd->s, '@'); in print_sdt_events()
2330 printf("%s ", nd->s); in print_sdt_events()
2335 ptr = strchr(nd2->s, '@'); in print_sdt_events()
2338 if (strcmp(nd->s, nd2->s) == 0) in print_sdt_events()
2343 ret = asprintf(&buf, "%s@%s(%.12s)", nd->s, path, buf); in print_sdt_events()
2345 printf(" %-50s [%s]\n", buf, "SDT event"); in print_sdt_events()
2350 printf(" %-50s [%s]\n", nd->s, "SDT event"); in print_sdt_events()
2352 if (strcmp(nd->s, nd2->s) != 0) in print_sdt_events()
2415 printf(" %-50s [%s]\n", evt_list[evt_i++], in print_hwcache_events()
2449 syms -= max; in print_symbol_events()
2454 if (event_glob != NULL && syms->symbol != NULL && in print_symbol_events()
2455 !(strglobmatch(syms->symbol, event_glob) || in print_symbol_events()
2456 (syms->alias && strglobmatch(syms->alias, event_glob)))) in print_symbol_events()
2467 if (!name_only && strlen(syms->alias)) in print_symbol_events()
2468 snprintf(name, MAX_NAME_LEN, "%s OR %s", syms->symbol, syms->alias); in print_symbol_events()
2470 strlcpy(name, syms->symbol, MAX_NAME_LEN); in print_symbol_events()
2489 printf(" %-50s [%s]\n", evt_list[evt_i++], event_type_descriptors[type]); in print_symbol_events()
2528 printf(" %-50s [%s]\n", in print_events()
2531 printf(" %-50s [%s]\n", in print_events()
2535 printf(" (see 'man perf-list' on how to encode it)\n\n"); in print_events()
2537 printf(" %-50s [%s]\n", in print_events()
2551 int parse_events__is_hardcoded_term(struct parse_events_term *term) in parse_events__is_hardcoded_term() argument
2553 return term->type_term != PARSE_EVENTS__TERM_TYPE_USER; in parse_events__is_hardcoded_term()
2560 struct parse_events_term *term; in new_term() local
2562 term = malloc(sizeof(*term)); in new_term()
2563 if (!term) in new_term()
2564 return -ENOMEM; in new_term()
2566 *term = *temp; in new_term()
2567 INIT_LIST_HEAD(&term->list); in new_term()
2568 term->weak = false; in new_term()
2570 switch (term->type_val) { in new_term()
2572 term->val.num = num; in new_term()
2575 term->val.str = str; in new_term()
2578 free(term); in new_term()
2579 return -EINVAL; in new_term()
2582 *_term = term; in new_term()
2586 int parse_events_term__num(struct parse_events_term **term, in parse_events_term__num() argument
2599 .err_term = loc_term ? loc_term->first_column : 0, in parse_events_term__num()
2600 .err_val = loc_val ? loc_val->first_column : 0, in parse_events_term__num()
2603 return new_term(term, &temp, NULL, num); in parse_events_term__num()
2606 int parse_events_term__str(struct parse_events_term **term, in parse_events_term__str() argument
2617 .err_term = loc_term ? loc_term->first_column : 0, in parse_events_term__str()
2618 .err_val = loc_val ? loc_val->first_column : 0, in parse_events_term__str()
2621 return new_term(term, &temp, str, 0); in parse_events_term__str()
2624 int parse_events_term__sym_hw(struct parse_events_term **term, in parse_events_term__sym_hw() argument
2637 return new_term(term, &temp, (char *) sym->symbol, 0); in parse_events_term__sym_hw()
2641 struct parse_events_term *term) in parse_events_term__clone() argument
2644 .type_val = term->type_val, in parse_events_term__clone()
2645 .type_term = term->type_term, in parse_events_term__clone()
2646 .config = term->config, in parse_events_term__clone()
2647 .err_term = term->err_term, in parse_events_term__clone()
2648 .err_val = term->err_val, in parse_events_term__clone()
2651 return new_term(new, &temp, term->val.str, term->val.num); in parse_events_term__clone()
2657 struct parse_events_term *term, *n; in parse_events_copy_term_list() local
2667 return -ENOMEM; in parse_events_copy_term_list()
2670 list_for_each_entry (term, old, list) { in parse_events_copy_term_list()
2671 ret = parse_events_term__clone(&n, term); in parse_events_copy_term_list()
2674 list_add_tail(&n->list, *new); in parse_events_copy_term_list()
2681 struct parse_events_term *term, *h; in parse_events_terms__purge() local
2683 list_for_each_entry_safe(term, h, terms, list) { in parse_events_terms__purge()
2684 if (term->array.nr_ranges) in parse_events_terms__purge()
2685 zfree(&term->array.ranges); in parse_events_terms__purge()
2686 list_del_init(&term->list); in parse_events_terms__purge()
2687 free(term); in parse_events_terms__purge()
2701 zfree(&a->ranges); in parse_events__clear_array()
2707 struct parse_events_error *err = parse_state->error; in parse_events_evlist_error()
2711 err->idx = idx; in parse_events_evlist_error()
2712 err->str = strdup(str); in parse_events_evlist_error()
2713 WARN_ONCE(!err->str, "WARNING: failed to allocate error string"); in parse_events_evlist_error()
2750 /* "no-overwrite" is the longest name */ in parse_events_formats_error_string()
2752 (sizeof("no-overwrite") - 1)]; in parse_events_formats_error_string()