public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
* [PATCH] arc: Migrate to new target features
@ 2020-03-05 16:06 Shahab Vahedi
  2020-03-05 23:06 ` Simon Marchi
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Shahab Vahedi @ 2020-03-05 16:06 UTC (permalink / raw)
  To: gdb-patches
  Cc: Shahab Vahedi, Shahab Vahedi, Anton Kolesov, Francois Bedard,
	Anton Kolesov

From: Anton Kolesov <Anton.Kolesov@synopsys.com>

This patch replaces usage of target descriptions in ARC, where the whole
description is fixed in XML, with new target descriptions where XML describes
individual features, and GDB assembles those features into actual target
description.

gdb/ChangeLog:
2017-10-25  Anton Kolesov  <Anton.Kolesov@synopsys.com>
	    Shahab Vahedi  <shahab@synopsys.com>

	* Makefile.in: Add arch/arc.o
	* configure.tgt: Likewise.
	* arc-tdep.h: Change type of "jb_pc" to CORE_ADDR.
	* arc-tdep.c (arc_tdesc_init): Use arc_create_target_description.
	(_initialize_arc_tdep): Don't initialize old target descriptions.
	(arc_dump_tdep): Use "%li" to print "jb_pc".
	* arch/arc.c: New file.
	* arch/arc.h: Likewise.
	* features/Makefile: Replace old target descriptions with new.
	* features/arc-arcompact.c: Remove.
	* features/arc-arcompact.xml: Likewise.
	* features/arc-v2.c: Likewise
	* features/arc-v2.xml: Likewise
	* features/arc/aux-arcompact.xml: New file.
	* features/arc/aux-v2.xml: Likewise.
	* features/arc/core-arcompact.xml: Likewise.
	* features/arc/core-v2.xml: Likewise.
	* features/arc/aux-arcompact.c: Generate.
	* features/arc/aux-v2.c: Likewise.
	* features/arc/core-arcompact.c: Likewise.
	* features/arc/core-v2.c: Likewise.
	* target-descriptions (maint_print_c_tdesc_cmd): Support ARC features.
---
 gdb/Makefile.in                     |  3 +
 gdb/arc-tdep.c                      | 27 +++------
 gdb/arc-tdep.h                      |  2 +-
 gdb/arch/arc.c                      | 70 ++++++++++++++++++++++
 gdb/arch/arc.h                      | 20 +++++++
 gdb/configure.tgt                   |  2 +-
 gdb/features/Makefile               | 25 ++++----
 gdb/features/arc-arcompact.c        | 74 -----------------------
 gdb/features/arc-arcompact.xml      | 85 --------------------------
 gdb/features/arc-v2.c               | 78 ------------------------
 gdb/features/arc-v2.xml             | 92 -----------------------------
 gdb/features/arc/aux-arcompact.c    | 31 ++++++++++
 gdb/features/arc/aux-arcompact.xml  | 28 +++++++++
 gdb/features/arc/aux-v2.c           | 35 +++++++++++
 gdb/features/arc/aux-v2.xml         | 32 ++++++++++
 gdb/features/arc/core-arcompact.c   | 47 +++++++++++++++
 gdb/features/arc/core-arcompact.xml | 58 ++++++++++++++++++
 gdb/features/arc/core-v2.c          | 47 +++++++++++++++
 gdb/features/arc/core-v2.xml        | 61 +++++++++++++++++++
 gdb/target-descriptions.c           |  4 +-
 20 files changed, 457 insertions(+), 364 deletions(-)
 create mode 100644 gdb/arch/arc.c
 create mode 100644 gdb/arch/arc.h
 delete mode 100644 gdb/features/arc-arcompact.c
 delete mode 100644 gdb/features/arc-arcompact.xml
 delete mode 100644 gdb/features/arc-v2.c
 delete mode 100644 gdb/features/arc-v2.xml
 create mode 100644 gdb/features/arc/aux-arcompact.c
 create mode 100644 gdb/features/arc/aux-arcompact.xml
 create mode 100644 gdb/features/arc/aux-v2.c
 create mode 100644 gdb/features/arc/aux-v2.xml
 create mode 100644 gdb/features/arc/core-arcompact.c
 create mode 100644 gdb/features/arc/core-arcompact.xml
 create mode 100644 gdb/features/arc/core-v2.c
 create mode 100644 gdb/features/arc/core-v2.xml

diff --git a/gdb/Makefile.in b/gdb/Makefile.in
index 7c0a0aefbc2..7dbadd4e119 100644
--- a/gdb/Makefile.in
+++ b/gdb/Makefile.in
@@ -694,6 +694,7 @@ ALL_TARGET_OBS = \
 	aarch32-tdep.o \
 	arc-tdep.o \
 	arch/aarch32.o \
+	arch/arc.o \
 	arch/arm.o \
 	arch/arm-get-next-pcs.o \
 	arch/arm-linux.o \
@@ -1438,6 +1439,7 @@ HFILES_NO_SRCDIR = \
 	arch/aarch32.h \
 	arch/aarch64.h \
 	arch/aarch64-insn.h \
+	arch/arc.h \
 	arch/arm.h \
 	arch/i386.h \
 	arch/ppc-linux-common.h \
@@ -2119,6 +2121,7 @@ ALLDEPFILES = \
 	amd64-obsd-tdep.c \
 	amd64-sol2-tdep.c \
 	amd64-tdep.c \
+	arc.c \
 	arc-tdep.c \
 	arm.c \
 	arm-bsd-tdep.c \
diff --git a/gdb/arc-tdep.c b/gdb/arc-tdep.c
index ac98f03efc1..4d840aa9342 100644
--- a/gdb/arc-tdep.c
+++ b/gdb/arc-tdep.c
@@ -28,21 +28,20 @@
 #include "gdbcore.h"
 #include "gdbcmd.h"
 #include "objfiles.h"
+#include "osabi.h"
 #include "prologue-value.h"
+#include "target-descriptions.h"
 #include "trad-frame.h"
 
 /* ARC header files.  */
 #include "opcode/arc.h"
 #include "opcodes/arc-dis.h"
 #include "arc-tdep.h"
+#include "arch/arc.h"
 
 /* Standard headers.  */
 #include <algorithm>
 
-/* Default target descriptions.  */
-#include "features/arc-v2.c"
-#include "features/arc-arcompact.c"
-
 /* The frame unwind cache for ARC.  */
 
 struct arc_frame_cache
@@ -1753,18 +1752,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))
     {
-      if (is_arcv2)
-	{
-	  tdesc_loc = tdesc_arc_v2;
-	  if (arc_debug)
-	    debug_printf ("arc: Using default register set for ARC v2.\n");
-	}
-      else
-	{
-	  tdesc_loc = tdesc_arc_arcompact;
-	  if (arc_debug)
-	    debug_printf ("arc: Using default register set for ARCompact.\n");
-	}
+      tdesc_loc = arc_create_target_description (arc_debug, is_arcv2);
     }
   else
     {
@@ -2114,7 +2102,7 @@ arc_dump_tdep (struct gdbarch *gdbarch, struct ui_file *file)
 {
   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
 
-  fprintf_unfiltered (file, "arc_dump_tdep: jb_pc = %i\n", tdep->jb_pc);
+  fprintf_unfiltered (file, "arc_dump_tdep: jb_pc = %li\n", tdep->jb_pc);
 }
 
 /* Wrapper for "maintenance print arc" list of commands.  */
@@ -2151,9 +2139,6 @@ _initialize_arc_tdep ()
 {
   gdbarch_register (bfd_arch_arc, arc_gdbarch_init, arc_dump_tdep);
 
-  initialize_tdesc_arc_v2 ();
-  initialize_tdesc_arc_arcompact ();
-
   /* Register ARC-specific commands with gdb.  */
 
   /* Add root prefix command for "maintenance print arc" commands.  */
@@ -2176,3 +2161,5 @@ _initialize_arc_tdep ()
 			    _("Non-zero enables ARC specific debugging."),
 			    NULL, NULL, &setdebuglist, &showdebuglist);
 }
+
+/* vim: set sts=2 shiftwidth=2 ts=8: */
diff --git a/gdb/arc-tdep.h b/gdb/arc-tdep.h
index bd0096741ff..3f2f5449722 100644
--- a/gdb/arc-tdep.h
+++ b/gdb/arc-tdep.h
@@ -99,7 +99,7 @@ struct gdbarch_tdep
 {
   /* Offset to PC value in jump buffer.  If this is negative, longjmp
      support will be disabled.  */
-  int jb_pc;
+  CORE_ADDR jb_pc;
 };
 
 /* Utility functions used by other ARC-specific modules.  */
diff --git a/gdb/arch/arc.c b/gdb/arch/arc.c
new file mode 100644
index 00000000000..effa6ec3d6f
--- /dev/null
+++ b/gdb/arch/arc.c
@@ -0,0 +1,70 @@
+/* Copyright (C) 2017-2020 Free Software Foundation, Inc.
+
+   This file is part of GDB.
+
+   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 <http://www.gnu.org/licenses/>.  */
+
+
+#include "gdbsupport/common-defs.h"
+#include <stdlib.h>
+
+#include "arc.h"
+
+/* Target description features.  */
+#include "features/arc/core-v2.c"
+#include "features/arc/aux-v2.c"
+#include "features/arc/core-arcompact.c"
+#include "features/arc/aux-arcompact.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_desc *
+arc_create_target_description (bool print_debug, bool is_arcv2)
+{
+  target_desc *tdesc = allocate_target_description ();
+
+  if (print_debug)
+    debug_printf ("arc: Creating target description, "
+	"is_arcv2=%i\n", is_arcv2);
+
+  long regnum = 0;
+
+#ifndef IN_PROCESS_AGENT
+  if (is_arcv2)
+    {
+      set_tdesc_architecture (tdesc, "arc:ARCv2");
+    }
+  else
+    {
+      set_tdesc_architecture (tdesc, "arc:ARC700");
+    }
+#endif
+
+  if (is_arcv2)
+    {
+      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);
+    }
+
+  return tdesc;
+}
diff --git a/gdb/arch/arc.h b/gdb/arch/arc.h
new file mode 100644
index 00000000000..dc7871c3103
--- /dev/null
+++ b/gdb/arch/arc.h
@@ -0,0 +1,20 @@
+/* Copyright (C) 2017-2020 Free Software Foundation, Inc.
+
+   This file is part of GDB.
+
+   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 <http://www.gnu.org/licenses/>.  */
+
+#include "gdbsupport/tdesc.h"
+
+target_desc *arc_create_target_description (bool print_debug, bool is_arcv2);
diff --git a/gdb/configure.tgt b/gdb/configure.tgt
index 755187dca65..9b77a2872ca 100644
--- a/gdb/configure.tgt
+++ b/gdb/configure.tgt
@@ -59,7 +59,7 @@ alpha*-*-*)
 
 arc*-*-*)
 	# Target: Unidentified ARC target
-	cpu_obs="arc-tdep.o"
+	cpu_obs="arc-tdep.o arch/arc.o"
 	;;
 
 arm*-*-*)
diff --git a/gdb/features/Makefile b/gdb/features/Makefile
index 9a98b0542c4..60be548780d 100644
--- a/gdb/features/Makefile
+++ b/gdb/features/Makefile
@@ -108,8 +108,14 @@ OUTPUTS = $(patsubst %,$(outdir)/%.dat,$(WHICH))
 # --enable-targets=all GDB.  You can override this by passing XMLTOC
 # to make on the command line.
 XMLTOC = \
-	arc-v2.xml \
-	arc-arcompact.xml \
+	aarch64.xml \
+	arm/arm-with-iwmmxt.xml \
+	arm/arm-with-m-fpa-layout.xml \
+	arm/arm-with-m-vfp-d16.xml \
+	arm/arm-with-m.xml \
+	arm/arm-with-neon.xml \
+	arm/arm-with-vfpv2.xml \
+	arm/arm-with-vfpv3.xml \
 	microblaze-with-stack-protect.xml \
 	microblaze.xml \
 	mips-dsp-linux.xml \
@@ -203,16 +209,11 @@ $(outdir)/%.dat: %.xml number-regs.xsl sort-regs.xsl gdbserver-regs.xsl
 
 # For targets with feature based target descriptions,
 # the set of xml files we'll generate .c files for GDB from.
-FEATURE_XMLFILES = aarch64-core.xml \
-	aarch64-fpu.xml \
-	aarch64-pauth.xml \
-	arm/arm-core.xml \
-	arm/arm-fpa.xml \
-	arm/arm-m-profile.xml \
-	arm/arm-m-profile-with-fpa.xml \
-	arm/arm-vfpv2.xml \
-	arm/arm-vfpv3.xml \
-	arm/xscale-iwmmxt.xml \
+FEATURE_XMLFILES = \
+	arc/core-v2.xml \
+	arc/aux-v2.xml \
+	arc/core-arcompact.xml \
+	arc/aux-arcompact.xml \
 	i386/32bit-core.xml \
 	i386/32bit-sse.xml \
 	i386/32bit-linux.xml \
diff --git a/gdb/features/arc-arcompact.c b/gdb/features/arc-arcompact.c
deleted file mode 100644
index f81f0a26ba2..00000000000
--- a/gdb/features/arc-arcompact.c
+++ /dev/null
@@ -1,74 +0,0 @@
-/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
-  Original: arc-arcompact.xml */
-
-#include "defs.h"
-#include "osabi.h"
-#include "target-descriptions.h"
-
-struct target_desc *tdesc_arc_arcompact;
-static void
-initialize_tdesc_arc_arcompact (void)
-{
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("ARC700"));
-
-  struct tdesc_feature *feature;
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.arc.core.arcompact");
-  tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r3", 3, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r4", 4, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r5", 5, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r6", 6, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r7", 7, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r8", 8, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r9", 9, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r10", 10, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r11", 11, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r12", 12, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r13", 13, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r14", 14, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r15", 15, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r16", 16, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r17", 17, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r18", 18, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r19", 19, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r20", 20, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r21", 21, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r22", 22, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r23", 23, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r24", 24, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r25", 25, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "gp", 26, 1, NULL, 32, "data_ptr");
-  tdesc_create_reg (feature, "fp", 27, 1, NULL, 32, "data_ptr");
-  tdesc_create_reg (feature, "sp", 28, 1, NULL, 32, "data_ptr");
-  tdesc_create_reg (feature, "ilink1", 29, 1, NULL, 32, "code_ptr");
-  tdesc_create_reg (feature, "ilink2", 30, 1, NULL, 32, "code_ptr");
-  tdesc_create_reg (feature, "blink", 31, 1, NULL, 32, "code_ptr");
-  tdesc_create_reg (feature, "lp_count", 32, 1, NULL, 32, "uint32");
-  tdesc_create_reg (feature, "pcl", 33, 1, NULL, 32, "code_ptr");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.arc.aux-minimal");
-  tdesc_type_with_fields *type_with_fields;
-  type_with_fields = tdesc_create_flags (feature, "status32_type", 4);
-  tdesc_add_flag (type_with_fields, 0, "H");
-  tdesc_add_bitfield (type_with_fields, "E", 1, 2);
-  tdesc_add_bitfield (type_with_fields, "A", 3, 4);
-  tdesc_add_flag (type_with_fields, 5, "AE");
-  tdesc_add_flag (type_with_fields, 6, "DE");
-  tdesc_add_flag (type_with_fields, 7, "U");
-  tdesc_add_flag (type_with_fields, 8, "V");
-  tdesc_add_flag (type_with_fields, 9, "C");
-  tdesc_add_flag (type_with_fields, 10, "N");
-  tdesc_add_flag (type_with_fields, 11, "Z");
-  tdesc_add_flag (type_with_fields, 12, "L");
-  tdesc_add_flag (type_with_fields, 13, "R");
-  tdesc_add_flag (type_with_fields, 14, "SE");
-
-  tdesc_create_reg (feature, "pc", 34, 1, NULL, 32, "code_ptr");
-  tdesc_create_reg (feature, "status32", 35, 1, NULL, 32, "status32_type");
-
-  tdesc_arc_arcompact = result;
-}
diff --git a/gdb/features/arc-arcompact.xml b/gdb/features/arc-arcompact.xml
deleted file mode 100644
index 31acbaf9398..00000000000
--- a/gdb/features/arc-arcompact.xml
+++ /dev/null
@@ -1,85 +0,0 @@
-<?xml version="1.0"?>
-<!-- Copyright (C) 2015-2020 Free Software Foundation, Inc.
-
-     Copying and distribution of this file, with or without modification,
-     are permitted in any medium without royalty provided the copyright
-     notice and this notice are preserved.  -->
-
-<!DOCTYPE target SYSTEM "gdb-target.dtd">
-<target>
-  <architecture>arc:ARC700</architecture>
-  <!-- No OSABI for bare metal.  -->
-  <!-- No compatibility for ARC.  -->
-
-  <feature name="org.gnu.gdb.arc.core.arcompact">
-    <reg name="r0"  bitsize="32"/>
-    <reg name="r1"  bitsize="32"/>
-    <reg name="r2"  bitsize="32"/>
-    <reg name="r3"  bitsize="32"/>
-    <reg name="r4"  bitsize="32"/>
-    <reg name="r5"  bitsize="32"/>
-    <reg name="r6"  bitsize="32"/>
-    <reg name="r7"  bitsize="32"/>
-    <reg name="r8"  bitsize="32"/>
-    <reg name="r9"  bitsize="32"/>
-    <reg name="r10" bitsize="32"/>
-    <reg name="r11" bitsize="32"/>
-    <reg name="r12" bitsize="32"/>
-    <reg name="r13" bitsize="32"/>
-    <reg name="r14" bitsize="32"/>
-    <reg name="r15" bitsize="32"/>
-    <reg name="r16" bitsize="32"/>
-    <reg name="r17" bitsize="32"/>
-    <reg name="r18" bitsize="32"/>
-    <reg name="r19" bitsize="32"/>
-    <reg name="r20" bitsize="32"/>
-    <reg name="r21" bitsize="32"/>
-    <reg name="r22" bitsize="32"/>
-    <reg name="r23" bitsize="32"/>
-    <reg name="r24" bitsize="32"/>
-    <reg name="r25" bitsize="32"/>
-
-    <!-- ARC core data pointer registers.  -->
-    <reg name="gp"  bitsize="32" type="data_ptr"/>
-    <reg name="fp"  bitsize="32" type="data_ptr"/>
-    <reg name="sp"  bitsize="32" type="data_ptr"/>
-
-    <!-- Code pointers.  -->
-    <reg name="ilink1" bitsize="32" type="code_ptr"/>
-    <reg name="ilink2" bitsize="32" type="code_ptr"/>
-    <reg name="blink"  bitsize="32" type="code_ptr"/>
-
-    <!-- Here goes extension core registers: r32 - r59 -->
-
-    <!-- Loop counter.  -->
-    <reg name="lp_count" bitsize="32" type="uint32"/>
-
-    <!-- r61 is a reserved register address.  -->
-
-    <!-- r62 is a long immediate value, not a real register.  -->
-
-    <!-- 4-byte aligned read-only program counter.  -->
-    <reg name="pcl" bitsize="32" type="code_ptr" group=""/>
-  </feature>
-
-  <feature name="org.gnu.gdb.arc.aux-minimal">
-    <flags id="status32_type" size="4">
-	<field name="H"   start="0" end="0"/>
-	<field name="E"   start="1" end="2"/>
-	<field name="A"   start="3" end="4"/>
-	<field name="AE"  start="5" end="5"/>
-	<field name="DE"  start="6" end="6"/>
-	<field name="U"   start="7" end="7"/>
-	<field name="V"   start="8" end="8"/>
-	<field name="C"   start="9" end="9"/>
-	<field name="N"   start="10" end="10"/>
-	<field name="Z"   start="11" end="11"/>
-	<field name="L"   start="12" end="12"/>
-	<field name="R"  start="13" end="13"/>
-	<field name="SE"  start="14" end="14"/>
-    </flags>
-
-    <reg name="pc"       bitsize="32" type="code_ptr"/>
-    <reg name="status32" bitsize="32" type="status32_type"/>
-  </feature>
-</target>
diff --git a/gdb/features/arc-v2.c b/gdb/features/arc-v2.c
deleted file mode 100644
index b2254b293cf..00000000000
--- a/gdb/features/arc-v2.c
+++ /dev/null
@@ -1,78 +0,0 @@
-/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
-  Original: arc-v2.xml */
-
-#include "defs.h"
-#include "osabi.h"
-#include "target-descriptions.h"
-
-struct target_desc *tdesc_arc_v2;
-static void
-initialize_tdesc_arc_v2 (void)
-{
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("ARCv2"));
-
-  struct tdesc_feature *feature;
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.arc.core.v2");
-  tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r3", 3, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r4", 4, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r5", 5, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r6", 6, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r7", 7, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r8", 8, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r9", 9, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r10", 10, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r11", 11, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r12", 12, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r13", 13, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r14", 14, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r15", 15, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r16", 16, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r17", 17, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r18", 18, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r19", 19, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r20", 20, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r21", 21, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r22", 22, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r23", 23, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r24", 24, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r25", 25, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "gp", 26, 1, NULL, 32, "data_ptr");
-  tdesc_create_reg (feature, "fp", 27, 1, NULL, 32, "data_ptr");
-  tdesc_create_reg (feature, "sp", 28, 1, NULL, 32, "data_ptr");
-  tdesc_create_reg (feature, "ilink", 29, 1, NULL, 32, "code_ptr");
-  tdesc_create_reg (feature, "r30", 30, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "blink", 31, 1, NULL, 32, "code_ptr");
-  tdesc_create_reg (feature, "lp_count", 32, 1, NULL, 32, "uint32");
-  tdesc_create_reg (feature, "pcl", 33, 1, NULL, 32, "code_ptr");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.arc.aux-minimal");
-  tdesc_type_with_fields *type_with_fields;
-  type_with_fields = tdesc_create_flags (feature, "status32_type", 4);
-  tdesc_add_flag (type_with_fields, 0, "H");
-  tdesc_add_bitfield (type_with_fields, "E", 1, 4);
-  tdesc_add_flag (type_with_fields, 5, "AE");
-  tdesc_add_flag (type_with_fields, 6, "DE");
-  tdesc_add_flag (type_with_fields, 7, "U");
-  tdesc_add_flag (type_with_fields, 8, "V");
-  tdesc_add_flag (type_with_fields, 9, "C");
-  tdesc_add_flag (type_with_fields, 10, "N");
-  tdesc_add_flag (type_with_fields, 11, "Z");
-  tdesc_add_flag (type_with_fields, 12, "L");
-  tdesc_add_flag (type_with_fields, 13, "DZ");
-  tdesc_add_flag (type_with_fields, 14, "SC");
-  tdesc_add_flag (type_with_fields, 15, "ES");
-  tdesc_add_bitfield (type_with_fields, "RB", 16, 18);
-  tdesc_add_flag (type_with_fields, 19, "AD");
-  tdesc_add_flag (type_with_fields, 20, "US");
-  tdesc_add_flag (type_with_fields, 31, "IE");
-
-  tdesc_create_reg (feature, "pc", 34, 1, NULL, 32, "code_ptr");
-  tdesc_create_reg (feature, "status32", 35, 1, NULL, 32, "status32_type");
-
-  tdesc_arc_v2 = result;
-}
diff --git a/gdb/features/arc-v2.xml b/gdb/features/arc-v2.xml
deleted file mode 100644
index 2dae670158c..00000000000
--- a/gdb/features/arc-v2.xml
+++ /dev/null
@@ -1,92 +0,0 @@
-<?xml version="1.0"?>
-<!-- Copyright (C) 2015-2020 Free Software Foundation, Inc.
-
-     Copying and distribution of this file, with or without modification,
-     are permitted in any medium without royalty provided the copyright
-     notice and this notice are preserved.  -->
-
-<!DOCTYPE target SYSTEM "gdb-target.dtd">
-<target>
-  <architecture>arc:ARCv2</architecture>
-  <!-- No OSABI for bare metal.  -->
-  <!-- No compatibility for ARC.  -->
-
-  <feature name="org.gnu.gdb.arc.core.v2">
-    <reg name="r0"  bitsize="32"/>
-    <reg name="r1"  bitsize="32"/>
-    <reg name="r2"  bitsize="32"/>
-    <reg name="r3"  bitsize="32"/>
-    <reg name="r4"  bitsize="32"/>
-    <reg name="r5"  bitsize="32"/>
-    <reg name="r6"  bitsize="32"/>
-    <reg name="r7"  bitsize="32"/>
-    <reg name="r8"  bitsize="32"/>
-    <reg name="r9"  bitsize="32"/>
-    <reg name="r10" bitsize="32"/>
-    <reg name="r11" bitsize="32"/>
-    <reg name="r12" bitsize="32"/>
-    <reg name="r13" bitsize="32"/>
-    <reg name="r14" bitsize="32"/>
-    <reg name="r15" bitsize="32"/>
-    <reg name="r16" bitsize="32"/>
-    <reg name="r17" bitsize="32"/>
-    <reg name="r18" bitsize="32"/>
-    <reg name="r19" bitsize="32"/>
-    <reg name="r20" bitsize="32"/>
-    <reg name="r21" bitsize="32"/>
-    <reg name="r22" bitsize="32"/>
-    <reg name="r23" bitsize="32"/>
-    <reg name="r24" bitsize="32"/>
-    <reg name="r25" bitsize="32"/>
-
-    <!-- ARC core data pointer registers.  -->
-    <reg name="gp"  bitsize="32" type="data_ptr"/>
-    <reg name="fp"  bitsize="32" type="data_ptr"/>
-    <reg name="sp"  bitsize="32" type="data_ptr"/>
-
-    <!-- Code pointers.  R30 is general purpose, but it used to be ILINK2 in
-    ARCompact, thus its odd position in between of special purpose registers.
-    GCC does't use this register, so it isn't a member of a general group. -->
-    <reg name="ilink" bitsize="32" type="code_ptr"/>
-    <reg name="r30"   bitsize="32" group=""/>
-    <reg name="blink" bitsize="32" type="code_ptr"/>
-
-    <!-- Here goes extension core registers: r32 - r57.  -->
-    <!-- Here goes ACCL/ACCH registers, r58, r59.  -->
-
-    <!-- Loop counter.  -->
-    <reg name="lp_count" bitsize="32" type="uint32"/>
-
-    <!-- r61 is a reserved register address.  -->
-
-    <!-- r62 is a long immediate value, not a real register.  -->
-
-    <!-- 4-byte aligned read-only program counter.  -->
-    <reg name="pcl" bitsize="32" type="code_ptr" group=""/>
-  </feature>
-
-  <feature name="org.gnu.gdb.arc.aux-minimal">
-    <flags id="status32_type" size="4">
-	<field name="H"   start="0" end="0"/>
-	<field name="E"   start="1" end="4"/>
-	<field name="AE"  start="5" end="5"/>
-	<field name="DE"  start="6" end="6"/>
-	<field name="U"   start="7" end="7"/>
-	<field name="V"   start="8" end="8"/>
-	<field name="C"   start="9" end="9"/>
-	<field name="N"   start="10" end="10"/>
-	<field name="Z"   start="11" end="11"/>
-	<field name="L"   start="12" end="12"/>
-	<field name="DZ"  start="13" end="13"/>
-	<field name="SC"  start="14" end="14"/>
-	<field name="ES"  start="15" end="15"/>
-	<field name="RB"  start="16" end="18"/>
-	<field name="AD"  start="19" end="19"/>
-	<field name="US"  start="20" end="20"/>
-	<field name="IE"  start="31" end="31"/>
-    </flags>
-
-    <reg name="pc"       bitsize="32" type="code_ptr"/>
-    <reg name="status32" bitsize="32" type="status32_type"/>
-  </feature>
-</target>
diff --git a/gdb/features/arc/aux-arcompact.c b/gdb/features/arc/aux-arcompact.c
new file mode 100644
index 00000000000..d8e8c74e639
--- /dev/null
+++ b/gdb/features/arc/aux-arcompact.c
@@ -0,0 +1,31 @@
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
+  Original: aux-arcompact.xml */
+
+#include "gdbsupport/tdesc.h"
+
+static int
+create_feature_arc_aux_arcompact (struct target_desc *result, long regnum)
+{
+  struct tdesc_feature *feature;
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.arc.aux-minimal");
+  tdesc_type_with_fields *type_with_fields;
+  type_with_fields = tdesc_create_flags (feature, "status32_type", 4);
+  tdesc_add_flag (type_with_fields, 0, "H");
+  tdesc_add_bitfield (type_with_fields, "E", 1, 2);
+  tdesc_add_bitfield (type_with_fields, "A", 3, 4);
+  tdesc_add_flag (type_with_fields, 5, "AE");
+  tdesc_add_flag (type_with_fields, 6, "DE");
+  tdesc_add_flag (type_with_fields, 7, "U");
+  tdesc_add_flag (type_with_fields, 8, "V");
+  tdesc_add_flag (type_with_fields, 9, "C");
+  tdesc_add_flag (type_with_fields, 10, "N");
+  tdesc_add_flag (type_with_fields, 11, "Z");
+  tdesc_add_flag (type_with_fields, 12, "L");
+  tdesc_add_flag (type_with_fields, 13, "R");
+  tdesc_add_flag (type_with_fields, 14, "SE");
+
+  tdesc_create_reg (feature, "pc", regnum++, 1, NULL, 32, "code_ptr");
+  tdesc_create_reg (feature, "status32", regnum++, 1, NULL, 32, "status32_type");
+  return regnum;
+}
diff --git a/gdb/features/arc/aux-arcompact.xml b/gdb/features/arc/aux-arcompact.xml
new file mode 100644
index 00000000000..bf68112f5db
--- /dev/null
+++ b/gdb/features/arc/aux-arcompact.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2015-2020 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
+<feature name="org.gnu.gdb.arc.aux-minimal">
+  <flags id="status32_type" size="4">
+      <field name="H"   start="0" end="0"/>
+      <field name="E"   start="1" end="2"/>
+      <field name="A"   start="3" end="4"/>
+      <field name="AE"  start="5" end="5"/>
+      <field name="DE"  start="6" end="6"/>
+      <field name="U"   start="7" end="7"/>
+      <field name="V"   start="8" end="8"/>
+      <field name="C"   start="9" end="9"/>
+      <field name="N"   start="10" end="10"/>
+      <field name="Z"   start="11" end="11"/>
+      <field name="L"   start="12" end="12"/>
+      <field name="R"  start="13" end="13"/>
+      <field name="SE"  start="14" end="14"/>
+  </flags>
+
+  <reg name="pc"       bitsize="32" type="code_ptr"/>
+  <reg name="status32" bitsize="32" type="status32_type"/>
+</feature>
diff --git a/gdb/features/arc/aux-v2.c b/gdb/features/arc/aux-v2.c
new file mode 100644
index 00000000000..6290b9b1a7f
--- /dev/null
+++ b/gdb/features/arc/aux-v2.c
@@ -0,0 +1,35 @@
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
+  Original: aux-v2.xml */
+
+#include "gdbsupport/tdesc.h"
+
+static int
+create_feature_arc_aux_v2 (struct target_desc *result, long regnum)
+{
+  struct tdesc_feature *feature;
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.arc.aux-minimal");
+  tdesc_type_with_fields *type_with_fields;
+  type_with_fields = tdesc_create_flags (feature, "status32_type", 4);
+  tdesc_add_flag (type_with_fields, 0, "H");
+  tdesc_add_bitfield (type_with_fields, "E", 1, 4);
+  tdesc_add_flag (type_with_fields, 5, "AE");
+  tdesc_add_flag (type_with_fields, 6, "DE");
+  tdesc_add_flag (type_with_fields, 7, "U");
+  tdesc_add_flag (type_with_fields, 8, "V");
+  tdesc_add_flag (type_with_fields, 9, "C");
+  tdesc_add_flag (type_with_fields, 10, "N");
+  tdesc_add_flag (type_with_fields, 11, "Z");
+  tdesc_add_flag (type_with_fields, 12, "L");
+  tdesc_add_flag (type_with_fields, 13, "DZ");
+  tdesc_add_flag (type_with_fields, 14, "SC");
+  tdesc_add_flag (type_with_fields, 15, "ES");
+  tdesc_add_bitfield (type_with_fields, "RB", 16, 18);
+  tdesc_add_flag (type_with_fields, 19, "AD");
+  tdesc_add_flag (type_with_fields, 20, "US");
+  tdesc_add_flag (type_with_fields, 31, "IE");
+
+  tdesc_create_reg (feature, "pc", regnum++, 1, NULL, 32, "code_ptr");
+  tdesc_create_reg (feature, "status32", regnum++, 1, NULL, 32, "status32_type");
+  return regnum;
+}
diff --git a/gdb/features/arc/aux-v2.xml b/gdb/features/arc/aux-v2.xml
new file mode 100644
index 00000000000..2701fad72dc
--- /dev/null
+++ b/gdb/features/arc/aux-v2.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2015-2020 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
+<feature name="org.gnu.gdb.arc.aux-minimal">
+  <flags id="status32_type" size="4">
+      <field name="H"   start="0" end="0"/>
+      <field name="E"   start="1" end="4"/>
+      <field name="AE"  start="5" end="5"/>
+      <field name="DE"  start="6" end="6"/>
+      <field name="U"   start="7" end="7"/>
+      <field name="V"   start="8" end="8"/>
+      <field name="C"   start="9" end="9"/>
+      <field name="N"   start="10" end="10"/>
+      <field name="Z"   start="11" end="11"/>
+      <field name="L"   start="12" end="12"/>
+      <field name="DZ"  start="13" end="13"/>
+      <field name="SC"  start="14" end="14"/>
+      <field name="ES"  start="15" end="15"/>
+      <field name="RB"  start="16" end="18"/>
+      <field name="AD"  start="19" end="19"/>
+      <field name="US"  start="20" end="20"/>
+      <field name="IE"  start="31" end="31"/>
+  </flags>
+
+  <reg name="pc"       bitsize="32" type="code_ptr"/>
+  <reg name="status32" bitsize="32" type="status32_type"/>
+</feature>
diff --git a/gdb/features/arc/core-arcompact.c b/gdb/features/arc/core-arcompact.c
new file mode 100644
index 00000000000..7d9a4b23c21
--- /dev/null
+++ b/gdb/features/arc/core-arcompact.c
@@ -0,0 +1,47 @@
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
+  Original: core-arcompact.xml */
+
+#include "gdbsupport/tdesc.h"
+
+static int
+create_feature_arc_core_arcompact (struct target_desc *result, long regnum)
+{
+  struct tdesc_feature *feature;
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.arc.core.arcompact");
+  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, "ilink1", regnum++, 1, NULL, 32, "code_ptr");
+  tdesc_create_reg (feature, "ilink2", regnum++, 1, NULL, 32, "code_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, NULL, 32, "code_ptr");
+  return regnum;
+}
diff --git a/gdb/features/arc/core-arcompact.xml b/gdb/features/arc/core-arcompact.xml
new file mode 100644
index 00000000000..9209891b41a
--- /dev/null
+++ b/gdb/features/arc/core-arcompact.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2015-2020 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
+<feature name="org.gnu.gdb.arc.core.arcompact">
+  <reg name="r0"  bitsize="32"/>
+  <reg name="r1"  bitsize="32"/>
+  <reg name="r2"  bitsize="32"/>
+  <reg name="r3"  bitsize="32"/>
+  <reg name="r4"  bitsize="32"/>
+  <reg name="r5"  bitsize="32"/>
+  <reg name="r6"  bitsize="32"/>
+  <reg name="r7"  bitsize="32"/>
+  <reg name="r8"  bitsize="32"/>
+  <reg name="r9"  bitsize="32"/>
+  <reg name="r10" bitsize="32"/>
+  <reg name="r11" bitsize="32"/>
+  <reg name="r12" bitsize="32"/>
+  <reg name="r13" bitsize="32"/>
+  <reg name="r14" bitsize="32"/>
+  <reg name="r15" bitsize="32"/>
+  <reg name="r16" bitsize="32"/>
+  <reg name="r17" bitsize="32"/>
+  <reg name="r18" bitsize="32"/>
+  <reg name="r19" bitsize="32"/>
+  <reg name="r20" bitsize="32"/>
+  <reg name="r21" bitsize="32"/>
+  <reg name="r22" bitsize="32"/>
+  <reg name="r23" bitsize="32"/>
+  <reg name="r24" bitsize="32"/>
+  <reg name="r25" bitsize="32"/>
+
+  <!-- ARC core data pointer registers.  -->
+  <reg name="gp"  bitsize="32" type="data_ptr"/>
+  <reg name="fp"  bitsize="32" type="data_ptr"/>
+  <reg name="sp"  bitsize="32" type="data_ptr"/>
+
+  <!-- Code pointers.  -->
+  <reg name="ilink1" bitsize="32" type="code_ptr"/>
+  <reg name="ilink2" bitsize="32" type="code_ptr"/>
+  <reg name="blink"  bitsize="32" type="code_ptr"/>
+
+  <!-- Here goes extension core registers: r32 - r59 -->
+
+  <!-- Loop counter.  -->
+  <reg name="lp_count" bitsize="32" type="uint32"/>
+
+  <!-- r61 is a reserved register address.  -->
+
+  <!-- r62 is a long immediate value, not a real register.  -->
+
+  <!-- 4-byte aligned read-only program counter.  -->
+  <reg name="pcl" bitsize="32" type="code_ptr" group=""/>
+</feature>
diff --git a/gdb/features/arc/core-v2.c b/gdb/features/arc/core-v2.c
new file mode 100644
index 00000000000..d37da990457
--- /dev/null
+++ b/gdb/features/arc/core-v2.c
@@ -0,0 +1,47 @@
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
+  Original: core-v2.xml */
+
+#include "gdbsupport/tdesc.h"
+
+static int
+create_feature_arc_core_v2 (struct target_desc *result, long regnum)
+{
+  struct tdesc_feature *feature;
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.arc.core.v2");
+  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, "ilink", regnum++, 1, NULL, 32, "code_ptr");
+  tdesc_create_reg (feature, "r30", regnum++, 1, NULL, 32, "int");
+  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, NULL, 32, "code_ptr");
+  return regnum;
+}
diff --git a/gdb/features/arc/core-v2.xml b/gdb/features/arc/core-v2.xml
new file mode 100644
index 00000000000..1b17968fb2e
--- /dev/null
+++ b/gdb/features/arc/core-v2.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2015-2020 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
+<feature name="org.gnu.gdb.arc.core.v2">
+  <reg name="r0"  bitsize="32"/>
+  <reg name="r1"  bitsize="32"/>
+  <reg name="r2"  bitsize="32"/>
+  <reg name="r3"  bitsize="32"/>
+  <reg name="r4"  bitsize="32"/>
+  <reg name="r5"  bitsize="32"/>
+  <reg name="r6"  bitsize="32"/>
+  <reg name="r7"  bitsize="32"/>
+  <reg name="r8"  bitsize="32"/>
+  <reg name="r9"  bitsize="32"/>
+  <reg name="r10" bitsize="32"/>
+  <reg name="r11" bitsize="32"/>
+  <reg name="r12" bitsize="32"/>
+  <reg name="r13" bitsize="32"/>
+  <reg name="r14" bitsize="32"/>
+  <reg name="r15" bitsize="32"/>
+  <reg name="r16" bitsize="32"/>
+  <reg name="r17" bitsize="32"/>
+  <reg name="r18" bitsize="32"/>
+  <reg name="r19" bitsize="32"/>
+  <reg name="r20" bitsize="32"/>
+  <reg name="r21" bitsize="32"/>
+  <reg name="r22" bitsize="32"/>
+  <reg name="r23" bitsize="32"/>
+  <reg name="r24" bitsize="32"/>
+  <reg name="r25" bitsize="32"/>
+
+  <!-- ARC core data pointer registers.  -->
+  <reg name="gp"  bitsize="32" type="data_ptr"/>
+  <reg name="fp"  bitsize="32" type="data_ptr"/>
+  <reg name="sp"  bitsize="32" type="data_ptr"/>
+
+  <!-- Code pointers.  R30 is general purpose, but it used to be ILINK2 in
+  ARCompact, thus its odd position in between of special purpose registers.
+  GCC does't use this register, so it isn't a member of a general group. -->
+  <reg name="ilink" bitsize="32" type="code_ptr"/>
+  <reg name="r30"   bitsize="32" group=""/>
+  <reg name="blink" bitsize="32" type="code_ptr"/>
+
+  <!-- Here goes extension core registers: r32 - r57.  -->
+  <!-- Here goes ACCL/ACCH registers, r58, r59.  -->
+
+  <!-- Loop counter.  -->
+  <reg name="lp_count" bitsize="32" type="uint32"/>
+
+  <!-- r61 is a reserved register address.  -->
+
+  <!-- r62 is a long immediate value, not a real register.  -->
+
+  <!-- 4-byte aligned read-only program counter.  -->
+  <reg name="pcl" bitsize="32" type="code_ptr" group=""/>
+</feature>
diff --git a/gdb/target-descriptions.c b/gdb/target-descriptions.c
index 04711ba2fa5..7909fee7d5c 100644
--- a/gdb/target-descriptions.c
+++ b/gdb/target-descriptions.c
@@ -1715,7 +1715,9 @@ maint_print_c_tdesc_cmd (const char *args, int from_tty)
       || startswith (filename_after_features.c_str (), "riscv/")
       || startswith (filename_after_features.c_str (), "tic6x-")
       || startswith (filename_after_features.c_str (), "aarch64")
-      || startswith (filename_after_features.c_str (), "arm/"))
+      || startswith (filename_after_features.c_str (), "arm/")
+      || startswith (filename_after_features.c_str (), "arc/core-")
+      || startswith (filename_after_features.c_str (), "arc/aux-"))
     {
       print_c_feature v (filename_after_features);
 
-- 
2.25.1

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] arc: Migrate to new target features
  2020-03-05 16:06 [PATCH] arc: Migrate to new target features Shahab Vahedi
@ 2020-03-05 23:06 ` Simon Marchi
  2020-03-07 23:54 ` [PATCH v2] " Shahab Vahedi
  2020-03-13 10:37 ` [PATCH v3] " Shahab Vahedi
  2 siblings, 0 replies; 6+ messages in thread
From: Simon Marchi @ 2020-03-05 23:06 UTC (permalink / raw)
  To: Shahab Vahedi, gdb-patches; +Cc: Shahab Vahedi, Anton Kolesov, Francois Bedard

On 2020-03-05 11:05 a.m., Shahab Vahedi wrote:
> From: Anton Kolesov <Anton.Kolesov@synopsys.com>
> 
> This patch replaces usage of target descriptions in ARC, where the whole
> description is fixed in XML, with new target descriptions where XML describes
> individual features, and GDB assembles those features into actual target
> description.
> 
> gdb/ChangeLog:
> 2017-10-25  Anton Kolesov  <Anton.Kolesov@synopsys.com>
> 	    Shahab Vahedi  <shahab@synopsys.com>
> 
> 	* Makefile.in: Add arch/arc.o
> 	* configure.tgt: Likewise.
> 	* arc-tdep.h: Change type of "jb_pc" to CORE_ADDR.
> 	* arc-tdep.c (arc_tdesc_init): Use arc_create_target_description.
> 	(_initialize_arc_tdep): Don't initialize old target descriptions.
> 	(arc_dump_tdep): Use "%li" to print "jb_pc".
> 	* arch/arc.c: New file.
> 	* arch/arc.h: Likewise.
> 	* features/Makefile: Replace old target descriptions with new.
> 	* features/arc-arcompact.c: Remove.
> 	* features/arc-arcompact.xml: Likewise.
> 	* features/arc-v2.c: Likewise
> 	* features/arc-v2.xml: Likewise
> 	* features/arc/aux-arcompact.xml: New file.
> 	* features/arc/aux-v2.xml: Likewise.
> 	* features/arc/core-arcompact.xml: Likewise.
> 	* features/arc/core-v2.xml: Likewise.
> 	* features/arc/aux-arcompact.c: Generate.
> 	* features/arc/aux-v2.c: Likewise.
> 	* features/arc/core-arcompact.c: Likewise.
> 	* features/arc/core-v2.c: Likewise.
> 	* target-descriptions (maint_print_c_tdesc_cmd): Support ARC features.

Hi Shahab,


> @@ -2119,6 +2121,7 @@ ALLDEPFILES = \
>  	amd64-obsd-tdep.c \
>  	amd64-sol2-tdep.c \
>  	amd64-tdep.c \
> +	arc.c \

That looks wrong, there is no gdb/arc.c file.  The arm.c entry below looks wrong
as well... but at least put the right path to arc.c.

> @@ -1753,18 +1752,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))
>      {
> -      if (is_arcv2)
> -	{
> -	  tdesc_loc = tdesc_arc_v2;
> -	  if (arc_debug)
> -	    debug_printf ("arc: Using default register set for ARC v2.\n");
> -	}
> -      else
> -	{
> -	  tdesc_loc = tdesc_arc_arcompact;
> -	  if (arc_debug)
> -	    debug_printf ("arc: Using default register set for ARCompact.\n");
> -	}
> +      tdesc_loc = arc_create_target_description (arc_debug, is_arcv2);
>      }

Remove braces here.

>    else
>      {
> @@ -2114,7 +2102,7 @@ arc_dump_tdep (struct gdbarch *gdbarch, struct ui_file *file)
>  {
>    struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
>  
> -  fprintf_unfiltered (file, "arc_dump_tdep: jb_pc = %i\n", tdep->jb_pc);
> +  fprintf_unfiltered (file, "arc_dump_tdep: jb_pc = %li\n", tdep->jb_pc);

Printing a CORE_ADDR should be done using the paddress function, so that it works
fine regardless of the host machine type.

>  }
>  
>  /* Wrapper for "maintenance print arc" list of commands.  */
> @@ -2151,9 +2139,6 @@ _initialize_arc_tdep ()
>  {
>    gdbarch_register (bfd_arch_arc, arc_gdbarch_init, arc_dump_tdep);
>  
> -  initialize_tdesc_arc_v2 ();
> -  initialize_tdesc_arc_arcompact ();
> -
>    /* Register ARC-specific commands with gdb.  */
>  
>    /* Add root prefix command for "maintenance print arc" commands.  */
> @@ -2176,3 +2161,5 @@ _initialize_arc_tdep ()
>  			    _("Non-zero enables ARC specific debugging."),
>  			    NULL, NULL, &setdebuglist, &showdebuglist);
>  }
> +
> +/* vim: set sts=2 shiftwidth=2 ts=8: */

That change shouldn't be included in the patch.  I would welcome some auto
configuration for vim, however, like we have for emacs (.dir-locals.el).  Please
propose this as a separate patch.

> diff --git a/gdb/arc-tdep.h b/gdb/arc-tdep.h
> index bd0096741ff..3f2f5449722 100644
> --- a/gdb/arc-tdep.h
> +++ b/gdb/arc-tdep.h
> @@ -99,7 +99,7 @@ struct gdbarch_tdep
>  {
>    /* Offset to PC value in jump buffer.  If this is negative, longjmp
>       support will be disabled.  */
> -  int jb_pc;
> +  CORE_ADDR jb_pc;

Just wondering what motivates this change.  Since this changes a signed type
to an unsigned one, and a negative value has a special meaning, did you check
all uses to make sure this is fine?  For example, this use in arc_gdbarch_init:

  if (tdep->jb_pc >= 0)

Isn't it always true now?

If the change is not tied to the target description changes, please make a
separate patch for that.  If it is, then it's fine to include it here.  In both
cases, please explain what motivated you to change it.

Finally, since the comment above says "negative" but a CORE_ADDR can't really
be negative, the comment should be updated.  The CORE_ADDR_MAX value (which
is equivalent to the -1 used currently) could maybe be used instead?

>  };
>  
>  /* Utility functions used by other ARC-specific modules.  */
> diff --git a/gdb/arch/arc.c b/gdb/arch/arc.c
> new file mode 100644
> index 00000000000..effa6ec3d6f
> --- /dev/null
> +++ b/gdb/arch/arc.c
> @@ -0,0 +1,70 @@
> +/* Copyright (C) 2017-2020 Free Software Foundation, Inc.
> +
> +   This file is part of GDB.
> +
> +   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 <http://www.gnu.org/licenses/>.  */
> +
> +
> +#include "gdbsupport/common-defs.h"
> +#include <stdlib.h>
> +
> +#include "arc.h"
> +
> +/* Target description features.  */
> +#include "features/arc/core-v2.c"
> +#include "features/arc/aux-v2.c"
> +#include "features/arc/core-arcompact.c"
> +#include "features/arc/aux-arcompact.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_desc *
> +arc_create_target_description (bool print_debug, bool is_arcv2)
> +{
> +  target_desc *tdesc = allocate_target_description ();
> +
> +  if (print_debug)
> +    debug_printf ("arc: Creating target description, "
> +	"is_arcv2=%i\n", is_arcv2);

I think the last statement fits within 80 column without wrapping.

> +
> +  long regnum = 0;
> +
> +#ifndef IN_PROCESS_AGENT
> +  if (is_arcv2)
> +    {
> +      set_tdesc_architecture (tdesc, "arc:ARCv2");
> +    }
> +  else
> +    {
> +      set_tdesc_architecture (tdesc, "arc:ARC700");
> +    }

Remove braces above.

> diff --git a/gdb/features/Makefile b/gdb/features/Makefile
> index 9a98b0542c4..60be548780d 100644
> --- a/gdb/features/Makefile
> +++ b/gdb/features/Makefile
> @@ -108,8 +108,14 @@ OUTPUTS = $(patsubst %,$(outdir)/%.dat,$(WHICH))
>  # --enable-targets=all GDB.  You can override this by passing XMLTOC
>  # to make on the command line.
>  XMLTOC = \
> -	arc-v2.xml \
> -	arc-arcompact.xml \
> +	aarch64.xml \
> +	arm/arm-with-iwmmxt.xml \
> +	arm/arm-with-m-fpa-layout.xml \
> +	arm/arm-with-m-vfp-d16.xml \
> +	arm/arm-with-m.xml \
> +	arm/arm-with-neon.xml \
> +	arm/arm-with-vfpv2.xml \
> +	arm/arm-with-vfpv3.xml \
>  	microblaze-with-stack-protect.xml \
>  	microblaze.xml \
>  	mips-dsp-linux.xml \
> @@ -203,16 +209,11 @@ $(outdir)/%.dat: %.xml number-regs.xsl sort-regs.xsl gdbserver-regs.xsl
>  
>  # For targets with feature based target descriptions,
>  # the set of xml files we'll generate .c files for GDB from.
> -FEATURE_XMLFILES = aarch64-core.xml \
> -	aarch64-fpu.xml \
> -	aarch64-pauth.xml \
> -	arm/arm-core.xml \
> -	arm/arm-fpa.xml \
> -	arm/arm-m-profile.xml \
> -	arm/arm-m-profile-with-fpa.xml \
> -	arm/arm-vfpv2.xml \
> -	arm/arm-vfpv3.xml \
> -	arm/xscale-iwmmxt.xml \
> +FEATURE_XMLFILES = \
> +	arc/core-v2.xml \
> +	arc/aux-v2.xml \
> +	arc/core-arcompact.xml \
> +	arc/aux-arcompact.xml \

Why are all these arm files moving?  I presume there was a bad merge.

> diff --git a/gdb/target-descriptions.c b/gdb/target-descriptions.c
> index 04711ba2fa5..7909fee7d5c 100644
> --- a/gdb/target-descriptions.c
> +++ b/gdb/target-descriptions.c
> @@ -1715,7 +1715,9 @@ maint_print_c_tdesc_cmd (const char *args, int from_tty)
>        || startswith (filename_after_features.c_str (), "riscv/")
>        || startswith (filename_after_features.c_str (), "tic6x-")
>        || startswith (filename_after_features.c_str (), "aarch64")
> -      || startswith (filename_after_features.c_str (), "arm/"))
> +      || startswith (filename_after_features.c_str (), "arm/")
> +      || startswith (filename_after_features.c_str (), "arc/core-")
> +      || startswith (filename_after_features.c_str (), "arc/aux-"))

Might as well just compare to "arc/" ?

Simon

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH v2] arc: Migrate to new target features
  2020-03-05 16:06 [PATCH] arc: Migrate to new target features Shahab Vahedi
  2020-03-05 23:06 ` Simon Marchi
@ 2020-03-07 23:54 ` Shahab Vahedi
  2020-03-08  4:16   ` Simon Marchi
  2020-03-13 10:37 ` [PATCH v3] " Shahab Vahedi
  2 siblings, 1 reply; 6+ messages in thread
From: Shahab Vahedi @ 2020-03-07 23:54 UTC (permalink / raw)
  To: gdb-patches
  Cc: Shahab Vahedi, Shahab Vahedi, Anton Kolesov, Simon Marchi,
	Francois Bedard, Anton Kolesov

From: Anton Kolesov <Anton.Kolesov@synopsys.com>

This patch replaces usage of target descriptions in ARC, where the whole
description is fixed in XML, with new target descriptions where XML describes
individual features, and GDB assembles those features into actual target
description.

gdb/ChangeLog:
2017-10-25  Anton Kolesov  <Anton.Kolesov@synopsys.com>
	    Shahab Vahedi  <shahab@synopsys.com>

	* Makefile.in: Add arch/arc.o
	* configure.tgt: Likewise.
	* arc-tdep.c (arc_tdesc_init): Use arc_create_target_description.
	(_initialize_arc_tdep): Don't initialize old target descriptions.
	* arch/arc.c: New file.
	* arch/arc.h: Likewise.
	* features/Makefile: Replace old target descriptions with new.
	* features/arc-arcompact.c: Remove.
	* features/arc-arcompact.xml: Likewise.
	* features/arc-v2.c: Likewise
	* features/arc-v2.xml: Likewise
	* features/arc/aux-arcompact.xml: New file.
	* features/arc/aux-v2.xml: Likewise.
	* features/arc/core-arcompact.xml: Likewise.
	* features/arc/core-v2.xml: Likewise.
	* features/arc/aux-arcompact.c: Generate.
	* features/arc/aux-v2.c: Likewise.
	* features/arc/core-arcompact.c: Likewise.
	* features/arc/core-v2.c: Likewise.
	* target-descriptions (maint_print_c_tdesc_cmd): Support ARC features.
---
 gdb/Makefile.in                     |  2 +
 gdb/arc-tdep.c                      | 32 ++--------
 gdb/arch/arc.c                      | 65 ++++++++++++++++++++
 gdb/arch/arc.h                      | 20 +++++++
 gdb/configure.tgt                   |  2 +-
 gdb/features/Makefile               |  6 +-
 gdb/features/arc-arcompact.c        | 74 -----------------------
 gdb/features/arc-arcompact.xml      | 85 --------------------------
 gdb/features/arc-v2.c               | 78 ------------------------
 gdb/features/arc-v2.xml             | 92 -----------------------------
 gdb/features/arc/aux-arcompact.c    | 31 ++++++++++
 gdb/features/arc/aux-arcompact.xml  | 28 +++++++++
 gdb/features/arc/aux-v2.c           | 35 +++++++++++
 gdb/features/arc/aux-v2.xml         | 32 ++++++++++
 gdb/features/arc/core-arcompact.c   | 47 +++++++++++++++
 gdb/features/arc/core-arcompact.xml | 58 ++++++++++++++++++
 gdb/features/arc/core-v2.c          | 47 +++++++++++++++
 gdb/features/arc/core-v2.xml        | 61 +++++++++++++++++++
 gdb/target-descriptions.c           |  3 +-
 19 files changed, 439 insertions(+), 359 deletions(-)
 create mode 100644 gdb/arch/arc.c
 create mode 100644 gdb/arch/arc.h
 delete mode 100644 gdb/features/arc-arcompact.c
 delete mode 100644 gdb/features/arc-arcompact.xml
 delete mode 100644 gdb/features/arc-v2.c
 delete mode 100644 gdb/features/arc-v2.xml
 create mode 100644 gdb/features/arc/aux-arcompact.c
 create mode 100644 gdb/features/arc/aux-arcompact.xml
 create mode 100644 gdb/features/arc/aux-v2.c
 create mode 100644 gdb/features/arc/aux-v2.xml
 create mode 100644 gdb/features/arc/core-arcompact.c
 create mode 100644 gdb/features/arc/core-arcompact.xml
 create mode 100644 gdb/features/arc/core-v2.c
 create mode 100644 gdb/features/arc/core-v2.xml

diff --git a/gdb/Makefile.in b/gdb/Makefile.in
index 7c0a0aefbc2..532b17c6310 100644
--- a/gdb/Makefile.in
+++ b/gdb/Makefile.in
@@ -694,6 +694,7 @@ ALL_TARGET_OBS = \
 	aarch32-tdep.o \
 	arc-tdep.o \
 	arch/aarch32.o \
+	arch/arc.o \
 	arch/arm.o \
 	arch/arm-get-next-pcs.o \
 	arch/arm-linux.o \
@@ -1438,6 +1439,7 @@ HFILES_NO_SRCDIR = \
 	arch/aarch32.h \
 	arch/aarch64.h \
 	arch/aarch64-insn.h \
+	arch/arc.h \
 	arch/arm.h \
 	arch/i386.h \
 	arch/ppc-linux-common.h \
diff --git a/gdb/arc-tdep.c b/gdb/arc-tdep.c
index ac98f03efc1..93ab9d1e90d 100644
--- a/gdb/arc-tdep.c
+++ b/gdb/arc-tdep.c
@@ -28,21 +28,20 @@
 #include "gdbcore.h"
 #include "gdbcmd.h"
 #include "objfiles.h"
+#include "osabi.h"
 #include "prologue-value.h"
+#include "target-descriptions.h"
 #include "trad-frame.h"
 
 /* ARC header files.  */
 #include "opcode/arc.h"
 #include "opcodes/arc-dis.h"
 #include "arc-tdep.h"
+#include "arch/arc.h"
 
 /* Standard headers.  */
 #include <algorithm>
 
-/* Default target descriptions.  */
-#include "features/arc-v2.c"
-#include "features/arc-arcompact.c"
-
 /* The frame unwind cache for ARC.  */
 
 struct arc_frame_cache
@@ -1752,25 +1751,9 @@ 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))
-    {
-      if (is_arcv2)
-	{
-	  tdesc_loc = tdesc_arc_v2;
-	  if (arc_debug)
-	    debug_printf ("arc: Using default register set for ARC v2.\n");
-	}
-      else
-	{
-	  tdesc_loc = tdesc_arc_arcompact;
-	  if (arc_debug)
-	    debug_printf ("arc: Using default register set for ARCompact.\n");
-	}
-    }
-  else
-    {
-      if (arc_debug)
-	debug_printf ("arc: Using provided register set.\n");
-    }
+    tdesc_loc = arc_create_target_description (arc_debug, is_arcv2);
+  else if (arc_debug)
+    debug_printf ("arc: Using provided register set.\n");
   gdb_assert (tdesc_loc != NULL);
 
   /* Now we can search for base registers.  Core registers can be either full
@@ -2151,9 +2134,6 @@ _initialize_arc_tdep ()
 {
   gdbarch_register (bfd_arch_arc, arc_gdbarch_init, arc_dump_tdep);
 
-  initialize_tdesc_arc_v2 ();
-  initialize_tdesc_arc_arcompact ();
-
   /* Register ARC-specific commands with gdb.  */
 
   /* Add root prefix command for "maintenance print arc" commands.  */
diff --git a/gdb/arch/arc.c b/gdb/arch/arc.c
new file mode 100644
index 00000000000..b04d317d6b0
--- /dev/null
+++ b/gdb/arch/arc.c
@@ -0,0 +1,65 @@
+/* Copyright (C) 2017-2020 Free Software Foundation, Inc.
+
+   This file is part of GDB.
+
+   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 <http://www.gnu.org/licenses/>.  */
+
+
+#include "gdbsupport/common-defs.h"
+#include <stdlib.h>
+
+#include "arc.h"
+
+/* Target description features.  */
+#include "features/arc/core-v2.c"
+#include "features/arc/aux-v2.c"
+#include "features/arc/core-arcompact.c"
+#include "features/arc/aux-arcompact.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_desc *
+arc_create_target_description (bool print_debug, bool is_arcv2)
+{
+  target_desc *tdesc = allocate_target_description ();
+
+  if (print_debug)
+    debug_printf ("arc: Creating target description, is_arcv2=%i\n", is_arcv2);
+
+  long regnum = 0;
+
+#ifndef IN_PROCESS_AGENT
+  if (is_arcv2)
+    set_tdesc_architecture (tdesc, "arc:ARCv2");
+  else
+    set_tdesc_architecture (tdesc, "arc:ARC700");
+#endif
+
+  if (is_arcv2)
+    {
+      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);
+    }
+
+  return tdesc;
+}
diff --git a/gdb/arch/arc.h b/gdb/arch/arc.h
new file mode 100644
index 00000000000..dc7871c3103
--- /dev/null
+++ b/gdb/arch/arc.h
@@ -0,0 +1,20 @@
+/* Copyright (C) 2017-2020 Free Software Foundation, Inc.
+
+   This file is part of GDB.
+
+   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 <http://www.gnu.org/licenses/>.  */
+
+#include "gdbsupport/tdesc.h"
+
+target_desc *arc_create_target_description (bool print_debug, bool is_arcv2);
diff --git a/gdb/configure.tgt b/gdb/configure.tgt
index 755187dca65..9b77a2872ca 100644
--- a/gdb/configure.tgt
+++ b/gdb/configure.tgt
@@ -59,7 +59,7 @@ alpha*-*-*)
 
 arc*-*-*)
 	# Target: Unidentified ARC target
-	cpu_obs="arc-tdep.o"
+	cpu_obs="arc-tdep.o arch/arc.o"
 	;;
 
 arm*-*-*)
diff --git a/gdb/features/Makefile b/gdb/features/Makefile
index 9a98b0542c4..cc65baa6eda 100644
--- a/gdb/features/Makefile
+++ b/gdb/features/Makefile
@@ -108,8 +108,6 @@ OUTPUTS = $(patsubst %,$(outdir)/%.dat,$(WHICH))
 # --enable-targets=all GDB.  You can override this by passing XMLTOC
 # to make on the command line.
 XMLTOC = \
-	arc-v2.xml \
-	arc-arcompact.xml \
 	microblaze-with-stack-protect.xml \
 	microblaze.xml \
 	mips-dsp-linux.xml \
@@ -206,6 +204,10 @@ $(outdir)/%.dat: %.xml number-regs.xsl sort-regs.xsl gdbserver-regs.xsl
 FEATURE_XMLFILES = aarch64-core.xml \
 	aarch64-fpu.xml \
 	aarch64-pauth.xml \
+	arc/core-v2.xml \
+	arc/aux-v2.xml \
+	arc/core-arcompact.xml \
+	arc/aux-arcompact.xml \
 	arm/arm-core.xml \
 	arm/arm-fpa.xml \
 	arm/arm-m-profile.xml \
diff --git a/gdb/features/arc-arcompact.c b/gdb/features/arc-arcompact.c
deleted file mode 100644
index f81f0a26ba2..00000000000
--- a/gdb/features/arc-arcompact.c
+++ /dev/null
@@ -1,74 +0,0 @@
-/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
-  Original: arc-arcompact.xml */
-
-#include "defs.h"
-#include "osabi.h"
-#include "target-descriptions.h"
-
-struct target_desc *tdesc_arc_arcompact;
-static void
-initialize_tdesc_arc_arcompact (void)
-{
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("ARC700"));
-
-  struct tdesc_feature *feature;
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.arc.core.arcompact");
-  tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r3", 3, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r4", 4, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r5", 5, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r6", 6, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r7", 7, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r8", 8, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r9", 9, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r10", 10, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r11", 11, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r12", 12, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r13", 13, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r14", 14, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r15", 15, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r16", 16, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r17", 17, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r18", 18, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r19", 19, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r20", 20, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r21", 21, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r22", 22, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r23", 23, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r24", 24, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r25", 25, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "gp", 26, 1, NULL, 32, "data_ptr");
-  tdesc_create_reg (feature, "fp", 27, 1, NULL, 32, "data_ptr");
-  tdesc_create_reg (feature, "sp", 28, 1, NULL, 32, "data_ptr");
-  tdesc_create_reg (feature, "ilink1", 29, 1, NULL, 32, "code_ptr");
-  tdesc_create_reg (feature, "ilink2", 30, 1, NULL, 32, "code_ptr");
-  tdesc_create_reg (feature, "blink", 31, 1, NULL, 32, "code_ptr");
-  tdesc_create_reg (feature, "lp_count", 32, 1, NULL, 32, "uint32");
-  tdesc_create_reg (feature, "pcl", 33, 1, NULL, 32, "code_ptr");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.arc.aux-minimal");
-  tdesc_type_with_fields *type_with_fields;
-  type_with_fields = tdesc_create_flags (feature, "status32_type", 4);
-  tdesc_add_flag (type_with_fields, 0, "H");
-  tdesc_add_bitfield (type_with_fields, "E", 1, 2);
-  tdesc_add_bitfield (type_with_fields, "A", 3, 4);
-  tdesc_add_flag (type_with_fields, 5, "AE");
-  tdesc_add_flag (type_with_fields, 6, "DE");
-  tdesc_add_flag (type_with_fields, 7, "U");
-  tdesc_add_flag (type_with_fields, 8, "V");
-  tdesc_add_flag (type_with_fields, 9, "C");
-  tdesc_add_flag (type_with_fields, 10, "N");
-  tdesc_add_flag (type_with_fields, 11, "Z");
-  tdesc_add_flag (type_with_fields, 12, "L");
-  tdesc_add_flag (type_with_fields, 13, "R");
-  tdesc_add_flag (type_with_fields, 14, "SE");
-
-  tdesc_create_reg (feature, "pc", 34, 1, NULL, 32, "code_ptr");
-  tdesc_create_reg (feature, "status32", 35, 1, NULL, 32, "status32_type");
-
-  tdesc_arc_arcompact = result;
-}
diff --git a/gdb/features/arc-arcompact.xml b/gdb/features/arc-arcompact.xml
deleted file mode 100644
index 31acbaf9398..00000000000
--- a/gdb/features/arc-arcompact.xml
+++ /dev/null
@@ -1,85 +0,0 @@
-<?xml version="1.0"?>
-<!-- Copyright (C) 2015-2020 Free Software Foundation, Inc.
-
-     Copying and distribution of this file, with or without modification,
-     are permitted in any medium without royalty provided the copyright
-     notice and this notice are preserved.  -->
-
-<!DOCTYPE target SYSTEM "gdb-target.dtd">
-<target>
-  <architecture>arc:ARC700</architecture>
-  <!-- No OSABI for bare metal.  -->
-  <!-- No compatibility for ARC.  -->
-
-  <feature name="org.gnu.gdb.arc.core.arcompact">
-    <reg name="r0"  bitsize="32"/>
-    <reg name="r1"  bitsize="32"/>
-    <reg name="r2"  bitsize="32"/>
-    <reg name="r3"  bitsize="32"/>
-    <reg name="r4"  bitsize="32"/>
-    <reg name="r5"  bitsize="32"/>
-    <reg name="r6"  bitsize="32"/>
-    <reg name="r7"  bitsize="32"/>
-    <reg name="r8"  bitsize="32"/>
-    <reg name="r9"  bitsize="32"/>
-    <reg name="r10" bitsize="32"/>
-    <reg name="r11" bitsize="32"/>
-    <reg name="r12" bitsize="32"/>
-    <reg name="r13" bitsize="32"/>
-    <reg name="r14" bitsize="32"/>
-    <reg name="r15" bitsize="32"/>
-    <reg name="r16" bitsize="32"/>
-    <reg name="r17" bitsize="32"/>
-    <reg name="r18" bitsize="32"/>
-    <reg name="r19" bitsize="32"/>
-    <reg name="r20" bitsize="32"/>
-    <reg name="r21" bitsize="32"/>
-    <reg name="r22" bitsize="32"/>
-    <reg name="r23" bitsize="32"/>
-    <reg name="r24" bitsize="32"/>
-    <reg name="r25" bitsize="32"/>
-
-    <!-- ARC core data pointer registers.  -->
-    <reg name="gp"  bitsize="32" type="data_ptr"/>
-    <reg name="fp"  bitsize="32" type="data_ptr"/>
-    <reg name="sp"  bitsize="32" type="data_ptr"/>
-
-    <!-- Code pointers.  -->
-    <reg name="ilink1" bitsize="32" type="code_ptr"/>
-    <reg name="ilink2" bitsize="32" type="code_ptr"/>
-    <reg name="blink"  bitsize="32" type="code_ptr"/>
-
-    <!-- Here goes extension core registers: r32 - r59 -->
-
-    <!-- Loop counter.  -->
-    <reg name="lp_count" bitsize="32" type="uint32"/>
-
-    <!-- r61 is a reserved register address.  -->
-
-    <!-- r62 is a long immediate value, not a real register.  -->
-
-    <!-- 4-byte aligned read-only program counter.  -->
-    <reg name="pcl" bitsize="32" type="code_ptr" group=""/>
-  </feature>
-
-  <feature name="org.gnu.gdb.arc.aux-minimal">
-    <flags id="status32_type" size="4">
-	<field name="H"   start="0" end="0"/>
-	<field name="E"   start="1" end="2"/>
-	<field name="A"   start="3" end="4"/>
-	<field name="AE"  start="5" end="5"/>
-	<field name="DE"  start="6" end="6"/>
-	<field name="U"   start="7" end="7"/>
-	<field name="V"   start="8" end="8"/>
-	<field name="C"   start="9" end="9"/>
-	<field name="N"   start="10" end="10"/>
-	<field name="Z"   start="11" end="11"/>
-	<field name="L"   start="12" end="12"/>
-	<field name="R"  start="13" end="13"/>
-	<field name="SE"  start="14" end="14"/>
-    </flags>
-
-    <reg name="pc"       bitsize="32" type="code_ptr"/>
-    <reg name="status32" bitsize="32" type="status32_type"/>
-  </feature>
-</target>
diff --git a/gdb/features/arc-v2.c b/gdb/features/arc-v2.c
deleted file mode 100644
index b2254b293cf..00000000000
--- a/gdb/features/arc-v2.c
+++ /dev/null
@@ -1,78 +0,0 @@
-/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
-  Original: arc-v2.xml */
-
-#include "defs.h"
-#include "osabi.h"
-#include "target-descriptions.h"
-
-struct target_desc *tdesc_arc_v2;
-static void
-initialize_tdesc_arc_v2 (void)
-{
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("ARCv2"));
-
-  struct tdesc_feature *feature;
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.arc.core.v2");
-  tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r3", 3, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r4", 4, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r5", 5, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r6", 6, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r7", 7, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r8", 8, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r9", 9, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r10", 10, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r11", 11, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r12", 12, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r13", 13, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r14", 14, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r15", 15, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r16", 16, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r17", 17, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r18", 18, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r19", 19, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r20", 20, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r21", 21, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r22", 22, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r23", 23, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r24", 24, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r25", 25, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "gp", 26, 1, NULL, 32, "data_ptr");
-  tdesc_create_reg (feature, "fp", 27, 1, NULL, 32, "data_ptr");
-  tdesc_create_reg (feature, "sp", 28, 1, NULL, 32, "data_ptr");
-  tdesc_create_reg (feature, "ilink", 29, 1, NULL, 32, "code_ptr");
-  tdesc_create_reg (feature, "r30", 30, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "blink", 31, 1, NULL, 32, "code_ptr");
-  tdesc_create_reg (feature, "lp_count", 32, 1, NULL, 32, "uint32");
-  tdesc_create_reg (feature, "pcl", 33, 1, NULL, 32, "code_ptr");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.arc.aux-minimal");
-  tdesc_type_with_fields *type_with_fields;
-  type_with_fields = tdesc_create_flags (feature, "status32_type", 4);
-  tdesc_add_flag (type_with_fields, 0, "H");
-  tdesc_add_bitfield (type_with_fields, "E", 1, 4);
-  tdesc_add_flag (type_with_fields, 5, "AE");
-  tdesc_add_flag (type_with_fields, 6, "DE");
-  tdesc_add_flag (type_with_fields, 7, "U");
-  tdesc_add_flag (type_with_fields, 8, "V");
-  tdesc_add_flag (type_with_fields, 9, "C");
-  tdesc_add_flag (type_with_fields, 10, "N");
-  tdesc_add_flag (type_with_fields, 11, "Z");
-  tdesc_add_flag (type_with_fields, 12, "L");
-  tdesc_add_flag (type_with_fields, 13, "DZ");
-  tdesc_add_flag (type_with_fields, 14, "SC");
-  tdesc_add_flag (type_with_fields, 15, "ES");
-  tdesc_add_bitfield (type_with_fields, "RB", 16, 18);
-  tdesc_add_flag (type_with_fields, 19, "AD");
-  tdesc_add_flag (type_with_fields, 20, "US");
-  tdesc_add_flag (type_with_fields, 31, "IE");
-
-  tdesc_create_reg (feature, "pc", 34, 1, NULL, 32, "code_ptr");
-  tdesc_create_reg (feature, "status32", 35, 1, NULL, 32, "status32_type");
-
-  tdesc_arc_v2 = result;
-}
diff --git a/gdb/features/arc-v2.xml b/gdb/features/arc-v2.xml
deleted file mode 100644
index 2dae670158c..00000000000
--- a/gdb/features/arc-v2.xml
+++ /dev/null
@@ -1,92 +0,0 @@
-<?xml version="1.0"?>
-<!-- Copyright (C) 2015-2020 Free Software Foundation, Inc.
-
-     Copying and distribution of this file, with or without modification,
-     are permitted in any medium without royalty provided the copyright
-     notice and this notice are preserved.  -->
-
-<!DOCTYPE target SYSTEM "gdb-target.dtd">
-<target>
-  <architecture>arc:ARCv2</architecture>
-  <!-- No OSABI for bare metal.  -->
-  <!-- No compatibility for ARC.  -->
-
-  <feature name="org.gnu.gdb.arc.core.v2">
-    <reg name="r0"  bitsize="32"/>
-    <reg name="r1"  bitsize="32"/>
-    <reg name="r2"  bitsize="32"/>
-    <reg name="r3"  bitsize="32"/>
-    <reg name="r4"  bitsize="32"/>
-    <reg name="r5"  bitsize="32"/>
-    <reg name="r6"  bitsize="32"/>
-    <reg name="r7"  bitsize="32"/>
-    <reg name="r8"  bitsize="32"/>
-    <reg name="r9"  bitsize="32"/>
-    <reg name="r10" bitsize="32"/>
-    <reg name="r11" bitsize="32"/>
-    <reg name="r12" bitsize="32"/>
-    <reg name="r13" bitsize="32"/>
-    <reg name="r14" bitsize="32"/>
-    <reg name="r15" bitsize="32"/>
-    <reg name="r16" bitsize="32"/>
-    <reg name="r17" bitsize="32"/>
-    <reg name="r18" bitsize="32"/>
-    <reg name="r19" bitsize="32"/>
-    <reg name="r20" bitsize="32"/>
-    <reg name="r21" bitsize="32"/>
-    <reg name="r22" bitsize="32"/>
-    <reg name="r23" bitsize="32"/>
-    <reg name="r24" bitsize="32"/>
-    <reg name="r25" bitsize="32"/>
-
-    <!-- ARC core data pointer registers.  -->
-    <reg name="gp"  bitsize="32" type="data_ptr"/>
-    <reg name="fp"  bitsize="32" type="data_ptr"/>
-    <reg name="sp"  bitsize="32" type="data_ptr"/>
-
-    <!-- Code pointers.  R30 is general purpose, but it used to be ILINK2 in
-    ARCompact, thus its odd position in between of special purpose registers.
-    GCC does't use this register, so it isn't a member of a general group. -->
-    <reg name="ilink" bitsize="32" type="code_ptr"/>
-    <reg name="r30"   bitsize="32" group=""/>
-    <reg name="blink" bitsize="32" type="code_ptr"/>
-
-    <!-- Here goes extension core registers: r32 - r57.  -->
-    <!-- Here goes ACCL/ACCH registers, r58, r59.  -->
-
-    <!-- Loop counter.  -->
-    <reg name="lp_count" bitsize="32" type="uint32"/>
-
-    <!-- r61 is a reserved register address.  -->
-
-    <!-- r62 is a long immediate value, not a real register.  -->
-
-    <!-- 4-byte aligned read-only program counter.  -->
-    <reg name="pcl" bitsize="32" type="code_ptr" group=""/>
-  </feature>
-
-  <feature name="org.gnu.gdb.arc.aux-minimal">
-    <flags id="status32_type" size="4">
-	<field name="H"   start="0" end="0"/>
-	<field name="E"   start="1" end="4"/>
-	<field name="AE"  start="5" end="5"/>
-	<field name="DE"  start="6" end="6"/>
-	<field name="U"   start="7" end="7"/>
-	<field name="V"   start="8" end="8"/>
-	<field name="C"   start="9" end="9"/>
-	<field name="N"   start="10" end="10"/>
-	<field name="Z"   start="11" end="11"/>
-	<field name="L"   start="12" end="12"/>
-	<field name="DZ"  start="13" end="13"/>
-	<field name="SC"  start="14" end="14"/>
-	<field name="ES"  start="15" end="15"/>
-	<field name="RB"  start="16" end="18"/>
-	<field name="AD"  start="19" end="19"/>
-	<field name="US"  start="20" end="20"/>
-	<field name="IE"  start="31" end="31"/>
-    </flags>
-
-    <reg name="pc"       bitsize="32" type="code_ptr"/>
-    <reg name="status32" bitsize="32" type="status32_type"/>
-  </feature>
-</target>
diff --git a/gdb/features/arc/aux-arcompact.c b/gdb/features/arc/aux-arcompact.c
new file mode 100644
index 00000000000..d8e8c74e639
--- /dev/null
+++ b/gdb/features/arc/aux-arcompact.c
@@ -0,0 +1,31 @@
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
+  Original: aux-arcompact.xml */
+
+#include "gdbsupport/tdesc.h"
+
+static int
+create_feature_arc_aux_arcompact (struct target_desc *result, long regnum)
+{
+  struct tdesc_feature *feature;
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.arc.aux-minimal");
+  tdesc_type_with_fields *type_with_fields;
+  type_with_fields = tdesc_create_flags (feature, "status32_type", 4);
+  tdesc_add_flag (type_with_fields, 0, "H");
+  tdesc_add_bitfield (type_with_fields, "E", 1, 2);
+  tdesc_add_bitfield (type_with_fields, "A", 3, 4);
+  tdesc_add_flag (type_with_fields, 5, "AE");
+  tdesc_add_flag (type_with_fields, 6, "DE");
+  tdesc_add_flag (type_with_fields, 7, "U");
+  tdesc_add_flag (type_with_fields, 8, "V");
+  tdesc_add_flag (type_with_fields, 9, "C");
+  tdesc_add_flag (type_with_fields, 10, "N");
+  tdesc_add_flag (type_with_fields, 11, "Z");
+  tdesc_add_flag (type_with_fields, 12, "L");
+  tdesc_add_flag (type_with_fields, 13, "R");
+  tdesc_add_flag (type_with_fields, 14, "SE");
+
+  tdesc_create_reg (feature, "pc", regnum++, 1, NULL, 32, "code_ptr");
+  tdesc_create_reg (feature, "status32", regnum++, 1, NULL, 32, "status32_type");
+  return regnum;
+}
diff --git a/gdb/features/arc/aux-arcompact.xml b/gdb/features/arc/aux-arcompact.xml
new file mode 100644
index 00000000000..bf68112f5db
--- /dev/null
+++ b/gdb/features/arc/aux-arcompact.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2015-2020 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
+<feature name="org.gnu.gdb.arc.aux-minimal">
+  <flags id="status32_type" size="4">
+      <field name="H"   start="0" end="0"/>
+      <field name="E"   start="1" end="2"/>
+      <field name="A"   start="3" end="4"/>
+      <field name="AE"  start="5" end="5"/>
+      <field name="DE"  start="6" end="6"/>
+      <field name="U"   start="7" end="7"/>
+      <field name="V"   start="8" end="8"/>
+      <field name="C"   start="9" end="9"/>
+      <field name="N"   start="10" end="10"/>
+      <field name="Z"   start="11" end="11"/>
+      <field name="L"   start="12" end="12"/>
+      <field name="R"  start="13" end="13"/>
+      <field name="SE"  start="14" end="14"/>
+  </flags>
+
+  <reg name="pc"       bitsize="32" type="code_ptr"/>
+  <reg name="status32" bitsize="32" type="status32_type"/>
+</feature>
diff --git a/gdb/features/arc/aux-v2.c b/gdb/features/arc/aux-v2.c
new file mode 100644
index 00000000000..6290b9b1a7f
--- /dev/null
+++ b/gdb/features/arc/aux-v2.c
@@ -0,0 +1,35 @@
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
+  Original: aux-v2.xml */
+
+#include "gdbsupport/tdesc.h"
+
+static int
+create_feature_arc_aux_v2 (struct target_desc *result, long regnum)
+{
+  struct tdesc_feature *feature;
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.arc.aux-minimal");
+  tdesc_type_with_fields *type_with_fields;
+  type_with_fields = tdesc_create_flags (feature, "status32_type", 4);
+  tdesc_add_flag (type_with_fields, 0, "H");
+  tdesc_add_bitfield (type_with_fields, "E", 1, 4);
+  tdesc_add_flag (type_with_fields, 5, "AE");
+  tdesc_add_flag (type_with_fields, 6, "DE");
+  tdesc_add_flag (type_with_fields, 7, "U");
+  tdesc_add_flag (type_with_fields, 8, "V");
+  tdesc_add_flag (type_with_fields, 9, "C");
+  tdesc_add_flag (type_with_fields, 10, "N");
+  tdesc_add_flag (type_with_fields, 11, "Z");
+  tdesc_add_flag (type_with_fields, 12, "L");
+  tdesc_add_flag (type_with_fields, 13, "DZ");
+  tdesc_add_flag (type_with_fields, 14, "SC");
+  tdesc_add_flag (type_with_fields, 15, "ES");
+  tdesc_add_bitfield (type_with_fields, "RB", 16, 18);
+  tdesc_add_flag (type_with_fields, 19, "AD");
+  tdesc_add_flag (type_with_fields, 20, "US");
+  tdesc_add_flag (type_with_fields, 31, "IE");
+
+  tdesc_create_reg (feature, "pc", regnum++, 1, NULL, 32, "code_ptr");
+  tdesc_create_reg (feature, "status32", regnum++, 1, NULL, 32, "status32_type");
+  return regnum;
+}
diff --git a/gdb/features/arc/aux-v2.xml b/gdb/features/arc/aux-v2.xml
new file mode 100644
index 00000000000..2701fad72dc
--- /dev/null
+++ b/gdb/features/arc/aux-v2.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2015-2020 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
+<feature name="org.gnu.gdb.arc.aux-minimal">
+  <flags id="status32_type" size="4">
+      <field name="H"   start="0" end="0"/>
+      <field name="E"   start="1" end="4"/>
+      <field name="AE"  start="5" end="5"/>
+      <field name="DE"  start="6" end="6"/>
+      <field name="U"   start="7" end="7"/>
+      <field name="V"   start="8" end="8"/>
+      <field name="C"   start="9" end="9"/>
+      <field name="N"   start="10" end="10"/>
+      <field name="Z"   start="11" end="11"/>
+      <field name="L"   start="12" end="12"/>
+      <field name="DZ"  start="13" end="13"/>
+      <field name="SC"  start="14" end="14"/>
+      <field name="ES"  start="15" end="15"/>
+      <field name="RB"  start="16" end="18"/>
+      <field name="AD"  start="19" end="19"/>
+      <field name="US"  start="20" end="20"/>
+      <field name="IE"  start="31" end="31"/>
+  </flags>
+
+  <reg name="pc"       bitsize="32" type="code_ptr"/>
+  <reg name="status32" bitsize="32" type="status32_type"/>
+</feature>
diff --git a/gdb/features/arc/core-arcompact.c b/gdb/features/arc/core-arcompact.c
new file mode 100644
index 00000000000..7d9a4b23c21
--- /dev/null
+++ b/gdb/features/arc/core-arcompact.c
@@ -0,0 +1,47 @@
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
+  Original: core-arcompact.xml */
+
+#include "gdbsupport/tdesc.h"
+
+static int
+create_feature_arc_core_arcompact (struct target_desc *result, long regnum)
+{
+  struct tdesc_feature *feature;
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.arc.core.arcompact");
+  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, "ilink1", regnum++, 1, NULL, 32, "code_ptr");
+  tdesc_create_reg (feature, "ilink2", regnum++, 1, NULL, 32, "code_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, NULL, 32, "code_ptr");
+  return regnum;
+}
diff --git a/gdb/features/arc/core-arcompact.xml b/gdb/features/arc/core-arcompact.xml
new file mode 100644
index 00000000000..9209891b41a
--- /dev/null
+++ b/gdb/features/arc/core-arcompact.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2015-2020 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
+<feature name="org.gnu.gdb.arc.core.arcompact">
+  <reg name="r0"  bitsize="32"/>
+  <reg name="r1"  bitsize="32"/>
+  <reg name="r2"  bitsize="32"/>
+  <reg name="r3"  bitsize="32"/>
+  <reg name="r4"  bitsize="32"/>
+  <reg name="r5"  bitsize="32"/>
+  <reg name="r6"  bitsize="32"/>
+  <reg name="r7"  bitsize="32"/>
+  <reg name="r8"  bitsize="32"/>
+  <reg name="r9"  bitsize="32"/>
+  <reg name="r10" bitsize="32"/>
+  <reg name="r11" bitsize="32"/>
+  <reg name="r12" bitsize="32"/>
+  <reg name="r13" bitsize="32"/>
+  <reg name="r14" bitsize="32"/>
+  <reg name="r15" bitsize="32"/>
+  <reg name="r16" bitsize="32"/>
+  <reg name="r17" bitsize="32"/>
+  <reg name="r18" bitsize="32"/>
+  <reg name="r19" bitsize="32"/>
+  <reg name="r20" bitsize="32"/>
+  <reg name="r21" bitsize="32"/>
+  <reg name="r22" bitsize="32"/>
+  <reg name="r23" bitsize="32"/>
+  <reg name="r24" bitsize="32"/>
+  <reg name="r25" bitsize="32"/>
+
+  <!-- ARC core data pointer registers.  -->
+  <reg name="gp"  bitsize="32" type="data_ptr"/>
+  <reg name="fp"  bitsize="32" type="data_ptr"/>
+  <reg name="sp"  bitsize="32" type="data_ptr"/>
+
+  <!-- Code pointers.  -->
+  <reg name="ilink1" bitsize="32" type="code_ptr"/>
+  <reg name="ilink2" bitsize="32" type="code_ptr"/>
+  <reg name="blink"  bitsize="32" type="code_ptr"/>
+
+  <!-- Here goes extension core registers: r32 - r59 -->
+
+  <!-- Loop counter.  -->
+  <reg name="lp_count" bitsize="32" type="uint32"/>
+
+  <!-- r61 is a reserved register address.  -->
+
+  <!-- r62 is a long immediate value, not a real register.  -->
+
+  <!-- 4-byte aligned read-only program counter.  -->
+  <reg name="pcl" bitsize="32" type="code_ptr" group=""/>
+</feature>
diff --git a/gdb/features/arc/core-v2.c b/gdb/features/arc/core-v2.c
new file mode 100644
index 00000000000..d37da990457
--- /dev/null
+++ b/gdb/features/arc/core-v2.c
@@ -0,0 +1,47 @@
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
+  Original: core-v2.xml */
+
+#include "gdbsupport/tdesc.h"
+
+static int
+create_feature_arc_core_v2 (struct target_desc *result, long regnum)
+{
+  struct tdesc_feature *feature;
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.arc.core.v2");
+  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, "ilink", regnum++, 1, NULL, 32, "code_ptr");
+  tdesc_create_reg (feature, "r30", regnum++, 1, NULL, 32, "int");
+  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, NULL, 32, "code_ptr");
+  return regnum;
+}
diff --git a/gdb/features/arc/core-v2.xml b/gdb/features/arc/core-v2.xml
new file mode 100644
index 00000000000..1b17968fb2e
--- /dev/null
+++ b/gdb/features/arc/core-v2.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2015-2020 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
+<feature name="org.gnu.gdb.arc.core.v2">
+  <reg name="r0"  bitsize="32"/>
+  <reg name="r1"  bitsize="32"/>
+  <reg name="r2"  bitsize="32"/>
+  <reg name="r3"  bitsize="32"/>
+  <reg name="r4"  bitsize="32"/>
+  <reg name="r5"  bitsize="32"/>
+  <reg name="r6"  bitsize="32"/>
+  <reg name="r7"  bitsize="32"/>
+  <reg name="r8"  bitsize="32"/>
+  <reg name="r9"  bitsize="32"/>
+  <reg name="r10" bitsize="32"/>
+  <reg name="r11" bitsize="32"/>
+  <reg name="r12" bitsize="32"/>
+  <reg name="r13" bitsize="32"/>
+  <reg name="r14" bitsize="32"/>
+  <reg name="r15" bitsize="32"/>
+  <reg name="r16" bitsize="32"/>
+  <reg name="r17" bitsize="32"/>
+  <reg name="r18" bitsize="32"/>
+  <reg name="r19" bitsize="32"/>
+  <reg name="r20" bitsize="32"/>
+  <reg name="r21" bitsize="32"/>
+  <reg name="r22" bitsize="32"/>
+  <reg name="r23" bitsize="32"/>
+  <reg name="r24" bitsize="32"/>
+  <reg name="r25" bitsize="32"/>
+
+  <!-- ARC core data pointer registers.  -->
+  <reg name="gp"  bitsize="32" type="data_ptr"/>
+  <reg name="fp"  bitsize="32" type="data_ptr"/>
+  <reg name="sp"  bitsize="32" type="data_ptr"/>
+
+  <!-- Code pointers.  R30 is general purpose, but it used to be ILINK2 in
+  ARCompact, thus its odd position in between of special purpose registers.
+  GCC does't use this register, so it isn't a member of a general group. -->
+  <reg name="ilink" bitsize="32" type="code_ptr"/>
+  <reg name="r30"   bitsize="32" group=""/>
+  <reg name="blink" bitsize="32" type="code_ptr"/>
+
+  <!-- Here goes extension core registers: r32 - r57.  -->
+  <!-- Here goes ACCL/ACCH registers, r58, r59.  -->
+
+  <!-- Loop counter.  -->
+  <reg name="lp_count" bitsize="32" type="uint32"/>
+
+  <!-- r61 is a reserved register address.  -->
+
+  <!-- r62 is a long immediate value, not a real register.  -->
+
+  <!-- 4-byte aligned read-only program counter.  -->
+  <reg name="pcl" bitsize="32" type="code_ptr" group=""/>
+</feature>
diff --git a/gdb/target-descriptions.c b/gdb/target-descriptions.c
index 04711ba2fa5..4194819d9ab 100644
--- a/gdb/target-descriptions.c
+++ b/gdb/target-descriptions.c
@@ -1715,7 +1715,8 @@ maint_print_c_tdesc_cmd (const char *args, int from_tty)
       || startswith (filename_after_features.c_str (), "riscv/")
       || startswith (filename_after_features.c_str (), "tic6x-")
       || startswith (filename_after_features.c_str (), "aarch64")
-      || startswith (filename_after_features.c_str (), "arm/"))
+      || startswith (filename_after_features.c_str (), "arm/")
+      || startswith (filename_after_features.c_str (), "arc/"))
     {
       print_c_feature v (filename_after_features);
 
-- 
2.25.1


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v2] arc: Migrate to new target features
  2020-03-07 23:54 ` [PATCH v2] " Shahab Vahedi
@ 2020-03-08  4:16   ` Simon Marchi
  0 siblings, 0 replies; 6+ messages in thread
From: Simon Marchi @ 2020-03-08  4:16 UTC (permalink / raw)
  To: Shahab Vahedi, gdb-patches; +Cc: Shahab Vahedi, Anton Kolesov, Francois Bedard

On 2020-03-07 6:54 p.m., Shahab Vahedi wrote:
> From: Anton Kolesov <Anton.Kolesov@synopsys.com>
> 
> This patch replaces usage of target descriptions in ARC, where the whole
> description is fixed in XML, with new target descriptions where XML describes
> individual features, and GDB assembles those features into actual target
> description.

Hi Shahab,

The patch is ok, with the nit below fixed.

Also, I remembered that other architectures that use feature-based target descriptions
cache the target descriptions, such that if you request a tdesc with the same features
twice, the exact same instance is returned.  See for example:

- amd64_linux_read_description
- arm_read_description

I can't remember if this is just a simple optimization or if it's actually required...

> diff --git a/gdb/arch/arc.h b/gdb/arch/arc.h
> new file mode 100644
> index 00000000000..dc7871c3103
> --- /dev/null
> +++ b/gdb/arch/arc.h
> @@ -0,0 +1,20 @@
> +/* Copyright (C) 2017-2020 Free Software Foundation, Inc.
> +
> +   This file is part of GDB.
> +
> +   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 <http://www.gnu.org/licenses/>.  */
> +
> +#include "gdbsupport/tdesc.h"
> +
> +target_desc *arc_create_target_description (bool print_debug, bool is_arcv2);

This file (arc.h) is missing include guards.

Simon

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH v3] arc: Migrate to new target features
  2020-03-05 16:06 [PATCH] arc: Migrate to new target features Shahab Vahedi
  2020-03-05 23:06 ` Simon Marchi
  2020-03-07 23:54 ` [PATCH v2] " Shahab Vahedi
@ 2020-03-13 10:37 ` Shahab Vahedi
  2020-03-13 13:49   ` Simon Marchi
  2 siblings, 1 reply; 6+ messages in thread
From: Shahab Vahedi @ 2020-03-13 10:37 UTC (permalink / raw)
  To: gdb-patches
  Cc: Shahab Vahedi, Shahab Vahedi, Anton Kolesov, Simon Marchi,
	Francois Bedard, Anton Kolesov

From: Anton Kolesov <Anton.Kolesov@synopsys.com>

This patch replaces usage of target descriptions in ARC, where the whole
description is fixed in XML, with new target descriptions where XML describes
individual features, and GDB assembles those features into actual target
description.

v2:
Removed arc.c from ALLDEPFILES in gdb/Makefile.in.
Removed vim modeline from arc-tdep.c to have it in a separate patch.
Removed braces from one line "if/else".
Undid the type change for "jb_pc" (kept it as "int").
Joined the unnecessary line breaks into one line.
No more moving around arm targets in gdb/features/Makefile.

v3:
Added include gaurds to arc.h.
Added arc_read_description to _create_ target descriptions less.

gdb/ChangeLog:
2017-10-25  Anton Kolesov  <Anton.Kolesov@synopsys.com>
	    Shahab Vahedi  <shahab@synopsys.com>

	* Makefile.in: Add arch/arc.o
	* configure.tgt: Likewise.
	* arc-tdep.c (arc_tdesc_init): Use arc_read_description.
	(_initialize_arc_tdep): Don't initialize old target descriptions.
        (arc_read_description): New function to cache target descriptions.
	* arc-tdep.h (arc_read_description): Add proto type.
	* arch/arc.c: New file.
	* arch/arc.h: Likewise.
	* features/Makefile: Replace old target descriptions with new.
	* features/arc-arcompact.c: Remove.
	* features/arc-arcompact.xml: Likewise.
	* features/arc-v2.c: Likewise
	* features/arc-v2.xml: Likewise
	* features/arc/aux-arcompact.xml: New file.
	* features/arc/aux-v2.xml: Likewise.
	* features/arc/core-arcompact.xml: Likewise.
	* features/arc/core-v2.xml: Likewise.
	* features/arc/aux-arcompact.c: Generate.
	* features/arc/aux-v2.c: Likewise.
	* features/arc/core-arcompact.c: Likewise.
	* features/arc/core-v2.c: Likewise.
	* target-descriptions (maint_print_c_tdesc_cmd): Support ARC features.
---
 gdb/Makefile.in                     |  2 +
 gdb/arc-tdep.c                      | 59 ++++++++++++------
 gdb/arc-tdep.h                      |  4 ++
 gdb/arch/arc.c                      | 58 ++++++++++++++++++
 gdb/arch/arc.h                      | 41 +++++++++++++
 gdb/configure.tgt                   |  2 +-
 gdb/features/Makefile               |  6 +-
 gdb/features/arc-arcompact.c        | 74 -----------------------
 gdb/features/arc-arcompact.xml      | 85 --------------------------
 gdb/features/arc-v2.c               | 78 ------------------------
 gdb/features/arc-v2.xml             | 92 -----------------------------
 gdb/features/arc/aux-arcompact.c    | 31 ++++++++++
 gdb/features/arc/aux-arcompact.xml  | 28 +++++++++
 gdb/features/arc/aux-v2.c           | 35 +++++++++++
 gdb/features/arc/aux-v2.xml         | 32 ++++++++++
 gdb/features/arc/core-arcompact.c   | 47 +++++++++++++++
 gdb/features/arc/core-arcompact.xml | 58 ++++++++++++++++++
 gdb/features/arc/core-v2.c          | 47 +++++++++++++++
 gdb/features/arc/core-v2.xml        | 61 +++++++++++++++++++
 gdb/target-descriptions.c           |  3 +-
 20 files changed, 492 insertions(+), 351 deletions(-)
 create mode 100644 gdb/arch/arc.c
 create mode 100644 gdb/arch/arc.h
 delete mode 100644 gdb/features/arc-arcompact.c
 delete mode 100644 gdb/features/arc-arcompact.xml
 delete mode 100644 gdb/features/arc-v2.c
 delete mode 100644 gdb/features/arc-v2.xml
 create mode 100644 gdb/features/arc/aux-arcompact.c
 create mode 100644 gdb/features/arc/aux-arcompact.xml
 create mode 100644 gdb/features/arc/aux-v2.c
 create mode 100644 gdb/features/arc/aux-v2.xml
 create mode 100644 gdb/features/arc/core-arcompact.c
 create mode 100644 gdb/features/arc/core-arcompact.xml
 create mode 100644 gdb/features/arc/core-v2.c
 create mode 100644 gdb/features/arc/core-v2.xml

diff --git a/gdb/Makefile.in b/gdb/Makefile.in
index 7c0a0aefbc2..532b17c6310 100644
--- a/gdb/Makefile.in
+++ b/gdb/Makefile.in
@@ -694,6 +694,7 @@ ALL_TARGET_OBS = \
 	aarch32-tdep.o \
 	arc-tdep.o \
 	arch/aarch32.o \
+	arch/arc.o \
 	arch/arm.o \
 	arch/arm-get-next-pcs.o \
 	arch/arm-linux.o \
@@ -1438,6 +1439,7 @@ HFILES_NO_SRCDIR = \
 	arch/aarch32.h \
 	arch/aarch64.h \
 	arch/aarch64-insn.h \
+	arch/arc.h \
 	arch/arm.h \
 	arch/i386.h \
 	arch/ppc-linux-common.h \
diff --git a/gdb/arc-tdep.c b/gdb/arc-tdep.c
index ac98f03efc1..2f865f3fcaf 100644
--- a/gdb/arc-tdep.c
+++ b/gdb/arc-tdep.c
@@ -28,21 +28,20 @@
 #include "gdbcore.h"
 #include "gdbcmd.h"
 #include "objfiles.h"
+#include "osabi.h"
 #include "prologue-value.h"
+#include "target-descriptions.h"
 #include "trad-frame.h"
 
 /* ARC header files.  */
 #include "opcode/arc.h"
 #include "opcodes/arc-dis.h"
 #include "arc-tdep.h"
+#include "arch/arc.h"
 
 /* Standard headers.  */
 #include <algorithm>
 
-/* Default target descriptions.  */
-#include "features/arc-v2.c"
-#include "features/arc-arcompact.c"
-
 /* The frame unwind cache for ARC.  */
 
 struct arc_frame_cache
@@ -147,6 +146,9 @@ static const char *const core_arcompact_register_names[] = {
 
 static char *arc_disassembler_options = NULL;
 
+/* Possible arc target descriptors.  */
+static struct target_desc *tdesc_arc_list[ARC_SYS_TYPE_INVALID];
+
 /* Functions are sorted in the order as they are used in the
    _initialize_arc_tdep (), which uses the same order as gdbarch.h.  Static
    functions are defined before the first invocation.  */
@@ -1750,21 +1752,13 @@ arc_tdesc_init (struct gdbarch_info info, const struct target_desc **tdesc,
   const char *const *core_regs;
   const char *core_feature_name;
 
-  /* If target doesn't provide a description - use default one.  */
+  /* If target doesn't provide a description, use the default ones.  */
   if (!tdesc_has_registers (tdesc_loc))
     {
       if (is_arcv2)
-	{
-	  tdesc_loc = tdesc_arc_v2;
-	  if (arc_debug)
-	    debug_printf ("arc: Using default register set for ARC v2.\n");
-	}
+	tdesc_loc = arc_read_description (ARC_SYS_TYPE_ARCV2);
       else
-	{
-	  tdesc_loc = tdesc_arc_arcompact;
-	  if (arc_debug)
-	    debug_printf ("arc: Using default register set for ARCompact.\n");
-	}
+	tdesc_loc = arc_read_description (ARC_SYS_TYPE_ARCOMPACT);
     }
   else
     {
@@ -2145,15 +2139,44 @@ dump_arc_instruction_command (const char *args, int from_tty)
   arc_insn_dump (insn);
 }
 
+/* See arc-tdep.h.  */
+
+const target_desc *
+arc_read_description (arc_sys_type sys_type)
+{
+  if (arc_debug)
+    debug_printf ("arc: Reading target description for \"%s\".\n",
+		  arc_sys_type_to_str (sys_type));
+
+  gdb_assert ((sys_type > 0) && (sys_type < ARC_SYS_TYPE_INVALID));
+  struct target_desc *tdesc = tdesc_arc_list[sys_type];
+
+  if (tdesc == nullptr)
+    {
+      tdesc = arc_create_target_description (sys_type);
+      tdesc_arc_list[sys_type] = tdesc;
+
+      if (arc_debug)
+      {
+	const char *arch = tdesc_architecture_name (tdesc);
+	const char *abi = tdesc_osabi_name (tdesc);
+	arch = arch ? arch : "";
+	abi = abi ? abi : "";
+	debug_printf ("arc: Created target description for "
+		      "\"%s\": arch=\"%s\", ABI=\"%s\"\n",
+		      arc_sys_type_to_str (sys_type), arch, abi);
+      }
+    }
+
+  return tdesc;
+}
+
 void _initialize_arc_tdep ();
 void
 _initialize_arc_tdep ()
 {
   gdbarch_register (bfd_arch_arc, arc_gdbarch_init, arc_dump_tdep);
 
-  initialize_tdesc_arc_v2 ();
-  initialize_tdesc_arc_arcompact ();
-
   /* Register ARC-specific commands with gdb.  */
 
   /* Add root prefix command for "maintenance print arc" commands.  */
diff --git a/gdb/arc-tdep.h b/gdb/arc-tdep.h
index bd0096741ff..d72332c7638 100644
--- a/gdb/arc-tdep.h
+++ b/gdb/arc-tdep.h
@@ -23,6 +23,7 @@
 
 /* Need disassemble_info.  */
 #include "dis-asm.h"
+#include "arch/arc.h"
 
 /* To simplify GDB code this enum assumes that internal regnums should be same
    as architectural register numbers, i.e. PCL regnum is 63.  This allows to
@@ -163,4 +164,7 @@ CORE_ADDR arc_insn_get_branch_target (const struct arc_instruction &insn);
 
 CORE_ADDR arc_insn_get_linear_next_pc (const struct arc_instruction &insn);
 
+/* Get the correct ARC target description for the given system type.  */
+const target_desc *arc_read_description (arc_sys_type sys_type);
+
 #endif /* ARC_TDEP_H */
diff --git a/gdb/arch/arc.c b/gdb/arch/arc.c
new file mode 100644
index 00000000000..9552b4aff97
--- /dev/null
+++ b/gdb/arch/arc.c
@@ -0,0 +1,58 @@
+/* Copyright (C) 2017-2020 Free Software Foundation, Inc.
+
+   This file is part of GDB.
+
+   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 <http://www.gnu.org/licenses/>.  */
+
+
+#include "gdbsupport/common-defs.h"
+#include <stdlib.h>
+
+#include "arc.h"
+
+/* Target description features.  */
+#include "features/arc/core-v2.c"
+#include "features/arc/aux-v2.c"
+#include "features/arc/core-arcompact.c"
+#include "features/arc/aux-arcompact.c"
+
+/* See arc.h.  */
+
+target_desc *
+arc_create_target_description (arc_sys_type sys_type)
+{
+  target_desc *tdesc = allocate_target_description ();
+
+  long regnum = 0;
+
+#ifndef IN_PROCESS_AGENT
+  if (sys_type == ARC_SYS_TYPE_ARCV2)
+    set_tdesc_architecture (tdesc, "arc:ARCv2");
+  else
+    set_tdesc_architecture (tdesc, "arc:ARC700");
+#endif
+
+  if (sys_type == ARC_SYS_TYPE_ARCV2)
+    {
+      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);
+    }
+
+  return tdesc;
+}
diff --git a/gdb/arch/arc.h b/gdb/arch/arc.h
new file mode 100644
index 00000000000..0cb5a845ac1
--- /dev/null
+++ b/gdb/arch/arc.h
@@ -0,0 +1,41 @@
+/* Copyright (C) 2017-2020 Free Software Foundation, Inc.
+
+   This file is part of GDB.
+
+   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 <http://www.gnu.org/licenses/>.  */
+
+#ifndef ARCH_ARC_H
+#define ARCH_ARC_H
+
+#include "gdbsupport/tdesc.h"
+
+/* Supported ARC system hardware types.  */
+enum arc_sys_type {
+   ARC_SYS_TYPE_NONE = 0,
+   ARC_SYS_TYPE_ARCOMPACT,	  /* ARC600 or ARC700 */
+   ARC_SYS_TYPE_ARCV2,		  /* ARC EM or ARC HS */
+   ARC_SYS_TYPE_INVALID
+};
+
+#define arc_sys_type_to_str(x) \
+  (x == ARC_SYS_TYPE_NONE ? "ARC_SYS_TYPE_NONE" : \
+   (x == ARC_SYS_TYPE_ARCOMPACT ? "ARC_SYS_TYPE_ARCOMPACT" : \
+    (x == ARC_SYS_TYPE_ARCV2 ? "ARC_SYS_TYPE_ARCV2" : \
+     (x == ARC_SYS_TYPE_INVALID ? "ARC_SYS_TYPE_INVALID" : \
+      "Unknown"))))
+
+/* Create target description for a target with specified parameters.  */
+target_desc *arc_create_target_description (arc_sys_type sys_type);
+
+#endif /* ARCH_ARC_H */
diff --git a/gdb/configure.tgt b/gdb/configure.tgt
index 755187dca65..9b77a2872ca 100644
--- a/gdb/configure.tgt
+++ b/gdb/configure.tgt
@@ -59,7 +59,7 @@ alpha*-*-*)
 
 arc*-*-*)
 	# Target: Unidentified ARC target
-	cpu_obs="arc-tdep.o"
+	cpu_obs="arc-tdep.o arch/arc.o"
 	;;
 
 arm*-*-*)
diff --git a/gdb/features/Makefile b/gdb/features/Makefile
index 9a98b0542c4..cc65baa6eda 100644
--- a/gdb/features/Makefile
+++ b/gdb/features/Makefile
@@ -108,8 +108,6 @@ OUTPUTS = $(patsubst %,$(outdir)/%.dat,$(WHICH))
 # --enable-targets=all GDB.  You can override this by passing XMLTOC
 # to make on the command line.
 XMLTOC = \
-	arc-v2.xml \
-	arc-arcompact.xml \
 	microblaze-with-stack-protect.xml \
 	microblaze.xml \
 	mips-dsp-linux.xml \
@@ -206,6 +204,10 @@ $(outdir)/%.dat: %.xml number-regs.xsl sort-regs.xsl gdbserver-regs.xsl
 FEATURE_XMLFILES = aarch64-core.xml \
 	aarch64-fpu.xml \
 	aarch64-pauth.xml \
+	arc/core-v2.xml \
+	arc/aux-v2.xml \
+	arc/core-arcompact.xml \
+	arc/aux-arcompact.xml \
 	arm/arm-core.xml \
 	arm/arm-fpa.xml \
 	arm/arm-m-profile.xml \
diff --git a/gdb/features/arc-arcompact.c b/gdb/features/arc-arcompact.c
deleted file mode 100644
index f81f0a26ba2..00000000000
--- a/gdb/features/arc-arcompact.c
+++ /dev/null
@@ -1,74 +0,0 @@
-/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
-  Original: arc-arcompact.xml */
-
-#include "defs.h"
-#include "osabi.h"
-#include "target-descriptions.h"
-
-struct target_desc *tdesc_arc_arcompact;
-static void
-initialize_tdesc_arc_arcompact (void)
-{
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("ARC700"));
-
-  struct tdesc_feature *feature;
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.arc.core.arcompact");
-  tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r3", 3, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r4", 4, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r5", 5, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r6", 6, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r7", 7, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r8", 8, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r9", 9, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r10", 10, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r11", 11, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r12", 12, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r13", 13, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r14", 14, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r15", 15, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r16", 16, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r17", 17, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r18", 18, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r19", 19, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r20", 20, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r21", 21, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r22", 22, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r23", 23, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r24", 24, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r25", 25, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "gp", 26, 1, NULL, 32, "data_ptr");
-  tdesc_create_reg (feature, "fp", 27, 1, NULL, 32, "data_ptr");
-  tdesc_create_reg (feature, "sp", 28, 1, NULL, 32, "data_ptr");
-  tdesc_create_reg (feature, "ilink1", 29, 1, NULL, 32, "code_ptr");
-  tdesc_create_reg (feature, "ilink2", 30, 1, NULL, 32, "code_ptr");
-  tdesc_create_reg (feature, "blink", 31, 1, NULL, 32, "code_ptr");
-  tdesc_create_reg (feature, "lp_count", 32, 1, NULL, 32, "uint32");
-  tdesc_create_reg (feature, "pcl", 33, 1, NULL, 32, "code_ptr");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.arc.aux-minimal");
-  tdesc_type_with_fields *type_with_fields;
-  type_with_fields = tdesc_create_flags (feature, "status32_type", 4);
-  tdesc_add_flag (type_with_fields, 0, "H");
-  tdesc_add_bitfield (type_with_fields, "E", 1, 2);
-  tdesc_add_bitfield (type_with_fields, "A", 3, 4);
-  tdesc_add_flag (type_with_fields, 5, "AE");
-  tdesc_add_flag (type_with_fields, 6, "DE");
-  tdesc_add_flag (type_with_fields, 7, "U");
-  tdesc_add_flag (type_with_fields, 8, "V");
-  tdesc_add_flag (type_with_fields, 9, "C");
-  tdesc_add_flag (type_with_fields, 10, "N");
-  tdesc_add_flag (type_with_fields, 11, "Z");
-  tdesc_add_flag (type_with_fields, 12, "L");
-  tdesc_add_flag (type_with_fields, 13, "R");
-  tdesc_add_flag (type_with_fields, 14, "SE");
-
-  tdesc_create_reg (feature, "pc", 34, 1, NULL, 32, "code_ptr");
-  tdesc_create_reg (feature, "status32", 35, 1, NULL, 32, "status32_type");
-
-  tdesc_arc_arcompact = result;
-}
diff --git a/gdb/features/arc-arcompact.xml b/gdb/features/arc-arcompact.xml
deleted file mode 100644
index 31acbaf9398..00000000000
--- a/gdb/features/arc-arcompact.xml
+++ /dev/null
@@ -1,85 +0,0 @@
-<?xml version="1.0"?>
-<!-- Copyright (C) 2015-2020 Free Software Foundation, Inc.
-
-     Copying and distribution of this file, with or without modification,
-     are permitted in any medium without royalty provided the copyright
-     notice and this notice are preserved.  -->
-
-<!DOCTYPE target SYSTEM "gdb-target.dtd">
-<target>
-  <architecture>arc:ARC700</architecture>
-  <!-- No OSABI for bare metal.  -->
-  <!-- No compatibility for ARC.  -->
-
-  <feature name="org.gnu.gdb.arc.core.arcompact">
-    <reg name="r0"  bitsize="32"/>
-    <reg name="r1"  bitsize="32"/>
-    <reg name="r2"  bitsize="32"/>
-    <reg name="r3"  bitsize="32"/>
-    <reg name="r4"  bitsize="32"/>
-    <reg name="r5"  bitsize="32"/>
-    <reg name="r6"  bitsize="32"/>
-    <reg name="r7"  bitsize="32"/>
-    <reg name="r8"  bitsize="32"/>
-    <reg name="r9"  bitsize="32"/>
-    <reg name="r10" bitsize="32"/>
-    <reg name="r11" bitsize="32"/>
-    <reg name="r12" bitsize="32"/>
-    <reg name="r13" bitsize="32"/>
-    <reg name="r14" bitsize="32"/>
-    <reg name="r15" bitsize="32"/>
-    <reg name="r16" bitsize="32"/>
-    <reg name="r17" bitsize="32"/>
-    <reg name="r18" bitsize="32"/>
-    <reg name="r19" bitsize="32"/>
-    <reg name="r20" bitsize="32"/>
-    <reg name="r21" bitsize="32"/>
-    <reg name="r22" bitsize="32"/>
-    <reg name="r23" bitsize="32"/>
-    <reg name="r24" bitsize="32"/>
-    <reg name="r25" bitsize="32"/>
-
-    <!-- ARC core data pointer registers.  -->
-    <reg name="gp"  bitsize="32" type="data_ptr"/>
-    <reg name="fp"  bitsize="32" type="data_ptr"/>
-    <reg name="sp"  bitsize="32" type="data_ptr"/>
-
-    <!-- Code pointers.  -->
-    <reg name="ilink1" bitsize="32" type="code_ptr"/>
-    <reg name="ilink2" bitsize="32" type="code_ptr"/>
-    <reg name="blink"  bitsize="32" type="code_ptr"/>
-
-    <!-- Here goes extension core registers: r32 - r59 -->
-
-    <!-- Loop counter.  -->
-    <reg name="lp_count" bitsize="32" type="uint32"/>
-
-    <!-- r61 is a reserved register address.  -->
-
-    <!-- r62 is a long immediate value, not a real register.  -->
-
-    <!-- 4-byte aligned read-only program counter.  -->
-    <reg name="pcl" bitsize="32" type="code_ptr" group=""/>
-  </feature>
-
-  <feature name="org.gnu.gdb.arc.aux-minimal">
-    <flags id="status32_type" size="4">
-	<field name="H"   start="0" end="0"/>
-	<field name="E"   start="1" end="2"/>
-	<field name="A"   start="3" end="4"/>
-	<field name="AE"  start="5" end="5"/>
-	<field name="DE"  start="6" end="6"/>
-	<field name="U"   start="7" end="7"/>
-	<field name="V"   start="8" end="8"/>
-	<field name="C"   start="9" end="9"/>
-	<field name="N"   start="10" end="10"/>
-	<field name="Z"   start="11" end="11"/>
-	<field name="L"   start="12" end="12"/>
-	<field name="R"  start="13" end="13"/>
-	<field name="SE"  start="14" end="14"/>
-    </flags>
-
-    <reg name="pc"       bitsize="32" type="code_ptr"/>
-    <reg name="status32" bitsize="32" type="status32_type"/>
-  </feature>
-</target>
diff --git a/gdb/features/arc-v2.c b/gdb/features/arc-v2.c
deleted file mode 100644
index b2254b293cf..00000000000
--- a/gdb/features/arc-v2.c
+++ /dev/null
@@ -1,78 +0,0 @@
-/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
-  Original: arc-v2.xml */
-
-#include "defs.h"
-#include "osabi.h"
-#include "target-descriptions.h"
-
-struct target_desc *tdesc_arc_v2;
-static void
-initialize_tdesc_arc_v2 (void)
-{
-  struct target_desc *result = allocate_target_description ();
-  set_tdesc_architecture (result, bfd_scan_arch ("ARCv2"));
-
-  struct tdesc_feature *feature;
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.arc.core.v2");
-  tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r3", 3, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r4", 4, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r5", 5, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r6", 6, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r7", 7, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r8", 8, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r9", 9, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r10", 10, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r11", 11, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r12", 12, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r13", 13, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r14", 14, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r15", 15, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r16", 16, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r17", 17, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r18", 18, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r19", 19, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r20", 20, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r21", 21, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r22", 22, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r23", 23, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r24", 24, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "r25", 25, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "gp", 26, 1, NULL, 32, "data_ptr");
-  tdesc_create_reg (feature, "fp", 27, 1, NULL, 32, "data_ptr");
-  tdesc_create_reg (feature, "sp", 28, 1, NULL, 32, "data_ptr");
-  tdesc_create_reg (feature, "ilink", 29, 1, NULL, 32, "code_ptr");
-  tdesc_create_reg (feature, "r30", 30, 1, NULL, 32, "int");
-  tdesc_create_reg (feature, "blink", 31, 1, NULL, 32, "code_ptr");
-  tdesc_create_reg (feature, "lp_count", 32, 1, NULL, 32, "uint32");
-  tdesc_create_reg (feature, "pcl", 33, 1, NULL, 32, "code_ptr");
-
-  feature = tdesc_create_feature (result, "org.gnu.gdb.arc.aux-minimal");
-  tdesc_type_with_fields *type_with_fields;
-  type_with_fields = tdesc_create_flags (feature, "status32_type", 4);
-  tdesc_add_flag (type_with_fields, 0, "H");
-  tdesc_add_bitfield (type_with_fields, "E", 1, 4);
-  tdesc_add_flag (type_with_fields, 5, "AE");
-  tdesc_add_flag (type_with_fields, 6, "DE");
-  tdesc_add_flag (type_with_fields, 7, "U");
-  tdesc_add_flag (type_with_fields, 8, "V");
-  tdesc_add_flag (type_with_fields, 9, "C");
-  tdesc_add_flag (type_with_fields, 10, "N");
-  tdesc_add_flag (type_with_fields, 11, "Z");
-  tdesc_add_flag (type_with_fields, 12, "L");
-  tdesc_add_flag (type_with_fields, 13, "DZ");
-  tdesc_add_flag (type_with_fields, 14, "SC");
-  tdesc_add_flag (type_with_fields, 15, "ES");
-  tdesc_add_bitfield (type_with_fields, "RB", 16, 18);
-  tdesc_add_flag (type_with_fields, 19, "AD");
-  tdesc_add_flag (type_with_fields, 20, "US");
-  tdesc_add_flag (type_with_fields, 31, "IE");
-
-  tdesc_create_reg (feature, "pc", 34, 1, NULL, 32, "code_ptr");
-  tdesc_create_reg (feature, "status32", 35, 1, NULL, 32, "status32_type");
-
-  tdesc_arc_v2 = result;
-}
diff --git a/gdb/features/arc-v2.xml b/gdb/features/arc-v2.xml
deleted file mode 100644
index 2dae670158c..00000000000
--- a/gdb/features/arc-v2.xml
+++ /dev/null
@@ -1,92 +0,0 @@
-<?xml version="1.0"?>
-<!-- Copyright (C) 2015-2020 Free Software Foundation, Inc.
-
-     Copying and distribution of this file, with or without modification,
-     are permitted in any medium without royalty provided the copyright
-     notice and this notice are preserved.  -->
-
-<!DOCTYPE target SYSTEM "gdb-target.dtd">
-<target>
-  <architecture>arc:ARCv2</architecture>
-  <!-- No OSABI for bare metal.  -->
-  <!-- No compatibility for ARC.  -->
-
-  <feature name="org.gnu.gdb.arc.core.v2">
-    <reg name="r0"  bitsize="32"/>
-    <reg name="r1"  bitsize="32"/>
-    <reg name="r2"  bitsize="32"/>
-    <reg name="r3"  bitsize="32"/>
-    <reg name="r4"  bitsize="32"/>
-    <reg name="r5"  bitsize="32"/>
-    <reg name="r6"  bitsize="32"/>
-    <reg name="r7"  bitsize="32"/>
-    <reg name="r8"  bitsize="32"/>
-    <reg name="r9"  bitsize="32"/>
-    <reg name="r10" bitsize="32"/>
-    <reg name="r11" bitsize="32"/>
-    <reg name="r12" bitsize="32"/>
-    <reg name="r13" bitsize="32"/>
-    <reg name="r14" bitsize="32"/>
-    <reg name="r15" bitsize="32"/>
-    <reg name="r16" bitsize="32"/>
-    <reg name="r17" bitsize="32"/>
-    <reg name="r18" bitsize="32"/>
-    <reg name="r19" bitsize="32"/>
-    <reg name="r20" bitsize="32"/>
-    <reg name="r21" bitsize="32"/>
-    <reg name="r22" bitsize="32"/>
-    <reg name="r23" bitsize="32"/>
-    <reg name="r24" bitsize="32"/>
-    <reg name="r25" bitsize="32"/>
-
-    <!-- ARC core data pointer registers.  -->
-    <reg name="gp"  bitsize="32" type="data_ptr"/>
-    <reg name="fp"  bitsize="32" type="data_ptr"/>
-    <reg name="sp"  bitsize="32" type="data_ptr"/>
-
-    <!-- Code pointers.  R30 is general purpose, but it used to be ILINK2 in
-    ARCompact, thus its odd position in between of special purpose registers.
-    GCC does't use this register, so it isn't a member of a general group. -->
-    <reg name="ilink" bitsize="32" type="code_ptr"/>
-    <reg name="r30"   bitsize="32" group=""/>
-    <reg name="blink" bitsize="32" type="code_ptr"/>
-
-    <!-- Here goes extension core registers: r32 - r57.  -->
-    <!-- Here goes ACCL/ACCH registers, r58, r59.  -->
-
-    <!-- Loop counter.  -->
-    <reg name="lp_count" bitsize="32" type="uint32"/>
-
-    <!-- r61 is a reserved register address.  -->
-
-    <!-- r62 is a long immediate value, not a real register.  -->
-
-    <!-- 4-byte aligned read-only program counter.  -->
-    <reg name="pcl" bitsize="32" type="code_ptr" group=""/>
-  </feature>
-
-  <feature name="org.gnu.gdb.arc.aux-minimal">
-    <flags id="status32_type" size="4">
-	<field name="H"   start="0" end="0"/>
-	<field name="E"   start="1" end="4"/>
-	<field name="AE"  start="5" end="5"/>
-	<field name="DE"  start="6" end="6"/>
-	<field name="U"   start="7" end="7"/>
-	<field name="V"   start="8" end="8"/>
-	<field name="C"   start="9" end="9"/>
-	<field name="N"   start="10" end="10"/>
-	<field name="Z"   start="11" end="11"/>
-	<field name="L"   start="12" end="12"/>
-	<field name="DZ"  start="13" end="13"/>
-	<field name="SC"  start="14" end="14"/>
-	<field name="ES"  start="15" end="15"/>
-	<field name="RB"  start="16" end="18"/>
-	<field name="AD"  start="19" end="19"/>
-	<field name="US"  start="20" end="20"/>
-	<field name="IE"  start="31" end="31"/>
-    </flags>
-
-    <reg name="pc"       bitsize="32" type="code_ptr"/>
-    <reg name="status32" bitsize="32" type="status32_type"/>
-  </feature>
-</target>
diff --git a/gdb/features/arc/aux-arcompact.c b/gdb/features/arc/aux-arcompact.c
new file mode 100644
index 00000000000..d8e8c74e639
--- /dev/null
+++ b/gdb/features/arc/aux-arcompact.c
@@ -0,0 +1,31 @@
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
+  Original: aux-arcompact.xml */
+
+#include "gdbsupport/tdesc.h"
+
+static int
+create_feature_arc_aux_arcompact (struct target_desc *result, long regnum)
+{
+  struct tdesc_feature *feature;
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.arc.aux-minimal");
+  tdesc_type_with_fields *type_with_fields;
+  type_with_fields = tdesc_create_flags (feature, "status32_type", 4);
+  tdesc_add_flag (type_with_fields, 0, "H");
+  tdesc_add_bitfield (type_with_fields, "E", 1, 2);
+  tdesc_add_bitfield (type_with_fields, "A", 3, 4);
+  tdesc_add_flag (type_with_fields, 5, "AE");
+  tdesc_add_flag (type_with_fields, 6, "DE");
+  tdesc_add_flag (type_with_fields, 7, "U");
+  tdesc_add_flag (type_with_fields, 8, "V");
+  tdesc_add_flag (type_with_fields, 9, "C");
+  tdesc_add_flag (type_with_fields, 10, "N");
+  tdesc_add_flag (type_with_fields, 11, "Z");
+  tdesc_add_flag (type_with_fields, 12, "L");
+  tdesc_add_flag (type_with_fields, 13, "R");
+  tdesc_add_flag (type_with_fields, 14, "SE");
+
+  tdesc_create_reg (feature, "pc", regnum++, 1, NULL, 32, "code_ptr");
+  tdesc_create_reg (feature, "status32", regnum++, 1, NULL, 32, "status32_type");
+  return regnum;
+}
diff --git a/gdb/features/arc/aux-arcompact.xml b/gdb/features/arc/aux-arcompact.xml
new file mode 100644
index 00000000000..bf68112f5db
--- /dev/null
+++ b/gdb/features/arc/aux-arcompact.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2015-2020 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
+<feature name="org.gnu.gdb.arc.aux-minimal">
+  <flags id="status32_type" size="4">
+      <field name="H"   start="0" end="0"/>
+      <field name="E"   start="1" end="2"/>
+      <field name="A"   start="3" end="4"/>
+      <field name="AE"  start="5" end="5"/>
+      <field name="DE"  start="6" end="6"/>
+      <field name="U"   start="7" end="7"/>
+      <field name="V"   start="8" end="8"/>
+      <field name="C"   start="9" end="9"/>
+      <field name="N"   start="10" end="10"/>
+      <field name="Z"   start="11" end="11"/>
+      <field name="L"   start="12" end="12"/>
+      <field name="R"  start="13" end="13"/>
+      <field name="SE"  start="14" end="14"/>
+  </flags>
+
+  <reg name="pc"       bitsize="32" type="code_ptr"/>
+  <reg name="status32" bitsize="32" type="status32_type"/>
+</feature>
diff --git a/gdb/features/arc/aux-v2.c b/gdb/features/arc/aux-v2.c
new file mode 100644
index 00000000000..6290b9b1a7f
--- /dev/null
+++ b/gdb/features/arc/aux-v2.c
@@ -0,0 +1,35 @@
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
+  Original: aux-v2.xml */
+
+#include "gdbsupport/tdesc.h"
+
+static int
+create_feature_arc_aux_v2 (struct target_desc *result, long regnum)
+{
+  struct tdesc_feature *feature;
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.arc.aux-minimal");
+  tdesc_type_with_fields *type_with_fields;
+  type_with_fields = tdesc_create_flags (feature, "status32_type", 4);
+  tdesc_add_flag (type_with_fields, 0, "H");
+  tdesc_add_bitfield (type_with_fields, "E", 1, 4);
+  tdesc_add_flag (type_with_fields, 5, "AE");
+  tdesc_add_flag (type_with_fields, 6, "DE");
+  tdesc_add_flag (type_with_fields, 7, "U");
+  tdesc_add_flag (type_with_fields, 8, "V");
+  tdesc_add_flag (type_with_fields, 9, "C");
+  tdesc_add_flag (type_with_fields, 10, "N");
+  tdesc_add_flag (type_with_fields, 11, "Z");
+  tdesc_add_flag (type_with_fields, 12, "L");
+  tdesc_add_flag (type_with_fields, 13, "DZ");
+  tdesc_add_flag (type_with_fields, 14, "SC");
+  tdesc_add_flag (type_with_fields, 15, "ES");
+  tdesc_add_bitfield (type_with_fields, "RB", 16, 18);
+  tdesc_add_flag (type_with_fields, 19, "AD");
+  tdesc_add_flag (type_with_fields, 20, "US");
+  tdesc_add_flag (type_with_fields, 31, "IE");
+
+  tdesc_create_reg (feature, "pc", regnum++, 1, NULL, 32, "code_ptr");
+  tdesc_create_reg (feature, "status32", regnum++, 1, NULL, 32, "status32_type");
+  return regnum;
+}
diff --git a/gdb/features/arc/aux-v2.xml b/gdb/features/arc/aux-v2.xml
new file mode 100644
index 00000000000..2701fad72dc
--- /dev/null
+++ b/gdb/features/arc/aux-v2.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2015-2020 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
+<feature name="org.gnu.gdb.arc.aux-minimal">
+  <flags id="status32_type" size="4">
+      <field name="H"   start="0" end="0"/>
+      <field name="E"   start="1" end="4"/>
+      <field name="AE"  start="5" end="5"/>
+      <field name="DE"  start="6" end="6"/>
+      <field name="U"   start="7" end="7"/>
+      <field name="V"   start="8" end="8"/>
+      <field name="C"   start="9" end="9"/>
+      <field name="N"   start="10" end="10"/>
+      <field name="Z"   start="11" end="11"/>
+      <field name="L"   start="12" end="12"/>
+      <field name="DZ"  start="13" end="13"/>
+      <field name="SC"  start="14" end="14"/>
+      <field name="ES"  start="15" end="15"/>
+      <field name="RB"  start="16" end="18"/>
+      <field name="AD"  start="19" end="19"/>
+      <field name="US"  start="20" end="20"/>
+      <field name="IE"  start="31" end="31"/>
+  </flags>
+
+  <reg name="pc"       bitsize="32" type="code_ptr"/>
+  <reg name="status32" bitsize="32" type="status32_type"/>
+</feature>
diff --git a/gdb/features/arc/core-arcompact.c b/gdb/features/arc/core-arcompact.c
new file mode 100644
index 00000000000..7d9a4b23c21
--- /dev/null
+++ b/gdb/features/arc/core-arcompact.c
@@ -0,0 +1,47 @@
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
+  Original: core-arcompact.xml */
+
+#include "gdbsupport/tdesc.h"
+
+static int
+create_feature_arc_core_arcompact (struct target_desc *result, long regnum)
+{
+  struct tdesc_feature *feature;
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.arc.core.arcompact");
+  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, "ilink1", regnum++, 1, NULL, 32, "code_ptr");
+  tdesc_create_reg (feature, "ilink2", regnum++, 1, NULL, 32, "code_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, NULL, 32, "code_ptr");
+  return regnum;
+}
diff --git a/gdb/features/arc/core-arcompact.xml b/gdb/features/arc/core-arcompact.xml
new file mode 100644
index 00000000000..9209891b41a
--- /dev/null
+++ b/gdb/features/arc/core-arcompact.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2015-2020 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
+<feature name="org.gnu.gdb.arc.core.arcompact">
+  <reg name="r0"  bitsize="32"/>
+  <reg name="r1"  bitsize="32"/>
+  <reg name="r2"  bitsize="32"/>
+  <reg name="r3"  bitsize="32"/>
+  <reg name="r4"  bitsize="32"/>
+  <reg name="r5"  bitsize="32"/>
+  <reg name="r6"  bitsize="32"/>
+  <reg name="r7"  bitsize="32"/>
+  <reg name="r8"  bitsize="32"/>
+  <reg name="r9"  bitsize="32"/>
+  <reg name="r10" bitsize="32"/>
+  <reg name="r11" bitsize="32"/>
+  <reg name="r12" bitsize="32"/>
+  <reg name="r13" bitsize="32"/>
+  <reg name="r14" bitsize="32"/>
+  <reg name="r15" bitsize="32"/>
+  <reg name="r16" bitsize="32"/>
+  <reg name="r17" bitsize="32"/>
+  <reg name="r18" bitsize="32"/>
+  <reg name="r19" bitsize="32"/>
+  <reg name="r20" bitsize="32"/>
+  <reg name="r21" bitsize="32"/>
+  <reg name="r22" bitsize="32"/>
+  <reg name="r23" bitsize="32"/>
+  <reg name="r24" bitsize="32"/>
+  <reg name="r25" bitsize="32"/>
+
+  <!-- ARC core data pointer registers.  -->
+  <reg name="gp"  bitsize="32" type="data_ptr"/>
+  <reg name="fp"  bitsize="32" type="data_ptr"/>
+  <reg name="sp"  bitsize="32" type="data_ptr"/>
+
+  <!-- Code pointers.  -->
+  <reg name="ilink1" bitsize="32" type="code_ptr"/>
+  <reg name="ilink2" bitsize="32" type="code_ptr"/>
+  <reg name="blink"  bitsize="32" type="code_ptr"/>
+
+  <!-- Here goes extension core registers: r32 - r59 -->
+
+  <!-- Loop counter.  -->
+  <reg name="lp_count" bitsize="32" type="uint32"/>
+
+  <!-- r61 is a reserved register address.  -->
+
+  <!-- r62 is a long immediate value, not a real register.  -->
+
+  <!-- 4-byte aligned read-only program counter.  -->
+  <reg name="pcl" bitsize="32" type="code_ptr" group=""/>
+</feature>
diff --git a/gdb/features/arc/core-v2.c b/gdb/features/arc/core-v2.c
new file mode 100644
index 00000000000..d37da990457
--- /dev/null
+++ b/gdb/features/arc/core-v2.c
@@ -0,0 +1,47 @@
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
+  Original: core-v2.xml */
+
+#include "gdbsupport/tdesc.h"
+
+static int
+create_feature_arc_core_v2 (struct target_desc *result, long regnum)
+{
+  struct tdesc_feature *feature;
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.arc.core.v2");
+  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, "ilink", regnum++, 1, NULL, 32, "code_ptr");
+  tdesc_create_reg (feature, "r30", regnum++, 1, NULL, 32, "int");
+  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, NULL, 32, "code_ptr");
+  return regnum;
+}
diff --git a/gdb/features/arc/core-v2.xml b/gdb/features/arc/core-v2.xml
new file mode 100644
index 00000000000..1b17968fb2e
--- /dev/null
+++ b/gdb/features/arc/core-v2.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2015-2020 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
+<feature name="org.gnu.gdb.arc.core.v2">
+  <reg name="r0"  bitsize="32"/>
+  <reg name="r1"  bitsize="32"/>
+  <reg name="r2"  bitsize="32"/>
+  <reg name="r3"  bitsize="32"/>
+  <reg name="r4"  bitsize="32"/>
+  <reg name="r5"  bitsize="32"/>
+  <reg name="r6"  bitsize="32"/>
+  <reg name="r7"  bitsize="32"/>
+  <reg name="r8"  bitsize="32"/>
+  <reg name="r9"  bitsize="32"/>
+  <reg name="r10" bitsize="32"/>
+  <reg name="r11" bitsize="32"/>
+  <reg name="r12" bitsize="32"/>
+  <reg name="r13" bitsize="32"/>
+  <reg name="r14" bitsize="32"/>
+  <reg name="r15" bitsize="32"/>
+  <reg name="r16" bitsize="32"/>
+  <reg name="r17" bitsize="32"/>
+  <reg name="r18" bitsize="32"/>
+  <reg name="r19" bitsize="32"/>
+  <reg name="r20" bitsize="32"/>
+  <reg name="r21" bitsize="32"/>
+  <reg name="r22" bitsize="32"/>
+  <reg name="r23" bitsize="32"/>
+  <reg name="r24" bitsize="32"/>
+  <reg name="r25" bitsize="32"/>
+
+  <!-- ARC core data pointer registers.  -->
+  <reg name="gp"  bitsize="32" type="data_ptr"/>
+  <reg name="fp"  bitsize="32" type="data_ptr"/>
+  <reg name="sp"  bitsize="32" type="data_ptr"/>
+
+  <!-- Code pointers.  R30 is general purpose, but it used to be ILINK2 in
+  ARCompact, thus its odd position in between of special purpose registers.
+  GCC does't use this register, so it isn't a member of a general group. -->
+  <reg name="ilink" bitsize="32" type="code_ptr"/>
+  <reg name="r30"   bitsize="32" group=""/>
+  <reg name="blink" bitsize="32" type="code_ptr"/>
+
+  <!-- Here goes extension core registers: r32 - r57.  -->
+  <!-- Here goes ACCL/ACCH registers, r58, r59.  -->
+
+  <!-- Loop counter.  -->
+  <reg name="lp_count" bitsize="32" type="uint32"/>
+
+  <!-- r61 is a reserved register address.  -->
+
+  <!-- r62 is a long immediate value, not a real register.  -->
+
+  <!-- 4-byte aligned read-only program counter.  -->
+  <reg name="pcl" bitsize="32" type="code_ptr" group=""/>
+</feature>
diff --git a/gdb/target-descriptions.c b/gdb/target-descriptions.c
index 04711ba2fa5..4194819d9ab 100644
--- a/gdb/target-descriptions.c
+++ b/gdb/target-descriptions.c
@@ -1715,7 +1715,8 @@ maint_print_c_tdesc_cmd (const char *args, int from_tty)
       || startswith (filename_after_features.c_str (), "riscv/")
       || startswith (filename_after_features.c_str (), "tic6x-")
       || startswith (filename_after_features.c_str (), "aarch64")
-      || startswith (filename_after_features.c_str (), "arm/"))
+      || startswith (filename_after_features.c_str (), "arm/")
+      || startswith (filename_after_features.c_str (), "arc/"))
     {
       print_c_feature v (filename_after_features);
 
-- 
2.25.1


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v3] arc: Migrate to new target features
  2020-03-13 10:37 ` [PATCH v3] " Shahab Vahedi
@ 2020-03-13 13:49   ` Simon Marchi
  0 siblings, 0 replies; 6+ messages in thread
From: Simon Marchi @ 2020-03-13 13:49 UTC (permalink / raw)
  To: Shahab Vahedi, gdb-patches; +Cc: Shahab Vahedi, Anton Kolesov, Francois Bedard

On 2020-03-13 6:37 a.m., Shahab Vahedi wrote:
> From: Anton Kolesov <Anton.Kolesov@synopsys.com>
> 
> This patch replaces usage of target descriptions in ARC, where the whole
> description is fixed in XML, with new target descriptions where XML describes
> individual features, and GDB assembles those features into actual target
> description.
> 
> v2:
> Removed arc.c from ALLDEPFILES in gdb/Makefile.in.
> Removed vim modeline from arc-tdep.c to have it in a separate patch.
> Removed braces from one line "if/else".
> Undid the type change for "jb_pc" (kept it as "int").
> Joined the unnecessary line breaks into one line.
> No more moving around arm targets in gdb/features/Makefile.
> 
> v3:
> Added include gaurds to arc.h.
> Added arc_read_description to _create_ target descriptions less.

Hi Shahab,

I put some comments, they are all very minor, so the patch LGTM with those
addressed.  No need to send another version unless some other problem comes up.

> @@ -2145,15 +2139,44 @@ dump_arc_instruction_command (const char *args, int from_tty)
>    arc_insn_dump (insn);
>  }
>  
> +/* See arc-tdep.h.  */
> +
> +const target_desc *
> +arc_read_description (arc_sys_type sys_type)
> +{
> +  if (arc_debug)
> +    debug_printf ("arc: Reading target description for \"%s\".\n",
> +		  arc_sys_type_to_str (sys_type));
> +
> +  gdb_assert ((sys_type > 0) && (sys_type < ARC_SYS_TYPE_INVALID));
> +  struct target_desc *tdesc = tdesc_arc_list[sys_type];
> +
> +  if (tdesc == nullptr)
> +    {
> +      tdesc = arc_create_target_description (sys_type);
> +      tdesc_arc_list[sys_type] = tdesc;
> +
> +      if (arc_debug)
> +      {
> +	const char *arch = tdesc_architecture_name (tdesc);
> +	const char *abi = tdesc_osabi_name (tdesc);
> +	arch = arch ? arch : "";
> +	abi = abi ? abi : "";

When comparing pointers, we always use explicit comparisons to NULL or nullptr.  So here, it
should be:

  arch = arch != nullptr ? arch : "";



> +	debug_printf ("arc: Created target description for "
> +		      "\"%s\": arch=\"%s\", ABI=\"%s\"\n",
> +		      arc_sys_type_to_str (sys_type), arch, abi);
> +      }

This block is missing an indentation level.

> +    }
> +
> +  return tdesc;
> +}
> +
>  void _initialize_arc_tdep ();
>  void
>  _initialize_arc_tdep ()
>  {
>    gdbarch_register (bfd_arch_arc, arc_gdbarch_init, arc_dump_tdep);
>  
> -  initialize_tdesc_arc_v2 ();
> -  initialize_tdesc_arc_arcompact ();
> -
>    /* Register ARC-specific commands with gdb.  */
>  
>    /* Add root prefix command for "maintenance print arc" commands.  */
> diff --git a/gdb/arc-tdep.h b/gdb/arc-tdep.h
> index bd0096741ff..d72332c7638 100644
> --- a/gdb/arc-tdep.h
> +++ b/gdb/arc-tdep.h
> @@ -23,6 +23,7 @@
>  
>  /* Need disassemble_info.  */
>  #include "dis-asm.h"
> +#include "arch/arc.h"
>  
>  /* To simplify GDB code this enum assumes that internal regnums should be same
>     as architectural register numbers, i.e. PCL regnum is 63.  This allows to
> @@ -163,4 +164,7 @@ CORE_ADDR arc_insn_get_branch_target (const struct arc_instruction &insn);
>  
>  CORE_ADDR arc_insn_get_linear_next_pc (const struct arc_instruction &insn);
>  
> +/* Get the correct ARC target description for the given system type.  */
> +const target_desc *arc_read_description (arc_sys_type sys_type);
> +
>  #endif /* ARC_TDEP_H */
> diff --git a/gdb/arch/arc.c b/gdb/arch/arc.c
> new file mode 100644
> index 00000000000..9552b4aff97
> --- /dev/null
> +++ b/gdb/arch/arc.c
> @@ -0,0 +1,58 @@
> +/* Copyright (C) 2017-2020 Free Software Foundation, Inc.
> +
> +   This file is part of GDB.
> +
> +   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 <http://www.gnu.org/licenses/>.  */
> +
> +
> +#include "gdbsupport/common-defs.h"
> +#include <stdlib.h>
> +
> +#include "arc.h"
> +
> +/* Target description features.  */
> +#include "features/arc/core-v2.c"
> +#include "features/arc/aux-v2.c"
> +#include "features/arc/core-arcompact.c"
> +#include "features/arc/aux-arcompact.c"
> +
> +/* See arc.h.  */
> +
> +target_desc *
> +arc_create_target_description (arc_sys_type sys_type)
> +{
> +  target_desc *tdesc = allocate_target_description ();
> +
> +  long regnum = 0;
> +
> +#ifndef IN_PROCESS_AGENT
> +  if (sys_type == ARC_SYS_TYPE_ARCV2)
> +    set_tdesc_architecture (tdesc, "arc:ARCv2");
> +  else
> +    set_tdesc_architecture (tdesc, "arc:ARC700");
> +#endif
> +
> +  if (sys_type == ARC_SYS_TYPE_ARCV2)
> +    {
> +      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);
> +    }
> +
> +  return tdesc;
> +}
> diff --git a/gdb/arch/arc.h b/gdb/arch/arc.h
> new file mode 100644
> index 00000000000..0cb5a845ac1
> --- /dev/null
> +++ b/gdb/arch/arc.h
> @@ -0,0 +1,41 @@
> +/* Copyright (C) 2017-2020 Free Software Foundation, Inc.
> +
> +   This file is part of GDB.
> +
> +   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 <http://www.gnu.org/licenses/>.  */
> +
> +#ifndef ARCH_ARC_H
> +#define ARCH_ARC_H
> +
> +#include "gdbsupport/tdesc.h"
> +
> +/* Supported ARC system hardware types.  */
> +enum arc_sys_type {

Curly brace on next line.

> +   ARC_SYS_TYPE_NONE = 0,

Is NONE really needed?

> +   ARC_SYS_TYPE_ARCOMPACT,	  /* ARC600 or ARC700 */
> +   ARC_SYS_TYPE_ARCV2,		  /* ARC EM or ARC HS */
> +   ARC_SYS_TYPE_INVALID

Perhaps call the last one ARC_SYS_TYPE_NUM, since you use it to get the number
of enumerators, to size the array of target descriptions.

> +};
> +
> +#define arc_sys_type_to_str(x) \
> +  (x == ARC_SYS_TYPE_NONE ? "ARC_SYS_TYPE_NONE" : \
> +   (x == ARC_SYS_TYPE_ARCOMPACT ? "ARC_SYS_TYPE_ARCOMPACT" : \
> +    (x == ARC_SYS_TYPE_ARCV2 ? "ARC_SYS_TYPE_ARCV2" : \
> +     (x == ARC_SYS_TYPE_INVALID ? "ARC_SYS_TYPE_INVALID" : \
> +      "Unknown"))))

Can you please make this a function instead?  It's more readable of maintainable.

static inline const char *
arc_sys_type_to_str (arc_sys_type type)
{
  switch (type)
    {
    case ARC_SYS_TYPE_NONE:
      return "ARC_SYS_TYPE_NONE";
...
    }
}

Simon

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2020-03-13 13:49 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-03-05 16:06 [PATCH] arc: Migrate to new target features Shahab Vahedi
2020-03-05 23:06 ` Simon Marchi
2020-03-07 23:54 ` [PATCH v2] " Shahab Vahedi
2020-03-08  4:16   ` Simon Marchi
2020-03-13 10:37 ` [PATCH v3] " Shahab Vahedi
2020-03-13 13:49   ` Simon Marchi

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).