From patchwork Thu Oct 26 11:40:18 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Kolesov X-Patchwork-Id: 23847 Received: (qmail 21819 invoked by alias); 26 Oct 2017 11:40:43 -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 21765 invoked by uid 89); 26 Oct 2017 11:40:43 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-23.9 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, DOCTYPE, !DOCTYPE X-HELO: smtprelay.synopsys.com Received: from smtprelay2.synopsys.com (HELO smtprelay.synopsys.com) (198.182.60.111) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 26 Oct 2017 11:40:35 +0000 Received: from mailhost.synopsys.com (mailhost2.synopsys.com [10.13.184.66]) by smtprelay.synopsys.com (Postfix) with ESMTP id 34B1810C13AC for ; Thu, 26 Oct 2017 04:40:34 -0700 (PDT) Received: from mailhost.synopsys.com (localhost [127.0.0.1]) by mailhost.synopsys.com (Postfix) with ESMTP id 1C251613; Thu, 26 Oct 2017 04:40:34 -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 21C46604; Thu, 26 Oct 2017 04:40:32 -0700 (PDT) From: Anton Kolesov To: gdb-patches@sourceware.org Cc: Anton Kolesov , Francois Bedard Subject: [PATCH v2 2/4] arc: Add XML target features for Linux targets Date: Thu, 26 Oct 2017 14:40:18 +0300 Message-Id: <20171026114020.10213-2-Anton.Kolesov@synopsys.com> In-Reply-To: <20171026114020.10213-1-Anton.Kolesov@synopsys.com> References: <20171026114020.10213-1-Anton.Kolesov@synopsys.com> In-Reply-To: <20171012012859.GJ8425@1170ee0b50d5> References: <20171012012859.GJ8425@1170ee0b50d5> Add XML target features for Linux targets. Compared to default Linux features: - Explicitly specify CPU machine. - Remove baremetal only ILINK{,1,2} registers. - Add LP_START and LP_END registers for hardware loops - required to properly evaluate possible next instruction during software single instruction stepping. - Add BTA register which contains branch target address - address of next instruction when processor is in the delay slot. - ARC HS description also adds R30, R58 and R59 registers, specific to this architecture. gdb/ChangeLog: yyyy-mm-dd Anton Kolesov * arch/arc.h (arc_create_target_description): Support Linux targets. * arch/arc.c (arc_create_target_description): Likewise. * arc-tdep.c (arc_tdesc_init): Update invocation of arc_create_target_description. * features/Makefile (FEATURE_XMLFILES): Add new files. * features/arc/aux-arcompact-linux.xml: New file. * features/arc/aux-v2-linux.xml: Likewise. * features/arc/core-arcompact-linux.xml: Likewise. * features/arc/core-v2-linux.xml: Likewise. * features/arc/aux-arcompact-linux.c: Generate. * features/arc/aux-v2-linux.c: Likewise. * features/arc/core-arcompact-linux.c: Likewise. * features/arc/core-v2-linux.c: Likewise. --- gdb/arc-tdep.c | 2 +- gdb/arch/arc.c | 42 +++++++++++++++++----- gdb/arch/arc.h | 3 +- gdb/features/Makefile | 4 +++ gdb/features/arc/aux-arcompact-linux.c | 35 +++++++++++++++++++ gdb/features/arc/aux-arcompact-linux.xml | 31 +++++++++++++++++ gdb/features/arc/aux-v2-linux.c | 39 +++++++++++++++++++++ gdb/features/arc/aux-v2-linux.xml | 35 +++++++++++++++++++ gdb/features/arc/core-arcompact-linux.c | 45 ++++++++++++++++++++++++ gdb/features/arc/core-arcompact-linux.xml | 56 +++++++++++++++++++++++++++++ gdb/features/arc/core-v2-linux.c | 48 +++++++++++++++++++++++++ gdb/features/arc/core-v2-linux.xml | 58 +++++++++++++++++++++++++++++++ 12 files changed, 388 insertions(+), 10 deletions(-) create mode 100644 gdb/features/arc/aux-arcompact-linux.c create mode 100644 gdb/features/arc/aux-arcompact-linux.xml create mode 100644 gdb/features/arc/aux-v2-linux.c create mode 100644 gdb/features/arc/aux-v2-linux.xml create mode 100644 gdb/features/arc/core-arcompact-linux.c create mode 100644 gdb/features/arc/core-arcompact-linux.xml create mode 100644 gdb/features/arc/core-v2-linux.c create mode 100644 gdb/features/arc/core-v2-linux.xml diff --git a/gdb/arc-tdep.c b/gdb/arc-tdep.c index 6ed30da..2782535 100644 --- a/gdb/arc-tdep.c +++ b/gdb/arc-tdep.c @@ -1792,7 +1792,7 @@ arc_tdesc_init (struct gdbarch_info info, const struct target_desc **tdesc, /* If target doesn't provide a description - use default one. */ if (!tdesc_has_registers (tdesc_loc)) { - tdesc_loc = arc_create_target_description (arc_debug, is_arcv2); + tdesc_loc = arc_create_target_description (arc_debug, is_arcv2, false); } else { diff --git a/gdb/arch/arc.c b/gdb/arch/arc.c index 8f0d8d6..f0da408 100644 --- a/gdb/arch/arc.c +++ b/gdb/arch/arc.c @@ -24,46 +24,72 @@ /* Target description features. */ #include "features/arc/core-v2.c" #include "features/arc/aux-v2.c" +#include "features/arc/core-v2-linux.c" +#include "features/arc/aux-v2-linux.c" #include "features/arc/core-arcompact.c" #include "features/arc/aux-arcompact.c" +#include "features/arc/core-arcompact-linux.c" +#include "features/arc/aux-arcompact-linux.c" /* Create target description for a target with specified parameters. PRINT_DEBUG defines whether to print debug messages to the stderr stream. IS_ARCV2 defines if this is an ARCv2 (ARC EM or ARC HS) target or ARCompact (ARC600 or ARC700); there is no use for more specific information about - target processor. */ + target processor. IS_LINUX defines if this is a Linux target or not. */ target_desc * -arc_create_target_description (bool print_debug, bool is_arcv2) +arc_create_target_description (bool print_debug, bool is_arcv2, bool is_linux) { target_desc *tdesc = allocate_target_description (); if (print_debug) debug_printf ("arc: Creating target description, " - "is_arcv2=%i\n", is_arcv2); + "is_arcv2=%i, is_linux=%i\n", is_arcv2, is_linux); long regnum = 0; #ifndef IN_PROCESS_AGENT if (is_arcv2) { - set_tdesc_architecture (tdesc, "arc:ARCv2"); + if (is_linux) + /* If this is ARCv2 Linux, then it is ARC HS. */ + set_tdesc_architecture (tdesc, "arc:HS"); + else + set_tdesc_architecture (tdesc, "arc:ARCv2"); } else { set_tdesc_architecture (tdesc, "arc:ARC700"); } + if (is_linux) + set_tdesc_osabi (tdesc, "GNU/Linux"); #endif if (is_arcv2) { - regnum = create_feature_arc_core_v2 (tdesc, regnum); - regnum = create_feature_arc_aux_v2 (tdesc, regnum); + if (is_linux) + { + regnum = create_feature_arc_core_v2_linux (tdesc, regnum); + regnum = create_feature_arc_aux_v2_linux (tdesc, regnum); + } + else + { + regnum = create_feature_arc_core_v2 (tdesc, regnum); + regnum = create_feature_arc_aux_v2 (tdesc, regnum); + } } else { - regnum = create_feature_arc_core_arcompact (tdesc, regnum); - regnum = create_feature_arc_aux_arcompact (tdesc, regnum); + if (is_linux) + { + regnum = create_feature_arc_core_arcompact_linux (tdesc, regnum); + regnum = create_feature_arc_aux_arcompact_linux (tdesc, regnum); + } + else + { + regnum = create_feature_arc_core_arcompact (tdesc, regnum); + regnum = create_feature_arc_aux_arcompact (tdesc, regnum); + } } return tdesc; diff --git a/gdb/arch/arc.h b/gdb/arch/arc.h index 2d1828e..70b5b52 100644 --- a/gdb/arch/arc.h +++ b/gdb/arch/arc.h @@ -17,5 +17,6 @@ #include "tdesc.h" -target_desc *arc_create_target_description (bool print_debug, bool is_arcv2); +target_desc *arc_create_target_description (bool print_debug, bool is_arcv2, + bool is_linux); diff --git a/gdb/features/Makefile b/gdb/features/Makefile index e30a8bd..f12e0ff 100644 --- a/gdb/features/Makefile +++ b/gdb/features/Makefile @@ -208,8 +208,12 @@ $(outdir)/%.dat: %.xml number-regs.xsl sort-regs.xsl gdbserver-regs.xsl FEATURE_XMLFILES = \ arc/core-v2.xml \ arc/aux-v2.xml \ + arc/core-v2-linux.xml \ + arc/aux-v2-linux.xml \ arc/core-arcompact.xml \ arc/aux-arcompact.xml \ + arc/core-arcompact-linux.xml \ + arc/aux-arcompact-linux.xml \ i386/32bit-core.xml \ i386/32bit-sse.xml \ i386/32bit-linux.xml \ diff --git a/gdb/features/arc/aux-arcompact-linux.c b/gdb/features/arc/aux-arcompact-linux.c new file mode 100644 index 0000000..998929e --- /dev/null +++ b/gdb/features/arc/aux-arcompact-linux.c @@ -0,0 +1,35 @@ +/* THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi:set ro: + Original: aux-arcompact-linux.xml */ + +#include "arch/tdesc.h" + +static int +create_feature_arc_aux_arcompact_linux (struct target_desc *result, long regnum) +{ + struct tdesc_feature *feature; + + feature = tdesc_create_feature (result, "org.gnu.gdb.arc.aux-minimal", "aux-arcompact-linux.xml"); + struct tdesc_type *field_type; + struct tdesc_type *type; + type = tdesc_create_flags (feature, "status32_type", 4); + tdesc_add_flag (type, 0, "H"); + tdesc_add_bitfield (type, "E", 1, 2); + tdesc_add_bitfield (type, "A", 3, 4); + tdesc_add_flag (type, 5, "AE"); + tdesc_add_flag (type, 6, "DE"); + tdesc_add_flag (type, 7, "U"); + tdesc_add_flag (type, 8, "V"); + tdesc_add_flag (type, 9, "C"); + tdesc_add_flag (type, 10, "N"); + tdesc_add_flag (type, 11, "Z"); + tdesc_add_flag (type, 12, "L"); + tdesc_add_flag (type, 13, "R"); + tdesc_add_flag (type, 14, "SE"); + + tdesc_create_reg (feature, "pc", regnum++, 1, NULL, 32, "code_ptr"); + tdesc_create_reg (feature, "status32", regnum++, 1, NULL, 32, "status32_type"); + tdesc_create_reg (feature, "lp_start", regnum++, 1, NULL, 32, "code_ptr"); + tdesc_create_reg (feature, "lp_end", regnum++, 1, NULL, 32, "code_ptr"); + tdesc_create_reg (feature, "bta", regnum++, 1, NULL, 32, "code_ptr"); + return regnum; +} diff --git a/gdb/features/arc/aux-arcompact-linux.xml b/gdb/features/arc/aux-arcompact-linux.xml new file mode 100644 index 0000000..2dc0a67 --- /dev/null +++ b/gdb/features/arc/aux-arcompact-linux.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gdb/features/arc/aux-v2-linux.c b/gdb/features/arc/aux-v2-linux.c new file mode 100644 index 0000000..48b1550 --- /dev/null +++ b/gdb/features/arc/aux-v2-linux.c @@ -0,0 +1,39 @@ +/* THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi:set ro: + Original: aux-v2-linux.xml */ + +#include "arch/tdesc.h" + +static int +create_feature_arc_aux_v2_linux (struct target_desc *result, long regnum) +{ + struct tdesc_feature *feature; + + feature = tdesc_create_feature (result, "org.gnu.gdb.arc.aux-minimal", "aux-v2-linux.xml"); + struct tdesc_type *field_type; + struct tdesc_type *type; + type = tdesc_create_flags (feature, "status32_type", 4); + tdesc_add_flag (type, 0, "H"); + tdesc_add_bitfield (type, "E", 1, 4); + tdesc_add_flag (type, 5, "AE"); + tdesc_add_flag (type, 6, "DE"); + tdesc_add_flag (type, 7, "U"); + tdesc_add_flag (type, 8, "V"); + tdesc_add_flag (type, 9, "C"); + tdesc_add_flag (type, 10, "N"); + tdesc_add_flag (type, 11, "Z"); + tdesc_add_flag (type, 12, "L"); + tdesc_add_flag (type, 13, "DZ"); + tdesc_add_flag (type, 14, "SC"); + tdesc_add_flag (type, 15, "ES"); + tdesc_add_bitfield (type, "RB", 16, 18); + tdesc_add_flag (type, 19, "AD"); + tdesc_add_flag (type, 20, "US"); + tdesc_add_flag (type, 31, "IE"); + + tdesc_create_reg (feature, "pc", regnum++, 1, NULL, 32, "code_ptr"); + tdesc_create_reg (feature, "status32", regnum++, 1, NULL, 32, "status32_type"); + tdesc_create_reg (feature, "lp_start", regnum++, 1, NULL, 32, "code_ptr"); + tdesc_create_reg (feature, "lp_end", regnum++, 1, NULL, 32, "code_ptr"); + tdesc_create_reg (feature, "bta", regnum++, 1, NULL, 32, "code_ptr"); + return regnum; +} diff --git a/gdb/features/arc/aux-v2-linux.xml b/gdb/features/arc/aux-v2-linux.xml new file mode 100644 index 0000000..d85b577 --- /dev/null +++ b/gdb/features/arc/aux-v2-linux.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gdb/features/arc/core-arcompact-linux.c b/gdb/features/arc/core-arcompact-linux.c new file mode 100644 index 0000000..9ccefe3 --- /dev/null +++ b/gdb/features/arc/core-arcompact-linux.c @@ -0,0 +1,45 @@ +/* THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi:set ro: + Original: core-arcompact-linux.xml */ + +#include "arch/tdesc.h" + +static int +create_feature_arc_core_arcompact_linux (struct target_desc *result, long regnum) +{ + struct tdesc_feature *feature; + + feature = tdesc_create_feature (result, "org.gnu.gdb.arc.core.arcompact", "core-arcompact-linux.xml"); + tdesc_create_reg (feature, "r0", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r1", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r2", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r3", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r4", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r5", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r6", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r7", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r8", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r9", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r10", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r11", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r12", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r13", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r14", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r15", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r16", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r17", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r18", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r19", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r20", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r21", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r22", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r23", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r24", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r25", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "gp", regnum++, 1, NULL, 32, "data_ptr"); + tdesc_create_reg (feature, "fp", regnum++, 1, NULL, 32, "data_ptr"); + tdesc_create_reg (feature, "sp", regnum++, 1, NULL, 32, "data_ptr"); + tdesc_create_reg (feature, "blink", regnum++, 1, NULL, 32, "code_ptr"); + tdesc_create_reg (feature, "lp_count", regnum++, 1, NULL, 32, "uint32"); + tdesc_create_reg (feature, "pcl", regnum++, 1, "", 32, "code_ptr"); + return regnum; +} diff --git a/gdb/features/arc/core-arcompact-linux.xml b/gdb/features/arc/core-arcompact-linux.xml new file mode 100644 index 0000000..53183a3 --- /dev/null +++ b/gdb/features/arc/core-arcompact-linux.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gdb/features/arc/core-v2-linux.c b/gdb/features/arc/core-v2-linux.c new file mode 100644 index 0000000..780986b --- /dev/null +++ b/gdb/features/arc/core-v2-linux.c @@ -0,0 +1,48 @@ +/* THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi:set ro: + Original: core-v2-linux.xml */ + +#include "arch/tdesc.h" + +static int +create_feature_arc_core_v2_linux (struct target_desc *result, long regnum) +{ + struct tdesc_feature *feature; + + feature = tdesc_create_feature (result, "org.gnu.gdb.arc.core.v2", "core-v2-linux.xml"); + tdesc_create_reg (feature, "r0", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r1", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r2", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r3", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r4", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r5", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r6", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r7", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r8", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r9", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r10", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r11", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r12", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r13", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r14", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r15", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r16", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r17", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r18", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r19", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r20", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r21", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r22", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r23", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r24", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r25", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "gp", regnum++, 1, NULL, 32, "data_ptr"); + tdesc_create_reg (feature, "fp", regnum++, 1, NULL, 32, "data_ptr"); + tdesc_create_reg (feature, "sp", regnum++, 1, NULL, 32, "data_ptr"); + tdesc_create_reg (feature, "r30", regnum++, 1, "", 32, "int"); + tdesc_create_reg (feature, "blink", regnum++, 1, NULL, 32, "code_ptr"); + tdesc_create_reg (feature, "r58", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r59", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "lp_count", regnum++, 1, NULL, 32, "uint32"); + tdesc_create_reg (feature, "pcl", regnum++, 1, "", 32, "code_ptr"); + return regnum; +} diff --git a/gdb/features/arc/core-v2-linux.xml b/gdb/features/arc/core-v2-linux.xml new file mode 100644 index 0000000..c400874 --- /dev/null +++ b/gdb/features/arc/core-v2-linux.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +