perf callchain: Factor out adding new call chain entries
Move the code to resolve and add a new callchain entry into a new add_callchain_ip function. This will be used in the next patches to add LBRs too. No change in behavior. Signed-off-by: Andi Kleen <ak@linux.intel.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Namhyung Kim <namhyung@kernel.org> Link: http://lkml.kernel.org/r/1415844328-4884-2-git-send-email-andi@firstfloor.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
ee205503f2
commit
37592b8afb
1 changed files with 32 additions and 19 deletions
|
@ -1381,6 +1381,34 @@ struct mem_info *sample__resolve_mem(struct perf_sample *sample,
|
||||||
return mi;
|
return mi;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int add_callchain_ip(struct thread *thread,
|
||||||
|
struct symbol **parent,
|
||||||
|
struct addr_location *root_al,
|
||||||
|
int cpumode,
|
||||||
|
u64 ip)
|
||||||
|
{
|
||||||
|
struct addr_location al;
|
||||||
|
|
||||||
|
al.filtered = 0;
|
||||||
|
al.sym = NULL;
|
||||||
|
thread__find_addr_location(thread, cpumode, MAP__FUNCTION,
|
||||||
|
ip, &al);
|
||||||
|
if (al.sym != NULL) {
|
||||||
|
if (sort__has_parent && !*parent &&
|
||||||
|
symbol__match_regex(al.sym, &parent_regex))
|
||||||
|
*parent = al.sym;
|
||||||
|
else if (have_ignore_callees && root_al &&
|
||||||
|
symbol__match_regex(al.sym, &ignore_callees_regex)) {
|
||||||
|
/* Treat this symbol as the root,
|
||||||
|
forgetting its callees. */
|
||||||
|
*root_al = al;
|
||||||
|
callchain_cursor_reset(&callchain_cursor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return callchain_cursor_append(&callchain_cursor, ip, al.map, al.sym);
|
||||||
|
}
|
||||||
|
|
||||||
struct branch_info *sample__resolve_bstack(struct perf_sample *sample,
|
struct branch_info *sample__resolve_bstack(struct perf_sample *sample,
|
||||||
struct addr_location *al)
|
struct addr_location *al)
|
||||||
{
|
{
|
||||||
|
@ -1427,7 +1455,6 @@ static int thread__resolve_callchain_sample(struct thread *thread,
|
||||||
|
|
||||||
for (i = 0; i < chain_nr; i++) {
|
for (i = 0; i < chain_nr; i++) {
|
||||||
u64 ip;
|
u64 ip;
|
||||||
struct addr_location al;
|
|
||||||
|
|
||||||
if (callchain_param.order == ORDER_CALLEE)
|
if (callchain_param.order == ORDER_CALLEE)
|
||||||
j = i;
|
j = i;
|
||||||
|
@ -1464,24 +1491,10 @@ static int thread__resolve_callchain_sample(struct thread *thread,
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
al.filtered = 0;
|
err = add_callchain_ip(thread, parent, root_al,
|
||||||
thread__find_addr_location(thread, cpumode,
|
cpumode, ip);
|
||||||
MAP__FUNCTION, ip, &al);
|
if (err == -EINVAL)
|
||||||
if (al.sym != NULL) {
|
break;
|
||||||
if (sort__has_parent && !*parent &&
|
|
||||||
symbol__match_regex(al.sym, &parent_regex))
|
|
||||||
*parent = al.sym;
|
|
||||||
else if (have_ignore_callees && root_al &&
|
|
||||||
symbol__match_regex(al.sym, &ignore_callees_regex)) {
|
|
||||||
/* Treat this symbol as the root,
|
|
||||||
forgetting its callees. */
|
|
||||||
*root_al = al;
|
|
||||||
callchain_cursor_reset(&callchain_cursor);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
err = callchain_cursor_append(&callchain_cursor,
|
|
||||||
ip, al.map, al.sym);
|
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue