diff options
Diffstat (limited to 'tools/perf/util/annotate.c')
| -rw-r--r-- | tools/perf/util/annotate.c | 44 | 
1 files changed, 31 insertions, 13 deletions
diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c index c81fa0791918..27b2a9961cd5 100644 --- a/tools/perf/util/annotate.c +++ b/tools/perf/util/annotate.c @@ -843,6 +843,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)); @@ -2378,15 +2383,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 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	= &annotate_opts, -	};  	struct perf_env *env = evsel__env(evsel);  	const char *arch_name = perf_env__arch(env);  	struct arch *arch; @@ -2395,23 +2393,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 arch **parch) +{ +	struct symbol *sym = ms->sym; +	struct annotation *notes = symbol__annotation(sym); +	struct annotate_args args = { +		.evsel		= evsel, +		.options	= &annotate_opts, +	}; +	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 (annotate_opts.full_addr)  		notes->start = map__objdump_2mem(ms->map, ms->sym->start);  | 
