From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752517AbcEJHl3 (ORCPT ); Tue, 10 May 2016 03:41:29 -0400 Received: from szxga04-in.huawei.com ([58.251.152.52]:1367 "EHLO szxga04-in.huawei.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1752446AbcEJHlX (ORCPT ); Tue, 10 May 2016 03:41:23 -0400 From: He Kuang To: , , , , , , , , , , , , , , , , , CC: Subject: [PATCH v2 6/9] perf tools: Promote proper messages for cross-platform unwind Date: Tue, 10 May 2016 07:40:34 +0000 Message-ID: <1462866037-30382-7-git-send-email-hekuang@huawei.com> X-Mailer: git-send-email 1.8.3.4 In-Reply-To: <1462866037-30382-1-git-send-email-hekuang@huawei.com> References: <1462866037-30382-1-git-send-email-hekuang@huawei.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.107.193.250] X-CFilter-Loop: Reflected X-Mirapoint-Virus-RAPID-Raw: score=unknown(0), refid=str=0001.0A020201.57319088.00E7,ss=1,re=0.000,recu=0.000,reip=0.000,cl=1,cld=1,fgs=0, ip=0.0.0.0, so=2014-11-16 11:51:01, dmn=2013-03-21 17:37:32 X-Mirapoint-Loop-Id: 831ecbadd31ee3cf9c8db729f4da4802 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Currently, perf script uses host unwind methods to parse perf.data callchain info regardless of the target architecture. So we get wrong result and no promotion when unwinding callchains of x86(32-bit) on x86(64-bit) machine. This patch shows proper error messages when we do remote unwind x86(32-bit) on other machines. Same thing for other platforms will be added in next patches. Signed-off-by: He Kuang --- tools/perf/config/Makefile | 6 ++++++ tools/perf/util/thread.c | 2 ++ tools/perf/util/unwind-libunwind.c | 32 ++++++++++++++++++++++++++++++++ tools/perf/util/unwind.h | 5 +++++ 4 files changed, 45 insertions(+) diff --git a/tools/perf/config/Makefile b/tools/perf/config/Makefile index 1e46277..a86b864 100644 --- a/tools/perf/config/Makefile +++ b/tools/perf/config/Makefile @@ -345,6 +345,12 @@ ifeq ($(ARCH),powerpc) endif ifndef NO_LIBUNWIND + ifeq ($(feature-libunwind-x86), 1) + LIBUNWIND_LIBS += -lunwind-x86 + $(call detected,CONFIG_LIBUNWIND_X86) + CFLAGS += -DHAVE_LIBUNWIND_X86_SUPPORT + endif + ifneq ($(feature-libunwind), 1) msg := $(warning No libunwind found. Please install libunwind-dev[el] >= 1.1 and/or set LIBUNWIND_DIR); NO_LIBUNWIND := 1 diff --git a/tools/perf/util/thread.c b/tools/perf/util/thread.c index dfd00c6..244c4f6 100644 --- a/tools/perf/util/thread.c +++ b/tools/perf/util/thread.c @@ -186,6 +186,8 @@ void thread__insert_map(struct thread *thread, struct map *map) { map_groups__fixup_overlappings(thread->mg, map, stderr); map_groups__insert(thread->mg, map); + + unwind__get_arch(thread, map); } static int thread__clone_map_groups(struct thread *thread, diff --git a/tools/perf/util/unwind-libunwind.c b/tools/perf/util/unwind-libunwind.c index 63687d3..b6eb317 100644 --- a/tools/perf/util/unwind-libunwind.c +++ b/tools/perf/util/unwind-libunwind.c @@ -680,3 +680,35 @@ int unwind__get_entries(unwind_entry_cb_t cb, void *arg, return get_entries(&ui, cb, arg, max_stack); } + +void unwind__get_arch(struct thread *thread, struct map *map) +{ + char *arch; + int is_64_bit; + + if (!thread->mg->machine->env) + return; + + is_64_bit = dso_is_64_bit(map->dso, map); + if (is_64_bit < 0) + return; + + if (thread->addr_space) + pr_debug("Thread map already set, 64bit is %d, dso=%s\n", + is_64_bit, map->dso->name); + + arch = thread->mg->machine->env->arch; + + if (!strcmp(arch, "x86_64") + || !strcmp(arch, "x86") + || !strcmp(arch, "i686")) { + pr_debug("Thread map is X86, 64bit is %d\n", is_64_bit); + if (!is_64_bit) +#ifdef HAVE_LIBUNWIND_X86_SUPPORT + pr_err("target platform=%s is not implemented!\n", + arch); +#else + pr_err("target platform=%s is not supported!\n", arch); +#endif + } +} diff --git a/tools/perf/util/unwind.h b/tools/perf/util/unwind.h index 12790cf..889d630 100644 --- a/tools/perf/util/unwind.h +++ b/tools/perf/util/unwind.h @@ -24,6 +24,7 @@ int libunwind__arch_reg_id(int regnum); int unwind__prepare_access(struct thread *thread); void unwind__flush_access(struct thread *thread); void unwind__finish_access(struct thread *thread); +void unwind__get_arch(struct thread *thread, struct map *map); #else static inline int unwind__prepare_access(struct thread *thread __maybe_unused) { @@ -32,6 +33,8 @@ static inline int unwind__prepare_access(struct thread *thread __maybe_unused) static inline void unwind__flush_access(struct thread *thread __maybe_unused) {} static inline void unwind__finish_access(struct thread *thread __maybe_unused) {} +static inline void unwind__get_arch(struct thread *thread __maybe_unused, + struct map *map __maybe_unused) {} #endif #else static inline int @@ -51,5 +54,7 @@ static inline int unwind__prepare_access(struct thread *thread __maybe_unused) static inline void unwind__flush_access(struct thread *thread __maybe_unused) {} static inline void unwind__finish_access(struct thread *thread __maybe_unused) {} +static inline void unwind__get_arch(struct thread *thread __maybe_unused, + struct map *map __maybe_unused) {} #endif /* HAVE_DWARF_UNWIND_SUPPORT */ #endif /* __UNWIND_H */ -- 1.8.5.2