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>
This commit is contained in:
parent
5550171b2a
commit
2989ccaac4
|
@ -463,23 +463,6 @@ out:
|
||||||
return key;
|
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 {
|
struct callchain_print_arg {
|
||||||
/* for hists browser */
|
/* for hists browser */
|
||||||
off_t row_offset;
|
off_t row_offset;
|
||||||
|
|
|
@ -89,15 +89,6 @@ void perf_gtk__init_hpp(void)
|
||||||
perf_gtk__hpp_color_overhead_acc;
|
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,
|
static void perf_gtk__add_callchain(struct rb_root *root, GtkTreeStore *store,
|
||||||
GtkTreeIter *parent, int col, u64 total)
|
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);
|
scnprintf(buf, sizeof(buf), "%5.2f%%", percent);
|
||||||
gtk_tree_store_set(store, &iter, 0, buf, -1);
|
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);
|
gtk_tree_store_set(store, &iter, col, buf, -1);
|
||||||
|
|
||||||
if (need_new_parent) {
|
if (need_new_parent) {
|
||||||
|
|
|
@ -41,6 +41,7 @@ static size_t ipchain__fprintf_graph(FILE *fp, struct callchain_list *chain,
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
size_t ret = 0;
|
size_t ret = 0;
|
||||||
|
char bf[1024];
|
||||||
|
|
||||||
ret += callchain__fprintf_left_margin(fp, left_margin);
|
ret += callchain__fprintf_left_margin(fp, left_margin);
|
||||||
for (i = 0; i < depth; i++) {
|
for (i = 0; i < depth; i++) {
|
||||||
|
@ -56,11 +57,8 @@ static size_t ipchain__fprintf_graph(FILE *fp, struct callchain_list *chain,
|
||||||
} else
|
} else
|
||||||
ret += fprintf(fp, "%s", " ");
|
ret += fprintf(fp, "%s", " ");
|
||||||
}
|
}
|
||||||
if (chain->ms.sym)
|
fputs(callchain_list__sym_name(chain, bf, sizeof(bf), false), fp);
|
||||||
ret += fprintf(fp, "%s\n", chain->ms.sym->name);
|
fputc('\n', fp);
|
||||||
else
|
|
||||||
ret += fprintf(fp, "0x%0" PRIx64 "\n", chain->ip);
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -168,6 +166,7 @@ static size_t callchain__fprintf_graph(FILE *fp, struct rb_root *root,
|
||||||
struct rb_node *node;
|
struct rb_node *node;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
char bf[1024];
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If have one single callchain root, don't bother printing
|
* 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
|
} else
|
||||||
ret += callchain__fprintf_left_margin(fp, left_margin);
|
ret += callchain__fprintf_left_margin(fp, left_margin);
|
||||||
|
|
||||||
if (chain->ms.sym)
|
ret += fprintf(fp, "%s\n", callchain_list__sym_name(chain, bf, sizeof(bf),
|
||||||
ret += fprintf(fp, " %s\n", chain->ms.sym->name);
|
false));
|
||||||
else
|
|
||||||
ret += fprintf(fp, " %p\n", (void *)(long)chain->ip);
|
|
||||||
|
|
||||||
if (++entries_printed == callchain_param.print_limit)
|
if (++entries_printed == callchain_param.print_limit)
|
||||||
break;
|
break;
|
||||||
|
@ -219,6 +216,7 @@ static size_t __callchain__fprintf_flat(FILE *fp, struct callchain_node *node,
|
||||||
{
|
{
|
||||||
struct callchain_list *chain;
|
struct callchain_list *chain;
|
||||||
size_t ret = 0;
|
size_t ret = 0;
|
||||||
|
char bf[1024];
|
||||||
|
|
||||||
if (!node)
|
if (!node)
|
||||||
return 0;
|
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) {
|
list_for_each_entry(chain, &node->val, list) {
|
||||||
if (chain->ip >= PERF_CONTEXT_MAX)
|
if (chain->ip >= PERF_CONTEXT_MAX)
|
||||||
continue;
|
continue;
|
||||||
if (chain->ms.sym)
|
ret += fprintf(fp, " %s\n", callchain_list__sym_name(chain,
|
||||||
ret += fprintf(fp, " %s\n", chain->ms.sym->name);
|
bf, sizeof(bf), false));
|
||||||
else
|
|
||||||
ret += fprintf(fp, " %p\n",
|
|
||||||
(void *)(long)chain->ip);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
@ -808,3 +808,22 @@ int fill_callchain_info(struct addr_location *al, struct callchain_cursor_node *
|
||||||
out:
|
out:
|
||||||
return 1;
|
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;
|
||||||
|
}
|
||||||
|
|
|
@ -193,4 +193,7 @@ static inline int arch_skip_callchain_idx(struct thread *thread __maybe_unused,
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
char *callchain_list__sym_name(struct callchain_list *cl,
|
||||||
|
char *bf, size_t bfsize, bool show_dso);
|
||||||
|
|
||||||
#endif /* __PERF_CALLCHAIN_H */
|
#endif /* __PERF_CALLCHAIN_H */
|
||||||
|
|
Loading…
Reference in a new issue