lkml.org 
[lkml]   [2014]   [Sep]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 6/8] tools, perf: Make get_srcline fall back to sym+offset
    Date
    From: Andi Kleen <ak@linux.intel.com>

    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>
    ---
    tools/perf/util/annotate.c | 2 +-
    tools/perf/util/callchain.c | 3 ++-
    tools/perf/util/map.c | 2 +-
    tools/perf/util/sort.c | 6 ++++--
    tools/perf/util/srcline.c | 12 +++++++++---
    tools/perf/util/util.h | 4 +++-
    6 files changed, 20 insertions(+), 9 deletions(-)

    diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c
    index f49f9a5..ccd6f3a 100644
    --- a/tools/perf/util/annotate.c
    +++ b/tools/perf/util/annotate.c
    @@ -1190,7 +1190,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:
    diff --git a/tools/perf/util/callchain.c b/tools/perf/util/callchain.c
    index b7ee210..8c0cea0 100644
    --- a/tools/perf/util/callchain.c
    +++ b/tools/perf/util/callchain.c
    @@ -666,7 +666,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);
    diff --git a/tools/perf/util/map.c b/tools/perf/util/map.c
    index b709059..4f3cdbc 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,

    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);
    diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c
    index 289df9d..505700e 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)
    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);
    diff --git a/tools/perf/util/srcline.c b/tools/perf/util/srcline.c
    index ac877f9..36a7aff 100644
    --- a/tools/perf/util/srcline.c
    +++ b/tools/perf/util/srcline.c
    @@ -8,12 +8,13 @@
    #include "util/util.h"
    #include "util/debug.h"

    +#include "symbol.h"
    +
    #ifdef HAVE_LIBBFD_SUPPORT

    /*
    * Implement addr2line using libbfd.
    */
    -#define PACKAGE "perf"
    #include <bfd.h>

    struct a2l_data {
    @@ -250,7 +251,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 +291,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;
    }
    diff --git a/tools/perf/util/util.h b/tools/perf/util/util.h
    index 80bfdaa..9855c4f 100644
    --- a/tools/perf/util/util.h
    +++ b/tools/perf/util/util.h
    @@ -338,8 +338,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);
    --
    1.9.3


    \
     
     \ /
      Last update: 2014-09-27 02:01    [W:2.223 / U:0.160 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site