Message ID | 20231110000012.3538610-15-namhyung@kernel.org (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | perf tools: Introduce data type profiling (v2) | expand |
Em Thu, Nov 09, 2023 at 03:59:33PM -0800, Namhyung Kim escreveu: > 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. evsel__get_arch(): The "get" is mostly associated with refcounts, so at some point we should rename it to some better name, not a reason to delay processing this patch right now, so I'm applying it as is. > Also add arch__is() to check the arch info by name. cool > 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 3364edf30f50..83e0996992af 100644 > --- a/tools/perf/util/annotate.c > +++ b/tools/perf/util/annotate.c > @@ -804,6 +804,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)); > @@ -2340,15 +2345,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; > @@ -2357,23 +2355,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 bc8b95e8b1be..e8b0173f5f00 100644 > --- a/tools/perf/util/annotate.h > +++ b/tools/perf/util/annotate.h > @@ -59,6 +59,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.869.gea05f2083d-goog >
diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c index 3364edf30f50..83e0996992af 100644 --- a/tools/perf/util/annotate.c +++ b/tools/perf/util/annotate.c @@ -804,6 +804,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)); @@ -2340,15 +2345,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; @@ -2357,23 +2355,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 bc8b95e8b1be..e8b0173f5f00 100644 --- a/tools/perf/util/annotate.h +++ b/tools/perf/util/annotate.h @@ -59,6 +59,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);
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(-)