|
@@ -1381,6 +1381,34 @@ struct mem_info *sample__resolve_mem(struct perf_sample *sample,
|
|
|
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 addr_location *al)
|
|
|
{
|
|
@@ -1427,7 +1455,6 @@ static int thread__resolve_callchain_sample(struct thread *thread,
|
|
|
|
|
|
for (i = 0; i < chain_nr; i++) {
|
|
|
u64 ip;
|
|
|
- struct addr_location al;
|
|
|
|
|
|
if (callchain_param.order == ORDER_CALLEE)
|
|
|
j = i;
|
|
@@ -1464,24 +1491,10 @@ static int thread__resolve_callchain_sample(struct thread *thread,
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- al.filtered = 0;
|
|
|
- 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);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- err = callchain_cursor_append(&callchain_cursor,
|
|
|
- ip, al.map, al.sym);
|
|
|
+ err = add_callchain_ip(thread, parent, root_al,
|
|
|
+ cpumode, ip);
|
|
|
+ if (err == -EINVAL)
|
|
|
+ break;
|
|
|
if (err)
|
|
|
return err;
|
|
|
}
|