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 --- |