perf callchain: Use a common function to resolve symbol or name
authorAndi Kleen <ak@linux.intel.com>
Thu, 13 Nov 2014 02:05:23 +0000 (18:05 -0800)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Wed, 19 Nov 2014 15:33:47 +0000 (12:33 -0300)
Refactor the duplicated code to resolve the symbol name or
the address of a symbol into a single function.

Used in next patch to add common functionality.

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-6-git-send-email-andi@firstfloor.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/ui/browsers/hists.c
tools/perf/ui/gtk/hists.c
tools/perf/ui/stdio/hist.c
tools/perf/util/callchain.c
tools/perf/util/callchain.h

index cfb976b3de3a0a1593b96f33c2c4136acdccf6aa..12c17c5a3d686d2196aba599b3eb9c5f28fc7463 100644 (file)
@@ -463,23 +463,6 @@ out:
        return key;
 }
 
-static char *callchain_list__sym_name(struct callchain_list *cl,
-                                     char *bf, size_t bfsize, bool show_dso)
-{
-       int printed;
-
-       if (cl->ms.sym)
-               printed = scnprintf(bf, bfsize, "%s", cl->ms.sym->name);
-       else
-               printed = scnprintf(bf, bfsize, "%#" PRIx64, cl->ip);
-
-       if (show_dso)
-               scnprintf(bf + printed, bfsize - printed, " %s",
-                         cl->ms.map ? cl->ms.map->dso->short_name : "unknown");
-
-       return bf;
-}
-
 struct callchain_print_arg {
        /* for hists browser */
        off_t   row_offset;
index fc654fb77ace52769294ad70b6846fc4fa5f0ee9..4b3585eed1e84be6feb0243f4f9f0cbd7e1ef592 100644 (file)
@@ -89,15 +89,6 @@ void perf_gtk__init_hpp(void)
                                perf_gtk__hpp_color_overhead_acc;
 }
 
-static void callchain_list__sym_name(struct callchain_list *cl,
-                                    char *bf, size_t bfsize)
-{
-       if (cl->ms.sym)
-               scnprintf(bf, bfsize, "%s", cl->ms.sym->name);
-       else
-               scnprintf(bf, bfsize, "%#" PRIx64, cl->ip);
-}
-
 static void perf_gtk__add_callchain(struct rb_root *root, GtkTreeStore *store,
                                    GtkTreeIter *parent, int col, u64 total)
 {
@@ -128,7 +119,7 @@ static void perf_gtk__add_callchain(struct rb_root *root, GtkTreeStore *store,
                        scnprintf(buf, sizeof(buf), "%5.2f%%", percent);
                        gtk_tree_store_set(store, &iter, 0, buf, -1);
 
-                       callchain_list__sym_name(chain, buf, sizeof(buf));
+                       callchain_list__sym_name(chain, buf, sizeof(buf), false);
                        gtk_tree_store_set(store, &iter, col, buf, -1);
 
                        if (need_new_parent) {
index 15b451acbde61081eaf22aba07a5da3752a9e205..dfcbc90146ef0227bcdd19faca44c5890c823e26 100644 (file)
@@ -41,6 +41,7 @@ static size_t ipchain__fprintf_graph(FILE *fp, struct callchain_list *chain,
 {
        int i;
        size_t ret = 0;
+       char bf[1024];
 
        ret += callchain__fprintf_left_margin(fp, left_margin);
        for (i = 0; i < depth; i++) {
@@ -56,11 +57,8 @@ static size_t ipchain__fprintf_graph(FILE *fp, struct callchain_list *chain,
                } else
                        ret += fprintf(fp, "%s", "          ");
        }
-       if (chain->ms.sym)
-               ret += fprintf(fp, "%s\n", chain->ms.sym->name);
-       else
-               ret += fprintf(fp, "0x%0" PRIx64 "\n", chain->ip);
-
+       fputs(callchain_list__sym_name(chain, bf, sizeof(bf), false), fp);
+       fputc('\n', fp);
        return ret;
 }
 
@@ -168,6 +166,7 @@ static size_t callchain__fprintf_graph(FILE *fp, struct rb_root *root,
        struct rb_node *node;
        int i = 0;
        int ret = 0;
+       char bf[1024];
 
        /*
         * If have one single callchain root, don't bother printing
@@ -196,10 +195,8 @@ static size_t callchain__fprintf_graph(FILE *fp, struct rb_root *root,
                        } else
                                ret += callchain__fprintf_left_margin(fp, left_margin);
 
-                       if (chain->ms.sym)
-                               ret += fprintf(fp, " %s\n", chain->ms.sym->name);
-                       else
-                               ret += fprintf(fp, " %p\n", (void *)(long)chain->ip);
+                       ret += fprintf(fp, "%s\n", callchain_list__sym_name(chain, bf, sizeof(bf),
+                                                       false));
 
                        if (++entries_printed == callchain_param.print_limit)
                                break;
@@ -219,6 +216,7 @@ static size_t __callchain__fprintf_flat(FILE *fp, struct callchain_node *node,
 {
        struct callchain_list *chain;
        size_t ret = 0;
+       char bf[1024];
 
        if (!node)
                return 0;
@@ -229,11 +227,8 @@ static size_t __callchain__fprintf_flat(FILE *fp, struct callchain_node *node,
        list_for_each_entry(chain, &node->val, list) {
                if (chain->ip >= PERF_CONTEXT_MAX)
                        continue;
-               if (chain->ms.sym)
-                       ret += fprintf(fp, "                %s\n", chain->ms.sym->name);
-               else
-                       ret += fprintf(fp, "                %p\n",
-                                       (void *)(long)chain->ip);
+               ret += fprintf(fp, "                %s\n", callchain_list__sym_name(chain,
+                                       bf, sizeof(bf), false));
        }
 
        return ret;
index 00229809a90473ab170953d4c02636bba01835c7..38da69c8c1ffd2e19d4be0103f7414e93cf374dd 100644 (file)
@@ -808,3 +808,22 @@ int fill_callchain_info(struct addr_location *al, struct callchain_cursor_node *
 out:
        return 1;
 }
+
+char *callchain_list__sym_name(struct callchain_list *cl,
+                              char *bf, size_t bfsize, bool show_dso)
+{
+       int printed;
+
+       if (cl->ms.sym) {
+               printed = scnprintf(bf, bfsize, "%s", cl->ms.sym->name);
+       } else
+               printed = scnprintf(bf, bfsize, "%#" PRIx64, cl->ip);
+
+       if (show_dso)
+               scnprintf(bf + printed, bfsize - printed, " %s",
+                         cl->ms.map ?
+                         cl->ms.map->dso->short_name :
+                         "unknown");
+
+       return bf;
+}
index 3caccc2c173c32b1baef5b59f9366cf4aa09f9fb..3e1ed15d11f114c90349bf48859e42a726e5f634 100644 (file)
@@ -193,4 +193,7 @@ static inline int arch_skip_callchain_idx(struct thread *thread __maybe_unused,
 }
 #endif
 
+char *callchain_list__sym_name(struct callchain_list *cl,
+                              char *bf, size_t bfsize, bool show_dso);
+
 #endif /* __PERF_CALLCHAIN_H */