callchain.c (b70366e5d31788650b2a5cec5cd13ea80ac7e44a) callchain.c (5dfa210e407d0fedf746958bff206995bd46570d)
1/*
2 * Copyright (C) 2009-2011, Frederic Weisbecker <fweisbec@gmail.com>
3 *
4 * Handle the callchains from the stream in an ad-hoc radix tree and then
5 * sort them in an rbtree.
6 *
7 * Using a radix for code path provides a fast retrieval and factorizes
8 * memory use. Also that lets us use the paths in a hierarchical graph view.

--- 66 unchanged lines hidden (view full) ---

75 if (!strncmp(value, "function", strlen(value))) {
76 callchain_param.key = CCKEY_FUNCTION;
77 return 0;
78 }
79 if (!strncmp(value, "address", strlen(value))) {
80 callchain_param.key = CCKEY_ADDRESS;
81 return 0;
82 }
1/*
2 * Copyright (C) 2009-2011, Frederic Weisbecker <fweisbec@gmail.com>
3 *
4 * Handle the callchains from the stream in an ad-hoc radix tree and then
5 * sort them in an rbtree.
6 *
7 * Using a radix for code path provides a fast retrieval and factorizes
8 * memory use. Also that lets us use the paths in a hierarchical graph view.

--- 66 unchanged lines hidden (view full) ---

75 if (!strncmp(value, "function", strlen(value))) {
76 callchain_param.key = CCKEY_FUNCTION;
77 return 0;
78 }
79 if (!strncmp(value, "address", strlen(value))) {
80 callchain_param.key = CCKEY_ADDRESS;
81 return 0;
82 }
83 if (!strncmp(value, "srcline", strlen(value))) {
84 callchain_param.key = CCKEY_SRCLINE;
85 return 0;
86 }
83 if (!strncmp(value, "branch", strlen(value))) {
84 callchain_param.branch_callstack = 1;
85 return 0;
86 }
87
88 pr_err("Invalid callchain sort key: %s\n", value);
89 return -1;
90}

--- 414 unchanged lines hidden (view full) ---

505
506enum match_result {
507 MATCH_ERROR = -1,
508 MATCH_EQ,
509 MATCH_LT,
510 MATCH_GT,
511};
512
87 if (!strncmp(value, "branch", strlen(value))) {
88 callchain_param.branch_callstack = 1;
89 return 0;
90 }
91
92 pr_err("Invalid callchain sort key: %s\n", value);
93 return -1;
94}

--- 414 unchanged lines hidden (view full) ---

509
510enum match_result {
511 MATCH_ERROR = -1,
512 MATCH_EQ,
513 MATCH_LT,
514 MATCH_GT,
515};
516
517static enum match_result match_chain_srcline(struct callchain_cursor_node *node,
518 struct callchain_list *cnode)
519{
520 char *left = get_srcline(cnode->ms.map->dso,
521 map__rip_2objdump(cnode->ms.map, cnode->ip),
522 cnode->ms.sym, true, false);
523 char *right = get_srcline(node->map->dso,
524 map__rip_2objdump(node->map, node->ip),
525 node->sym, true, false);
526 enum match_result ret = MATCH_EQ;
527 int cmp;
528
529 if (left && right)
530 cmp = strcmp(left, right);
531 else if (!left && right)
532 cmp = 1;
533 else if (left && !right)
534 cmp = -1;
535 else if (cnode->ip == node->ip)
536 cmp = 0;
537 else
538 cmp = (cnode->ip < node->ip) ? -1 : 1;
539
540 if (cmp != 0)
541 ret = cmp < 0 ? MATCH_LT : MATCH_GT;
542
543 free_srcline(left);
544 free_srcline(right);
545 return ret;
546}
547
513static enum match_result match_chain(struct callchain_cursor_node *node,
514 struct callchain_list *cnode)
515{
516 struct symbol *sym = node->sym;
517 u64 left, right;
518
548static enum match_result match_chain(struct callchain_cursor_node *node,
549 struct callchain_list *cnode)
550{
551 struct symbol *sym = node->sym;
552 u64 left, right;
553
519 if (cnode->ms.sym && sym &&
520 callchain_param.key == CCKEY_FUNCTION) {
554 if (callchain_param.key == CCKEY_SRCLINE) {
555 enum match_result match = match_chain_srcline(node, cnode);
556
557 if (match != MATCH_ERROR)
558 return match;
559 }
560
561 if (cnode->ms.sym && sym && callchain_param.key == CCKEY_FUNCTION) {
521 left = cnode->ms.sym->start;
522 right = sym->start;
523 } else {
524 left = cnode->ip;
525 right = node->ip;
526 }
527
528 if (left == right) {

--- 377 unchanged lines hidden (view full) ---

906
907out:
908 return 1;
909}
910
911char *callchain_list__sym_name(struct callchain_list *cl,
912 char *bf, size_t bfsize, bool show_dso)
913{
562 left = cnode->ms.sym->start;
563 right = sym->start;
564 } else {
565 left = cnode->ip;
566 right = node->ip;
567 }
568
569 if (left == right) {

--- 377 unchanged lines hidden (view full) ---

947
948out:
949 return 1;
950}
951
952char *callchain_list__sym_name(struct callchain_list *cl,
953 char *bf, size_t bfsize, bool show_dso)
954{
955 bool show_addr = callchain_param.key == CCKEY_ADDRESS;
956 bool show_srcline = show_addr || callchain_param.key == CCKEY_SRCLINE;
914 int printed;
915
916 if (cl->ms.sym) {
957 int printed;
958
959 if (cl->ms.sym) {
917 if (callchain_param.key == CCKEY_ADDRESS &&
918 cl->ms.map && !cl->srcline)
960 if (show_srcline && cl->ms.map && !cl->srcline)
919 cl->srcline = get_srcline(cl->ms.map->dso,
920 map__rip_2objdump(cl->ms.map,
921 cl->ip),
961 cl->srcline = get_srcline(cl->ms.map->dso,
962 map__rip_2objdump(cl->ms.map,
963 cl->ip),
922 cl->ms.sym, false);
964 cl->ms.sym, false, show_addr);
923 if (cl->srcline)
924 printed = scnprintf(bf, bfsize, "%s %s",
925 cl->ms.sym->name, cl->srcline);
926 else
927 printed = scnprintf(bf, bfsize, "%s", cl->ms.sym->name);
928 } else
929 printed = scnprintf(bf, bfsize, "%#" PRIx64, cl->ip);
930

--- 352 unchanged lines hidden ---
965 if (cl->srcline)
966 printed = scnprintf(bf, bfsize, "%s %s",
967 cl->ms.sym->name, cl->srcline);
968 else
969 printed = scnprintf(bf, bfsize, "%s", cl->ms.sym->name);
970 } else
971 printed = scnprintf(bf, bfsize, "%#" PRIx64, cl->ip);
972

--- 352 unchanged lines hidden ---