Lines Matching +full:left +full:-
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 */
111 sort__thread_cmp(struct hist_entry *left, struct hist_entry *right) in sort__thread_cmp() argument
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 simd */
147 sort__simd_cmp(struct hist_entry *left, struct hist_entry *right) in sort__simd_cmp() argument
149 if (left->simd_flags.arch != right->simd_flags.arch) in sort__simd_cmp()
150 return (int64_t) left->simd_flags.arch - right->simd_flags.arch; in sort__simd_cmp()
152 return (int64_t) left->simd_flags.pred - right->simd_flags.pred; in sort__simd_cmp()
157 u64 arch = simd_flags->arch; in hist_entry__get_simd_name()
170 if (!he->simd_flags.arch) in hist_entry__simd_snprintf()
173 name = hist_entry__get_simd_name(&he->simd_flags); in hist_entry__simd_snprintf()
175 if (he->simd_flags.pred & SIMD_OP_FLAGS_PRED_EMPTY) in hist_entry__simd_snprintf()
177 else if (he->simd_flags.pred & SIMD_OP_FLAGS_PRED_PARTIAL) in hist_entry__simd_snprintf()
190 /* --sort comm */
198 sort__comm_cmp(struct hist_entry *left, struct hist_entry *right) in sort__comm_cmp() argument
200 return strcmp(comm__str(right->comm), comm__str(left->comm)); in sort__comm_cmp()
204 sort__comm_collapse(struct hist_entry *left, struct hist_entry *right) in sort__comm_collapse() argument
206 return strcmp(comm__str(right->comm), comm__str(left->comm)); in sort__comm_collapse()
210 sort__comm_sort(struct hist_entry *left, struct hist_entry *right) in sort__comm_sort() argument
212 return strcmp(comm__str(right->comm), comm__str(left->comm)); in sort__comm_sort()
218 return repsep_snprintf(bf, size, "%-*.*s", width, width, comm__str(he->comm)); in hist_entry__comm_snprintf()
231 /* --sort dso */
254 sort__dso_cmp(struct hist_entry *left, struct hist_entry *right) in sort__dso_cmp() argument
256 return _sort__dso_cmp(right->ms.map, left->ms.map); in sort__dso_cmp()
268 return repsep_snprintf(bf, size, "%-*.*s", width, width, dso_name); in _hist_entry__dso_snprintf()
274 return _hist_entry__dso_snprintf(he->ms.map, bf, size, width); in hist_entry__dso_snprintf()
282 return -1; in hist_entry__dso_filter()
284 return dso && (!he->ms.map || map__dso(he->ms.map) != dso); in hist_entry__dso_filter()
295 /* --sort symbol */
299 return (int64_t)(right_ip - left_ip); in _sort__addr_cmp()
310 if (sym_l->inlined || sym_r->inlined) { in _sort__sym_cmp()
311 int ret = strcmp(sym_l->name, sym_r->name); in _sort__sym_cmp()
315 if ((sym_l->start <= sym_r->end) && (sym_l->end >= sym_r->start)) in _sort__sym_cmp()
319 if (sym_l->start != sym_r->start) in _sort__sym_cmp()
320 return (int64_t)(sym_r->start - sym_l->start); in _sort__sym_cmp()
322 return (int64_t)(sym_r->end - sym_l->end); in _sort__sym_cmp()
326 sort__sym_cmp(struct hist_entry *left, struct hist_entry *right) in sort__sym_cmp() argument
330 if (!left->ms.sym && !right->ms.sym) in sort__sym_cmp()
331 return _sort__addr_cmp(left->ip, right->ip); in sort__sym_cmp()
337 if (!hists__has(left->hists, dso)) { in sort__sym_cmp()
338 ret = sort__dso_cmp(left, right); in sort__sym_cmp()
343 return _sort__sym_cmp(left->ms.sym, right->ms.sym); in sort__sym_cmp()
347 sort__sym_sort(struct hist_entry *left, struct hist_entry *right) in sort__sym_sort() argument
349 if (!left->ms.sym || !right->ms.sym) in sort__sym_sort()
350 return cmp_null(left->ms.sym, right->ms.sym); in sort__sym_sort()
352 return strcmp(right->ms.sym->name, left->ms.sym->name); in sort__sym_sort()
359 struct symbol *sym = ms->sym; in _hist_entry__sym_snprintf()
360 struct map *map = ms->map; in _hist_entry__sym_snprintf()
371 ret += repsep_snprintf(bf, size, "%-#*llx %c ", in _hist_entry__sym_snprintf()
375 ret += repsep_snprintf(bf + ret, size - ret, "[%c] ", level); in _hist_entry__sym_snprintf()
377 if (sym->type == STT_OBJECT) { in _hist_entry__sym_snprintf()
378 ret += repsep_snprintf(bf + ret, size - ret, "%s", sym->name); in _hist_entry__sym_snprintf()
379 ret += repsep_snprintf(bf + ret, size - ret, "+0x%llx", in _hist_entry__sym_snprintf()
380 ip - map__unmap_ip(map, sym->start)); in _hist_entry__sym_snprintf()
382 ret += repsep_snprintf(bf + ret, size - ret, "%.*s", in _hist_entry__sym_snprintf()
383 width - ret, in _hist_entry__sym_snprintf()
384 sym->name); in _hist_entry__sym_snprintf()
385 if (sym->inlined) in _hist_entry__sym_snprintf()
386 ret += repsep_snprintf(bf + ret, size - ret, in _hist_entry__sym_snprintf()
391 ret += repsep_snprintf(bf + ret, size - ret, "%-#.*llx", in _hist_entry__sym_snprintf()
400 return _hist_entry__sym_snprintf(&he->ms, he->ip, in hist_entry__sym_snprintf()
401 he->level, bf, size, width); in hist_entry__sym_snprintf()
409 return -1; in hist_entry__sym_filter()
411 return sym && (!he->ms.sym || !strstr(he->ms.sym->name, sym)); in hist_entry__sym_filter()
423 /* --sort symoff */
426 sort__symoff_cmp(struct hist_entry *left, struct hist_entry *right) in sort__symoff_cmp() argument
430 ret = sort__sym_cmp(left, right); in sort__symoff_cmp()
434 return left->ip - right->ip; in sort__symoff_cmp()
438 sort__symoff_sort(struct hist_entry *left, struct hist_entry *right) in sort__symoff_sort() argument
442 ret = sort__sym_sort(left, right); in sort__symoff_sort()
446 return left->ip - right->ip; in sort__symoff_sort()
452 struct symbol *sym = he->ms.sym; in hist_entry__symoff_snprintf()
455 return repsep_snprintf(bf, size, "[%c] %-#.*llx", he->level, width - 4, he->ip); in hist_entry__symoff_snprintf()
457 return repsep_snprintf(bf, size, "[%c] %s+0x%llx", he->level, sym->name, he->ip - sym->start); in hist_entry__symoff_snprintf()
469 /* --sort srcline */
473 return map__srcline(he->ms.map, he->ip, he->ms.sym); in hist_entry__srcline()
477 sort__srcline_cmp(struct hist_entry *left, struct hist_entry *right) in sort__srcline_cmp() argument
481 ret = _sort__addr_cmp(left->ip, right->ip); in sort__srcline_cmp()
485 return sort__dso_cmp(left, right); in sort__srcline_cmp()
489 sort__srcline_collapse(struct hist_entry *left, struct hist_entry *right) in sort__srcline_collapse() argument
491 if (!left->srcline) in sort__srcline_collapse()
492 left->srcline = hist_entry__srcline(left); in sort__srcline_collapse()
493 if (!right->srcline) in sort__srcline_collapse()
494 right->srcline = hist_entry__srcline(right); in sort__srcline_collapse()
496 return strcmp(right->srcline, left->srcline); in sort__srcline_collapse()
500 sort__srcline_sort(struct hist_entry *left, struct hist_entry *right) in sort__srcline_sort() argument
502 return sort__srcline_collapse(left, right); in sort__srcline_sort()
508 if (!he->srcline) in sort__srcline_init()
509 he->srcline = hist_entry__srcline(he); in sort__srcline_init()
515 return repsep_snprintf(bf, size, "%-.*s", width, he->srcline); in hist_entry__srcline_snprintf()
528 /* --sort srcline_from */
532 return map__srcline(ams->ms.map, ams->al_addr, ams->ms.sym); in addr_map_symbol__srcline()
536 sort__srcline_from_cmp(struct hist_entry *left, struct hist_entry *right) in sort__srcline_from_cmp() argument
538 return left->branch_info->from.addr - right->branch_info->from.addr; in sort__srcline_from_cmp()
542 sort__srcline_from_collapse(struct hist_entry *left, struct hist_entry *right) in sort__srcline_from_collapse() argument
544 if (!left->branch_info->srcline_from) in sort__srcline_from_collapse()
545 left->branch_info->srcline_from = addr_map_symbol__srcline(&left->branch_info->from); in sort__srcline_from_collapse()
547 if (!right->branch_info->srcline_from) in sort__srcline_from_collapse()
548 right->branch_info->srcline_from = addr_map_symbol__srcline(&right->branch_info->from); in sort__srcline_from_collapse()
550 return strcmp(right->branch_info->srcline_from, left->branch_info->srcline_from); in sort__srcline_from_collapse()
554 sort__srcline_from_sort(struct hist_entry *left, struct hist_entry *right) in sort__srcline_from_sort() argument
556 return sort__srcline_from_collapse(left, right); in sort__srcline_from_sort()
561 if (!he->branch_info->srcline_from) in sort__srcline_from_init()
562 he->branch_info->srcline_from = addr_map_symbol__srcline(&he->branch_info->from); in sort__srcline_from_init()
568 return repsep_snprintf(bf, size, "%-*.*s", width, width, he->branch_info->srcline_from); in hist_entry__srcline_from_snprintf()
581 /* --sort srcline_to */
584 sort__srcline_to_cmp(struct hist_entry *left, struct hist_entry *right) in sort__srcline_to_cmp() argument
586 return left->branch_info->to.addr - right->branch_info->to.addr; in sort__srcline_to_cmp()
590 sort__srcline_to_collapse(struct hist_entry *left, struct hist_entry *right) in sort__srcline_to_collapse() argument
592 if (!left->branch_info->srcline_to) in sort__srcline_to_collapse()
593 left->branch_info->srcline_to = addr_map_symbol__srcline(&left->branch_info->to); in sort__srcline_to_collapse()
595 if (!right->branch_info->srcline_to) in sort__srcline_to_collapse()
596 right->branch_info->srcline_to = addr_map_symbol__srcline(&right->branch_info->to); in sort__srcline_to_collapse()
598 return strcmp(right->branch_info->srcline_to, left->branch_info->srcline_to); in sort__srcline_to_collapse()
602 sort__srcline_to_sort(struct hist_entry *left, struct hist_entry *right) in sort__srcline_to_sort() argument
604 return sort__srcline_to_collapse(left, right); in sort__srcline_to_sort()
609 if (!he->branch_info->srcline_to) in sort__srcline_to_init()
610 he->branch_info->srcline_to = addr_map_symbol__srcline(&he->branch_info->to); in sort__srcline_to_init()
616 return repsep_snprintf(bf, size, "%-*.*s", width, width, he->branch_info->srcline_to); in hist_entry__srcline_to_snprintf()
633 struct symbol *sym = he->ms.sym; in hist_entry__sym_ipc_snprintf()
639 return repsep_snprintf(bf, size, "%-*s", width, "-"); in hist_entry__sym_ipc_snprintf()
641 branch = symbol__annotation(sym)->branch; in hist_entry__sym_ipc_snprintf()
643 if (branch && branch->hit_cycles) in hist_entry__sym_ipc_snprintf()
644 ipc = branch->hit_insn / ((double)branch->hit_cycles); in hist_entry__sym_ipc_snprintf()
646 if (branch && branch->total_insn) { in hist_entry__sym_ipc_snprintf()
647 coverage = branch->cover_insn * 100.0 / in hist_entry__sym_ipc_snprintf()
648 ((double)branch->total_insn); in hist_entry__sym_ipc_snprintf()
651 snprintf(tmp, sizeof(tmp), "%-5.2f [%5.1f%%]", ipc, coverage); in hist_entry__sym_ipc_snprintf()
652 return repsep_snprintf(bf, size, "%-*s", width, tmp); in hist_entry__sym_ipc_snprintf()
669 snprintf(tmp, sizeof(tmp), "%-5s %2s", "-", "-"); in hist_entry__sym_ipc_null_snprintf()
670 return repsep_snprintf(bf, size, "%-*s", width, tmp); in hist_entry__sym_ipc_null_snprintf()
680 /* --sort callchain_branch_predicted */
683 sort__callchain_branch_predicted_cmp(struct hist_entry *left __maybe_unused, in sort__callchain_branch_predicted_cmp()
696 callchain_branch_counts(he->callchain, &branch_count, in hist_entry__callchain_branch_predicted_snprintf()
703 return repsep_snprintf(bf, size, "%-*.*s", width, width, str); in hist_entry__callchain_branch_predicted_snprintf()
713 /* --sort callchain_branch_abort */
716 sort__callchain_branch_abort_cmp(struct hist_entry *left __maybe_unused, in sort__callchain_branch_abort_cmp()
729 callchain_branch_counts(he->callchain, &branch_count, in hist_entry__callchain_branch_abort_snprintf()
733 return repsep_snprintf(bf, size, "%-*.*s", width, width, str); in hist_entry__callchain_branch_abort_snprintf()
743 /* --sort callchain_branch_cycles */
746 sort__callchain_branch_cycles_cmp(struct hist_entry *left __maybe_unused, in sort__callchain_branch_cycles_cmp()
759 callchain_branch_counts(he->callchain, &branch_count, in hist_entry__callchain_branch_cycles_snprintf()
766 return repsep_snprintf(bf, size, "%-*.*s", width, width, str); in hist_entry__callchain_branch_cycles_snprintf()
776 /* --sort srcfile */
783 struct map *map = e->ms.map; in hist_entry__get_srcfile()
788 sf = __get_srcline(map__dso(map), map__rip_2objdump(map, e->ip), in hist_entry__get_srcfile()
789 e->ms.sym, false, true, true, e->ip); in hist_entry__get_srcfile()
802 sort__srcfile_cmp(struct hist_entry *left, struct hist_entry *right) in sort__srcfile_cmp() argument
804 return sort__srcline_cmp(left, right); in sort__srcfile_cmp()
808 sort__srcfile_collapse(struct hist_entry *left, struct hist_entry *right) in sort__srcfile_collapse() argument
810 if (!left->srcfile) in sort__srcfile_collapse()
811 left->srcfile = hist_entry__get_srcfile(left); in sort__srcfile_collapse()
812 if (!right->srcfile) in sort__srcfile_collapse()
813 right->srcfile = hist_entry__get_srcfile(right); in sort__srcfile_collapse()
815 return strcmp(right->srcfile, left->srcfile); in sort__srcfile_collapse()
819 sort__srcfile_sort(struct hist_entry *left, struct hist_entry *right) in sort__srcfile_sort() argument
821 return sort__srcfile_collapse(left, right); in sort__srcfile_sort()
826 if (!he->srcfile) in sort__srcfile_init()
827 he->srcfile = hist_entry__get_srcfile(he); in sort__srcfile_init()
833 return repsep_snprintf(bf, size, "%-.*s", width, he->srcfile); in hist_entry__srcfile_snprintf()
846 /* --sort parent */
849 sort__parent_cmp(struct hist_entry *left, struct hist_entry *right) in sort__parent_cmp() argument
851 struct symbol *sym_l = left->parent; in sort__parent_cmp()
852 struct symbol *sym_r = right->parent; in sort__parent_cmp()
857 return strcmp(sym_r->name, sym_l->name); in sort__parent_cmp()
863 return repsep_snprintf(bf, size, "%-*.*s", width, width, in hist_entry__parent_snprintf()
864 he->parent ? he->parent->name : "[other]"); in hist_entry__parent_snprintf()
874 /* --sort cpu */
877 sort__cpu_cmp(struct hist_entry *left, struct hist_entry *right) in sort__cpu_cmp() argument
879 return right->cpu - left->cpu; in sort__cpu_cmp()
885 return repsep_snprintf(bf, size, "%*.*d", width, width, he->cpu); in hist_entry__cpu_snprintf()
895 /* --sort cgroup_id */
899 return (int64_t)(right_dev - left_dev); in _sort__cgroup_dev_cmp()
904 return (int64_t)(right_ino - left_ino); in _sort__cgroup_inode_cmp()
908 sort__cgroup_id_cmp(struct hist_entry *left, struct hist_entry *right) in sort__cgroup_id_cmp() argument
912 ret = _sort__cgroup_dev_cmp(right->cgroup_id.dev, left->cgroup_id.dev); in sort__cgroup_id_cmp()
916 return _sort__cgroup_inode_cmp(right->cgroup_id.ino, in sort__cgroup_id_cmp()
917 left->cgroup_id.ino); in sort__cgroup_id_cmp()
924 return repsep_snprintf(bf, size, "%lu/0x%lx", he->cgroup_id.dev, in hist_entry__cgroup_id_snprintf()
925 he->cgroup_id.ino); in hist_entry__cgroup_id_snprintf()
935 /* --sort cgroup */
938 sort__cgroup_cmp(struct hist_entry *left, struct hist_entry *right) in sort__cgroup_cmp() argument
940 return right->cgroup - left->cgroup; in sort__cgroup_cmp()
949 if (he->cgroup) { in hist_entry__cgroup_snprintf()
950 struct cgroup *cgrp = cgroup__find(maps__machine(he->ms.maps)->env, in hist_entry__cgroup_snprintf()
951 he->cgroup); in hist_entry__cgroup_snprintf()
953 cgrp_name = cgrp->name; in hist_entry__cgroup_snprintf()
968 /* --sort socket */
971 sort__socket_cmp(struct hist_entry *left, struct hist_entry *right) in sort__socket_cmp() argument
973 return right->socket - left->socket; in sort__socket_cmp()
979 return repsep_snprintf(bf, size, "%*.*d", width, width-3, he->socket); in hist_entry__socket_snprintf()
987 return -1; in hist_entry__socket_filter()
989 return sk >= 0 && he->socket != sk; in hist_entry__socket_filter()
1000 /* --sort time */
1003 sort__time_cmp(struct hist_entry *left, struct hist_entry *right) in sort__time_cmp() argument
1005 return right->time - left->time; in sort__time_cmp()
1014 timestamp__scnprintf_nsec(he->time, he_time, in hist_entry__time_snprintf()
1017 timestamp__scnprintf_usec(he->time, he_time, in hist_entry__time_snprintf()
1020 return repsep_snprintf(bf, size, "%-.*s", width, he_time); in hist_entry__time_snprintf()
1030 /* --sort trace */
1038 .data = he->raw_data, in get_trace_output()
1039 .size = he->raw_size, in get_trace_output()
1043 evsel = hists_to_evsel(he->hists); in get_trace_output()
1049 tep_print_fields(&seq, he->raw_data, he->raw_size, tp_format); in get_trace_output()
1051 tep_print_event(tp_format->tep, &seq, &rec, "%s", TEP_PRINT_INFO); in get_trace_output()
1062 sort__trace_cmp(struct hist_entry *left, struct hist_entry *right) in sort__trace_cmp() argument
1066 evsel = hists_to_evsel(left->hists); in sort__trace_cmp()
1067 if (evsel->core.attr.type != PERF_TYPE_TRACEPOINT) in sort__trace_cmp()
1070 if (left->trace_output == NULL) in sort__trace_cmp()
1071 left->trace_output = get_trace_output(left); in sort__trace_cmp()
1072 if (right->trace_output == NULL) in sort__trace_cmp()
1073 right->trace_output = get_trace_output(right); in sort__trace_cmp()
1075 return strcmp(right->trace_output, left->trace_output); in sort__trace_cmp()
1083 evsel = hists_to_evsel(he->hists); in hist_entry__trace_snprintf()
1084 if (evsel->core.attr.type != PERF_TYPE_TRACEPOINT) in hist_entry__trace_snprintf()
1085 return scnprintf(bf, size, "%-.*s", width, "N/A"); in hist_entry__trace_snprintf()
1087 if (he->trace_output == NULL) in hist_entry__trace_snprintf()
1088 he->trace_output = get_trace_output(he); in hist_entry__trace_snprintf()
1089 return repsep_snprintf(bf, size, "%-.*s", width, he->trace_output); in hist_entry__trace_snprintf()
1103 sort__dso_from_cmp(struct hist_entry *left, struct hist_entry *right) in sort__dso_from_cmp() argument
1105 if (!left->branch_info || !right->branch_info) in sort__dso_from_cmp()
1106 return cmp_null(left->branch_info, right->branch_info); in sort__dso_from_cmp()
1108 return _sort__dso_cmp(left->branch_info->from.ms.map, in sort__dso_from_cmp()
1109 right->branch_info->from.ms.map); in sort__dso_from_cmp()
1115 if (he->branch_info) in hist_entry__dso_from_snprintf()
1116 return _hist_entry__dso_snprintf(he->branch_info->from.ms.map, in hist_entry__dso_from_snprintf()
1119 return repsep_snprintf(bf, size, "%-*.*s", width, width, "N/A"); in hist_entry__dso_from_snprintf()
1128 return -1; in hist_entry__dso_from_filter()
1130 return dso && (!he->branch_info || !he->branch_info->from.ms.map || in hist_entry__dso_from_filter()
1131 map__dso(he->branch_info->from.ms.map) != dso); in hist_entry__dso_from_filter()
1135 sort__dso_to_cmp(struct hist_entry *left, struct hist_entry *right) in sort__dso_to_cmp() argument
1137 if (!left->branch_info || !right->branch_info) in sort__dso_to_cmp()
1138 return cmp_null(left->branch_info, right->branch_info); in sort__dso_to_cmp()
1140 return _sort__dso_cmp(left->branch_info->to.ms.map, in sort__dso_to_cmp()
1141 right->branch_info->to.ms.map); in sort__dso_to_cmp()
1147 if (he->branch_info) in hist_entry__dso_to_snprintf()
1148 return _hist_entry__dso_snprintf(he->branch_info->to.ms.map, in hist_entry__dso_to_snprintf()
1151 return repsep_snprintf(bf, size, "%-*.*s", width, width, "N/A"); in hist_entry__dso_to_snprintf()
1160 return -1; in hist_entry__dso_to_filter()
1162 return dso && (!he->branch_info || !he->branch_info->to.ms.map || in hist_entry__dso_to_filter()
1163 map__dso(he->branch_info->to.ms.map) != dso); in hist_entry__dso_to_filter()
1167 sort__sym_from_cmp(struct hist_entry *left, struct hist_entry *right) in sort__sym_from_cmp() argument
1171 if (!left->branch_info || !right->branch_info) in sort__sym_from_cmp()
1172 return cmp_null(left->branch_info, right->branch_info); in sort__sym_from_cmp()
1174 from_l = &left->branch_info->from; in sort__sym_from_cmp()
1175 from_r = &right->branch_info->from; in sort__sym_from_cmp()
1177 if (!from_l->ms.sym && !from_r->ms.sym) in sort__sym_from_cmp()
1178 return _sort__addr_cmp(from_l->addr, from_r->addr); in sort__sym_from_cmp()
1180 return _sort__sym_cmp(from_l->ms.sym, from_r->ms.sym); in sort__sym_from_cmp()
1184 sort__sym_to_cmp(struct hist_entry *left, struct hist_entry *right) in sort__sym_to_cmp() argument
1188 if (!left->branch_info || !right->branch_info) in sort__sym_to_cmp()
1189 return cmp_null(left->branch_info, right->branch_info); in sort__sym_to_cmp()
1191 to_l = &left->branch_info->to; in sort__sym_to_cmp()
1192 to_r = &right->branch_info->to; in sort__sym_to_cmp()
1194 if (!to_l->ms.sym && !to_r->ms.sym) in sort__sym_to_cmp()
1195 return _sort__addr_cmp(to_l->addr, to_r->addr); in sort__sym_to_cmp()
1197 return _sort__sym_cmp(to_l->ms.sym, to_r->ms.sym); in sort__sym_to_cmp()
1203 if (he->branch_info) { in hist_entry__sym_from_snprintf()
1204 struct addr_map_symbol *from = &he->branch_info->from; in hist_entry__sym_from_snprintf()
1206 return _hist_entry__sym_snprintf(&from->ms, from->al_addr, in hist_entry__sym_from_snprintf()
1207 from->al_level, bf, size, width); in hist_entry__sym_from_snprintf()
1210 return repsep_snprintf(bf, size, "%-*.*s", width, width, "N/A"); in hist_entry__sym_from_snprintf()
1216 if (he->branch_info) { in hist_entry__sym_to_snprintf()
1217 struct addr_map_symbol *to = &he->branch_info->to; in hist_entry__sym_to_snprintf()
1219 return _hist_entry__sym_snprintf(&to->ms, to->al_addr, in hist_entry__sym_to_snprintf()
1220 to->al_level, bf, size, width); in hist_entry__sym_to_snprintf()
1223 return repsep_snprintf(bf, size, "%-*.*s", width, width, "N/A"); in hist_entry__sym_to_snprintf()
1232 return -1; in hist_entry__sym_from_filter()
1234 return sym && !(he->branch_info && he->branch_info->from.ms.sym && in hist_entry__sym_from_filter()
1235 strstr(he->branch_info->from.ms.sym->name, sym)); in hist_entry__sym_from_filter()
1244 return -1; in hist_entry__sym_to_filter()
1246 return sym && !(he->branch_info && he->branch_info->to.ms.sym && in hist_entry__sym_to_filter()
1247 strstr(he->branch_info->to.ms.sym->name, sym)); in hist_entry__sym_to_filter()
1286 struct symbol *sym = ms->sym; in _hist_entry__addr_snprintf()
1287 struct map *map = ms->map; in _hist_entry__addr_snprintf()
1290 ret += repsep_snprintf(bf + ret, size - ret, "[%c] ", level); in _hist_entry__addr_snprintf()
1292 if (sym->type == STT_OBJECT) { in _hist_entry__addr_snprintf()
1293 ret += repsep_snprintf(bf + ret, size - ret, "%s", sym->name); in _hist_entry__addr_snprintf()
1294 ret += repsep_snprintf(bf + ret, size - ret, "+0x%llx", in _hist_entry__addr_snprintf()
1295 ip - map__unmap_ip(map, sym->start)); in _hist_entry__addr_snprintf()
1297 ret += repsep_snprintf(bf + ret, size - ret, "%.*s", in _hist_entry__addr_snprintf()
1298 width - ret, in _hist_entry__addr_snprintf()
1299 sym->name); in _hist_entry__addr_snprintf()
1300 offs = ip - sym->start; in _hist_entry__addr_snprintf()
1302 ret += repsep_snprintf(bf + ret, size - ret, "+0x%llx", offs); in _hist_entry__addr_snprintf()
1306 ret += repsep_snprintf(bf + ret, size - ret, "%-#.*llx", in _hist_entry__addr_snprintf()
1316 if (he->branch_info) { in hist_entry__addr_from_snprintf()
1317 struct addr_map_symbol *from = &he->branch_info->from; in hist_entry__addr_from_snprintf()
1319 return _hist_entry__addr_snprintf(&from->ms, from->al_addr, in hist_entry__addr_from_snprintf()
1320 he->level, bf, size, width); in hist_entry__addr_from_snprintf()
1323 return repsep_snprintf(bf, size, "%-*.*s", width, width, "N/A"); in hist_entry__addr_from_snprintf()
1329 if (he->branch_info) { in hist_entry__addr_to_snprintf()
1330 struct addr_map_symbol *to = &he->branch_info->to; in hist_entry__addr_to_snprintf()
1332 return _hist_entry__addr_snprintf(&to->ms, to->al_addr, in hist_entry__addr_to_snprintf()
1333 he->level, bf, size, width); in hist_entry__addr_to_snprintf()
1336 return repsep_snprintf(bf, size, "%-*.*s", width, width, "N/A"); in hist_entry__addr_to_snprintf()
1340 sort__addr_from_cmp(struct hist_entry *left, struct hist_entry *right) in sort__addr_from_cmp() argument
1346 if (!left->branch_info || !right->branch_info) in sort__addr_from_cmp()
1347 return cmp_null(left->branch_info, right->branch_info); in sort__addr_from_cmp()
1349 from_l = &left->branch_info->from; in sort__addr_from_cmp()
1350 from_r = &right->branch_info->from; in sort__addr_from_cmp()
1356 ret = _sort__dso_cmp(from_l->ms.map, from_r->ms.map); in sort__addr_from_cmp()
1360 return _sort__addr_cmp(from_l->addr, from_r->addr); in sort__addr_from_cmp()
1364 sort__addr_to_cmp(struct hist_entry *left, struct hist_entry *right) in sort__addr_to_cmp() argument
1370 if (!left->branch_info || !right->branch_info) in sort__addr_to_cmp()
1371 return cmp_null(left->branch_info, right->branch_info); in sort__addr_to_cmp()
1373 to_l = &left->branch_info->to; in sort__addr_to_cmp()
1374 to_r = &right->branch_info->to; in sort__addr_to_cmp()
1380 ret = _sort__dso_cmp(to_l->ms.map, to_r->ms.map); in sort__addr_to_cmp()
1384 return _sort__addr_cmp(to_l->addr, to_r->addr); in sort__addr_to_cmp()
1405 sort__mispredict_cmp(struct hist_entry *left, struct hist_entry *right) in sort__mispredict_cmp() argument
1409 if (!left->branch_info || !right->branch_info) in sort__mispredict_cmp()
1410 return cmp_null(left->branch_info, right->branch_info); in sort__mispredict_cmp()
1412 mp = left->branch_info->flags.mispred != right->branch_info->flags.mispred; in sort__mispredict_cmp()
1413 p = left->branch_info->flags.predicted != right->branch_info->flags.predicted; in sort__mispredict_cmp()
1421 if (he->branch_info) { in hist_entry__mispredict_snprintf()
1422 if (he->branch_info->flags.predicted) in hist_entry__mispredict_snprintf()
1424 else if (he->branch_info->flags.mispred) in hist_entry__mispredict_snprintf()
1428 return repsep_snprintf(bf, size, "%-*.*s", width, width, out); in hist_entry__mispredict_snprintf()
1432 sort__cycles_cmp(struct hist_entry *left, struct hist_entry *right) in sort__cycles_cmp() argument
1434 if (!left->branch_info || !right->branch_info) in sort__cycles_cmp()
1435 return cmp_null(left->branch_info, right->branch_info); in sort__cycles_cmp()
1437 return left->branch_info->flags.cycles - in sort__cycles_cmp()
1438 right->branch_info->flags.cycles; in sort__cycles_cmp()
1444 if (!he->branch_info) in hist_entry__cycles_snprintf()
1445 return scnprintf(bf, size, "%-.*s", width, "N/A"); in hist_entry__cycles_snprintf()
1446 if (he->branch_info->flags.cycles == 0) in hist_entry__cycles_snprintf()
1447 return repsep_snprintf(bf, size, "%-*s", width, "-"); in hist_entry__cycles_snprintf()
1448 return repsep_snprintf(bf, size, "%-*hd", width, in hist_entry__cycles_snprintf()
1449 he->branch_info->flags.cycles); in hist_entry__cycles_snprintf()
1459 /* --sort daddr_sym */
1461 sort__daddr_cmp(struct hist_entry *left, struct hist_entry *right) in sort__daddr_cmp() argument
1465 if (left->mem_info) in sort__daddr_cmp()
1466 l = mem_info__daddr(left->mem_info)->addr; in sort__daddr_cmp()
1467 if (right->mem_info) in sort__daddr_cmp()
1468 r = mem_info__daddr(right->mem_info)->addr; in sort__daddr_cmp()
1470 return (int64_t)(r - l); in sort__daddr_cmp()
1479 if (he->mem_info) { in hist_entry__daddr_snprintf()
1480 addr = mem_info__daddr(he->mem_info)->addr; in hist_entry__daddr_snprintf()
1481 ms = &mem_info__daddr(he->mem_info)->ms; in hist_entry__daddr_snprintf()
1483 return _hist_entry__sym_snprintf(ms, addr, he->level, bf, size, width); in hist_entry__daddr_snprintf()
1487 sort__iaddr_cmp(struct hist_entry *left, struct hist_entry *right) in sort__iaddr_cmp() argument
1491 if (left->mem_info) in sort__iaddr_cmp()
1492 l = mem_info__iaddr(left->mem_info)->addr; in sort__iaddr_cmp()
1493 if (right->mem_info) in sort__iaddr_cmp()
1494 r = mem_info__iaddr(right->mem_info)->addr; in sort__iaddr_cmp()
1496 return (int64_t)(r - l); in sort__iaddr_cmp()
1505 if (he->mem_info) { in hist_entry__iaddr_snprintf()
1506 addr = mem_info__iaddr(he->mem_info)->addr; in hist_entry__iaddr_snprintf()
1507 ms = &mem_info__iaddr(he->mem_info)->ms; in hist_entry__iaddr_snprintf()
1509 return _hist_entry__sym_snprintf(ms, addr, he->level, bf, size, width); in hist_entry__iaddr_snprintf()
1513 sort__dso_daddr_cmp(struct hist_entry *left, struct hist_entry *right) in sort__dso_daddr_cmp() argument
1518 if (left->mem_info) in sort__dso_daddr_cmp()
1519 map_l = mem_info__daddr(left->mem_info)->ms.map; in sort__dso_daddr_cmp()
1520 if (right->mem_info) in sort__dso_daddr_cmp()
1521 map_r = mem_info__daddr(right->mem_info)->ms.map; in sort__dso_daddr_cmp()
1531 if (he->mem_info) in hist_entry__dso_daddr_snprintf()
1532 map = mem_info__daddr(he->mem_info)->ms.map; in hist_entry__dso_daddr_snprintf()
1538 sort__locked_cmp(struct hist_entry *left, struct hist_entry *right) in sort__locked_cmp() argument
1543 if (left->mem_info) in sort__locked_cmp()
1544 data_src_l = *mem_info__data_src(left->mem_info); in sort__locked_cmp()
1548 if (right->mem_info) in sort__locked_cmp()
1549 data_src_r = *mem_info__data_src(right->mem_info); in sort__locked_cmp()
1553 return (int64_t)(data_src_r.mem_lock - data_src_l.mem_lock); in sort__locked_cmp()
1561 perf_mem__lck_scnprintf(out, sizeof(out), he->mem_info); in hist_entry__locked_snprintf()
1566 sort__tlb_cmp(struct hist_entry *left, struct hist_entry *right) in sort__tlb_cmp() argument
1571 if (left->mem_info) in sort__tlb_cmp()
1572 data_src_l = *mem_info__data_src(left->mem_info); in sort__tlb_cmp()
1576 if (right->mem_info) in sort__tlb_cmp()
1577 data_src_r = *mem_info__data_src(right->mem_info); in sort__tlb_cmp()
1581 return (int64_t)(data_src_r.mem_dtlb - data_src_l.mem_dtlb); in sort__tlb_cmp()
1589 perf_mem__tlb_scnprintf(out, sizeof(out), he->mem_info); in hist_entry__tlb_snprintf()
1590 return repsep_snprintf(bf, size, "%-*s", width, out); in hist_entry__tlb_snprintf()
1594 sort__lvl_cmp(struct hist_entry *left, struct hist_entry *right) in sort__lvl_cmp() argument
1599 if (left->mem_info) in sort__lvl_cmp()
1600 data_src_l = *mem_info__data_src(left->mem_info); in sort__lvl_cmp()
1604 if (right->mem_info) in sort__lvl_cmp()
1605 data_src_r = *mem_info__data_src(right->mem_info); in sort__lvl_cmp()
1609 return (int64_t)(data_src_r.mem_lvl - data_src_l.mem_lvl); in sort__lvl_cmp()
1617 perf_mem__lvl_scnprintf(out, sizeof(out), he->mem_info); in hist_entry__lvl_snprintf()
1618 return repsep_snprintf(bf, size, "%-*s", width, out); in hist_entry__lvl_snprintf()
1622 sort__snoop_cmp(struct hist_entry *left, struct hist_entry *right) in sort__snoop_cmp() argument
1627 if (left->mem_info) in sort__snoop_cmp()
1628 data_src_l = *mem_info__data_src(left->mem_info); in sort__snoop_cmp()
1632 if (right->mem_info) in sort__snoop_cmp()
1633 data_src_r = *mem_info__data_src(right->mem_info); in sort__snoop_cmp()
1637 return (int64_t)(data_src_r.mem_snoop - data_src_l.mem_snoop); in sort__snoop_cmp()
1645 perf_mem__snp_scnprintf(out, sizeof(out), he->mem_info); in hist_entry__snoop_snprintf()
1646 return repsep_snprintf(bf, size, "%-*s", width, out); in hist_entry__snoop_snprintf()
1650 sort__dcacheline_cmp(struct hist_entry *left, struct hist_entry *right) in sort__dcacheline_cmp() argument
1657 if (!left->mem_info) return -1; in sort__dcacheline_cmp()
1658 if (!right->mem_info) return 1; in sort__dcacheline_cmp()
1661 if (left->cpumode > right->cpumode) return -1; in sort__dcacheline_cmp()
1662 if (left->cpumode < right->cpumode) return 1; in sort__dcacheline_cmp()
1664 l_map = mem_info__daddr(left->mem_info)->ms.map; in sort__dcacheline_cmp()
1665 r_map = mem_info__daddr(right->mem_info)->ms.map; in sort__dcacheline_cmp()
1671 if (!l_map) return -1; in sort__dcacheline_cmp()
1683 * The kernel and non-zero major/minor mapped areas are in sort__dcacheline_cmp()
1687 if ((left->cpumode != PERF_RECORD_MISC_KERNEL) && in sort__dcacheline_cmp()
1688 (!(map__flags(l_map) & MAP_SHARED)) && !dso__id(l_dso)->maj && !dso__id(l_dso)->min && in sort__dcacheline_cmp()
1689 !dso__id(l_dso)->ino && !dso__id(l_dso)->ino_generation) { in sort__dcacheline_cmp()
1692 if (thread__pid(left->thread) > thread__pid(right->thread)) in sort__dcacheline_cmp()
1693 return -1; in sort__dcacheline_cmp()
1694 if (thread__pid(left->thread) < thread__pid(right->thread)) in sort__dcacheline_cmp()
1699 /* al_addr does all the right addr - start + offset calculations */ in sort__dcacheline_cmp()
1700 l = cl_address(mem_info__daddr(left->mem_info)->al_addr, chk_double_cl); in sort__dcacheline_cmp()
1701 r = cl_address(mem_info__daddr(right->mem_info)->al_addr, chk_double_cl); in sort__dcacheline_cmp()
1703 if (l > r) return -1; in sort__dcacheline_cmp()
1715 char level = he->level; in hist_entry__dcacheline_snprintf()
1717 if (he->mem_info) { in hist_entry__dcacheline_snprintf()
1718 struct map *map = mem_info__daddr(he->mem_info)->ms.map; in hist_entry__dcacheline_snprintf()
1721 addr = cl_address(mem_info__daddr(he->mem_info)->al_addr, chk_double_cl); in hist_entry__dcacheline_snprintf()
1722 ms = &mem_info__daddr(he->mem_info)->ms; in hist_entry__dcacheline_snprintf()
1725 if ((he->cpumode != PERF_RECORD_MISC_KERNEL) && in hist_entry__dcacheline_snprintf()
1728 (dso__id(dso)->maj || dso__id(dso)->min || dso__id(dso)->ino || in hist_entry__dcacheline_snprintf()
1729 dso__id(dso)->ino_generation)) in hist_entry__dcacheline_snprintf()
1745 sort__weight_cmp(struct hist_entry *left, struct hist_entry *right) in sort__weight_cmp() argument
1747 return left->weight - right->weight; in sort__weight_cmp()
1753 return repsep_snprintf(bf, size, "%-*llu", width, he->weight); in hist_entry__local_weight_snprintf()
1766 return repsep_snprintf(bf, size, "%-*llu", width, in hist_entry__global_weight_snprintf()
1767 he->weight * he->stat.nr_events); in hist_entry__global_weight_snprintf()
1778 sort__ins_lat_cmp(struct hist_entry *left, struct hist_entry *right) in sort__ins_lat_cmp() argument
1780 return left->ins_lat - right->ins_lat; in sort__ins_lat_cmp()
1786 return repsep_snprintf(bf, size, "%-*u", width, he->ins_lat); in hist_entry__local_ins_lat_snprintf()
1799 return repsep_snprintf(bf, size, "%-*u", width, in hist_entry__global_ins_lat_snprintf()
1800 he->ins_lat * he->stat.nr_events); in hist_entry__global_ins_lat_snprintf()
1811 sort__p_stage_cyc_cmp(struct hist_entry *left, struct hist_entry *right) in sort__p_stage_cyc_cmp() argument
1813 return left->p_stage_cyc - right->p_stage_cyc; in sort__p_stage_cyc_cmp()
1819 return repsep_snprintf(bf, size, "%-*u", width, in hist_entry__global_p_stage_cyc_snprintf()
1820 he->p_stage_cyc * he->stat.nr_events); in hist_entry__global_p_stage_cyc_snprintf()
1827 return repsep_snprintf(bf, size, "%-*u", width, he->p_stage_cyc); in hist_entry__p_stage_cyc_snprintf()
1901 sort__blocked_cmp(struct hist_entry *left, struct hist_entry *right) in sort__blocked_cmp() argument
1906 if (left->mem_info) in sort__blocked_cmp()
1907 data_src_l = *mem_info__data_src(left->mem_info); in sort__blocked_cmp()
1911 if (right->mem_info) in sort__blocked_cmp()
1912 data_src_r = *mem_info__data_src(right->mem_info); in sort__blocked_cmp()
1916 return (int64_t)(data_src_r.mem_blk - data_src_l.mem_blk); in sort__blocked_cmp()
1924 perf_mem__blk_scnprintf(out, sizeof(out), he->mem_info); in hist_entry__blocked_snprintf()
1936 sort__phys_daddr_cmp(struct hist_entry *left, struct hist_entry *right) in sort__phys_daddr_cmp() argument
1940 if (left->mem_info) in sort__phys_daddr_cmp()
1941 l = mem_info__daddr(left->mem_info)->phys_addr; in sort__phys_daddr_cmp()
1942 if (right->mem_info) in sort__phys_daddr_cmp()
1943 r = mem_info__daddr(right->mem_info)->phys_addr; in sort__phys_daddr_cmp()
1945 return (int64_t)(r - l); in sort__phys_daddr_cmp()
1955 addr = mem_info__daddr(he->mem_info)->phys_addr; in hist_entry__phys_daddr_snprintf()
1957 ret += repsep_snprintf(bf + ret, size - ret, "[%c] ", he->level); in hist_entry__phys_daddr_snprintf()
1959 ret += repsep_snprintf(bf + ret, size - ret, "%-#.*llx", len, addr); in hist_entry__phys_daddr_snprintf()
1961 ret += repsep_snprintf(bf + ret, size - ret, "%-*s", width - ret, ""); in hist_entry__phys_daddr_snprintf()
1977 sort__data_page_size_cmp(struct hist_entry *left, struct hist_entry *right) in sort__data_page_size_cmp() argument
1981 if (left->mem_info) in sort__data_page_size_cmp()
1982 l = mem_info__daddr(left->mem_info)->data_page_size; in sort__data_page_size_cmp()
1983 if (right->mem_info) in sort__data_page_size_cmp()
1984 r = mem_info__daddr(right->mem_info)->data_page_size; in sort__data_page_size_cmp()
1986 return (int64_t)(r - l); in sort__data_page_size_cmp()
1994 return repsep_snprintf(bf, size, "%-*s", width, in hist_entry__data_page_size_snprintf()
1995 get_page_size_name(mem_info__daddr(he->mem_info)->data_page_size, str)); in hist_entry__data_page_size_snprintf()
2006 sort__code_page_size_cmp(struct hist_entry *left, struct hist_entry *right) in sort__code_page_size_cmp() argument
2008 uint64_t l = left->code_page_size; in sort__code_page_size_cmp()
2009 uint64_t r = right->code_page_size; in sort__code_page_size_cmp()
2011 return (int64_t)(r - l); in sort__code_page_size_cmp()
2019 return repsep_snprintf(bf, size, "%-*s", width, in hist_entry__code_page_size_snprintf()
2020 get_page_size_name(he->code_page_size, str)); in hist_entry__code_page_size_snprintf()
2031 sort__abort_cmp(struct hist_entry *left, struct hist_entry *right) in sort__abort_cmp() argument
2033 if (!left->branch_info || !right->branch_info) in sort__abort_cmp()
2034 return cmp_null(left->branch_info, right->branch_info); in sort__abort_cmp()
2036 return left->branch_info->flags.abort != in sort__abort_cmp()
2037 right->branch_info->flags.abort; in sort__abort_cmp()
2045 if (he->branch_info) { in hist_entry__abort_snprintf()
2046 if (he->branch_info->flags.abort) in hist_entry__abort_snprintf()
2052 return repsep_snprintf(bf, size, "%-*s", width, out); in hist_entry__abort_snprintf()
2063 sort__in_tx_cmp(struct hist_entry *left, struct hist_entry *right) in sort__in_tx_cmp() argument
2065 if (!left->branch_info || !right->branch_info) in sort__in_tx_cmp()
2066 return cmp_null(left->branch_info, right->branch_info); in sort__in_tx_cmp()
2068 return left->branch_info->flags.in_tx != in sort__in_tx_cmp()
2069 right->branch_info->flags.in_tx; in sort__in_tx_cmp()
2077 if (he->branch_info) { in hist_entry__in_tx_snprintf()
2078 if (he->branch_info->flags.in_tx) in hist_entry__in_tx_snprintf()
2084 return repsep_snprintf(bf, size, "%-*s", width, out); in hist_entry__in_tx_snprintf()
2095 sort__transaction_cmp(struct hist_entry *left, struct hist_entry *right) in sort__transaction_cmp() argument
2097 return left->transaction - right->transaction; in sort__transaction_cmp()
2117 { PERF_TXN_CAPACITY_WRITE, "CAP-WRITE ", 1 },
2118 { PERF_TXN_CAPACITY_READ, "CAP-READ ", 0 },
2138 u64 t = he->transaction; in hist_entry__transaction_snprintf()
2156 return repsep_snprintf(bf, size, "%-*s", width, buf); in hist_entry__transaction_snprintf()
2166 /* --sort symbol_size */
2173 return size_l < size_r ? -1 : in _sort__sym_size_cmp()
2178 sort__sym_size_cmp(struct hist_entry *left, struct hist_entry *right) in sort__sym_size_cmp() argument
2180 return _sort__sym_size_cmp(right->ms.sym, left->ms.sym); in sort__sym_size_cmp()
2195 return _hist_entry__sym_size_snprintf(he->ms.sym, bf, size, width); in hist_entry__sym_size_snprintf()
2205 /* --sort dso_size */
2212 return size_l < size_r ? -1 : in _sort__dso_size_cmp()
2217 sort__dso_size_cmp(struct hist_entry *left, struct hist_entry *right) in sort__dso_size_cmp() argument
2219 return _sort__dso_size_cmp(right->ms.map, left->ms.map); in sort__dso_size_cmp()
2234 return _hist_entry__dso_size_snprintf(he->ms.map, bf, size, width); in hist_entry__dso_size_snprintf()
2244 /* --sort addr */
2247 sort__addr_cmp(struct hist_entry *left, struct hist_entry *right) in sort__addr_cmp() argument
2249 u64 left_ip = left->ip; in sort__addr_cmp()
2250 u64 right_ip = right->ip; in sort__addr_cmp()
2251 struct map *left_map = left->ms.map; in sort__addr_cmp()
2252 struct map *right_map = right->ms.map; in sort__addr_cmp()
2265 u64 ip = he->ip; in hist_entry__addr_snprintf()
2266 struct map *map = he->ms.map; in hist_entry__addr_snprintf()
2271 return repsep_snprintf(bf, size, "%-#*llx", width, ip); in hist_entry__addr_snprintf()
2281 /* --sort type */
2291 sort__type_cmp(struct hist_entry *left, struct hist_entry *right) in sort__type_cmp() argument
2293 return sort__addr_cmp(left, right); in sort__type_cmp()
2298 if (he->mem_type) in sort__type_init()
2301 he->mem_type = hist_entry__get_data_type(he); in sort__type_init()
2302 if (he->mem_type == NULL) { in sort__type_init()
2303 he->mem_type = &unknown_type; in sort__type_init()
2304 he->mem_type_off = 0; in sort__type_init()
2309 sort__type_collapse(struct hist_entry *left, struct hist_entry *right) in sort__type_collapse() argument
2311 struct annotated_data_type *left_type = left->mem_type; in sort__type_collapse()
2312 struct annotated_data_type *right_type = right->mem_type; in sort__type_collapse()
2315 sort__type_init(left); in sort__type_collapse()
2316 left_type = left->mem_type; in sort__type_collapse()
2321 right_type = right->mem_type; in sort__type_collapse()
2324 return strcmp(left_type->self.type_name, right_type->self.type_name); in sort__type_collapse()
2328 sort__type_sort(struct hist_entry *left, struct hist_entry *right) in sort__type_sort() argument
2330 return sort__type_collapse(left, right); in sort__type_sort()
2336 return repsep_snprintf(bf, size, "%-*s", width, he->mem_type->self.type_name); in hist_entry__type_snprintf()
2349 /* --sort typeoff */
2352 sort__typeoff_sort(struct hist_entry *left, struct hist_entry *right) in sort__typeoff_sort() argument
2354 struct annotated_data_type *left_type = left->mem_type; in sort__typeoff_sort()
2355 struct annotated_data_type *right_type = right->mem_type; in sort__typeoff_sort()
2359 sort__type_init(left); in sort__typeoff_sort()
2360 left_type = left->mem_type; in sort__typeoff_sort()
2365 right_type = right->mem_type; in sort__typeoff_sort()
2368 ret = strcmp(left_type->self.type_name, right_type->self.type_name); in sort__typeoff_sort()
2371 return left->mem_type_off - right->mem_type_off; in sort__typeoff_sort()
2379 if (list_empty(&m->children)) in fill_member_name()
2382 list_for_each_entry(child, &m->children, node) { in fill_member_name()
2383 if (child->offset <= offset && offset < child->offset + child->size) { in fill_member_name()
2387 if (child->var_name) { in fill_member_name()
2389 first ? "" : ".", child->var_name); in fill_member_name()
2393 fill_member_name(buf + len, sz - len, child, offset, first); in fill_member_name()
2402 struct annotated_data_type *he_type = he->mem_type; in hist_entry__typeoff_snprintf()
2406 if (list_empty(&he_type->self.children)) in hist_entry__typeoff_snprintf()
2409 fill_member_name(buf, sizeof(buf), &he_type->self, in hist_entry__typeoff_snprintf()
2410 he->mem_type_off, true); in hist_entry__typeoff_snprintf()
2413 return repsep_snprintf(bf, size, "%s +%#x (%s)", he_type->self.type_name, in hist_entry__typeoff_snprintf()
2414 he->mem_type_off, buf); in hist_entry__typeoff_snprintf()
2427 /* --sort typecln */
2433 sort__typecln_sort(struct hist_entry *left, struct hist_entry *right) in sort__typecln_sort() argument
2435 struct annotated_data_type *left_type = left->mem_type; in sort__typecln_sort()
2436 struct annotated_data_type *right_type = right->mem_type; in sort__typecln_sort()
2441 sort__type_init(left); in sort__typecln_sort()
2442 left_type = left->mem_type; in sort__typecln_sort()
2447 right_type = right->mem_type; in sort__typecln_sort()
2450 ret = strcmp(left_type->self.type_name, right_type->self.type_name); in sort__typecln_sort()
2454 left_cln = left->mem_type_off / TYPE_CACHELINE_SIZE; in sort__typecln_sort()
2455 right_cln = right->mem_type_off / TYPE_CACHELINE_SIZE; in sort__typecln_sort()
2456 return left_cln - right_cln; in sort__typecln_sort()
2462 struct annotated_data_type *he_type = he->mem_type; in hist_entry__typecln_snprintf()
2464 return repsep_snprintf(bf, size, "%s: cache-line %d", he_type->self.type_name, in hist_entry__typecln_snprintf()
2465 he->mem_type_off / TYPE_CACHELINE_SIZE); in hist_entry__typecln_snprintf()
2497 sd->entry->se_header = arch_perf_header_entry(sd->entry->se_header); in sort_dimension_add_dynamic_header()
2541 #define DIM(d, n, func) [d - __SORT_BRANCH_STACK] = { .name = n, .entry = &(func) }
2570 #define DIM(d, n, func) [d - __SORT_MEMORY_MODE] = { .name = n, .entry = &(func) }
2629 hists__new_col_len(hists, hse->se->se_width_idx, strlen(fmt->name)); in perf_hpp__reset_sort_width()
2637 size_t len = fmt->user_len; in __sort__hpp_header()
2642 len = hists__col_len(hists, hse->se->se_width_idx); in __sort__hpp_header()
2644 return scnprintf(hpp->buf, hpp->size, "%-*.*s", len, len, fmt->name); in __sort__hpp_header()
2652 size_t len = fmt->user_len; in __sort__hpp_width()
2657 len = hists__col_len(hists, hse->se->se_width_idx); in __sort__hpp_width()
2666 size_t len = fmt->user_len; in __sort__hpp_entry()
2671 len = hists__col_len(he->hists, hse->se->se_width_idx); in __sort__hpp_entry()
2673 return hse->se->se_snprintf(he, hpp->buf, hpp->size, len); in __sort__hpp_entry()
2682 return hse->se->se_cmp(a, b); in __sort__hpp_cmp()
2692 collapse_fn = hse->se->se_collapse ?: hse->se->se_cmp; in __sort__hpp_collapse()
2703 sort_fn = hse->se->se_sort ?: hse->se->se_cmp; in __sort__hpp_sort()
2709 return format->header == __sort__hpp_header; in perf_hpp__is_sort_entry()
2721 return hse->se == &sort_ ## key ; \
2751 return hse_a->se == hse_b->se; in MK_SORT_ENTRY_CHK()
2771 if (hse->se->se_init) in hse_init()
2772 hse->se->se_init(he); in hse_init()
2786 hse->se = sd->entry; in __sort_dimension__alloc_hpp()
2787 hse->hpp.name = sd->entry->se_header; in __sort_dimension__alloc_hpp()
2788 hse->hpp.header = __sort__hpp_header; in __sort_dimension__alloc_hpp()
2789 hse->hpp.width = __sort__hpp_width; in __sort_dimension__alloc_hpp()
2790 hse->hpp.entry = __sort__hpp_entry; in __sort_dimension__alloc_hpp()
2791 hse->hpp.color = NULL; in __sort_dimension__alloc_hpp()
2793 hse->hpp.cmp = __sort__hpp_cmp; in __sort_dimension__alloc_hpp()
2794 hse->hpp.collapse = __sort__hpp_collapse; in __sort_dimension__alloc_hpp()
2795 hse->hpp.sort = __sort__hpp_sort; in __sort_dimension__alloc_hpp()
2796 hse->hpp.equal = __sort__hpp_equal; in __sort_dimension__alloc_hpp()
2797 hse->hpp.free = hse_free; in __sort_dimension__alloc_hpp()
2798 hse->hpp.init = hse_init; in __sort_dimension__alloc_hpp()
2800 INIT_LIST_HEAD(&hse->hpp.list); in __sort_dimension__alloc_hpp()
2801 INIT_LIST_HEAD(&hse->hpp.sort_list); in __sort_dimension__alloc_hpp()
2802 hse->hpp.elide = false; in __sort_dimension__alloc_hpp()
2803 hse->hpp.len = 0; in __sort_dimension__alloc_hpp()
2804 hse->hpp.user_len = 0; in __sort_dimension__alloc_hpp()
2805 hse->hpp.level = level; in __sort_dimension__alloc_hpp()
2820 fmt = memdup(hd->fmt, sizeof(*fmt)); in __hpp_dimension__alloc_hpp()
2822 INIT_LIST_HEAD(&fmt->list); in __hpp_dimension__alloc_hpp()
2823 INIT_LIST_HEAD(&fmt->sort_list); in __hpp_dimension__alloc_hpp()
2824 fmt->free = hpp_free; in __hpp_dimension__alloc_hpp()
2825 fmt->level = level; in __hpp_dimension__alloc_hpp()
2835 int ret = -1; in hist_entry__filter()
2838 perf_hpp_list__for_each_format(he->hpp_list, fmt) { in hist_entry__filter()
2843 if (hse->se->se_filter == NULL) in hist_entry__filter()
2848 * is applied. But it should skip non-matched filter types. in hist_entry__filter()
2850 r = hse->se->se_filter(he, type, arg); in hist_entry__filter()
2868 return -1; in __sort_dimension__add_hpp_sort()
2870 perf_hpp_list__register_sort_field(list, &hse->hpp); in __sort_dimension__add_hpp_sort()
2880 return -1; in __sort_dimension__add_hpp_output()
2882 perf_hpp_list__column_register(list, &hse->hpp); in __sort_dimension__add_hpp_output()
2907 if (!hde->hpp.len) { in hde_width()
2908 int len = hde->dynamic_len; in hde_width()
2909 int namelen = strlen(hde->field->name); in hde_width()
2910 int fieldlen = hde->field->size; in hde_width()
2915 if (!(hde->field->flags & TEP_FIELD_IS_STRING)) { in hde_width()
2917 fieldlen = hde->field->size * 2 + 2; in hde_width()
2922 hde->hpp.len = len; in hde_width()
2924 return hde->hpp.len; in hde_width()
2931 struct tep_format_field *field = hde->field; in update_dynamic_len()
2935 if (hde->raw_trace) in update_dynamic_len()
2939 if (!he->trace_output) in update_dynamic_len()
2940 he->trace_output = get_trace_output(he); in update_dynamic_len()
2942 namelen = strlen(field->name); in update_dynamic_len()
2943 str = he->trace_output; in update_dynamic_len()
2952 if (!strncmp(str, field->name, namelen)) { in update_dynamic_len()
2956 len = pos - str; in update_dynamic_len()
2958 if (len > hde->dynamic_len) in update_dynamic_len()
2959 hde->dynamic_len = len; in update_dynamic_len()
2976 size_t len = fmt->user_len; in __sort__hde_header()
2983 return scnprintf(hpp->buf, hpp->size, "%*.*s", len, len, hde->field->name); in __sort__hde_header()
2991 size_t len = fmt->user_len; in __sort__hde_width()
3007 return hists_to_evsel(hists) == hde->evsel; in perf_hpp__defined_dynamic_entry()
3014 size_t len = fmt->user_len; in __sort__hde_entry()
3026 if (hde->raw_trace) in __sort__hde_entry()
3029 if (!he->trace_output) in __sort__hde_entry()
3030 he->trace_output = get_trace_output(he); in __sort__hde_entry()
3032 field = hde->field; in __sort__hde_entry()
3033 namelen = strlen(field->name); in __sort__hde_entry()
3034 str = he->trace_output; in __sort__hde_entry()
3043 if (!strncmp(str, field->name, namelen)) { in __sort__hde_entry()
3045 str = strndup(str, pos - str); in __sort__hde_entry()
3048 return scnprintf(hpp->buf, hpp->size, in __sort__hde_entry()
3063 tep_print_field(&seq, he->raw_data, hde->field); in __sort__hde_entry()
3067 ret = scnprintf(hpp->buf, hpp->size, "%*.*s", len, len, str); in __sort__hde_entry()
3081 field = hde->field; in __sort__hde_cmp()
3082 if (field->flags & TEP_FIELD_IS_DYNAMIC) { in __sort__hde_cmp()
3085 tep_read_number_field(field, a->raw_data, &dyn); in __sort__hde_cmp()
3088 if (tep_field_is_relative(field->flags)) in __sort__hde_cmp()
3089 offset += field->offset + field->size; in __sort__hde_cmp()
3091 if (size > hde->dynamic_len) in __sort__hde_cmp()
3092 hde->dynamic_len = size; in __sort__hde_cmp()
3094 offset = field->offset; in __sort__hde_cmp()
3095 size = field->size; in __sort__hde_cmp()
3098 return memcmp(a->raw_data + offset, b->raw_data + offset, size); in __sort__hde_cmp()
3103 return fmt->cmp == __sort__hde_cmp; in perf_hpp__is_dynamic_entry()
3117 return hde_a->field == hde_b->field; in __sort__hde_equal()
3151 hde->evsel = evsel; in __alloc_dynamic_entry()
3152 hde->field = field; in __alloc_dynamic_entry()
3153 hde->dynamic_len = 0; in __alloc_dynamic_entry()
3155 hde->hpp.name = field->name; in __alloc_dynamic_entry()
3156 hde->hpp.header = __sort__hde_header; in __alloc_dynamic_entry()
3157 hde->hpp.width = __sort__hde_width; in __alloc_dynamic_entry()
3158 hde->hpp.entry = __sort__hde_entry; in __alloc_dynamic_entry()
3159 hde->hpp.color = NULL; in __alloc_dynamic_entry()
3161 hde->hpp.init = __sort__hde_init; in __alloc_dynamic_entry()
3162 hde->hpp.cmp = __sort__hde_cmp; in __alloc_dynamic_entry()
3163 hde->hpp.collapse = __sort__hde_cmp; in __alloc_dynamic_entry()
3164 hde->hpp.sort = __sort__hde_cmp; in __alloc_dynamic_entry()
3165 hde->hpp.equal = __sort__hde_equal; in __alloc_dynamic_entry()
3166 hde->hpp.free = hde_free; in __alloc_dynamic_entry()
3168 INIT_LIST_HEAD(&hde->hpp.list); in __alloc_dynamic_entry()
3169 INIT_LIST_HEAD(&hde->hpp.sort_list); in __alloc_dynamic_entry()
3170 hde->hpp.elide = false; in __alloc_dynamic_entry()
3171 hde->hpp.len = 0; in __alloc_dynamic_entry()
3172 hde->hpp.user_len = 0; in __alloc_dynamic_entry()
3173 hde->hpp.level = level; in __alloc_dynamic_entry()
3189 new_fmt = &new_hse->hpp; in perf_hpp_fmt__dup()
3197 new_fmt = &new_hde->hpp; in perf_hpp_fmt__dup()
3203 INIT_LIST_HEAD(&new_fmt->list); in perf_hpp_fmt__dup()
3204 INIT_LIST_HEAD(&new_fmt->sort_list); in perf_hpp_fmt__dup()
3249 if (nr > evlist->core.nr_entries) in find_evsel()
3253 while (--nr > 0) in find_evsel()
3265 if (!full_name && strstr(pos->name, event_name)) { in find_evsel()
3268 event_name, evsel->name, pos->name); in find_evsel()
3287 return -ENOMEM; in __dynamic_dimension__add()
3289 hde->raw_trace = raw_trace; in __dynamic_dimension__add()
3291 perf_hpp__register_sort_field(&hde->hpp); in __dynamic_dimension__add()
3299 struct tep_format_field *field = tp_format ? tp_format->format.fields : NULL; in add_evsel_fields()
3305 field = field->next; in add_evsel_fields()
3317 if (evsel->core.attr.type != PERF_TYPE_TRACEPOINT) in add_all_dynamic_fields()
3330 int ret = -ESRCH; in add_all_matching_fields()
3337 if (evsel->core.attr.type != PERF_TYPE_TRACEPOINT) in add_all_matching_fields()
3365 return -ENOENT; in add_dynamic_entry()
3369 return -ENOMEM; in add_dynamic_entry()
3372 ret = -EINVAL; in add_dynamic_entry()
3379 ret = -EINVAL; in add_dynamic_entry()
3397 if (evsel->core.attr.type == PERF_TYPE_TRACEPOINT) { in add_dynamic_entry()
3399 ret = -ENOTSUP; in add_dynamic_entry()
3412 ret = -ENOENT; in add_dynamic_entry()
3416 if (evsel->core.attr.type != PERF_TYPE_TRACEPOINT) { in add_dynamic_entry()
3418 ret = -EINVAL; in add_dynamic_entry()
3433 return -ENOENT; in add_dynamic_entry()
3452 if (sd->taken) in __sort_dimension__add()
3456 return -1; in __sort_dimension__add()
3458 if (sd->entry->se_collapse) in __sort_dimension__add()
3459 list->need_collapse = 1; in __sort_dimension__add()
3461 sd->taken = 1; in __sort_dimension__add()
3472 if (hd->taken) in __hpp_dimension__add()
3477 return -1; in __hpp_dimension__add()
3479 hd->taken = 1; in __hpp_dimension__add()
3487 if (sd->taken) in __sort_dimension__add_output()
3491 return -1; in __sort_dimension__add_output()
3493 sd->taken = 1; in __sort_dimension__add_output()
3502 if (hd->taken) in __hpp_dimension__add_output()
3507 return -1; in __hpp_dimension__add_output()
3509 hd->taken = 1; in __hpp_dimension__add_output()
3542 if (!sd->name || strncasecmp(tok, sd->name, strlen(tok))) in sort_dimension__add()
3546 if (sd->name && !strcmp(dynamic_headers[j], sd->name)) in sort_dimension__add()
3550 if (sd->entry == &sort_parent && parent_pattern) { in sort_dimension__add()
3557 return -EINVAL; in sort_dimension__add()
3559 list->parent = 1; in sort_dimension__add()
3560 } else if (sd->entry == &sort_sym) { in sort_dimension__add()
3561 list->sym = 1; in sort_dimension__add()
3569 sd->entry->se_collapse = sort__sym_sort; in sort_dimension__add()
3571 } else if (sd->entry == &sort_dso) { in sort_dimension__add()
3572 list->dso = 1; in sort_dimension__add()
3573 } else if (sd->entry == &sort_socket) { in sort_dimension__add()
3574 list->socket = 1; in sort_dimension__add()
3575 } else if (sd->entry == &sort_thread) { in sort_dimension__add()
3576 list->thread = 1; in sort_dimension__add()
3577 } else if (sd->entry == &sort_comm) { in sort_dimension__add()
3578 list->comm = 1; in sort_dimension__add()
3579 } else if (sd->entry == &sort_type_offset) { in sort_dimension__add()
3589 if (strncasecmp(tok, hd->name, strlen(tok))) in sort_dimension__add()
3598 if (!sd->name || strncasecmp(tok, sd->name, strlen(tok))) in sort_dimension__add()
3608 return -EINVAL; in sort_dimension__add()
3610 if (sd->entry == &sort_sym_from || sd->entry == &sort_sym_to) in sort_dimension__add()
3611 list->sym = 1; in sort_dimension__add()
3620 if (!sd->name || strncasecmp(tok, sd->name, strlen(tok))) in sort_dimension__add()
3624 return -EINVAL; in sort_dimension__add()
3626 if (sd->entry == &sort_mem_dcacheline && cacheline_size() == 0) in sort_dimension__add()
3627 return -EINVAL; in sort_dimension__add()
3629 if (sd->entry == &sort_mem_daddr_sym) in sort_dimension__add()
3630 list->sym = 1; in sort_dimension__add()
3639 return -ESRCH; in sort_dimension__add()
3671 if (ret == -EINVAL) { in setup_sort_list()
3673 …ui__error("The \"dcacheline\" --sort key needs to know the cacheline size and it couldn't be deter… in setup_sort_list()
3675 ui__error("Invalid --sort key: `%s'", tok); in setup_sort_list()
3677 } else if (ret == -ESRCH) { in setup_sort_list()
3678 ui__error("Unknown --sort key: `%s'", tok); in setup_sort_list()
3708 if (evsel->core.attr.type != PERF_TYPE_TRACEPOINT) { in get_default_sort_order()
3728 * Append '+'-prefixed sort order to the default sort in setup_sort_order()
3735 ui__error("Invalid --sort key: `+'"); in setup_sort_order()
3736 return -EINVAL; in setup_sort_order()
3745 pr_err("Not enough memory to set up --sort"); in setup_sort_order()
3746 return -ENOMEM; in setup_sort_order()
3810 return -ENOMEM; in __setup_sorting()
3820 return -ENOMEM; in __setup_sorting()
3840 if (hse->se->se_width_idx == idx) { in perf_hpp__set_elide()
3841 fmt->elide = elide; in perf_hpp__set_elide()
3852 strlist__entry(list, 0)->s); in __get_elide()
3904 fmt->elide = get_elide(hse->se->se_width_idx, output); in sort__setup_elide()
3915 if (!fmt->elide) in sort__setup_elide()
3923 fmt->elide = false; in sort__setup_elide()
3934 if (strncasecmp(tok, hd->name, strlen(tok))) in output_field_add()
3938 ui__warning("--fields weight shows the average value unlike in the --sort key.\n"); in output_field_add()
3946 if (!sd->name || strncasecmp(tok, sd->name, strlen(tok))) in output_field_add()
3955 if (!sd->name || strncasecmp(tok, sd->name, strlen(tok))) in output_field_add()
3959 return -EINVAL; in output_field_add()
3967 if (!sd->name || strncasecmp(tok, sd->name, strlen(tok))) in output_field_add()
3971 return -EINVAL; in output_field_add()
3976 return -ESRCH; in output_field_add()
3987 if (ret == -EINVAL) { in setup_output_list()
3988 ui__error("Invalid --fields key: `%s'", tok); in setup_output_list()
3990 } else if (ret == -ESRCH) { in setup_output_list()
3991 ui__error("Unknown --fields key: `%s'", tok); in setup_output_list()
4024 int ret = -EINVAL; in __setup_output_field()
4032 return -ENOMEM; in __setup_output_field()
4039 ui__error("Invalid --fields key: `+'"); in __setup_output_field()
4059 err = sort_dimension__add(&perf_hpp_list, "parent", evlist, -1); in setup_sorting()
4081 /* setup hists-specific output fields */ in setup_sorting()
4083 return -1; in setup_sorting()