lkml.org 
[lkml]   [2017]   [Mar]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v4 1/5] perf report: Refactor common code in srcline.c
    Date
    Introduce dso__name() and filename_split() out of existing code
    because these codes will be used in several places in next
    patch.

    For filename_split(), it may also solve a potential memory leak
    in existing code. In existing addr2line(),

    sep = strchr(filename, ':');
    if (sep) {
    *sep++ = '\0';
    *file = filename;
    *line_nr = strtoul(sep, NULL, 0);
    ret = 1;
    }

    out:
    pclose(fp);
    return ret;

    If sep is NULL, filename is not freed or returned via file.

    Signed-off-by: Jin Yao <yao.jin@linux.intel.com>
    Tested-by: Milian Wolff <milian.wolff@kdab.com>
    ---
    tools/perf/util/srcline.c | 68 +++++++++++++++++++++++++++++++----------------
    1 file changed, 45 insertions(+), 23 deletions(-)

    diff --git a/tools/perf/util/srcline.c b/tools/perf/util/srcline.c
    index b4db3f4..2953c9f 100644
    --- a/tools/perf/util/srcline.c
    +++ b/tools/perf/util/srcline.c
    @@ -12,6 +12,24 @@

    bool srcline_full_filename;

    +static const char *dso__name(struct dso *dso)
    +{
    + const char *dso_name;
    +
    + if (dso->symsrc_filename)
    + dso_name = dso->symsrc_filename;
    + else
    + dso_name = dso->long_name;
    +
    + if (dso_name[0] == '[')
    + return NULL;
    +
    + if (!strncmp(dso_name, "/tmp/perf-", 10))
    + return NULL;
    +
    + return dso_name;
    +}
    +
    #ifdef HAVE_LIBBFD_SUPPORT

    /*
    @@ -207,6 +225,27 @@ void dso__free_a2l(struct dso *dso)

    #else /* HAVE_LIBBFD_SUPPORT */

    +static int filename_split(char *filename, unsigned int *line_nr)
    +{
    + char *sep;
    +
    + sep = strchr(filename, '\n');
    + if (sep)
    + *sep = '\0';
    +
    + if (!strcmp(filename, "??:0"))
    + return 0;
    +
    + sep = strchr(filename, ':');
    + if (sep) {
    + *sep++ = '\0';
    + *line_nr = strtoul(sep, NULL, 0);
    + return 1;
    + }
    +
    + return 0;
    +}
    +
    static int addr2line(const char *dso_name, u64 addr,
    char **file, unsigned int *line_nr,
    struct dso *dso __maybe_unused,
    @@ -216,7 +255,6 @@ static int addr2line(const char *dso_name, u64 addr,
    char cmd[PATH_MAX];
    char *filename = NULL;
    size_t len;
    - char *sep;
    int ret = 0;

    scnprintf(cmd, sizeof(cmd), "addr2line -e %s %016"PRIx64,
    @@ -233,23 +271,14 @@ static int addr2line(const char *dso_name, u64 addr,
    goto out;
    }

    - sep = strchr(filename, '\n');
    - if (sep)
    - *sep = '\0';
    -
    - if (!strcmp(filename, "??:0")) {
    - pr_debug("no debugging info in %s\n", dso_name);
    + ret = filename_split(filename, line_nr);
    + if (ret != 1) {
    free(filename);
    goto out;
    }

    - sep = strchr(filename, ':');
    - if (sep) {
    - *sep++ = '\0';
    - *file = filename;
    - *line_nr = strtoul(sep, NULL, 0);
    - ret = 1;
    - }
    + *file = filename;
    +
    out:
    pclose(fp);
    return ret;
    @@ -278,15 +307,8 @@ char *__get_srcline(struct dso *dso, u64 addr, struct symbol *sym,
    if (!dso->has_srcline)
    goto out;

    - if (dso->symsrc_filename)
    - dso_name = dso->symsrc_filename;
    - else
    - dso_name = dso->long_name;
    -
    - if (dso_name[0] == '[')
    - goto out;
    -
    - if (!strncmp(dso_name, "/tmp/perf-", 10))
    + dso_name = dso__name(dso);
    + if (dso_name == NULL)
    goto out;

    if (!addr2line(dso_name, addr, &file, &line, dso, unwind_inlines))
    --
    2.7.4
    \
     
     \ /
      Last update: 2017-03-03 03:46    [W:3.215 / U:0.096 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site