lkml.org 
[lkml]   [2023]   [Oct]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 12/48] perf annotate: Factor out evsel__get_arch()
    Date
    The evsel__get_arch() is to get architecture info from the environ.
    It'll be used by other places later so let's factor it out.

    Also add arch__is() to check the arch info by name.

    Signed-off-by: Namhyung Kim <namhyung@kernel.org>
    ---
    tools/perf/util/annotate.c | 44 +++++++++++++++++++++++++++-----------
    tools/perf/util/annotate.h | 2 ++
    2 files changed, 33 insertions(+), 13 deletions(-)

    diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c
    index 605298410ed4..254cc9f224f4 100644
    --- a/tools/perf/util/annotate.c
    +++ b/tools/perf/util/annotate.c
    @@ -840,6 +840,11 @@ static struct arch *arch__find(const char *name)
    return bsearch(name, architectures, nmemb, sizeof(struct arch), arch__key_cmp);
    }

    +bool arch__is(struct arch *arch, const char *name)
    +{
    + return !strcmp(arch->name, name);
    +}
    +
    static struct annotated_source *annotated_source__new(void)
    {
    struct annotated_source *src = zalloc(sizeof(*src));
    @@ -2344,15 +2349,8 @@ void symbol__calc_percent(struct symbol *sym, struct evsel *evsel)
    annotation__calc_percent(notes, evsel, symbol__size(sym));
    }

    -int symbol__annotate(struct map_symbol *ms, struct evsel *evsel,
    - struct annotation_options *options, struct arch **parch)
    +static int evsel__get_arch(struct evsel *evsel, struct arch **parch)
    {
    - struct symbol *sym = ms->sym;
    - struct annotation *notes = symbol__annotation(sym);
    - struct annotate_args args = {
    - .evsel = evsel,
    - .options = options,
    - };
    struct perf_env *env = evsel__env(evsel);
    const char *arch_name = perf_env__arch(env);
    struct arch *arch;
    @@ -2361,23 +2359,43 @@ int symbol__annotate(struct map_symbol *ms, struct evsel *evsel,
    if (!arch_name)
    return errno;

    - args.arch = arch = arch__find(arch_name);
    + *parch = arch = arch__find(arch_name);
    if (arch == NULL) {
    pr_err("%s: unsupported arch %s\n", __func__, arch_name);
    return ENOTSUP;
    }

    - if (parch)
    - *parch = arch;
    -
    if (arch->init) {
    err = arch->init(arch, env ? env->cpuid : NULL);
    if (err) {
    - pr_err("%s: failed to initialize %s arch priv area\n", __func__, arch->name);
    + pr_err("%s: failed to initialize %s arch priv area\n",
    + __func__, arch->name);
    return err;
    }
    }
    + return 0;
    +}
    +
    +int symbol__annotate(struct map_symbol *ms, struct evsel *evsel,
    + struct annotation_options *options, struct arch **parch)
    +{
    + struct symbol *sym = ms->sym;
    + struct annotation *notes = symbol__annotation(sym);
    + struct annotate_args args = {
    + .evsel = evsel,
    + .options = options,
    + };
    + struct arch *arch = NULL;
    + int err;
    +
    + err = evsel__get_arch(evsel, &arch);
    + if (err < 0)
    + return err;
    +
    + if (parch)
    + *parch = arch;

    + args.arch = arch;
    args.ms = *ms;
    if (notes->options && notes->options->full_addr)
    notes->start = map__objdump_2mem(ms->map, ms->sym->start);
    diff --git a/tools/perf/util/annotate.h b/tools/perf/util/annotate.h
    index e33a55431bad..c74f8f10f705 100644
    --- a/tools/perf/util/annotate.h
    +++ b/tools/perf/util/annotate.h
    @@ -61,6 +61,8 @@ struct ins_operands {

    struct arch;

    +bool arch__is(struct arch *arch, const char *name);
    +
    struct ins_ops {
    void (*free)(struct ins_operands *ops);
    int (*parse)(struct arch *arch, struct ins_operands *ops, struct map_symbol *ms);
    --
    2.42.0.655.g421f12c284-goog
    \
     
     \ /
      Last update: 2023-10-12 05:53    [W:2.659 / U:0.592 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site