perf callchain: Factor out adding new call chain entries
authorAndi Kleen <ak@linux.intel.com>
Thu, 13 Nov 2014 02:05:19 +0000 (18:05 -0800)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Wed, 19 Nov 2014 15:33:47 +0000 (12:33 -0300)
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>
tools/perf/util/machine.c

index 52e94902afb12a5fde6c71f14ca90ede5f63f3ee..84390eecab06f6c214c91f5cb223a832b6106dd1 100644 (file)
@@ -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;
        }