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