diff options
-rw-r--r-- | tools/perf/util/sort.c | 64 | ||||
-rw-r--r-- | tools/perf/util/sort.h | 8 |
2 files changed, 58 insertions, 14 deletions
diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c index 39b1ab0967f4..7ad62393aa88 100644 --- a/tools/perf/util/sort.c +++ b/tools/perf/util/sort.c | |||
@@ -480,30 +480,40 @@ struct sort_dimension { | |||
480 | 480 | ||
481 | #define DIM(d, n, func) [d] = { .name = n, .entry = &(func) } | 481 | #define DIM(d, n, func) [d] = { .name = n, .entry = &(func) } |
482 | 482 | ||
483 | static struct sort_dimension sort_dimensions[] = { | 483 | static struct sort_dimension common_sort_dimensions[] = { |
484 | DIM(SORT_PID, "pid", sort_thread), | 484 | DIM(SORT_PID, "pid", sort_thread), |
485 | DIM(SORT_COMM, "comm", sort_comm), | 485 | DIM(SORT_COMM, "comm", sort_comm), |
486 | DIM(SORT_DSO, "dso", sort_dso), | 486 | DIM(SORT_DSO, "dso", sort_dso), |
487 | DIM(SORT_DSO_FROM, "dso_from", sort_dso_from), | ||
488 | DIM(SORT_DSO_TO, "dso_to", sort_dso_to), | ||
489 | DIM(SORT_SYM, "symbol", sort_sym), | 487 | DIM(SORT_SYM, "symbol", sort_sym), |
490 | DIM(SORT_SYM_TO, "symbol_from", sort_sym_from), | ||
491 | DIM(SORT_SYM_FROM, "symbol_to", sort_sym_to), | ||
492 | DIM(SORT_PARENT, "parent", sort_parent), | 488 | DIM(SORT_PARENT, "parent", sort_parent), |
493 | DIM(SORT_CPU, "cpu", sort_cpu), | 489 | DIM(SORT_CPU, "cpu", sort_cpu), |
494 | DIM(SORT_MISPREDICT, "mispredict", sort_mispredict), | ||
495 | DIM(SORT_SRCLINE, "srcline", sort_srcline), | 490 | DIM(SORT_SRCLINE, "srcline", sort_srcline), |
496 | }; | 491 | }; |
497 | 492 | ||
493 | #undef DIM | ||
494 | |||
495 | #define DIM(d, n, func) [d - __SORT_BRANCH_STACK] = { .name = n, .entry = &(func) } | ||
496 | |||
497 | static struct sort_dimension bstack_sort_dimensions[] = { | ||
498 | DIM(SORT_DSO_FROM, "dso_from", sort_dso_from), | ||
499 | DIM(SORT_DSO_TO, "dso_to", sort_dso_to), | ||
500 | DIM(SORT_SYM_FROM, "symbol_from", sort_sym_from), | ||
501 | DIM(SORT_SYM_TO, "symbol_to", sort_sym_to), | ||
502 | DIM(SORT_MISPREDICT, "mispredict", sort_mispredict), | ||
503 | }; | ||
504 | |||
505 | #undef DIM | ||
506 | |||
498 | int sort_dimension__add(const char *tok) | 507 | int sort_dimension__add(const char *tok) |
499 | { | 508 | { |
500 | unsigned int i; | 509 | unsigned int i; |
501 | 510 | ||
502 | for (i = 0; i < ARRAY_SIZE(sort_dimensions); i++) { | 511 | for (i = 0; i < ARRAY_SIZE(common_sort_dimensions); i++) { |
503 | struct sort_dimension *sd = &sort_dimensions[i]; | 512 | struct sort_dimension *sd = &common_sort_dimensions[i]; |
504 | 513 | ||
505 | if (strncasecmp(tok, sd->name, strlen(tok))) | 514 | if (strncasecmp(tok, sd->name, strlen(tok))) |
506 | continue; | 515 | continue; |
516 | |||
507 | if (sd->entry == &sort_parent) { | 517 | if (sd->entry == &sort_parent) { |
508 | int ret = regcomp(&parent_regex, parent_pattern, REG_EXTENDED); | 518 | int ret = regcomp(&parent_regex, parent_pattern, REG_EXTENDED); |
509 | if (ret) { | 519 | if (ret) { |
@@ -514,9 +524,7 @@ int sort_dimension__add(const char *tok) | |||
514 | return -EINVAL; | 524 | return -EINVAL; |
515 | } | 525 | } |
516 | sort__has_parent = 1; | 526 | sort__has_parent = 1; |
517 | } else if (sd->entry == &sort_sym || | 527 | } else if (sd->entry == &sort_sym) { |
518 | sd->entry == &sort_sym_from || | ||
519 | sd->entry == &sort_sym_to) { | ||
520 | sort__has_sym = 1; | 528 | sort__has_sym = 1; |
521 | } | 529 | } |
522 | 530 | ||
@@ -534,6 +542,34 @@ int sort_dimension__add(const char *tok) | |||
534 | 542 | ||
535 | return 0; | 543 | return 0; |
536 | } | 544 | } |
545 | |||
546 | for (i = 0; i < ARRAY_SIZE(bstack_sort_dimensions); i++) { | ||
547 | struct sort_dimension *sd = &bstack_sort_dimensions[i]; | ||
548 | |||
549 | if (strncasecmp(tok, sd->name, strlen(tok))) | ||
550 | continue; | ||
551 | |||
552 | if (sort__branch_mode != 1) | ||
553 | return -EINVAL; | ||
554 | |||
555 | if (sd->entry == &sort_sym_from || sd->entry == &sort_sym_to) | ||
556 | sort__has_sym = 1; | ||
557 | |||
558 | if (sd->taken) | ||
559 | return 0; | ||
560 | |||
561 | if (sd->entry->se_collapse) | ||
562 | sort__need_collapse = 1; | ||
563 | |||
564 | if (list_empty(&hist_entry__sort_list)) | ||
565 | sort__first_dimension = i + __SORT_BRANCH_STACK; | ||
566 | |||
567 | list_add_tail(&sd->entry->list, &hist_entry__sort_list); | ||
568 | sd->taken = 1; | ||
569 | |||
570 | return 0; | ||
571 | } | ||
572 | |||
537 | return -ESRCH; | 573 | return -ESRCH; |
538 | } | 574 | } |
539 | 575 | ||
@@ -543,7 +579,11 @@ void setup_sorting(const char * const usagestr[], const struct option *opts) | |||
543 | 579 | ||
544 | for (tok = strtok_r(str, ", ", &tmp); | 580 | for (tok = strtok_r(str, ", ", &tmp); |
545 | tok; tok = strtok_r(NULL, ", ", &tmp)) { | 581 | tok; tok = strtok_r(NULL, ", ", &tmp)) { |
546 | if (sort_dimension__add(tok) < 0) { | 582 | int ret = sort_dimension__add(tok); |
583 | if (ret == -EINVAL) { | ||
584 | error("Invalid --sort key: `%s'", tok); | ||
585 | usage_with_options(usagestr, opts); | ||
586 | } else if (ret == -ESRCH) { | ||
547 | error("Unknown --sort key: `%s'", tok); | 587 | error("Unknown --sort key: `%s'", tok); |
548 | usage_with_options(usagestr, opts); | 588 | usage_with_options(usagestr, opts); |
549 | } | 589 | } |
diff --git a/tools/perf/util/sort.h b/tools/perf/util/sort.h index a1c0d56b6885..e994ad3e9897 100644 --- a/tools/perf/util/sort.h +++ b/tools/perf/util/sort.h | |||
@@ -122,18 +122,22 @@ static inline void hist_entry__add_pair(struct hist_entry *he, | |||
122 | } | 122 | } |
123 | 123 | ||
124 | enum sort_type { | 124 | enum sort_type { |
125 | /* common sort keys */ | ||
125 | SORT_PID, | 126 | SORT_PID, |
126 | SORT_COMM, | 127 | SORT_COMM, |
127 | SORT_DSO, | 128 | SORT_DSO, |
128 | SORT_SYM, | 129 | SORT_SYM, |
129 | SORT_PARENT, | 130 | SORT_PARENT, |
130 | SORT_CPU, | 131 | SORT_CPU, |
131 | SORT_DSO_FROM, | 132 | SORT_SRCLINE, |
133 | |||
134 | /* branch stack specific sort keys */ | ||
135 | __SORT_BRANCH_STACK, | ||
136 | SORT_DSO_FROM = __SORT_BRANCH_STACK, | ||
132 | SORT_DSO_TO, | 137 | SORT_DSO_TO, |
133 | SORT_SYM_FROM, | 138 | SORT_SYM_FROM, |
134 | SORT_SYM_TO, | 139 | SORT_SYM_TO, |
135 | SORT_MISPREDICT, | 140 | SORT_MISPREDICT, |
136 | SORT_SRCLINE, | ||
137 | }; | 141 | }; |
138 | 142 | ||
139 | /* | 143 | /* |