summaryrefslogtreecommitdiff
path: root/tools/perf/util/unwind-libunwind.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf/util/unwind-libunwind.c')
-rw-r--r--tools/perf/util/unwind-libunwind.c25
1 files changed, 24 insertions, 1 deletions
diff --git a/tools/perf/util/unwind-libunwind.c b/tools/perf/util/unwind-libunwind.c
index f86f903ae8a8..0086726e00e0 100644
--- a/tools/perf/util/unwind-libunwind.c
+++ b/tools/perf/util/unwind-libunwind.c
@@ -1,5 +1,8 @@
#include "unwind.h"
#include "thread.h"
+#include "session.h"
+#include "debug.h"
+#include "arch/common.h"
struct unwind_libunwind_ops __weak *local_unwind_libunwind_ops;
@@ -9,8 +12,28 @@ static void unwind__register_ops(struct thread *thread,
thread->unwind_libunwind_ops = ops;
}
-int unwind__prepare_access(struct thread *thread)
+int unwind__prepare_access(struct thread *thread, struct map *map)
{
+ const char *arch;
+ enum dso_type dso_type;
+
+ if (thread->addr_space) {
+ pr_debug("unwind: thread map already set, dso=%s\n",
+ map->dso->name);
+ return 0;
+ }
+
+ /* env->arch is NULL for live-mode (i.e. perf top) */
+ if (!thread->mg->machine->env || !thread->mg->machine->env->arch)
+ goto out_register;
+
+ dso_type = dso__type(map->dso, thread->mg->machine);
+ if (dso_type == DSO__TYPE_UNKNOWN)
+ return 0;
+
+ arch = normalize_arch(thread->mg->machine->env->arch);
+ pr_debug("unwind: target platform=%s\n", arch);
+out_register:
unwind__register_ops(thread, local_unwind_libunwind_ops);
return thread->unwind_libunwind_ops->prepare_access(thread);