From patchwork Tue Oct 10 19:22:11 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Kolesov X-Patchwork-Id: 23462 Received: (qmail 89827 invoked by alias); 10 Oct 2017 19:22:20 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 89815 invoked by uid 89); 10 Oct 2017 19:22:19 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-24.0 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_LAZY_DOMAIN_SECURITY, RCVD_IN_DNSWL_NONE, RP_MATCHES_RCVD autolearn=ham version=3.3.2 spammy=!doctype, doctype, UD:xml, anton X-HELO: smtprelay.synopsys.com Received: from smtprelay4.synopsys.com (HELO smtprelay.synopsys.com) (198.182.47.9) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 10 Oct 2017 19:22:17 +0000 Received: from mailhost.synopsys.com (mailhost2.synopsys.com [10.13.184.66]) by smtprelay.synopsys.com (Postfix) with ESMTP id D544424E0C31 for ; Tue, 10 Oct 2017 12:22:15 -0700 (PDT) Received: from mailhost.synopsys.com (localhost [127.0.0.1]) by mailhost.synopsys.com (Postfix) with ESMTP id BED639BD; Tue, 10 Oct 2017 12:22:15 -0700 (PDT) Received: from akolesov-lab.internal.synopsys.com (akolesov-lab.internal.synopsys.com [10.121.14.106]) by mailhost.synopsys.com (Postfix) with ESMTP id 7B6F89AB; Tue, 10 Oct 2017 12:22:14 -0700 (PDT) From: Anton Kolesov To: gdb-patches@sourceware.org Cc: Anton Kolesov , Francois Bedard Subject: [PATCH] arc: Pass proper CPU value to disassembler Date: Tue, 10 Oct 2017 22:22:11 +0300 Message-Id: <20171010192211.28047-1-Anton.Kolesov@synopsys.com> There was a problem with generation of disassembler options for ARC in GDB, because a BFD architecture name was used as a CPU name, but they have different meaning even if some architectures have same name as respective CPUs. Target description specifies a BFD architecture, which is different from ARC CPU, as accepted by disassembler (and most other ARC tools), because CPU values are much more fine grained - there can be multiple CPU values per single BFD architecture. As a result this code should translate architecture to some CPU value. Since there is no info on exact CPU configuration, it is best to use the most feature-rich CPU, so that disassembler will recognize all instructions available to the specified architecture. gdb/ChangeLog yyyy-mm-dd Anton Kolesov * arc-tdep.c (arc_gdbarch_init): Pass proper cpu value to disassembler. * arc-tdep.h (arc_arch_is_em): New function. (arc_arch_is_hs): Likewise. gdb/testsuite/ChangeLog yyyy-mm-dd Anton Kolesov * arc-tdesc-cpu.exp: New file. * arc-tdesc-cpu.xml: Likewise. --- gdb/arc-tdep.c | 34 ++++++++++++++++++-- gdb/arc-tdep.h | 15 +++++++++ gdb/testsuite/gdb.arch/arc-tdesc-cpu.exp | 47 ++++++++++++++++++++++++++++ gdb/testsuite/gdb.arch/arc-tdesc-cpu.xml | 53 ++++++++++++++++++++++++++++++++ 4 files changed, 147 insertions(+), 2 deletions(-) create mode 100644 gdb/testsuite/gdb.arch/arc-tdesc-cpu.exp create mode 100644 gdb/testsuite/gdb.arch/arc-tdesc-cpu.xml diff --git a/gdb/arc-tdep.c b/gdb/arc-tdep.c index 1d05c5a..d238ab7 100644 --- a/gdb/arc-tdep.c +++ b/gdb/arc-tdep.c @@ -2085,8 +2085,38 @@ arc_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) existing gdbarches, which also can be problematic, if arc_gdbarch_init will start reusing existing gdbarch instances. */ - arc_disassembler_options = xstrprintf ("cpu=%s", - tdesc_arch->printable_name); + /* Target description specifies a BFD architecture, which is + different from ARC cpu, as accepted by disassembler (and most + other ARC tools), because cpu values are much more fine grained - + there can be multiple cpu values per single BFD architecture. As + a result this code should translate architecture to some cpu + value. Since there is no info on exact cpu configuration, it is + best to use the most feature-rich CPU, so that disassembler will + recognize all instructions available to the specified + architecture. */ + switch (tdesc_arch->mach) + { + case bfd_mach_arc_arc601: + arc_disassembler_options = xstrdup ("cpu=arc601"); + break; + case bfd_mach_arc_arc600: + arc_disassembler_options = xstrdup ("cpu=arc600"); + break; + case bfd_mach_arc_arc700: + arc_disassembler_options = xstrdup ("cpu=arc700"); + break; + case bfd_mach_arc_arcv2: + /* Machine arcv2 has three arches: ARCv2, EM and HS; where ARCv2 + is treated as EM. */ + if (arc_arch_is_hs (tdesc_arch)) + arc_disassembler_options = xstrdup ("cpu=hs38_linux"); + else + arc_disassembler_options = xstrdup ("cpu=em4_fpuda"); + break; + default: + arc_disassembler_options = NULL; + break; + } set_gdbarch_disassembler_options (gdbarch, &arc_disassembler_options); } diff --git a/gdb/arc-tdep.h b/gdb/arc-tdep.h index 1bf1817..07c76b6 100644 --- a/gdb/arc-tdep.h +++ b/gdb/arc-tdep.h @@ -123,6 +123,21 @@ arc_mach_is_arcv2 (struct gdbarch *gdbarch) return gdbarch_bfd_arch_info (gdbarch)->mach == bfd_mach_arc_arcv2; } +/* ARC EM and ARC HS are unique BFD arches, however they share the same machine + number as "ARCv2". */ + +static inline bool +arc_arch_is_hs (const struct bfd_arch_info* arch) +{ + return CONST_STRNEQ (arch->printable_name, "HS"); +} + +static inline bool +arc_arch_is_em (const struct bfd_arch_info* arch) +{ + return CONST_STRNEQ (arch->printable_name, "EM"); +} + /* Function to access ARC disassembler. Underlying opcodes disassembler will print an instruction into stream specified in the INFO, so if it is undesired, then this stream should be set to some invisible stream, but it diff --git a/gdb/testsuite/gdb.arch/arc-tdesc-cpu.exp b/gdb/testsuite/gdb.arch/arc-tdesc-cpu.exp new file mode 100644 index 0000000..5246427 --- /dev/null +++ b/gdb/testsuite/gdb.arch/arc-tdesc-cpu.exp @@ -0,0 +1,47 @@ +# Copyright 2017 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +if {[gdb_skip_xml_test]} { + unsupported "arc-tdesc-cpu.exp" + return -1 +} + +gdb_start + +# Test whether it ok to have `arc:HS` in target description architecture. +# `HS` is a valid BFD architecture name, however disassembler doesn't accept +# it as a CPU name. This test checks that GDB doesn't pass architecture from +# target description directly to disassembler and instead uses one of the +# valid CPU names. + +set filename $srcdir/$subdir/arc-tdesc-cpu.xml + +set cmd "set tdesc filename $filename" +gdb_test $cmd + +# Error message is emitted by disassembler, therefore it is not shown unless +# disassembler is actually invoked. Address "0" is not invalid, but that +# doesn't matter for this test case, because it is only disassembler error +# message that is interesting. +set cmd "x /i 0" +set msg "setting HS architecture" +gdb_test_multiple $cmd $msg { + -re "Unrecognised disassembler CPU option: HS" { + fail $msg + } + -re "\r\n$gdb_prompt" { + pass $msg + } +} diff --git a/gdb/testsuite/gdb.arch/arc-tdesc-cpu.xml b/gdb/testsuite/gdb.arch/arc-tdesc-cpu.xml new file mode 100644 index 0000000..fe158ae --- /dev/null +++ b/gdb/testsuite/gdb.arch/arc-tdesc-cpu.xml @@ -0,0 +1,53 @@ + + + + + + arc:HS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +