|
@@ -566,6 +566,7 @@ fill_node(struct callchain_node *node, struct callchain_cursor *cursor)
|
|
|
call->ip = cursor_node->ip;
|
|
|
call->ms.sym = cursor_node->sym;
|
|
|
call->ms.map = map__get(cursor_node->map);
|
|
|
+ call->srcline = cursor_node->srcline;
|
|
|
|
|
|
if (cursor_node->branch) {
|
|
|
call->branch_count = 1;
|
|
@@ -647,20 +648,11 @@ enum match_result {
|
|
|
static enum match_result match_chain_srcline(struct callchain_cursor_node *node,
|
|
|
struct callchain_list *cnode)
|
|
|
{
|
|
|
- char *left = NULL;
|
|
|
- char *right = NULL;
|
|
|
+ const char *left = cnode->srcline;
|
|
|
+ const char *right = node->srcline;
|
|
|
enum match_result ret = MATCH_EQ;
|
|
|
int cmp;
|
|
|
|
|
|
- if (cnode->ms.map)
|
|
|
- left = get_srcline(cnode->ms.map->dso,
|
|
|
- map__rip_2objdump(cnode->ms.map, cnode->ip),
|
|
|
- cnode->ms.sym, true, false);
|
|
|
- if (node->map)
|
|
|
- right = get_srcline(node->map->dso,
|
|
|
- map__rip_2objdump(node->map, node->ip),
|
|
|
- node->sym, true, false);
|
|
|
-
|
|
|
if (left && right)
|
|
|
cmp = strcmp(left, right);
|
|
|
else if (!left && right)
|
|
@@ -675,8 +667,6 @@ static enum match_result match_chain_srcline(struct callchain_cursor_node *node,
|
|
|
if (cmp != 0)
|
|
|
ret = cmp < 0 ? MATCH_LT : MATCH_GT;
|
|
|
|
|
|
- free_srcline(left);
|
|
|
- free_srcline(right);
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
@@ -969,7 +959,7 @@ merge_chain_branch(struct callchain_cursor *cursor,
|
|
|
list_for_each_entry_safe(list, next_list, &src->val, list) {
|
|
|
callchain_cursor_append(cursor, list->ip,
|
|
|
list->ms.map, list->ms.sym,
|
|
|
- false, NULL, 0, 0, 0);
|
|
|
+ false, NULL, 0, 0, 0, list->srcline);
|
|
|
list_del(&list->list);
|
|
|
map__zput(list->ms.map);
|
|
|
free(list);
|
|
@@ -1009,7 +999,8 @@ int callchain_merge(struct callchain_cursor *cursor,
|
|
|
int callchain_cursor_append(struct callchain_cursor *cursor,
|
|
|
u64 ip, struct map *map, struct symbol *sym,
|
|
|
bool branch, struct branch_flags *flags,
|
|
|
- int nr_loop_iter, u64 iter_cycles, u64 branch_from)
|
|
|
+ int nr_loop_iter, u64 iter_cycles, u64 branch_from,
|
|
|
+ const char *srcline)
|
|
|
{
|
|
|
struct callchain_cursor_node *node = *cursor->last;
|
|
|
|
|
@@ -1028,6 +1019,7 @@ int callchain_cursor_append(struct callchain_cursor *cursor,
|
|
|
node->branch = branch;
|
|
|
node->nr_loop_iter = nr_loop_iter;
|
|
|
node->iter_cycles = iter_cycles;
|
|
|
+ node->srcline = srcline;
|
|
|
|
|
|
if (flags)
|
|
|
memcpy(&node->branch_flags, flags,
|
|
@@ -1115,12 +1107,7 @@ char *callchain_list__sym_name(struct callchain_list *cl,
|
|
|
int printed;
|
|
|
|
|
|
if (cl->ms.sym) {
|
|
|
- if (show_srcline && cl->ms.map && !cl->srcline)
|
|
|
- cl->srcline = get_srcline(cl->ms.map->dso,
|
|
|
- map__rip_2objdump(cl->ms.map,
|
|
|
- cl->ip),
|
|
|
- cl->ms.sym, false, show_addr);
|
|
|
- if (cl->srcline)
|
|
|
+ if (show_srcline && cl->srcline)
|
|
|
printed = scnprintf(bf, bfsize, "%s %s",
|
|
|
cl->ms.sym->name, cl->srcline);
|
|
|
else
|
|
@@ -1532,7 +1519,7 @@ int callchain_cursor__copy(struct callchain_cursor *dst,
|
|
|
node->branch, &node->branch_flags,
|
|
|
node->nr_loop_iter,
|
|
|
node->iter_cycles,
|
|
|
- node->branch_from);
|
|
|
+ node->branch_from, node->srcline);
|
|
|
if (rc)
|
|
|
break;
|
|
|
|