diff options
author | Andi Kleen <ak@linux.intel.com> | 2014-11-12 21:05:23 -0500 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2014-11-19 10:33:47 -0500 |
commit | 2989ccaac48f8c3da7f77101bbf98e0ea8773d83 (patch) | |
tree | c0484d0ac42808cd690432c4425f556be28b4383 | |
parent | 5550171b2a9f8df26ff483051d060db06376b26d (diff) |
perf callchain: Use a common function to resolve symbol or name
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>
-rw-r--r-- | tools/perf/ui/browsers/hists.c | 17 | ||||
-rw-r--r-- | tools/perf/ui/gtk/hists.c | 11 | ||||
-rw-r--r-- | tools/perf/ui/stdio/hist.c | 23 | ||||
-rw-r--r-- | tools/perf/util/callchain.c | 19 | ||||
-rw-r--r-- | tools/perf/util/callchain.h | 3 |
5 files changed, 32 insertions, 41 deletions
diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c index cfb976b3de3a..12c17c5a3d68 100644 --- a/tools/perf/ui/browsers/hists.c +++ b/tools/perf/ui/browsers/hists.c | |||
@@ -463,23 +463,6 @@ out: | |||
463 | return key; | 463 | return key; |
464 | } | 464 | } |
465 | 465 | ||
466 | static char *callchain_list__sym_name(struct callchain_list *cl, | ||
467 | char *bf, size_t bfsize, bool show_dso) | ||
468 | { | ||
469 | int printed; | ||
470 | |||
471 | if (cl->ms.sym) | ||
472 | printed = scnprintf(bf, bfsize, "%s", cl->ms.sym->name); | ||
473 | else | ||
474 | printed = scnprintf(bf, bfsize, "%#" PRIx64, cl->ip); | ||
475 | |||
476 | if (show_dso) | ||
477 | scnprintf(bf + printed, bfsize - printed, " %s", | ||
478 | cl->ms.map ? cl->ms.map->dso->short_name : "unknown"); | ||
479 | |||
480 | return bf; | ||
481 | } | ||
482 | |||
483 | struct callchain_print_arg { | 466 | struct callchain_print_arg { |
484 | /* for hists browser */ | 467 | /* for hists browser */ |
485 | off_t row_offset; | 468 | off_t row_offset; |
diff --git a/tools/perf/ui/gtk/hists.c b/tools/perf/ui/gtk/hists.c index fc654fb77ace..4b3585eed1e8 100644 --- a/tools/perf/ui/gtk/hists.c +++ b/tools/perf/ui/gtk/hists.c | |||
@@ -89,15 +89,6 @@ void perf_gtk__init_hpp(void) | |||
89 | perf_gtk__hpp_color_overhead_acc; | 89 | perf_gtk__hpp_color_overhead_acc; |
90 | } | 90 | } |
91 | 91 | ||
92 | static void callchain_list__sym_name(struct callchain_list *cl, | ||
93 | char *bf, size_t bfsize) | ||
94 | { | ||
95 | if (cl->ms.sym) | ||
96 | scnprintf(bf, bfsize, "%s", cl->ms.sym->name); | ||
97 | else | ||
98 | scnprintf(bf, bfsize, "%#" PRIx64, cl->ip); | ||
99 | } | ||
100 | |||
101 | static void perf_gtk__add_callchain(struct rb_root *root, GtkTreeStore *store, | 92 | static void perf_gtk__add_callchain(struct rb_root *root, GtkTreeStore *store, |
102 | GtkTreeIter *parent, int col, u64 total) | 93 | GtkTreeIter *parent, int col, u64 total) |
103 | { | 94 | { |
@@ -128,7 +119,7 @@ static void perf_gtk__add_callchain(struct rb_root *root, GtkTreeStore *store, | |||
128 | scnprintf(buf, sizeof(buf), "%5.2f%%", percent); | 119 | scnprintf(buf, sizeof(buf), "%5.2f%%", percent); |
129 | gtk_tree_store_set(store, &iter, 0, buf, -1); | 120 | gtk_tree_store_set(store, &iter, 0, buf, -1); |
130 | 121 | ||
131 | callchain_list__sym_name(chain, buf, sizeof(buf)); | 122 | callchain_list__sym_name(chain, buf, sizeof(buf), false); |
132 | gtk_tree_store_set(store, &iter, col, buf, -1); | 123 | gtk_tree_store_set(store, &iter, col, buf, -1); |
133 | 124 | ||
134 | if (need_new_parent) { | 125 | if (need_new_parent) { |
diff --git a/tools/perf/ui/stdio/hist.c b/tools/perf/ui/stdio/hist.c index 15b451acbde6..dfcbc90146ef 100644 --- a/tools/perf/ui/stdio/hist.c +++ b/tools/perf/ui/stdio/hist.c | |||
@@ -41,6 +41,7 @@ static size_t ipchain__fprintf_graph(FILE *fp, struct callchain_list *chain, | |||
41 | { | 41 | { |
42 | int i; | 42 | int i; |
43 | size_t ret = 0; | 43 | size_t ret = 0; |
44 | char bf[1024]; | ||
44 | 45 | ||
45 | ret += callchain__fprintf_left_margin(fp, left_margin); | 46 | ret += callchain__fprintf_left_margin(fp, left_margin); |
46 | for (i = 0; i < depth; i++) { | 47 | for (i = 0; i < depth; i++) { |
@@ -56,11 +57,8 @@ static size_t ipchain__fprintf_graph(FILE *fp, struct callchain_list *chain, | |||
56 | } else | 57 | } else |
57 | ret += fprintf(fp, "%s", " "); | 58 | ret += fprintf(fp, "%s", " "); |
58 | } | 59 | } |
59 | if (chain->ms.sym) | 60 | fputs(callchain_list__sym_name(chain, bf, sizeof(bf), false), fp); |
60 | ret += fprintf(fp, "%s\n", chain->ms.sym->name); | 61 | fputc('\n', fp); |
61 | else | ||
62 | ret += fprintf(fp, "0x%0" PRIx64 "\n", chain->ip); | ||
63 | |||
64 | return ret; | 62 | return ret; |
65 | } | 63 | } |
66 | 64 | ||
@@ -168,6 +166,7 @@ static size_t callchain__fprintf_graph(FILE *fp, struct rb_root *root, | |||
168 | struct rb_node *node; | 166 | struct rb_node *node; |
169 | int i = 0; | 167 | int i = 0; |
170 | int ret = 0; | 168 | int ret = 0; |
169 | char bf[1024]; | ||
171 | 170 | ||
172 | /* | 171 | /* |
173 | * If have one single callchain root, don't bother printing | 172 | * 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, | |||
196 | } else | 195 | } else |
197 | ret += callchain__fprintf_left_margin(fp, left_margin); | 196 | ret += callchain__fprintf_left_margin(fp, left_margin); |
198 | 197 | ||
199 | if (chain->ms.sym) | 198 | ret += fprintf(fp, "%s\n", callchain_list__sym_name(chain, bf, sizeof(bf), |
200 | ret += fprintf(fp, " %s\n", chain->ms.sym->name); | 199 | false)); |
201 | else | ||
202 | ret += fprintf(fp, " %p\n", (void *)(long)chain->ip); | ||
203 | 200 | ||
204 | if (++entries_printed == callchain_param.print_limit) | 201 | if (++entries_printed == callchain_param.print_limit) |
205 | break; | 202 | break; |
@@ -219,6 +216,7 @@ static size_t __callchain__fprintf_flat(FILE *fp, struct callchain_node *node, | |||
219 | { | 216 | { |
220 | struct callchain_list *chain; | 217 | struct callchain_list *chain; |
221 | size_t ret = 0; | 218 | size_t ret = 0; |
219 | char bf[1024]; | ||
222 | 220 | ||
223 | if (!node) | 221 | if (!node) |
224 | return 0; | 222 | return 0; |
@@ -229,11 +227,8 @@ static size_t __callchain__fprintf_flat(FILE *fp, struct callchain_node *node, | |||
229 | list_for_each_entry(chain, &node->val, list) { | 227 | list_for_each_entry(chain, &node->val, list) { |
230 | if (chain->ip >= PERF_CONTEXT_MAX) | 228 | if (chain->ip >= PERF_CONTEXT_MAX) |
231 | continue; | 229 | continue; |
232 | if (chain->ms.sym) | 230 | ret += fprintf(fp, " %s\n", callchain_list__sym_name(chain, |
233 | ret += fprintf(fp, " %s\n", chain->ms.sym->name); | 231 | bf, sizeof(bf), false)); |
234 | else | ||
235 | ret += fprintf(fp, " %p\n", | ||
236 | (void *)(long)chain->ip); | ||
237 | } | 232 | } |
238 | 233 | ||
239 | return ret; | 234 | return ret; |
diff --git a/tools/perf/util/callchain.c b/tools/perf/util/callchain.c index 00229809a904..38da69c8c1ff 100644 --- a/tools/perf/util/callchain.c +++ b/tools/perf/util/callchain.c | |||
@@ -808,3 +808,22 @@ int fill_callchain_info(struct addr_location *al, struct callchain_cursor_node * | |||
808 | out: | 808 | out: |
809 | return 1; | 809 | return 1; |
810 | } | 810 | } |
811 | |||
812 | char *callchain_list__sym_name(struct callchain_list *cl, | ||
813 | char *bf, size_t bfsize, bool show_dso) | ||
814 | { | ||
815 | int printed; | ||
816 | |||
817 | if (cl->ms.sym) { | ||
818 | printed = scnprintf(bf, bfsize, "%s", cl->ms.sym->name); | ||
819 | } else | ||
820 | printed = scnprintf(bf, bfsize, "%#" PRIx64, cl->ip); | ||
821 | |||
822 | if (show_dso) | ||
823 | scnprintf(bf + printed, bfsize - printed, " %s", | ||
824 | cl->ms.map ? | ||
825 | cl->ms.map->dso->short_name : | ||
826 | "unknown"); | ||
827 | |||
828 | return bf; | ||
829 | } | ||
diff --git a/tools/perf/util/callchain.h b/tools/perf/util/callchain.h index 3caccc2c173c..3e1ed15d11f1 100644 --- a/tools/perf/util/callchain.h +++ b/tools/perf/util/callchain.h | |||
@@ -193,4 +193,7 @@ static inline int arch_skip_callchain_idx(struct thread *thread __maybe_unused, | |||
193 | } | 193 | } |
194 | #endif | 194 | #endif |
195 | 195 | ||
196 | char *callchain_list__sym_name(struct callchain_list *cl, | ||
197 | char *bf, size_t bfsize, bool show_dso); | ||
198 | |||
196 | #endif /* __PERF_CALLCHAIN_H */ | 199 | #endif /* __PERF_CALLCHAIN_H */ |