perf callchain: Make get_srcline fall back to sym+offset
When the source line is not found fall back to sym + offset. This is generally much more useful than a raw address. For this we need to pass in the symbol from the caller. For some callers it's awkward to compute, so we stay at the old behaviour. 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-10-git-send-email-andi@firstfloor.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
aaba4e12a9
commit
85c116a6cb
6 changed files with 20 additions and 8 deletions
|
@ -1192,7 +1192,7 @@ static int symbol__get_source_line(struct symbol *sym, struct map *map,
|
|||
goto next;
|
||||
|
||||
offset = start + i;
|
||||
src_line->path = get_srcline(map->dso, offset);
|
||||
src_line->path = get_srcline(map->dso, offset, NULL, false);
|
||||
insert_source_line(&tmp_root, src_line);
|
||||
|
||||
next:
|
||||
|
|
|
@ -819,7 +819,8 @@ char *callchain_list__sym_name(struct callchain_list *cl,
|
|||
cl->ms.map && !cl->srcline)
|
||||
cl->srcline = get_srcline(cl->ms.map->dso,
|
||||
map__rip_2objdump(cl->ms.map,
|
||||
cl->ip));
|
||||
cl->ip),
|
||||
cl->ms.sym, false);
|
||||
if (cl->srcline)
|
||||
printed = scnprintf(bf, bfsize, "%s %s",
|
||||
cl->ms.sym->name, cl->srcline);
|
||||
|
|
|
@ -360,7 +360,7 @@ int map__fprintf_srcline(struct map *map, u64 addr, const char *prefix,
|
|||
|
||||
if (map && map->dso) {
|
||||
srcline = get_srcline(map->dso,
|
||||
map__rip_2objdump(map, addr));
|
||||
map__rip_2objdump(map, addr), NULL, true);
|
||||
if (srcline != SRCLINE_UNKNOWN)
|
||||
ret = fprintf(fp, "%s%s", prefix, srcline);
|
||||
free_srcline(srcline);
|
||||
|
|
|
@ -291,7 +291,8 @@ sort__srcline_cmp(struct hist_entry *left, struct hist_entry *right)
|
|||
else {
|
||||
struct map *map = left->ms.map;
|
||||
left->srcline = get_srcline(map->dso,
|
||||
map__rip_2objdump(map, left->ip));
|
||||
map__rip_2objdump(map, left->ip),
|
||||
left->ms.sym, true);
|
||||
}
|
||||
}
|
||||
if (!right->srcline) {
|
||||
|
@ -300,7 +301,8 @@ sort__srcline_cmp(struct hist_entry *left, struct hist_entry *right)
|
|||
else {
|
||||
struct map *map = right->ms.map;
|
||||
right->srcline = get_srcline(map->dso,
|
||||
map__rip_2objdump(map, right->ip));
|
||||
map__rip_2objdump(map, right->ip),
|
||||
right->ms.sym, true);
|
||||
}
|
||||
}
|
||||
return strcmp(right->srcline, left->srcline);
|
||||
|
|
|
@ -8,6 +8,8 @@
|
|||
#include "util/util.h"
|
||||
#include "util/debug.h"
|
||||
|
||||
#include "symbol.h"
|
||||
|
||||
#ifdef HAVE_LIBBFD_SUPPORT
|
||||
|
||||
/*
|
||||
|
@ -250,7 +252,8 @@ void dso__free_a2l(struct dso *dso __maybe_unused)
|
|||
*/
|
||||
#define A2L_FAIL_LIMIT 123
|
||||
|
||||
char *get_srcline(struct dso *dso, unsigned long addr)
|
||||
char *get_srcline(struct dso *dso, unsigned long addr, struct symbol *sym,
|
||||
bool show_sym)
|
||||
{
|
||||
char *file = NULL;
|
||||
unsigned line = 0;
|
||||
|
@ -289,7 +292,11 @@ out:
|
|||
dso->has_srcline = 0;
|
||||
dso__free_a2l(dso);
|
||||
}
|
||||
if (asprintf(&srcline, "%s[%lx]", dso->short_name, addr) < 0)
|
||||
if (sym) {
|
||||
if (asprintf(&srcline, "%s+%ld", show_sym ? sym->name : "",
|
||||
addr - sym->start) < 0)
|
||||
return SRCLINE_UNKNOWN;
|
||||
} else if (asprintf(&srcline, "%s[%lx]", dso->short_name, addr) < 0)
|
||||
return SRCLINE_UNKNOWN;
|
||||
return srcline;
|
||||
}
|
||||
|
|
|
@ -337,8 +337,10 @@ static inline int path__join3(char *bf, size_t size,
|
|||
}
|
||||
|
||||
struct dso;
|
||||
struct symbol;
|
||||
|
||||
char *get_srcline(struct dso *dso, unsigned long addr);
|
||||
char *get_srcline(struct dso *dso, unsigned long addr, struct symbol *sym,
|
||||
bool show_sym);
|
||||
void free_srcline(char *srcline);
|
||||
|
||||
int filename__read_int(const char *filename, int *value);
|
||||
|
|
Loading…
Reference in a new issue