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:
Andi Kleen 2014-11-12 18:05:27 -08:00 committed by Arnaldo Carvalho de Melo
parent aaba4e12a9
commit 85c116a6cb
6 changed files with 20 additions and 8 deletions

View file

@ -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:

View file

@ -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);

View file

@ -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);

View file

@ -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);

View file

@ -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 @@ char *get_srcline(struct dso *dso, unsigned long addr)
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;
}

View file

@ -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);