diff options
Diffstat (limited to 'tools/perf/util/unwind-libunwind.c')
| -rw-r--r-- | tools/perf/util/unwind-libunwind.c | 39 | 
1 files changed, 23 insertions, 16 deletions
diff --git a/tools/perf/util/unwind-libunwind.c b/tools/perf/util/unwind-libunwind.c index 509c287ee762..375d23d9a590 100644 --- a/tools/perf/util/unwind-libunwind.c +++ b/tools/perf/util/unwind-libunwind.c @@ -14,7 +14,7 @@ struct unwind_libunwind_ops __weak *arm64_unwind_libunwind_ops;  static void unwind__register_ops(struct maps *maps, struct unwind_libunwind_ops *ops)  { -	maps->unwind_libunwind_ops = ops; +	RC_CHK_ACCESS(maps)->unwind_libunwind_ops = ops;  }  int unwind__prepare_access(struct maps *maps, struct map *map, bool *initialized) @@ -22,28 +22,30 @@ int unwind__prepare_access(struct maps *maps, struct map *map, bool *initialized  	const char *arch;  	enum dso_type dso_type;  	struct unwind_libunwind_ops *ops = local_unwind_libunwind_ops; +	struct dso *dso = map__dso(map); +	struct machine *machine;  	int err;  	if (!dwarf_callchain_users)  		return 0; -	if (maps->addr_space) { -		pr_debug("unwind: thread map already set, dso=%s\n", -			 map->dso->name); +	if (maps__addr_space(maps)) { +		pr_debug("unwind: thread map already set, dso=%s\n", dso->name);  		if (initialized)  			*initialized = true;  		return 0;  	} +	machine = maps__machine(maps);  	/* env->arch is NULL for live-mode (i.e. perf top) */ -	if (!maps->machine->env || !maps->machine->env->arch) +	if (!machine->env || !machine->env->arch)  		goto out_register; -	dso_type = dso__type(map->dso, maps->machine); +	dso_type = dso__type(dso, machine);  	if (dso_type == DSO__TYPE_UNKNOWN)  		return 0; -	arch = perf_env__arch(maps->machine->env); +	arch = perf_env__arch(machine->env);  	if (!strcmp(arch, "x86")) {  		if (dso_type != DSO__TYPE_64BIT) @@ -54,13 +56,13 @@ int unwind__prepare_access(struct maps *maps, struct map *map, bool *initialized  	}  	if (!ops) { -		pr_err("unwind: target platform=%s is not supported\n", arch); +		pr_warning_once("unwind: target platform=%s is not supported\n", arch);  		return 0;  	}  out_register:  	unwind__register_ops(maps, ops); -	err = maps->unwind_libunwind_ops->prepare_access(maps); +	err = maps__unwind_libunwind_ops(maps)->prepare_access(maps);  	if (initialized)  		*initialized = err ? false : true;  	return err; @@ -68,14 +70,18 @@ out_register:  void unwind__flush_access(struct maps *maps)  { -	if (maps->unwind_libunwind_ops) -		maps->unwind_libunwind_ops->flush_access(maps); +	const struct unwind_libunwind_ops *ops = maps__unwind_libunwind_ops(maps); + +	if (ops) +		ops->flush_access(maps);  }  void unwind__finish_access(struct maps *maps)  { -	if (maps->unwind_libunwind_ops) -		maps->unwind_libunwind_ops->finish_access(maps); +	const struct unwind_libunwind_ops *ops = maps__unwind_libunwind_ops(maps); + +	if (ops) +		ops->finish_access(maps);  }  int unwind__get_entries(unwind_entry_cb_t cb, void *arg, @@ -83,8 +89,9 @@ int unwind__get_entries(unwind_entry_cb_t cb, void *arg,  			 struct perf_sample *data, int max_stack,  			 bool best_effort)  { -	if (thread->maps->unwind_libunwind_ops) -		return thread->maps->unwind_libunwind_ops->get_entries(cb, arg, thread, data, -								       max_stack, best_effort); +	const struct unwind_libunwind_ops *ops = maps__unwind_libunwind_ops(thread->maps); + +	if (ops) +		return ops->get_entries(cb, arg, thread, data, max_stack, best_effort);  	return 0;  }  | 
