Lines Matching +full:line +full:- +full:orders

1 // SPDX-License-Identifier: GPL-2.0
25 #include "mem-events.h"
26 #include "mem-info.h"
28 #include "annotate-data.h"
30 #include "time-utils.h"
33 #include "trace-event.h"
38 #include <event-parse.h>
68 * -t, --field-separator
94 return size - 1; in repsep_snprintf()
103 return -1; in cmp_null()
108 /* --sort pid */
113 return thread__tid(right->thread) - thread__tid(left->thread); in sort__thread_cmp()
119 const char *comm = thread__comm_str(he->thread); in hist_entry__thread_snprintf()
121 width = max(7U, width) - 8; in hist_entry__thread_snprintf()
122 return repsep_snprintf(bf, size, "%7d:%-*.*s", thread__tid(he->thread), in hist_entry__thread_snprintf()
131 return -1; in hist_entry__thread_filter()
133 return th && !RC_CHK_EQUAL(he->thread, th); in hist_entry__thread_filter()
144 /* --sort tgid */
149 return thread__pid(right->thread) - thread__pid(left->thread); in sort__tgid_cmp()
155 int tgid = thread__pid(he->thread); in hist_entry__tgid_snprintf()
158 /* display comm of the thread-group leader */ in hist_entry__tgid_snprintf()
159 if (thread__pid(he->thread) == thread__tid(he->thread)) { in hist_entry__tgid_snprintf()
160 comm = thread__comm_str(he->thread); in hist_entry__tgid_snprintf()
162 struct maps *maps = thread__maps(he->thread); in hist_entry__tgid_snprintf()
170 width = max(7U, width) - 8; in hist_entry__tgid_snprintf()
171 return repsep_snprintf(bf, size, "%7d:%-*.*s", tgid, width, width, comm ?: ""); in hist_entry__tgid_snprintf()
181 /* --sort simd */
186 if (left->simd_flags.arch != right->simd_flags.arch) in sort__simd_cmp()
187 return (int64_t) left->simd_flags.arch - right->simd_flags.arch; in sort__simd_cmp()
189 return (int64_t) left->simd_flags.pred - right->simd_flags.pred; in sort__simd_cmp()
194 u64 arch = simd_flags->arch; in hist_entry__get_simd_name()
207 if (!he->simd_flags.arch) in hist_entry__simd_snprintf()
210 name = hist_entry__get_simd_name(&he->simd_flags); in hist_entry__simd_snprintf()
212 if (he->simd_flags.pred & SIMD_OP_FLAGS_PRED_EMPTY) in hist_entry__simd_snprintf()
214 else if (he->simd_flags.pred & SIMD_OP_FLAGS_PRED_PARTIAL) in hist_entry__simd_snprintf()
227 /* --sort comm */
237 return strcmp(comm__str(right->comm), comm__str(left->comm)); in sort__comm_cmp()
243 return strcmp(comm__str(right->comm), comm__str(left->comm)); in sort__comm_collapse()
249 return strcmp(comm__str(right->comm), comm__str(left->comm)); in sort__comm_sort()
255 return repsep_snprintf(bf, size, "%-*.*s", width, width, comm__str(he->comm)); in hist_entry__comm_snprintf()
268 /* --sort dso */
293 return _sort__dso_cmp(right->ms.map, left->ms.map); in sort__dso_cmp()
305 return repsep_snprintf(bf, size, "%-*.*s", width, width, dso_name); in _hist_entry__dso_snprintf()
311 return _hist_entry__dso_snprintf(he->ms.map, bf, size, width); in hist_entry__dso_snprintf()
319 return -1; in hist_entry__dso_filter()
321 return dso && (!he->ms.map || map__dso(he->ms.map) != dso); in hist_entry__dso_filter()
332 /* --sort symbol */
336 return (int64_t)(right_ip - left_ip); in _sort__addr_cmp()
347 if (sym_l->inlined || sym_r->inlined) { in _sort__sym_cmp()
348 int ret = strcmp(sym_l->name, sym_r->name); in _sort__sym_cmp()
352 if ((sym_l->start <= sym_r->end) && (sym_l->end >= sym_r->start)) in _sort__sym_cmp()
356 if (sym_l->start != sym_r->start) in _sort__sym_cmp()
357 return (int64_t)(sym_r->start - sym_l->start); in _sort__sym_cmp()
359 return (int64_t)(sym_r->end - sym_l->end); in _sort__sym_cmp()
367 if (!left->ms.sym && !right->ms.sym) in sort__sym_cmp()
368 return _sort__addr_cmp(left->ip, right->ip); in sort__sym_cmp()
374 if (!hists__has(left->hists, dso)) { in sort__sym_cmp()
380 return _sort__sym_cmp(left->ms.sym, right->ms.sym); in sort__sym_cmp()
386 if (!left->ms.sym || !right->ms.sym) in sort__sym_sort()
387 return cmp_null(left->ms.sym, right->ms.sym); in sort__sym_sort()
389 return strcmp(right->ms.sym->name, left->ms.sym->name); in sort__sym_sort()
396 struct symbol *sym = ms->sym; in _hist_entry__sym_snprintf()
397 struct map *map = ms->map; in _hist_entry__sym_snprintf()
408 ret += repsep_snprintf(bf, size, "%-#*llx %c ", in _hist_entry__sym_snprintf()
412 ret += repsep_snprintf(bf + ret, size - ret, "[%c] ", level); in _hist_entry__sym_snprintf()
414 if (sym->type == STT_OBJECT) { in _hist_entry__sym_snprintf()
415 ret += repsep_snprintf(bf + ret, size - ret, "%s", sym->name); in _hist_entry__sym_snprintf()
416 ret += repsep_snprintf(bf + ret, size - ret, "+0x%llx", in _hist_entry__sym_snprintf()
417 ip - map__unmap_ip(map, sym->start)); in _hist_entry__sym_snprintf()
419 ret += repsep_snprintf(bf + ret, size - ret, "%.*s", in _hist_entry__sym_snprintf()
420 width - ret, in _hist_entry__sym_snprintf()
421 sym->name); in _hist_entry__sym_snprintf()
422 if (sym->inlined) in _hist_entry__sym_snprintf()
423 ret += repsep_snprintf(bf + ret, size - ret, in _hist_entry__sym_snprintf()
428 ret += repsep_snprintf(bf + ret, size - ret, "%-#.*llx", in _hist_entry__sym_snprintf()
437 return _hist_entry__sym_snprintf(&he->ms, he->ip, in hist_entry__sym_snprintf()
438 he->level, bf, size, width); in hist_entry__sym_snprintf()
446 return -1; in hist_entry__sym_filter()
448 return sym && (!he->ms.sym || !strstr(he->ms.sym->name, sym)); in hist_entry__sym_filter()
460 /* --sort symoff */
471 return left->ip - right->ip; in sort__symoff_cmp()
483 return left->ip - right->ip; in sort__symoff_sort()
489 struct symbol *sym = he->ms.sym; in hist_entry__symoff_snprintf()
492 return repsep_snprintf(bf, size, "[%c] %-#.*llx", he->level, width - 4, he->ip); in hist_entry__symoff_snprintf()
494 return repsep_snprintf(bf, size, "[%c] %s+0x%llx", he->level, sym->name, he->ip - sym->start); in hist_entry__symoff_snprintf()
506 /* --sort srcline */
510 return map__srcline(he->ms.map, he->ip, he->ms.sym); in hist_entry__srcline()
518 ret = _sort__addr_cmp(left->ip, right->ip); in sort__srcline_cmp()
528 if (!left->srcline) in sort__srcline_collapse()
529 left->srcline = hist_entry__srcline(left); in sort__srcline_collapse()
530 if (!right->srcline) in sort__srcline_collapse()
531 right->srcline = hist_entry__srcline(right); in sort__srcline_collapse()
533 return strcmp(right->srcline, left->srcline); in sort__srcline_collapse()
545 if (!he->srcline) in sort__srcline_init()
546 he->srcline = hist_entry__srcline(he); in sort__srcline_init()
552 return repsep_snprintf(bf, size, "%-.*s", width, he->srcline); in hist_entry__srcline_snprintf()
556 .se_header = "Source:Line",
565 /* --sort srcline_from */
569 return map__srcline(ams->ms.map, ams->al_addr, ams->ms.sym); in addr_map_symbol__srcline()
575 return left->branch_info->from.addr - right->branch_info->from.addr; in sort__srcline_from_cmp()
581 if (!left->branch_info->srcline_from) in sort__srcline_from_collapse()
582 left->branch_info->srcline_from = addr_map_symbol__srcline(&left->branch_info->from); in sort__srcline_from_collapse()
584 if (!right->branch_info->srcline_from) in sort__srcline_from_collapse()
585 right->branch_info->srcline_from = addr_map_symbol__srcline(&right->branch_info->from); in sort__srcline_from_collapse()
587 return strcmp(right->branch_info->srcline_from, left->branch_info->srcline_from); in sort__srcline_from_collapse()
598 if (!he->branch_info->srcline_from) in sort__srcline_from_init()
599 he->branch_info->srcline_from = addr_map_symbol__srcline(&he->branch_info->from); in sort__srcline_from_init()
605 return repsep_snprintf(bf, size, "%-*.*s", width, width, he->branch_info->srcline_from); in hist_entry__srcline_from_snprintf()
609 .se_header = "From Source:Line",
618 /* --sort srcline_to */
623 return left->branch_info->to.addr - right->branch_info->to.addr; in sort__srcline_to_cmp()
629 if (!left->branch_info->srcline_to) in sort__srcline_to_collapse()
630 left->branch_info->srcline_to = addr_map_symbol__srcline(&left->branch_info->to); in sort__srcline_to_collapse()
632 if (!right->branch_info->srcline_to) in sort__srcline_to_collapse()
633 right->branch_info->srcline_to = addr_map_symbol__srcline(&right->branch_info->to); in sort__srcline_to_collapse()
635 return strcmp(right->branch_info->srcline_to, left->branch_info->srcline_to); in sort__srcline_to_collapse()
646 if (!he->branch_info->srcline_to) in sort__srcline_to_init()
647 he->branch_info->srcline_to = addr_map_symbol__srcline(&he->branch_info->to); in sort__srcline_to_init()
653 return repsep_snprintf(bf, size, "%-*.*s", width, width, he->branch_info->srcline_to); in hist_entry__srcline_to_snprintf()
657 .se_header = "To Source:Line",
670 struct symbol *sym = he->ms.sym; in hist_entry__sym_ipc_snprintf()
676 return repsep_snprintf(bf, size, "%-*s", width, "-"); in hist_entry__sym_ipc_snprintf()
678 branch = symbol__annotation(sym)->branch; in hist_entry__sym_ipc_snprintf()
680 if (branch && branch->hit_cycles) in hist_entry__sym_ipc_snprintf()
681 ipc = branch->hit_insn / ((double)branch->hit_cycles); in hist_entry__sym_ipc_snprintf()
683 if (branch && branch->total_insn) { in hist_entry__sym_ipc_snprintf()
684 coverage = branch->cover_insn * 100.0 / in hist_entry__sym_ipc_snprintf()
685 ((double)branch->total_insn); in hist_entry__sym_ipc_snprintf()
688 snprintf(tmp, sizeof(tmp), "%-5.2f [%5.1f%%]", ipc, coverage); in hist_entry__sym_ipc_snprintf()
689 return repsep_snprintf(bf, size, "%-*s", width, tmp); in hist_entry__sym_ipc_snprintf()
706 snprintf(tmp, sizeof(tmp), "%-5s %2s", "-", "-"); in hist_entry__sym_ipc_null_snprintf()
707 return repsep_snprintf(bf, size, "%-*s", width, tmp); in hist_entry__sym_ipc_null_snprintf()
717 /* --sort callchain_branch_predicted */
733 callchain_branch_counts(he->callchain, &branch_count, in hist_entry__callchain_branch_predicted_snprintf()
740 return repsep_snprintf(bf, size, "%-*.*s", width, width, str); in hist_entry__callchain_branch_predicted_snprintf()
750 /* --sort callchain_branch_abort */
766 callchain_branch_counts(he->callchain, &branch_count, in hist_entry__callchain_branch_abort_snprintf()
770 return repsep_snprintf(bf, size, "%-*.*s", width, width, str); in hist_entry__callchain_branch_abort_snprintf()
780 /* --sort callchain_branch_cycles */
796 callchain_branch_counts(he->callchain, &branch_count, in hist_entry__callchain_branch_cycles_snprintf()
803 return repsep_snprintf(bf, size, "%-*.*s", width, width, str); in hist_entry__callchain_branch_cycles_snprintf()
813 /* --sort srcfile */
820 struct map *map = e->ms.map; in hist_entry__get_srcfile()
825 sf = __get_srcline(map__dso(map), map__rip_2objdump(map, e->ip), in hist_entry__get_srcfile()
826 e->ms.sym, false, true, true, e->ip); in hist_entry__get_srcfile()
847 if (!left->srcfile) in sort__srcfile_collapse()
848 left->srcfile = hist_entry__get_srcfile(left); in sort__srcfile_collapse()
849 if (!right->srcfile) in sort__srcfile_collapse()
850 right->srcfile = hist_entry__get_srcfile(right); in sort__srcfile_collapse()
852 return strcmp(right->srcfile, left->srcfile); in sort__srcfile_collapse()
863 if (!he->srcfile) in sort__srcfile_init()
864 he->srcfile = hist_entry__get_srcfile(he); in sort__srcfile_init()
870 return repsep_snprintf(bf, size, "%-.*s", width, he->srcfile); in hist_entry__srcfile_snprintf()
883 /* --sort parent */
888 struct symbol *sym_l = left->parent; in sort__parent_cmp()
889 struct symbol *sym_r = right->parent; in sort__parent_cmp()
894 return strcmp(sym_r->name, sym_l->name); in sort__parent_cmp()
900 return repsep_snprintf(bf, size, "%-*.*s", width, width, in hist_entry__parent_snprintf()
901 he->parent ? he->parent->name : "[other]"); in hist_entry__parent_snprintf()
911 /* --sort cpu */
916 return right->cpu - left->cpu; in sort__cpu_cmp()
922 return repsep_snprintf(bf, size, "%*.*d", width, width, he->cpu); in hist_entry__cpu_snprintf()
932 /* --sort parallelism */
937 return right->parallelism - left->parallelism; in sort__parallelism_cmp()
945 return -1; in hist_entry__parallelism_filter()
947 return test_bit(he->parallelism, parallelism_filter); in hist_entry__parallelism_filter()
953 return repsep_snprintf(bf, size, "%*d", width, he->parallelism); in hist_entry__parallelism_snprintf()
964 /* --sort cgroup_id */
968 return (int64_t)(right_dev - left_dev); in _sort__cgroup_dev_cmp()
973 return (int64_t)(right_ino - left_ino); in _sort__cgroup_inode_cmp()
981 ret = _sort__cgroup_dev_cmp(right->cgroup_id.dev, left->cgroup_id.dev); in sort__cgroup_id_cmp()
985 return _sort__cgroup_inode_cmp(right->cgroup_id.ino, in sort__cgroup_id_cmp()
986 left->cgroup_id.ino); in sort__cgroup_id_cmp()
993 return repsep_snprintf(bf, size, "%lu/0x%lx", he->cgroup_id.dev, in hist_entry__cgroup_id_snprintf()
994 he->cgroup_id.ino); in hist_entry__cgroup_id_snprintf()
1004 /* --sort cgroup */
1009 return right->cgroup - left->cgroup; in sort__cgroup_cmp()
1018 if (he->cgroup) { in hist_entry__cgroup_snprintf()
1019 struct cgroup *cgrp = cgroup__find(maps__machine(he->ms.maps)->env, in hist_entry__cgroup_snprintf()
1020 he->cgroup); in hist_entry__cgroup_snprintf()
1022 cgrp_name = cgrp->name; in hist_entry__cgroup_snprintf()
1037 /* --sort socket */
1042 return right->socket - left->socket; in sort__socket_cmp()
1048 return repsep_snprintf(bf, size, "%*.*d", width, width-3, he->socket); in hist_entry__socket_snprintf()
1056 return -1; in hist_entry__socket_filter()
1058 return sk >= 0 && he->socket != sk; in hist_entry__socket_filter()
1069 /* --sort time */
1074 return right->time - left->time; in sort__time_cmp()
1083 timestamp__scnprintf_nsec(he->time, he_time, in hist_entry__time_snprintf()
1086 timestamp__scnprintf_usec(he->time, he_time, in hist_entry__time_snprintf()
1089 return repsep_snprintf(bf, size, "%-.*s", width, he_time); in hist_entry__time_snprintf()
1099 /* --sort trace */
1107 .data = he->raw_data, in get_trace_output()
1108 .size = he->raw_size, in get_trace_output()
1112 evsel = hists_to_evsel(he->hists); in get_trace_output()
1118 tep_print_fields(&seq, he->raw_data, he->raw_size, tp_format); in get_trace_output()
1120 tep_print_event(tp_format->tep, &seq, &rec, "%s", TEP_PRINT_INFO); in get_trace_output()
1135 evsel = hists_to_evsel(left->hists); in sort__trace_cmp()
1136 if (evsel->core.attr.type != PERF_TYPE_TRACEPOINT) in sort__trace_cmp()
1139 if (left->trace_output == NULL) in sort__trace_cmp()
1140 left->trace_output = get_trace_output(left); in sort__trace_cmp()
1141 if (right->trace_output == NULL) in sort__trace_cmp()
1142 right->trace_output = get_trace_output(right); in sort__trace_cmp()
1144 return strcmp(right->trace_output, left->trace_output); in sort__trace_cmp()
1152 evsel = hists_to_evsel(he->hists); in hist_entry__trace_snprintf()
1153 if (evsel->core.attr.type != PERF_TYPE_TRACEPOINT) in hist_entry__trace_snprintf()
1154 return scnprintf(bf, size, "%-.*s", width, "N/A"); in hist_entry__trace_snprintf()
1156 if (he->trace_output == NULL) in hist_entry__trace_snprintf()
1157 he->trace_output = get_trace_output(he); in hist_entry__trace_snprintf()
1158 return repsep_snprintf(bf, size, "%-.*s", width, he->trace_output); in hist_entry__trace_snprintf()
1174 if (!left->branch_info || !right->branch_info) in sort__dso_from_cmp()
1175 return cmp_null(left->branch_info, right->branch_info); in sort__dso_from_cmp()
1177 return _sort__dso_cmp(left->branch_info->from.ms.map, in sort__dso_from_cmp()
1178 right->branch_info->from.ms.map); in sort__dso_from_cmp()
1184 if (he->branch_info) in hist_entry__dso_from_snprintf()
1185 return _hist_entry__dso_snprintf(he->branch_info->from.ms.map, in hist_entry__dso_from_snprintf()
1188 return repsep_snprintf(bf, size, "%-*.*s", width, width, "N/A"); in hist_entry__dso_from_snprintf()
1197 return -1; in hist_entry__dso_from_filter()
1199 return dso && (!he->branch_info || !he->branch_info->from.ms.map || in hist_entry__dso_from_filter()
1200 map__dso(he->branch_info->from.ms.map) != dso); in hist_entry__dso_from_filter()
1206 if (!left->branch_info || !right->branch_info) in sort__dso_to_cmp()
1207 return cmp_null(left->branch_info, right->branch_info); in sort__dso_to_cmp()
1209 return _sort__dso_cmp(left->branch_info->to.ms.map, in sort__dso_to_cmp()
1210 right->branch_info->to.ms.map); in sort__dso_to_cmp()
1216 if (he->branch_info) in hist_entry__dso_to_snprintf()
1217 return _hist_entry__dso_snprintf(he->branch_info->to.ms.map, in hist_entry__dso_to_snprintf()
1220 return repsep_snprintf(bf, size, "%-*.*s", width, width, "N/A"); in hist_entry__dso_to_snprintf()
1229 return -1; in hist_entry__dso_to_filter()
1231 return dso && (!he->branch_info || !he->branch_info->to.ms.map || in hist_entry__dso_to_filter()
1232 map__dso(he->branch_info->to.ms.map) != dso); in hist_entry__dso_to_filter()
1240 if (!left->branch_info || !right->branch_info) in sort__sym_from_cmp()
1241 return cmp_null(left->branch_info, right->branch_info); in sort__sym_from_cmp()
1243 from_l = &left->branch_info->from; in sort__sym_from_cmp()
1244 from_r = &right->branch_info->from; in sort__sym_from_cmp()
1246 if (!from_l->ms.sym && !from_r->ms.sym) in sort__sym_from_cmp()
1247 return _sort__addr_cmp(from_l->addr, from_r->addr); in sort__sym_from_cmp()
1249 return _sort__sym_cmp(from_l->ms.sym, from_r->ms.sym); in sort__sym_from_cmp()
1257 if (!left->branch_info || !right->branch_info) in sort__sym_to_cmp()
1258 return cmp_null(left->branch_info, right->branch_info); in sort__sym_to_cmp()
1260 to_l = &left->branch_info->to; in sort__sym_to_cmp()
1261 to_r = &right->branch_info->to; in sort__sym_to_cmp()
1263 if (!to_l->ms.sym && !to_r->ms.sym) in sort__sym_to_cmp()
1264 return _sort__addr_cmp(to_l->addr, to_r->addr); in sort__sym_to_cmp()
1266 return _sort__sym_cmp(to_l->ms.sym, to_r->ms.sym); in sort__sym_to_cmp()
1272 if (he->branch_info) { in hist_entry__sym_from_snprintf()
1273 struct addr_map_symbol *from = &he->branch_info->from; in hist_entry__sym_from_snprintf()
1275 return _hist_entry__sym_snprintf(&from->ms, from->al_addr, in hist_entry__sym_from_snprintf()
1276 from->al_level, bf, size, width); in hist_entry__sym_from_snprintf()
1279 return repsep_snprintf(bf, size, "%-*.*s", width, width, "N/A"); in hist_entry__sym_from_snprintf()
1285 if (he->branch_info) { in hist_entry__sym_to_snprintf()
1286 struct addr_map_symbol *to = &he->branch_info->to; in hist_entry__sym_to_snprintf()
1288 return _hist_entry__sym_snprintf(&to->ms, to->al_addr, in hist_entry__sym_to_snprintf()
1289 to->al_level, bf, size, width); in hist_entry__sym_to_snprintf()
1292 return repsep_snprintf(bf, size, "%-*.*s", width, width, "N/A"); in hist_entry__sym_to_snprintf()
1301 return -1; in hist_entry__sym_from_filter()
1303 return sym && !(he->branch_info && he->branch_info->from.ms.sym && in hist_entry__sym_from_filter()
1304 strstr(he->branch_info->from.ms.sym->name, sym)); in hist_entry__sym_from_filter()
1313 return -1; in hist_entry__sym_to_filter()
1315 return sym && !(he->branch_info && he->branch_info->to.ms.sym && in hist_entry__sym_to_filter()
1316 strstr(he->branch_info->to.ms.sym->name, sym)); in hist_entry__sym_to_filter()
1355 struct symbol *sym = ms->sym; in _hist_entry__addr_snprintf()
1356 struct map *map = ms->map; in _hist_entry__addr_snprintf()
1359 ret += repsep_snprintf(bf + ret, size - ret, "[%c] ", level); in _hist_entry__addr_snprintf()
1361 if (sym->type == STT_OBJECT) { in _hist_entry__addr_snprintf()
1362 ret += repsep_snprintf(bf + ret, size - ret, "%s", sym->name); in _hist_entry__addr_snprintf()
1363 ret += repsep_snprintf(bf + ret, size - ret, "+0x%llx", in _hist_entry__addr_snprintf()
1364 ip - map__unmap_ip(map, sym->start)); in _hist_entry__addr_snprintf()
1366 ret += repsep_snprintf(bf + ret, size - ret, "%.*s", in _hist_entry__addr_snprintf()
1367 width - ret, in _hist_entry__addr_snprintf()
1368 sym->name); in _hist_entry__addr_snprintf()
1369 offs = ip - sym->start; in _hist_entry__addr_snprintf()
1371 ret += repsep_snprintf(bf + ret, size - ret, "+0x%llx", offs); in _hist_entry__addr_snprintf()
1375 ret += repsep_snprintf(bf + ret, size - ret, "%-#.*llx", in _hist_entry__addr_snprintf()
1385 if (he->branch_info) { in hist_entry__addr_from_snprintf()
1386 struct addr_map_symbol *from = &he->branch_info->from; in hist_entry__addr_from_snprintf()
1388 return _hist_entry__addr_snprintf(&from->ms, from->al_addr, in hist_entry__addr_from_snprintf()
1389 he->level, bf, size, width); in hist_entry__addr_from_snprintf()
1392 return repsep_snprintf(bf, size, "%-*.*s", width, width, "N/A"); in hist_entry__addr_from_snprintf()
1398 if (he->branch_info) { in hist_entry__addr_to_snprintf()
1399 struct addr_map_symbol *to = &he->branch_info->to; in hist_entry__addr_to_snprintf()
1401 return _hist_entry__addr_snprintf(&to->ms, to->al_addr, in hist_entry__addr_to_snprintf()
1402 he->level, bf, size, width); in hist_entry__addr_to_snprintf()
1405 return repsep_snprintf(bf, size, "%-*.*s", width, width, "N/A"); in hist_entry__addr_to_snprintf()
1415 if (!left->branch_info || !right->branch_info) in sort__addr_from_cmp()
1416 return cmp_null(left->branch_info, right->branch_info); in sort__addr_from_cmp()
1418 from_l = &left->branch_info->from; in sort__addr_from_cmp()
1419 from_r = &right->branch_info->from; in sort__addr_from_cmp()
1425 ret = _sort__dso_cmp(from_l->ms.map, from_r->ms.map); in sort__addr_from_cmp()
1429 return _sort__addr_cmp(from_l->addr, from_r->addr); in sort__addr_from_cmp()
1439 if (!left->branch_info || !right->branch_info) in sort__addr_to_cmp()
1440 return cmp_null(left->branch_info, right->branch_info); in sort__addr_to_cmp()
1442 to_l = &left->branch_info->to; in sort__addr_to_cmp()
1443 to_r = &right->branch_info->to; in sort__addr_to_cmp()
1449 ret = _sort__dso_cmp(to_l->ms.map, to_r->ms.map); in sort__addr_to_cmp()
1453 return _sort__addr_cmp(to_l->addr, to_r->addr); in sort__addr_to_cmp()
1478 if (!left->branch_info || !right->branch_info) in sort__mispredict_cmp()
1479 return cmp_null(left->branch_info, right->branch_info); in sort__mispredict_cmp()
1481 mp = left->branch_info->flags.mispred != right->branch_info->flags.mispred; in sort__mispredict_cmp()
1482 p = left->branch_info->flags.predicted != right->branch_info->flags.predicted; in sort__mispredict_cmp()
1490 if (he->branch_info) { in hist_entry__mispredict_snprintf()
1491 if (he->branch_info->flags.predicted) in hist_entry__mispredict_snprintf()
1493 else if (he->branch_info->flags.mispred) in hist_entry__mispredict_snprintf()
1497 return repsep_snprintf(bf, size, "%-*.*s", width, width, out); in hist_entry__mispredict_snprintf()
1503 if (!left->branch_info || !right->branch_info) in sort__cycles_cmp()
1504 return cmp_null(left->branch_info, right->branch_info); in sort__cycles_cmp()
1506 return left->branch_info->flags.cycles - in sort__cycles_cmp()
1507 right->branch_info->flags.cycles; in sort__cycles_cmp()
1513 if (!he->branch_info) in hist_entry__cycles_snprintf()
1514 return scnprintf(bf, size, "%-.*s", width, "N/A"); in hist_entry__cycles_snprintf()
1515 if (he->branch_info->flags.cycles == 0) in hist_entry__cycles_snprintf()
1516 return repsep_snprintf(bf, size, "%-*s", width, "-"); in hist_entry__cycles_snprintf()
1517 return repsep_snprintf(bf, size, "%-*hd", width, in hist_entry__cycles_snprintf()
1518 he->branch_info->flags.cycles); in hist_entry__cycles_snprintf()
1528 /* --sort daddr_sym */
1534 if (left->mem_info) in sort__daddr_cmp()
1535 l = mem_info__daddr(left->mem_info)->addr; in sort__daddr_cmp()
1536 if (right->mem_info) in sort__daddr_cmp()
1537 r = mem_info__daddr(right->mem_info)->addr; in sort__daddr_cmp()
1539 return (int64_t)(r - l); in sort__daddr_cmp()
1548 if (he->mem_info) { in hist_entry__daddr_snprintf()
1549 addr = mem_info__daddr(he->mem_info)->addr; in hist_entry__daddr_snprintf()
1550 ms = &mem_info__daddr(he->mem_info)->ms; in hist_entry__daddr_snprintf()
1552 return _hist_entry__sym_snprintf(ms, addr, he->level, bf, size, width); in hist_entry__daddr_snprintf()
1560 if (left->mem_info) in sort__iaddr_cmp()
1561 l = mem_info__iaddr(left->mem_info)->addr; in sort__iaddr_cmp()
1562 if (right->mem_info) in sort__iaddr_cmp()
1563 r = mem_info__iaddr(right->mem_info)->addr; in sort__iaddr_cmp()
1565 return (int64_t)(r - l); in sort__iaddr_cmp()
1574 if (he->mem_info) { in hist_entry__iaddr_snprintf()
1575 addr = mem_info__iaddr(he->mem_info)->addr; in hist_entry__iaddr_snprintf()
1576 ms = &mem_info__iaddr(he->mem_info)->ms; in hist_entry__iaddr_snprintf()
1578 return _hist_entry__sym_snprintf(ms, addr, he->level, bf, size, width); in hist_entry__iaddr_snprintf()
1587 if (left->mem_info) in sort__dso_daddr_cmp()
1588 map_l = mem_info__daddr(left->mem_info)->ms.map; in sort__dso_daddr_cmp()
1589 if (right->mem_info) in sort__dso_daddr_cmp()
1590 map_r = mem_info__daddr(right->mem_info)->ms.map; in sort__dso_daddr_cmp()
1600 if (he->mem_info) in hist_entry__dso_daddr_snprintf()
1601 map = mem_info__daddr(he->mem_info)->ms.map; in hist_entry__dso_daddr_snprintf()
1612 if (left->mem_info) in sort__locked_cmp()
1613 data_src_l = *mem_info__data_src(left->mem_info); in sort__locked_cmp()
1617 if (right->mem_info) in sort__locked_cmp()
1618 data_src_r = *mem_info__data_src(right->mem_info); in sort__locked_cmp()
1622 return (int64_t)(data_src_r.mem_lock - data_src_l.mem_lock); in sort__locked_cmp()
1630 perf_mem__lck_scnprintf(out, sizeof(out), he->mem_info); in hist_entry__locked_snprintf()
1640 if (left->mem_info) in sort__tlb_cmp()
1641 data_src_l = *mem_info__data_src(left->mem_info); in sort__tlb_cmp()
1645 if (right->mem_info) in sort__tlb_cmp()
1646 data_src_r = *mem_info__data_src(right->mem_info); in sort__tlb_cmp()
1650 return (int64_t)(data_src_r.mem_dtlb - data_src_l.mem_dtlb); in sort__tlb_cmp()
1658 perf_mem__tlb_scnprintf(out, sizeof(out), he->mem_info); in hist_entry__tlb_snprintf()
1659 return repsep_snprintf(bf, size, "%-*s", width, out); in hist_entry__tlb_snprintf()
1668 if (left->mem_info) in sort__lvl_cmp()
1669 data_src_l = *mem_info__data_src(left->mem_info); in sort__lvl_cmp()
1673 if (right->mem_info) in sort__lvl_cmp()
1674 data_src_r = *mem_info__data_src(right->mem_info); in sort__lvl_cmp()
1678 return (int64_t)(data_src_r.mem_lvl - data_src_l.mem_lvl); in sort__lvl_cmp()
1686 perf_mem__lvl_scnprintf(out, sizeof(out), he->mem_info); in hist_entry__lvl_snprintf()
1687 return repsep_snprintf(bf, size, "%-*s", width, out); in hist_entry__lvl_snprintf()
1696 if (left->mem_info) in sort__snoop_cmp()
1697 data_src_l = *mem_info__data_src(left->mem_info); in sort__snoop_cmp()
1701 if (right->mem_info) in sort__snoop_cmp()
1702 data_src_r = *mem_info__data_src(right->mem_info); in sort__snoop_cmp()
1706 return (int64_t)(data_src_r.mem_snoop - data_src_l.mem_snoop); in sort__snoop_cmp()
1714 perf_mem__snp_scnprintf(out, sizeof(out), he->mem_info); in hist_entry__snoop_snprintf()
1715 return repsep_snprintf(bf, size, "%-*s", width, out); in hist_entry__snoop_snprintf()
1726 if (!left->mem_info) return -1; in sort__dcacheline_cmp()
1727 if (!right->mem_info) return 1; in sort__dcacheline_cmp()
1730 if (left->cpumode > right->cpumode) return -1; in sort__dcacheline_cmp()
1731 if (left->cpumode < right->cpumode) return 1; in sort__dcacheline_cmp()
1733 l_map = mem_info__daddr(left->mem_info)->ms.map; in sort__dcacheline_cmp()
1734 r_map = mem_info__daddr(right->mem_info)->ms.map; in sort__dcacheline_cmp()
1740 if (!l_map) return -1; in sort__dcacheline_cmp()
1752 * The kernel and non-zero major/minor mapped areas are in sort__dcacheline_cmp()
1755 if (left->cpumode != PERF_RECORD_MISC_KERNEL && (map__flags(l_map) & MAP_SHARED) == 0) { in sort__dcacheline_cmp()
1758 if (!dso_id->mmap2_valid) in sort__dcacheline_cmp()
1761 if (!build_id__is_defined(&dso_id->build_id) && in sort__dcacheline_cmp()
1762 (!dso_id->mmap2_valid || (dso_id->maj == 0 && dso_id->min == 0))) { in sort__dcacheline_cmp()
1765 if (thread__pid(left->thread) > thread__pid(right->thread)) in sort__dcacheline_cmp()
1766 return -1; in sort__dcacheline_cmp()
1767 if (thread__pid(left->thread) < thread__pid(right->thread)) in sort__dcacheline_cmp()
1773 /* al_addr does all the right addr - start + offset calculations */ in sort__dcacheline_cmp()
1774 l = cl_address(mem_info__daddr(left->mem_info)->al_addr, chk_double_cl); in sort__dcacheline_cmp()
1775 r = cl_address(mem_info__daddr(right->mem_info)->al_addr, chk_double_cl); in sort__dcacheline_cmp()
1777 if (l > r) return -1; in sort__dcacheline_cmp()
1789 char level = he->level; in hist_entry__dcacheline_snprintf()
1791 if (he->mem_info) { in hist_entry__dcacheline_snprintf()
1792 struct map *map = mem_info__daddr(he->mem_info)->ms.map; in hist_entry__dcacheline_snprintf()
1796 addr = cl_address(mem_info__daddr(he->mem_info)->al_addr, chk_double_cl); in hist_entry__dcacheline_snprintf()
1797 ms = &mem_info__daddr(he->mem_info)->ms; in hist_entry__dcacheline_snprintf()
1800 if ((he->cpumode != PERF_RECORD_MISC_KERNEL) && in hist_entry__dcacheline_snprintf()
1803 (!dso_id->mmap2_valid || (dso_id->maj == 0 && dso_id->min == 0))) in hist_entry__dcacheline_snprintf()
1821 return left->weight - right->weight; in sort__weight_cmp()
1827 return repsep_snprintf(bf, size, "%-*llu", width, he->weight); in hist_entry__local_weight_snprintf()
1840 return repsep_snprintf(bf, size, "%-*llu", width, in hist_entry__global_weight_snprintf()
1841 he->weight * he->stat.nr_events); in hist_entry__global_weight_snprintf()
1854 return left->ins_lat - right->ins_lat; in sort__ins_lat_cmp()
1860 return repsep_snprintf(bf, size, "%-*u", width, he->ins_lat); in hist_entry__local_ins_lat_snprintf()
1873 return repsep_snprintf(bf, size, "%-*u", width, in hist_entry__global_ins_lat_snprintf()
1874 he->ins_lat * he->stat.nr_events); in hist_entry__global_ins_lat_snprintf()
1887 return left->weight3 - right->weight3; in sort__p_stage_cyc_cmp()
1893 return repsep_snprintf(bf, size, "%-*u", width, he->weight3 * he->stat.nr_events); in hist_entry__global_p_stage_cyc_snprintf()
1900 return repsep_snprintf(bf, size, "%-*u", width, he->weight3); in hist_entry__p_stage_cyc_snprintf()
1979 if (left->mem_info) in sort__blocked_cmp()
1980 data_src_l = *mem_info__data_src(left->mem_info); in sort__blocked_cmp()
1984 if (right->mem_info) in sort__blocked_cmp()
1985 data_src_r = *mem_info__data_src(right->mem_info); in sort__blocked_cmp()
1989 return (int64_t)(data_src_r.mem_blk - data_src_l.mem_blk); in sort__blocked_cmp()
1997 perf_mem__blk_scnprintf(out, sizeof(out), he->mem_info); in hist_entry__blocked_snprintf()
2013 if (left->mem_info) in sort__phys_daddr_cmp()
2014 l = mem_info__daddr(left->mem_info)->phys_addr; in sort__phys_daddr_cmp()
2015 if (right->mem_info) in sort__phys_daddr_cmp()
2016 r = mem_info__daddr(right->mem_info)->phys_addr; in sort__phys_daddr_cmp()
2018 return (int64_t)(r - l); in sort__phys_daddr_cmp()
2028 addr = mem_info__daddr(he->mem_info)->phys_addr; in hist_entry__phys_daddr_snprintf()
2030 ret += repsep_snprintf(bf + ret, size - ret, "[%c] ", he->level); in hist_entry__phys_daddr_snprintf()
2032 ret += repsep_snprintf(bf + ret, size - ret, "%-#.*llx", len, addr); in hist_entry__phys_daddr_snprintf()
2034 ret += repsep_snprintf(bf + ret, size - ret, "%-*s", width - ret, ""); in hist_entry__phys_daddr_snprintf()
2054 if (left->mem_info) in sort__data_page_size_cmp()
2055 l = mem_info__daddr(left->mem_info)->data_page_size; in sort__data_page_size_cmp()
2056 if (right->mem_info) in sort__data_page_size_cmp()
2057 r = mem_info__daddr(right->mem_info)->data_page_size; in sort__data_page_size_cmp()
2059 return (int64_t)(r - l); in sort__data_page_size_cmp()
2067 return repsep_snprintf(bf, size, "%-*s", width, in hist_entry__data_page_size_snprintf()
2068 get_page_size_name(mem_info__daddr(he->mem_info)->data_page_size, str)); in hist_entry__data_page_size_snprintf()
2081 uint64_t l = left->code_page_size; in sort__code_page_size_cmp()
2082 uint64_t r = right->code_page_size; in sort__code_page_size_cmp()
2084 return (int64_t)(r - l); in sort__code_page_size_cmp()
2092 return repsep_snprintf(bf, size, "%-*s", width, in hist_entry__code_page_size_snprintf()
2093 get_page_size_name(he->code_page_size, str)); in hist_entry__code_page_size_snprintf()
2106 if (!left->branch_info || !right->branch_info) in sort__abort_cmp()
2107 return cmp_null(left->branch_info, right->branch_info); in sort__abort_cmp()
2109 return left->branch_info->flags.abort != in sort__abort_cmp()
2110 right->branch_info->flags.abort; in sort__abort_cmp()
2118 if (he->branch_info) { in hist_entry__abort_snprintf()
2119 if (he->branch_info->flags.abort) in hist_entry__abort_snprintf()
2125 return repsep_snprintf(bf, size, "%-*s", width, out); in hist_entry__abort_snprintf()
2138 if (!left->branch_info || !right->branch_info) in sort__in_tx_cmp()
2139 return cmp_null(left->branch_info, right->branch_info); in sort__in_tx_cmp()
2141 return left->branch_info->flags.in_tx != in sort__in_tx_cmp()
2142 right->branch_info->flags.in_tx; in sort__in_tx_cmp()
2150 if (he->branch_info) { in hist_entry__in_tx_snprintf()
2151 if (he->branch_info->flags.in_tx) in hist_entry__in_tx_snprintf()
2157 return repsep_snprintf(bf, size, "%-*s", width, out); in hist_entry__in_tx_snprintf()
2170 return left->transaction - right->transaction; in sort__transaction_cmp()
2190 { PERF_TXN_CAPACITY_WRITE, "CAP-WRITE ", 1 },
2191 { PERF_TXN_CAPACITY_READ, "CAP-READ ", 0 },
2211 u64 t = he->transaction; in hist_entry__transaction_snprintf()
2229 return repsep_snprintf(bf, size, "%-*s", width, buf); in hist_entry__transaction_snprintf()
2239 /* --sort symbol_size */
2246 return size_l < size_r ? -1 : in _sort__sym_size_cmp()
2253 return _sort__sym_size_cmp(right->ms.sym, left->ms.sym); in sort__sym_size_cmp()
2268 return _hist_entry__sym_size_snprintf(he->ms.sym, bf, size, width); in hist_entry__sym_size_snprintf()
2278 /* --sort dso_size */
2285 return size_l < size_r ? -1 : in _sort__dso_size_cmp()
2292 return _sort__dso_size_cmp(right->ms.map, left->ms.map); in sort__dso_size_cmp()
2307 return _hist_entry__dso_size_snprintf(he->ms.map, bf, size, width); in hist_entry__dso_size_snprintf()
2317 /* --sort addr */
2322 u64 left_ip = left->ip; in sort__addr_cmp()
2323 u64 right_ip = right->ip; in sort__addr_cmp()
2324 struct map *left_map = left->ms.map; in sort__addr_cmp()
2325 struct map *right_map = right->ms.map; in sort__addr_cmp()
2338 u64 ip = he->ip; in hist_entry__addr_snprintf()
2339 struct map *map = he->ms.map; in hist_entry__addr_snprintf()
2344 return repsep_snprintf(bf, size, "%-#*llx", width, ip); in hist_entry__addr_snprintf()
2354 /* --sort type */
2371 if (he->mem_type) in sort__type_init()
2374 he->mem_type = hist_entry__get_data_type(he); in sort__type_init()
2375 if (he->mem_type == NULL) { in sort__type_init()
2376 he->mem_type = &unknown_type; in sort__type_init()
2377 he->mem_type_off = 0; in sort__type_init()
2384 struct annotated_data_type *left_type = left->mem_type; in sort__type_collapse()
2385 struct annotated_data_type *right_type = right->mem_type; in sort__type_collapse()
2389 left_type = left->mem_type; in sort__type_collapse()
2394 right_type = right->mem_type; in sort__type_collapse()
2397 return strcmp(left_type->self.type_name, right_type->self.type_name); in sort__type_collapse()
2409 return repsep_snprintf(bf, size, "%-*s", width, he->mem_type->self.type_name); in hist_entry__type_snprintf()
2422 /* --sort typeoff */
2427 struct annotated_data_type *left_type = left->mem_type; in sort__typeoff_sort()
2428 struct annotated_data_type *right_type = right->mem_type; in sort__typeoff_sort()
2433 left_type = left->mem_type; in sort__typeoff_sort()
2438 right_type = right->mem_type; in sort__typeoff_sort()
2441 ret = strcmp(left_type->self.type_name, right_type->self.type_name); in sort__typeoff_sort()
2444 return left->mem_type_off - right->mem_type_off; in sort__typeoff_sort()
2450 struct annotated_data_type *he_type = he->mem_type; in hist_entry__typeoff_snprintf()
2455 return repsep_snprintf(bf, size, "%s", he_type->self.type_name); in hist_entry__typeoff_snprintf()
2458 he->mem_type_off)) in hist_entry__typeoff_snprintf()
2461 return repsep_snprintf(bf, size, "%s +%#x (%s)", he_type->self.type_name, in hist_entry__typeoff_snprintf()
2462 he->mem_type_off, buf); in hist_entry__typeoff_snprintf()
2475 /* --sort typecln */
2483 struct annotated_data_type *left_type = left->mem_type; in sort__typecln_sort()
2484 struct annotated_data_type *right_type = right->mem_type; in sort__typecln_sort()
2490 left_type = left->mem_type; in sort__typecln_sort()
2495 right_type = right->mem_type; in sort__typecln_sort()
2498 ret = strcmp(left_type->self.type_name, right_type->self.type_name); in sort__typecln_sort()
2502 left_cln = left->mem_type_off / TYPE_CACHELINE_SIZE; in sort__typecln_sort()
2503 right_cln = right->mem_type_off / TYPE_CACHELINE_SIZE; in sort__typecln_sort()
2504 return left_cln - right_cln; in sort__typecln_sort()
2510 struct annotated_data_type *he_type = he->mem_type; in hist_entry__typecln_snprintf()
2512 return repsep_snprintf(bf, size, "%s: cache-line %d", he_type->self.type_name, in hist_entry__typecln_snprintf()
2513 he->mem_type_off / TYPE_CACHELINE_SIZE); in hist_entry__typecln_snprintf()
2570 sd->entry->se_header = arch_perf_header_entry(sd->entry->se_header, env); in sort_dimension_add_dynamic_header()
2616 #define DIM(d, n, func) [d - __SORT_BRANCH_STACK] = { .name = n, .entry = &(func) }
2645 #define DIM(d, n, func) [d - __SORT_MEMORY_MODE] = { .name = n, .entry = &(func) }
2716 hists__new_col_len(hists, hse->se->se_width_idx, strlen(fmt->name)); in perf_hpp__reset_sort_width()
2720 struct hists *hists, int line, in __sort__hpp_header() argument
2724 size_t len = fmt->user_len; in __sort__hpp_header()
2727 if (line == hists->hpp_list->nr_header_lines - 1) in __sort__hpp_header()
2728 hdr = fmt->name; in __sort__hpp_header()
2733 len = hists__col_len(hists, hse->se->se_width_idx); in __sort__hpp_header()
2735 return scnprintf(hpp->buf, hpp->size, "%-*.*s", len, len, hdr); in __sort__hpp_header()
2743 size_t len = fmt->user_len; in __sort__hpp_width()
2748 len = hists__col_len(hists, hse->se->se_width_idx); in __sort__hpp_width()
2757 size_t len = fmt->user_len; in __sort__hpp_entry()
2762 len = hists__col_len(he->hists, hse->se->se_width_idx); in __sort__hpp_entry()
2764 return hse->se->se_snprintf(he, hpp->buf, hpp->size, len); in __sort__hpp_entry()
2773 return hse->se->se_cmp(a, b); in __sort__hpp_cmp()
2783 collapse_fn = hse->se->se_collapse ?: hse->se->se_cmp; in __sort__hpp_collapse()
2794 sort_fn = hse->se->se_sort ?: hse->se->se_cmp; in __sort__hpp_sort()
2800 return format->header == __sort__hpp_header; in perf_hpp__is_sort_entry()
2812 return hse->se == &sort_ ## key ; \
2843 return hse_a->se == hse_b->se; in MK_SORT_ENTRY_CHK()
2863 if (hse->se->se_init) in hse_init()
2864 hse->se->se_init(he); in hse_init()
2878 hse->se = sd->entry; in __sort_dimension__alloc_hpp()
2879 hse->hpp.name = sd->entry->se_header; in __sort_dimension__alloc_hpp()
2880 hse->hpp.header = __sort__hpp_header; in __sort_dimension__alloc_hpp()
2881 hse->hpp.width = __sort__hpp_width; in __sort_dimension__alloc_hpp()
2882 hse->hpp.entry = __sort__hpp_entry; in __sort_dimension__alloc_hpp()
2883 hse->hpp.color = NULL; in __sort_dimension__alloc_hpp()
2885 hse->hpp.cmp = __sort__hpp_cmp; in __sort_dimension__alloc_hpp()
2886 hse->hpp.collapse = __sort__hpp_collapse; in __sort_dimension__alloc_hpp()
2887 hse->hpp.sort = __sort__hpp_sort; in __sort_dimension__alloc_hpp()
2888 hse->hpp.equal = __sort__hpp_equal; in __sort_dimension__alloc_hpp()
2889 hse->hpp.free = hse_free; in __sort_dimension__alloc_hpp()
2890 hse->hpp.init = hse_init; in __sort_dimension__alloc_hpp()
2892 INIT_LIST_HEAD(&hse->hpp.list); in __sort_dimension__alloc_hpp()
2893 INIT_LIST_HEAD(&hse->hpp.sort_list); in __sort_dimension__alloc_hpp()
2894 hse->hpp.elide = false; in __sort_dimension__alloc_hpp()
2895 hse->hpp.len = 0; in __sort_dimension__alloc_hpp()
2896 hse->hpp.user_len = 0; in __sort_dimension__alloc_hpp()
2897 hse->hpp.level = level; in __sort_dimension__alloc_hpp()
2912 fmt = memdup(hd->fmt, sizeof(*fmt)); in __hpp_dimension__alloc_hpp()
2914 INIT_LIST_HEAD(&fmt->list); in __hpp_dimension__alloc_hpp()
2915 INIT_LIST_HEAD(&fmt->sort_list); in __hpp_dimension__alloc_hpp()
2916 fmt->free = hpp_free; in __hpp_dimension__alloc_hpp()
2917 fmt->level = level; in __hpp_dimension__alloc_hpp()
2927 int ret = -1; in hist_entry__filter()
2930 perf_hpp_list__for_each_format(he->hpp_list, fmt) { in hist_entry__filter()
2935 if (hse->se->se_filter == NULL) in hist_entry__filter()
2940 * is applied. But it should skip non-matched filter types. in hist_entry__filter()
2942 r = hse->se->se_filter(he, type, arg); in hist_entry__filter()
2960 return -1; in __sort_dimension__add_hpp_sort()
2962 perf_hpp_list__register_sort_field(list, &hse->hpp); in __sort_dimension__add_hpp_sort()
2973 return -1; in __sort_dimension__add_hpp_output()
2975 perf_hpp_list__column_register(list, &hse->hpp); in __sort_dimension__add_hpp_output()
3000 if (!hde->hpp.len) { in hde_width()
3001 int len = hde->dynamic_len; in hde_width()
3002 int namelen = strlen(hde->field->name); in hde_width()
3003 int fieldlen = hde->field->size; in hde_width()
3008 if (!(hde->field->flags & TEP_FIELD_IS_STRING)) { in hde_width()
3010 fieldlen = hde->field->size * 2 + 2; in hde_width()
3015 hde->hpp.len = len; in hde_width()
3017 return hde->hpp.len; in hde_width()
3024 struct tep_format_field *field = hde->field; in update_dynamic_len()
3028 if (hde->raw_trace) in update_dynamic_len()
3032 if (!he->trace_output) in update_dynamic_len()
3033 he->trace_output = get_trace_output(he); in update_dynamic_len()
3035 namelen = strlen(field->name); in update_dynamic_len()
3036 str = he->trace_output; in update_dynamic_len()
3045 if (!strncmp(str, field->name, namelen)) { in update_dynamic_len()
3049 len = pos - str; in update_dynamic_len()
3051 if (len > hde->dynamic_len) in update_dynamic_len()
3052 hde->dynamic_len = len; in update_dynamic_len()
3065 int line __maybe_unused, in __sort__hde_header()
3069 size_t len = fmt->user_len; in __sort__hde_header()
3076 return scnprintf(hpp->buf, hpp->size, "%*.*s", len, len, hde->field->name); in __sort__hde_header()
3084 size_t len = fmt->user_len; in __sort__hde_width()
3100 return hists_to_evsel(hists) == hde->evsel; in perf_hpp__defined_dynamic_entry()
3107 size_t len = fmt->user_len; in __sort__hde_entry()
3119 if (hde->raw_trace) in __sort__hde_entry()
3122 if (!he->trace_output) in __sort__hde_entry()
3123 he->trace_output = get_trace_output(he); in __sort__hde_entry()
3125 field = hde->field; in __sort__hde_entry()
3126 namelen = strlen(field->name); in __sort__hde_entry()
3127 str = he->trace_output; in __sort__hde_entry()
3136 if (!strncmp(str, field->name, namelen)) { in __sort__hde_entry()
3138 str = strndup(str, pos - str); in __sort__hde_entry()
3141 return scnprintf(hpp->buf, hpp->size, in __sort__hde_entry()
3156 tep_print_field(&seq, he->raw_data, hde->field); in __sort__hde_entry()
3160 ret = scnprintf(hpp->buf, hpp->size, "%*.*s", len, len, str); in __sort__hde_entry()
3174 field = hde->field; in __sort__hde_cmp()
3175 if (field->flags & TEP_FIELD_IS_DYNAMIC) { in __sort__hde_cmp()
3178 tep_read_number_field(field, a->raw_data, &dyn); in __sort__hde_cmp()
3181 if (tep_field_is_relative(field->flags)) in __sort__hde_cmp()
3182 offset += field->offset + field->size; in __sort__hde_cmp()
3184 if (size > hde->dynamic_len) in __sort__hde_cmp()
3185 hde->dynamic_len = size; in __sort__hde_cmp()
3187 offset = field->offset; in __sort__hde_cmp()
3188 size = field->size; in __sort__hde_cmp()
3191 return memcmp(a->raw_data + offset, b->raw_data + offset, size); in __sort__hde_cmp()
3196 return fmt->cmp == __sort__hde_cmp; in perf_hpp__is_dynamic_entry()
3210 return hde_a->field == hde_b->field; in __sort__hde_equal()
3244 hde->evsel = evsel; in __alloc_dynamic_entry()
3245 hde->field = field; in __alloc_dynamic_entry()
3246 hde->dynamic_len = 0; in __alloc_dynamic_entry()
3248 hde->hpp.name = field->name; in __alloc_dynamic_entry()
3249 hde->hpp.header = __sort__hde_header; in __alloc_dynamic_entry()
3250 hde->hpp.width = __sort__hde_width; in __alloc_dynamic_entry()
3251 hde->hpp.entry = __sort__hde_entry; in __alloc_dynamic_entry()
3252 hde->hpp.color = NULL; in __alloc_dynamic_entry()
3254 hde->hpp.init = __sort__hde_init; in __alloc_dynamic_entry()
3255 hde->hpp.cmp = __sort__hde_cmp; in __alloc_dynamic_entry()
3256 hde->hpp.collapse = __sort__hde_cmp; in __alloc_dynamic_entry()
3257 hde->hpp.sort = __sort__hde_cmp; in __alloc_dynamic_entry()
3258 hde->hpp.equal = __sort__hde_equal; in __alloc_dynamic_entry()
3259 hde->hpp.free = hde_free; in __alloc_dynamic_entry()
3261 INIT_LIST_HEAD(&hde->hpp.list); in __alloc_dynamic_entry()
3262 INIT_LIST_HEAD(&hde->hpp.sort_list); in __alloc_dynamic_entry()
3263 hde->hpp.elide = false; in __alloc_dynamic_entry()
3264 hde->hpp.len = 0; in __alloc_dynamic_entry()
3265 hde->hpp.user_len = 0; in __alloc_dynamic_entry()
3266 hde->hpp.level = level; in __alloc_dynamic_entry()
3282 new_fmt = &new_hse->hpp; in perf_hpp_fmt__dup()
3290 new_fmt = &new_hde->hpp; in perf_hpp_fmt__dup()
3296 INIT_LIST_HEAD(&new_fmt->list); in perf_hpp_fmt__dup()
3297 INIT_LIST_HEAD(&new_fmt->sort_list); in perf_hpp_fmt__dup()
3342 if (nr > evlist->core.nr_entries) in find_evsel()
3346 while (--nr > 0) in find_evsel()
3358 if (!full_name && strstr(pos->name, event_name)) { in find_evsel()
3361 event_name, evsel->name, pos->name); in find_evsel()
3380 return -ENOMEM; in __dynamic_dimension__add()
3382 hde->raw_trace = raw_trace; in __dynamic_dimension__add()
3384 perf_hpp__register_sort_field(&hde->hpp); in __dynamic_dimension__add()
3392 struct tep_format_field *field = tp_format ? tp_format->format.fields : NULL; in add_evsel_fields()
3398 field = field->next; in add_evsel_fields()
3410 if (evsel->core.attr.type != PERF_TYPE_TRACEPOINT) in add_all_dynamic_fields()
3423 int ret = -ESRCH; in add_all_matching_fields()
3430 if (evsel->core.attr.type != PERF_TYPE_TRACEPOINT) in add_all_matching_fields()
3458 return -ENOENT; in add_dynamic_entry()
3462 return -ENOMEM; in add_dynamic_entry()
3465 ret = -EINVAL; in add_dynamic_entry()
3472 ret = -EINVAL; in add_dynamic_entry()
3490 if (evsel->core.attr.type == PERF_TYPE_TRACEPOINT) { in add_dynamic_entry()
3492 ret = -ENOTSUP; in add_dynamic_entry()
3505 ret = -ENOENT; in add_dynamic_entry()
3509 if (evsel->core.attr.type != PERF_TYPE_TRACEPOINT) { in add_dynamic_entry()
3511 ret = -EINVAL; in add_dynamic_entry()
3526 return -ENOENT; in add_dynamic_entry()
3545 if (sd->taken) in __sort_dimension__add()
3549 return -1; in __sort_dimension__add()
3551 if (sd->entry->se_collapse) in __sort_dimension__add()
3552 list->need_collapse = 1; in __sort_dimension__add()
3554 sd->taken = 1; in __sort_dimension__add()
3565 if (hd->taken) in __hpp_dimension__add()
3570 return -1; in __hpp_dimension__add()
3572 hd->taken = 1; in __hpp_dimension__add()
3573 hd->was_taken = 1; in __hpp_dimension__add()
3582 if (sd->taken) in __sort_dimension__add_output()
3586 return -1; in __sort_dimension__add_output()
3588 sd->taken = 1; in __sort_dimension__add_output()
3598 if (hd->taken) in __hpp_dimension__add_output()
3603 return -1; in __hpp_dimension__add_output()
3605 hd->taken = 1; in __hpp_dimension__add_output()
3616 if (implicit && !hd->was_taken) in hpp_dimension__add_output()
3643 if (!sd->name || strncasecmp(tok, sd->name, strlen(tok))) in sort_dimension__add()
3647 if (sd->name && !strcmp(dynamic_headers[j], sd->name)) in sort_dimension__add()
3651 if (sd->entry == &sort_parent && parent_pattern) { in sort_dimension__add()
3658 return -EINVAL; in sort_dimension__add()
3660 list->parent = 1; in sort_dimension__add()
3661 } else if (sd->entry == &sort_sym) { in sort_dimension__add()
3662 list->sym = 1; in sort_dimension__add()
3670 sd->entry->se_collapse = sort__sym_sort; in sort_dimension__add()
3672 } else if (sd->entry == &sort_dso) { in sort_dimension__add()
3673 list->dso = 1; in sort_dimension__add()
3674 } else if (sd->entry == &sort_socket) { in sort_dimension__add()
3675 list->socket = 1; in sort_dimension__add()
3676 } else if (sd->entry == &sort_thread) { in sort_dimension__add()
3677 list->thread = 1; in sort_dimension__add()
3678 } else if (sd->entry == &sort_comm) { in sort_dimension__add()
3679 list->comm = 1; in sort_dimension__add()
3680 } else if (sd->entry == &sort_type_offset) { in sort_dimension__add()
3690 if (!sd->name || strncasecmp(tok, sd->name, strlen(tok))) in sort_dimension__add()
3700 return -EINVAL; in sort_dimension__add()
3702 if (sd->entry == &sort_sym_from || sd->entry == &sort_sym_to) in sort_dimension__add()
3703 list->sym = 1; in sort_dimension__add()
3712 if (!sd->name || strncasecmp(tok, sd->name, strlen(tok))) in sort_dimension__add()
3716 return -EINVAL; in sort_dimension__add()
3718 if (sd->entry == &sort_mem_dcacheline && cacheline_size() == 0) in sort_dimension__add()
3719 return -EINVAL; in sort_dimension__add()
3721 if (sd->entry == &sort_mem_daddr_sym) in sort_dimension__add()
3722 list->sym = 1; in sort_dimension__add()
3731 if (strncasecmp(tok, hd->name, strlen(tok))) in sort_dimension__add()
3740 return -ESRCH; in sort_dimension__add()
3758 if (sd->name && !strncasecmp(key, sd->name, strlen(key))) in is_hpp_sort_key()
3765 if (!strncasecmp(key, hd->name, strlen(key))) in is_hpp_sort_key()
3815 if (ret == -EINVAL) { in setup_sort_list()
3817 …ui__error("The \"dcacheline\" --sort key needs to know the cacheline size and it couldn't be deter… in setup_sort_list()
3819 ui__error("Invalid --sort key: `%s'", tok); in setup_sort_list()
3821 } else if (ret == -ESRCH) { in setup_sort_list()
3822 ui__error("Unknown --sort key: `%s'", tok); in setup_sort_list()
3853 if (evsel->core.attr.type != PERF_TYPE_TRACEPOINT) { in get_default_sort_order()
3873 * Append '+'-prefixed sort order to the default sort in setup_sort_order()
3880 ui__error("Invalid --sort key: `+'"); in setup_sort_order()
3881 return -EINVAL; in setup_sort_order()
3890 pr_err("Not enough memory to set up --sort"); in setup_sort_order()
3891 return -ENOMEM; in setup_sort_order()
3958 * we'll honor it and not add default sort orders. in __setup_sorting()
3969 return -ENOMEM; in __setup_sorting()
3979 return -ENOMEM; in __setup_sorting()
3999 if (hse->se->se_width_idx == idx) { in perf_hpp__set_elide()
4000 fmt->elide = elide; in perf_hpp__set_elide()
4011 strlist__entry(list, 0)->s); in __get_elide()
4063 fmt->elide = get_elide(hse->se->se_width_idx, output); in sort__setup_elide()
4074 if (!fmt->elide) in sort__setup_elide()
4082 fmt->elide = false; in sort__setup_elide()
4093 if (strncasecmp(tok, hd->name, strlen(tok))) in output_field_add()
4097 ui__warning("--fields weight shows the average value unlike in the --sort key.\n"); in output_field_add()
4099 if (hd->mem_mode && sort__mode != SORT_MODE__MEMORY) in output_field_add()
4106 * A non-output field will increase level so that it can be in a in output_field_add()
4114 if (!sd->name || strncasecmp(tok, sd->name, strlen(tok))) in output_field_add()
4123 if (!sd->name || strncasecmp(tok, sd->name, strlen(tok))) in output_field_add()
4127 return -EINVAL; in output_field_add()
4135 if (!sd->name || strncasecmp(tok, sd->name, strlen(tok))) in output_field_add()
4139 return -EINVAL; in output_field_add()
4144 return -ESRCH; in output_field_add()
4156 if (ret == -EINVAL) { in setup_output_list()
4157 ui__error("Invalid --fields key: `%s'", tok); in setup_output_list()
4159 } else if (ret == -ESRCH) { in setup_output_list()
4160 ui__error("Unknown --fields key: `%s'", tok); in setup_output_list()
4193 int ret = -EINVAL; in __setup_output_field()
4201 return -ENOMEM; in __setup_output_field()
4208 ui__error("Invalid --fields key: `+'"); in __setup_output_field()
4228 err = sort_dimension__add(&perf_hpp_list, "parent", evlist, env, -1); in setup_sorting()
4254 /* setup hists-specific output fields */ in setup_sorting()
4256 return -1; in setup_sorting()