diff options
author | Andi Kleen <ak@linux.intel.com> | 2014-11-12 21:05:27 -0500 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2014-11-24 16:03:47 -0500 |
commit | 85c116a6cb91a5c09b7a6c95ffc6a6cbd32cd237 (patch) | |
tree | ed4727c432cd2cfbd26a7e27cbed070f112d1df5 /tools | |
parent | aaba4e12a99cc56fc8614a3f2a3ec6db4fcde76e (diff) |
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>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/perf/util/annotate.c | 2 | ||||
-rw-r--r-- | tools/perf/util/callchain.c | 3 | ||||
-rw-r--r-- | tools/perf/util/map.c | 2 | ||||
-rw-r--r-- | tools/perf/util/sort.c | 6 | ||||
-rw-r--r-- | tools/perf/util/srcline.c | 11 | ||||
-rw-r--r-- | tools/perf/util/util.h | 4 |
6 files changed, 20 insertions, 8 deletions
diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c index e5670f1af737..79999ceaf2be 100644 --- a/tools/perf/util/annotate.c +++ b/tools/perf/util/annotate.c | |||
@@ -1192,7 +1192,7 @@ static int symbol__get_source_line(struct symbol *sym, struct map *map, | |||
1192 | goto next; | 1192 | goto next; |
1193 | 1193 | ||
1194 | offset = start + i; | 1194 | offset = start + i; |
1195 | src_line->path = get_srcline(map->dso, offset); | 1195 | src_line->path = get_srcline(map->dso, offset, NULL, false); |
1196 | insert_source_line(&tmp_root, src_line); | 1196 | insert_source_line(&tmp_root, src_line); |
1197 | 1197 | ||
1198 | next: | 1198 | next: |
diff --git a/tools/perf/util/callchain.c b/tools/perf/util/callchain.c index b6624aeaaca9..517ed84db97a 100644 --- a/tools/perf/util/callchain.c +++ b/tools/perf/util/callchain.c | |||
@@ -819,7 +819,8 @@ char *callchain_list__sym_name(struct callchain_list *cl, | |||
819 | cl->ms.map && !cl->srcline) | 819 | cl->ms.map && !cl->srcline) |
820 | cl->srcline = get_srcline(cl->ms.map->dso, | 820 | cl->srcline = get_srcline(cl->ms.map->dso, |
821 | map__rip_2objdump(cl->ms.map, | 821 | map__rip_2objdump(cl->ms.map, |
822 | cl->ip)); | 822 | cl->ip), |
823 | cl->ms.sym, false); | ||
823 | if (cl->srcline) | 824 | if (cl->srcline) |
824 | printed = scnprintf(bf, bfsize, "%s %s", | 825 | printed = scnprintf(bf, bfsize, "%s %s", |
825 | cl->ms.sym->name, cl->srcline); | 826 | cl->ms.sym->name, cl->srcline); |
diff --git a/tools/perf/util/map.c b/tools/perf/util/map.c index 040a785c857b..62ca9f2607d5 100644 --- a/tools/perf/util/map.c +++ b/tools/perf/util/map.c | |||
@@ -360,7 +360,7 @@ int map__fprintf_srcline(struct map *map, u64 addr, const char *prefix, | |||
360 | 360 | ||
361 | if (map && map->dso) { | 361 | if (map && map->dso) { |
362 | srcline = get_srcline(map->dso, | 362 | srcline = get_srcline(map->dso, |
363 | map__rip_2objdump(map, addr)); | 363 | map__rip_2objdump(map, addr), NULL, true); |
364 | if (srcline != SRCLINE_UNKNOWN) | 364 | if (srcline != SRCLINE_UNKNOWN) |
365 | ret = fprintf(fp, "%s%s", prefix, srcline); | 365 | ret = fprintf(fp, "%s%s", prefix, srcline); |
366 | free_srcline(srcline); | 366 | free_srcline(srcline); |
diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c index 82a5596241a7..9139dda9f9a3 100644 --- a/tools/perf/util/sort.c +++ b/tools/perf/util/sort.c | |||
@@ -291,7 +291,8 @@ sort__srcline_cmp(struct hist_entry *left, struct hist_entry *right) | |||
291 | else { | 291 | else { |
292 | struct map *map = left->ms.map; | 292 | struct map *map = left->ms.map; |
293 | left->srcline = get_srcline(map->dso, | 293 | left->srcline = get_srcline(map->dso, |
294 | map__rip_2objdump(map, left->ip)); | 294 | map__rip_2objdump(map, left->ip), |
295 | left->ms.sym, true); | ||
295 | } | 296 | } |
296 | } | 297 | } |
297 | if (!right->srcline) { | 298 | if (!right->srcline) { |
@@ -300,7 +301,8 @@ sort__srcline_cmp(struct hist_entry *left, struct hist_entry *right) | |||
300 | else { | 301 | else { |
301 | struct map *map = right->ms.map; | 302 | struct map *map = right->ms.map; |
302 | right->srcline = get_srcline(map->dso, | 303 | right->srcline = get_srcline(map->dso, |
303 | map__rip_2objdump(map, right->ip)); | 304 | map__rip_2objdump(map, right->ip), |
305 | right->ms.sym, true); | ||
304 | } | 306 | } |
305 | } | 307 | } |
306 | return strcmp(right->srcline, left->srcline); | 308 | return strcmp(right->srcline, left->srcline); |
diff --git a/tools/perf/util/srcline.c b/tools/perf/util/srcline.c index ac877f96fed7..e73b6a5c9e0f 100644 --- a/tools/perf/util/srcline.c +++ b/tools/perf/util/srcline.c | |||
@@ -8,6 +8,8 @@ | |||
8 | #include "util/util.h" | 8 | #include "util/util.h" |
9 | #include "util/debug.h" | 9 | #include "util/debug.h" |
10 | 10 | ||
11 | #include "symbol.h" | ||
12 | |||
11 | #ifdef HAVE_LIBBFD_SUPPORT | 13 | #ifdef HAVE_LIBBFD_SUPPORT |
12 | 14 | ||
13 | /* | 15 | /* |
@@ -250,7 +252,8 @@ void dso__free_a2l(struct dso *dso __maybe_unused) | |||
250 | */ | 252 | */ |
251 | #define A2L_FAIL_LIMIT 123 | 253 | #define A2L_FAIL_LIMIT 123 |
252 | 254 | ||
253 | char *get_srcline(struct dso *dso, unsigned long addr) | 255 | char *get_srcline(struct dso *dso, unsigned long addr, struct symbol *sym, |
256 | bool show_sym) | ||
254 | { | 257 | { |
255 | char *file = NULL; | 258 | char *file = NULL; |
256 | unsigned line = 0; | 259 | unsigned line = 0; |
@@ -289,7 +292,11 @@ out: | |||
289 | dso->has_srcline = 0; | 292 | dso->has_srcline = 0; |
290 | dso__free_a2l(dso); | 293 | dso__free_a2l(dso); |
291 | } | 294 | } |
292 | if (asprintf(&srcline, "%s[%lx]", dso->short_name, addr) < 0) | 295 | if (sym) { |
296 | if (asprintf(&srcline, "%s+%ld", show_sym ? sym->name : "", | ||
297 | addr - sym->start) < 0) | ||
298 | return SRCLINE_UNKNOWN; | ||
299 | } else if (asprintf(&srcline, "%s[%lx]", dso->short_name, addr) < 0) | ||
293 | return SRCLINE_UNKNOWN; | 300 | return SRCLINE_UNKNOWN; |
294 | return srcline; | 301 | return srcline; |
295 | } | 302 | } |
diff --git a/tools/perf/util/util.h b/tools/perf/util/util.h index 76d23d83eae5..419bee030f83 100644 --- a/tools/perf/util/util.h +++ b/tools/perf/util/util.h | |||
@@ -337,8 +337,10 @@ static inline int path__join3(char *bf, size_t size, | |||
337 | } | 337 | } |
338 | 338 | ||
339 | struct dso; | 339 | struct dso; |
340 | struct symbol; | ||
340 | 341 | ||
341 | char *get_srcline(struct dso *dso, unsigned long addr); | 342 | char *get_srcline(struct dso *dso, unsigned long addr, struct symbol *sym, |
343 | bool show_sym); | ||
342 | void free_srcline(char *srcline); | 344 | void free_srcline(char *srcline); |
343 | 345 | ||
344 | int filename__read_int(const char *filename, int *value); | 346 | int filename__read_int(const char *filename, int *value); |