From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752771AbcELIqc (ORCPT ); Thu, 12 May 2016 04:46:32 -0400 Received: from szxga05-in.huawei.com ([58.251.152.179]:34071 "EHLO szxga05-in.huawei.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1752396AbcELIoQ (ORCPT ); Thu, 12 May 2016 04:44:16 -0400 From: He Kuang To: , , , , , , , , , , , , , , , , , CC: Subject: [PATCH v3 4/7] perf tools: Promote proper messages for cross-platform unwind Date: Thu, 12 May 2016 08:43:13 +0000 Message-ID: <1463042596-61703-5-git-send-email-hekuang@huawei.com> X-Mailer: git-send-email 1.8.3.4 In-Reply-To: <1463042596-61703-1-git-send-email-hekuang@huawei.com> References: <1463042596-61703-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.0A020202.57344256.002F,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: ee2949b50e944c7344389cd1234c58f5 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 | 33 +++++++++++++++++++++++++++++++++ tools/perf/util/unwind.h | 5 +++++ 4 files changed, 46 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..d464c35 100644 --- a/tools/perf/util/unwind-libunwind.c +++ b/tools/perf/util/unwind-libunwind.c @@ -680,3 +680,36 @@ 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; + enum dso_type dso_type; + + if (!thread->mg->machine->env) + return; + + dso_type = dso__type(map->dso, thread->mg->machine); + if (dso_type == DSO__TYPE_UNKNOWN) + return; + + if (thread->addr_space) + pr_debug("Thread map already set, 64bit is %d, dso=%s\n", + dso_type == DSO__TYPE_64BIT, 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", + dso_type == DSO__TYPE_64BIT); + if (dso_type != DSO__TYPE_64BIT) +#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