Skip to content

Commit

Permalink
perf callchain: Make get_srcline fall back to sym+offset
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Andi Kleen authored and Arnaldo Carvalho de Melo committed Nov 24, 2014
1 parent aaba4e1 commit 85c116a
Show file tree
Hide file tree
Showing 6 changed files with 20 additions and 8 deletions.
2 changes: 1 addition & 1 deletion tools/perf/util/annotate.c
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
3 changes: 2 additions & 1 deletion tools/perf/util/callchain.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
2 changes: 1 addition & 1 deletion tools/perf/util/map.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
6 changes: 4 additions & 2 deletions tools/perf/util/sort.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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);
Expand Down
11 changes: 9 additions & 2 deletions tools/perf/util/srcline.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
#include "util/util.h"
#include "util/debug.h"

#include "symbol.h"

#ifdef HAVE_LIBBFD_SUPPORT

/*
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}
Expand Down
4 changes: 3 additions & 1 deletion tools/perf/util/util.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit 85c116a

Please sign in to comment.