* [PATCH 1/3] arc: Add XML target descriptions for Linux targets
@ 2017-10-11 14:56 Anton Kolesov
2017-10-11 14:56 ` [PATCH 2/3] arc: Recognize registers available on " Anton Kolesov
` (2 more replies)
0 siblings, 3 replies; 13+ messages in thread
From: Anton Kolesov @ 2017-10-11 14:56 UTC (permalink / raw)
To: gdb-patches; +Cc: Anton Kolesov, Francois Bedard
Add XML target descriptions for Linux targets. Compared to default
Linux descriptions:
- Explicitly specify CPU machine.
- Remove baremetal only ILINK{,1,2} registers.
- Add LP_START and LP_END registers for hardware loops - required to properly
evaluate possible next instruction during software single instruction
stepping.
- Add BTA register which contains branch target address - address of next
instruction when processor is in the delay slot.
- ARC HS description also adds R30, R58 and R59 registers, specific to this
architecture.
gdb/ChangeLog:
yyyy-mm-dd Anton Kolesov <Anton.Kolesov@synopsys.com>
* arc-tdep (arc_tdesc_init): Use tdesc_arc_arcompact_linux and
tdesc_arc_v2_linux.
(_initialize_arc_tdep): Invoke initialize_tdesc_arc_v2_linux and
initialize_tdesc_arc_arcompact_linux.
* features/Makefile: Add targets to generate new files.
* features/arc-arcompact-linux.xml: New file.
* features/arc-v2-linux.xml: Likewise.
* features/arc-arcompact-linux.c: Generate.
* features/arc-v2-linux.c: Likewise.
* regformats/arc-arcompact-linux.dat: Likewise.
* regformats/arc-v2-linux.dat: Likewise.
---
gdb/arc-tdep.c | 17 ++++++-
gdb/features/Makefile | 5 ++
gdb/features/arc-arcompact-linux.c | 76 ++++++++++++++++++++++++++++
gdb/features/arc-arcompact-linux.xml | 84 +++++++++++++++++++++++++++++++
gdb/features/arc-v2-linux.c | 83 +++++++++++++++++++++++++++++++
gdb/features/arc-v2-linux.xml | 91 ++++++++++++++++++++++++++++++++++
gdb/regformats/arc-arcompact-linux.dat | 42 ++++++++++++++++
gdb/regformats/arc-v2-linux.dat | 45 +++++++++++++++++
8 files changed, 441 insertions(+), 2 deletions(-)
create mode 100644 gdb/features/arc-arcompact-linux.c
create mode 100644 gdb/features/arc-arcompact-linux.xml
create mode 100644 gdb/features/arc-v2-linux.c
create mode 100644 gdb/features/arc-v2-linux.xml
create mode 100644 gdb/regformats/arc-arcompact-linux.dat
create mode 100644 gdb/regformats/arc-v2-linux.dat
diff --git a/gdb/arc-tdep.c b/gdb/arc-tdep.c
index 771d6df..a825917 100644
--- a/gdb/arc-tdep.c
+++ b/gdb/arc-tdep.c
@@ -42,6 +42,8 @@
/* Default target descriptions. */
#include "features/arc-v2.c"
#include "features/arc-arcompact.c"
+#include "features/arc-v2-linux.c"
+#include "features/arc-arcompact-linux.c"
/* The frame unwind cache for ARC. */
@@ -1799,13 +1801,22 @@ arc_tdesc_init (struct gdbarch_info info, const struct target_desc **tdesc,
{
if (is_arcv2)
{
- tdesc_loc = tdesc_arc_v2;
+ /* Usually Linux-specific target description would be provided by
+ the gdbserver, but it has to be selected manually when debugging
+ core files. */
+ if (info.osabi == GDB_OSABI_LINUX)
+ tdesc_loc = tdesc_arc_v2_linux;
+ else
+ 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 (info.osabi == GDB_OSABI_LINUX)
+ tdesc_loc = tdesc_arc_arcompact_linux;
+ else
+ tdesc_loc = tdesc_arc_arcompact;
if (arc_debug)
debug_printf ("arc: Using default register set for ARCompact.\n");
}
@@ -2172,6 +2183,8 @@ _initialize_arc_tdep (void)
initialize_tdesc_arc_v2 ();
initialize_tdesc_arc_arcompact ();
+ initialize_tdesc_arc_v2_linux ();
+ initialize_tdesc_arc_arcompact_linux ();
/* Register ARC-specific commands with gdb. */
diff --git a/gdb/features/Makefile b/gdb/features/Makefile
index 8a7f377..8d5e3d3 100644
--- a/gdb/features/Makefile
+++ b/gdb/features/Makefile
@@ -44,6 +44,7 @@
# make GDB=/path/to/gdb XMLTOC="xml files" cfiles
WHICH = aarch64 \
+ arc-v2-linux arc-arcompact-linux \
arm/arm-with-iwmmxt arm/arm-with-vfpv2 arm/arm-with-vfpv3 \
arm/arm-with-neon \
i386/i386 i386/i386-linux \
@@ -84,6 +85,8 @@ WHICH = aarch64 \
# Record which registers should be sent to GDB by default after stop.
aarch64-expedite = x29,sp,pc
+arc-v2-linux-expedite = sp,pc
+arc-arcompact-linux-expedite = sp,pc
arm-expedite = r11,sp,pc
i386-expedite = ebp,esp,eip
amd64-expedite = rbp,rsp,rip
@@ -133,7 +136,9 @@ OUTPUTS = $(patsubst %,$(outdir)/%.dat,$(WHICH))
XMLTOC = \
aarch64.xml \
arc-v2.xml \
+ arc-v2-linux.xml \
arc-arcompact.xml \
+ arc-arcompact-linux.xml \
arm/arm-with-iwmmxt.xml \
arm/arm-with-m-fpa-layout.xml \
arm/arm-with-m-vfp-d16.xml \
diff --git a/gdb/features/arc-arcompact-linux.c b/gdb/features/arc-arcompact-linux.c
new file mode 100644
index 0000000..de8da32
--- /dev/null
+++ b/gdb/features/arc-arcompact-linux.c
@@ -0,0 +1,76 @@
+/* THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi:set ro:
+ Original: arc-arcompact-linux.xml */
+
+#include "defs.h"
+#include "osabi.h"
+#include "target-descriptions.h"
+
+struct target_desc *tdesc_arc_arcompact_linux;
+static void
+initialize_tdesc_arc_arcompact_linux (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, "blink", 29, 1, NULL, 32, "code_ptr");
+ tdesc_create_reg (feature, "lp_count", 30, 1, NULL, 32, "uint32");
+ tdesc_create_reg (feature, "pcl", 31, 1, "", 32, "code_ptr");
+
+ feature = tdesc_create_feature (result, "org.gnu.gdb.arc.aux-minimal");
+ struct tdesc_type *field_type;
+ struct tdesc_type *type;
+ type = tdesc_create_flags (feature, "status32_type", 4);
+ tdesc_add_flag (type, 0, "H");
+ tdesc_add_bitfield (type, "E", 1, 2);
+ tdesc_add_bitfield (type, "A", 3, 4);
+ tdesc_add_flag (type, 5, "AE");
+ tdesc_add_flag (type, 6, "DE");
+ tdesc_add_flag (type, 7, "U");
+ tdesc_add_flag (type, 8, "V");
+ tdesc_add_flag (type, 9, "C");
+ tdesc_add_flag (type, 10, "N");
+ tdesc_add_flag (type, 11, "Z");
+ tdesc_add_flag (type, 12, "L");
+ tdesc_add_flag (type, 13, "R");
+ tdesc_add_flag (type, 14, "SE");
+
+ tdesc_create_reg (feature, "pc", 32, 1, NULL, 32, "code_ptr");
+ tdesc_create_reg (feature, "status32", 33, 1, NULL, 32, "status32_type");
+ tdesc_create_reg (feature, "lp_start", 34, 1, NULL, 32, "code_ptr");
+ tdesc_create_reg (feature, "lp_end", 35, 1, NULL, 32, "code_ptr");
+ tdesc_create_reg (feature, "bta", 36, 1, NULL, 32, "code_ptr");
+
+ tdesc_arc_arcompact_linux = result;
+}
diff --git a/gdb/features/arc-arcompact-linux.xml b/gdb/features/arc-arcompact-linux.xml
new file mode 100644
index 0000000..84847ed
--- /dev/null
+++ b/gdb/features/arc-arcompact-linux.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2015-2017 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>
+
+ <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="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"/>
+ <reg name="lp_start" bitsize="32" type="code_ptr"/>
+ <reg name="lp_end" bitsize="32" type="code_ptr"/>
+ <reg name="bta" bitsize="32" type="code_ptr"/>
+ </feature>
+</target>
diff --git a/gdb/features/arc-v2-linux.c b/gdb/features/arc-v2-linux.c
new file mode 100644
index 0000000..8d93786
--- /dev/null
+++ b/gdb/features/arc-v2-linux.c
@@ -0,0 +1,83 @@
+/* THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi:set ro:
+ Original: arc-v2-linux.xml */
+
+#include "defs.h"
+#include "osabi.h"
+#include "target-descriptions.h"
+
+struct target_desc *tdesc_arc_v2_linux;
+static void
+initialize_tdesc_arc_v2_linux (void)
+{
+ struct target_desc *result = allocate_target_description ();
+ set_tdesc_architecture (result, bfd_scan_arch ("HS"));
+
+ 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, "r30", 29, 1, "", 32, "int");
+ tdesc_create_reg (feature, "blink", 30, 1, NULL, 32, "code_ptr");
+ tdesc_create_reg (feature, "r58", 31, 1, NULL, 32, "int");
+ tdesc_create_reg (feature, "r59", 32, 1, NULL, 32, "int");
+ tdesc_create_reg (feature, "lp_count", 33, 1, NULL, 32, "uint32");
+ tdesc_create_reg (feature, "pcl", 34, 1, "", 32, "code_ptr");
+
+ feature = tdesc_create_feature (result, "org.gnu.gdb.arc.aux-minimal");
+ struct tdesc_type *field_type;
+ struct tdesc_type *type;
+ type = tdesc_create_flags (feature, "status32_type", 4);
+ tdesc_add_flag (type, 0, "H");
+ tdesc_add_bitfield (type, "E", 1, 4);
+ tdesc_add_flag (type, 5, "AE");
+ tdesc_add_flag (type, 6, "DE");
+ tdesc_add_flag (type, 7, "U");
+ tdesc_add_flag (type, 8, "V");
+ tdesc_add_flag (type, 9, "C");
+ tdesc_add_flag (type, 10, "N");
+ tdesc_add_flag (type, 11, "Z");
+ tdesc_add_flag (type, 12, "L");
+ tdesc_add_flag (type, 13, "DZ");
+ tdesc_add_flag (type, 14, "SC");
+ tdesc_add_flag (type, 15, "ES");
+ tdesc_add_bitfield (type, "RB", 16, 18);
+ tdesc_add_flag (type, 19, "AD");
+ tdesc_add_flag (type, 20, "US");
+ tdesc_add_flag (type, 31, "IE");
+
+ tdesc_create_reg (feature, "pc", 35, 1, NULL, 32, "code_ptr");
+ tdesc_create_reg (feature, "status32", 36, 1, NULL, 32, "status32_type");
+ tdesc_create_reg (feature, "lp_start", 37, 1, NULL, 32, "code_ptr");
+ tdesc_create_reg (feature, "lp_end", 38, 1, NULL, 32, "code_ptr");
+ tdesc_create_reg (feature, "bta", 39, 1, NULL, 32, "code_ptr");
+
+ tdesc_arc_v2_linux = result;
+}
diff --git a/gdb/features/arc-v2-linux.xml b/gdb/features/arc-v2-linux.xml
new file mode 100644
index 0000000..4bd17ac
--- /dev/null
+++ b/gdb/features/arc-v2-linux.xml
@@ -0,0 +1,91 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2015-2017 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:HS</architecture>
+
+ <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"/>
+
+ <reg name="r30" bitsize="32" group=""/>
+ <reg name="blink" bitsize="32" type="code_ptr"/>
+
+ <!-- Here goes extension core registers: r32 - r57. -->
+ <reg name="r58" bitsize="32"/>
+ <reg name="r59" bitsize="32"/>
+
+ <!-- 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"/>
+ <reg name="lp_start" bitsize="32" type="code_ptr"/>
+ <reg name="lp_end" bitsize="32" type="code_ptr"/>
+ <reg name="bta" bitsize="32" type="code_ptr"/>
+ </feature>
+
+</target>
diff --git a/gdb/regformats/arc-arcompact-linux.dat b/gdb/regformats/arc-arcompact-linux.dat
new file mode 100644
index 0000000..1d35860
--- /dev/null
+++ b/gdb/regformats/arc-arcompact-linux.dat
@@ -0,0 +1,42 @@
+# THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi :set ro:
+# Generated from: arc-arcompact-linux.xml
+name:arc_arcompact_linux
+xmltarget:arc-arcompact-linux.xml
+expedite:sp,pc
+32:r0
+32:r1
+32:r2
+32:r3
+32:r4
+32:r5
+32:r6
+32:r7
+32:r8
+32:r9
+32:r10
+32:r11
+32:r12
+32:r13
+32:r14
+32:r15
+32:r16
+32:r17
+32:r18
+32:r19
+32:r20
+32:r21
+32:r22
+32:r23
+32:r24
+32:r25
+32:gp
+32:fp
+32:sp
+32:blink
+32:lp_count
+32:pcl
+32:pc
+32:status32
+32:lp_start
+32:lp_end
+32:bta
diff --git a/gdb/regformats/arc-v2-linux.dat b/gdb/regformats/arc-v2-linux.dat
new file mode 100644
index 0000000..7e5d190
--- /dev/null
+++ b/gdb/regformats/arc-v2-linux.dat
@@ -0,0 +1,45 @@
+# THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi :set ro:
+# Generated from: arc-v2-linux.xml
+name:arc_v2_linux
+xmltarget:arc-v2-linux.xml
+expedite:sp,pc
+32:r0
+32:r1
+32:r2
+32:r3
+32:r4
+32:r5
+32:r6
+32:r7
+32:r8
+32:r9
+32:r10
+32:r11
+32:r12
+32:r13
+32:r14
+32:r15
+32:r16
+32:r17
+32:r18
+32:r19
+32:r20
+32:r21
+32:r22
+32:r23
+32:r24
+32:r25
+32:gp
+32:fp
+32:sp
+32:r30
+32:blink
+32:r58
+32:r59
+32:lp_count
+32:pcl
+32:pc
+32:status32
+32:lp_start
+32:lp_end
+32:bta
--
2.8.3
^ permalink raw reply [flat|nested] 13+ messages in thread* [PATCH 2/3] arc: Recognize registers available on Linux targets 2017-10-11 14:56 [PATCH 1/3] arc: Add XML target descriptions for Linux targets Anton Kolesov @ 2017-10-11 14:56 ` Anton Kolesov 2017-10-21 8:23 ` Eli Zaretskii 2017-10-11 14:56 ` [PATCH 3/3] arc: Add GNU/Linux support for ARC Anton Kolesov 2017-10-12 1:29 ` [PATCH 1/3] arc: Add XML target descriptions for Linux targets Yao Qi 2 siblings, 1 reply; 13+ messages in thread From: Anton Kolesov @ 2017-10-11 14:56 UTC (permalink / raw) To: gdb-patches; +Cc: Anton Kolesov, Francois Bedard For ARC there are registers that are not part of a required set in XML target descriptions by default, but which are almost always present on ARC targets and are universally exposed by the ptrace interface. This patch adds those registers to those recognized by GDB: - R30 - core register available in user-space on ARC HS processors only (used to be a privileged only ILINK2 on ARC700). - R58, R59 - accumulator register pair for a 64-multiplier and double-precision FPU - only on ARC HS. - LP_START, LP_END - AUX registers, hardware loop start and end. Formally optional, though it is hard to find ARC configuration that doesn't have them and is always present in processors that can run Linux. GDB needs to know about those registers to implement proper software single stepping, since they affect what instruction will be next. - BTA - AUX register that contains branch target address. Value of this register makes sense only when execution halts at the delay slot instruction - in this case branch instruction is already committed, STATUS32.DE is set to 1 and BTA contains address of next PC. GDB needs to understand this register to properly handle situations when breakpoint has been set in the delay slot (delay slot is stepped over when doing software single stepping). Unfortunately, right now this doesn't work very well, because Linux doesn't allow modifications of STATUS32 via ptrace and Linux uses TRAP_S instruction to implement software breakpoints - this instruction commits when executed, therefore when TRAP_S is set in the delay slot and execution halts at it, PC is already advanced to BTA value and STATUS32.DE is reset. BTA register will be more useful for debugger after support for SWI instruction will be added to ARC Linux - this breakpoint instruction doesn't commit, hence it doesn't change processor state. gdb/ChangeLog: yyyy-mm-dd Anton Kolesov <Anton.Kolesov@synopsys.com> * arc-tdep.c (core_v2_register_names): Fix names of R58 and R59. (aux_minimal_register_names): Add LP_START, LP_END and BTA. (arc_tdesc_init): Recognize those registers. * arc-tdep.h (arc_regnum): Add R58, R59, LP_START, LP_END and BTA. (gdbarch_tdep): New field has_hw_loops. gdb/doc/ChangeLog: yyyy-mm-dd Anton Kolesov <Anton.Kolesov@synopsys.com> * gdb.texinfo (Synopsys ARC): Document LP_START, LP_END and BTA. --- gdb/arc-tdep.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++------- gdb/arc-tdep.h | 15 +++++++++++-- gdb/doc/gdb.texinfo | 3 ++- 3 files changed, 68 insertions(+), 11 deletions(-) diff --git a/gdb/arc-tdep.c b/gdb/arc-tdep.c index a825917..1643912 100644 --- a/gdb/arc-tdep.c +++ b/gdb/arc-tdep.c @@ -120,12 +120,12 @@ static const char *const core_v2_register_names[] = { "r44", "r45", "r46", "r47", "r48", "r49", "r50", "r51", "r52", "r53", "r54", "r55", - "r56", "r57", "accl", "acch", + "r56", "r57", "r58", "r59", "lp_count", "reserved", "limm", "pcl", }; static const char *const aux_minimal_register_names[] = { - "pc", "status32", + "pc", "status32", "lp_start", "lp_end", "bta" }; static const char *const core_arcompact_register_names[] = { @@ -1768,7 +1768,7 @@ static const struct frame_base arc_normal_base = { static int arc_tdesc_init (struct gdbarch_info info, const struct target_desc **tdesc, - struct tdesc_arch_data **tdesc_data) + struct tdesc_arch_data **tdesc_data, struct gdbarch_tdep *tdep) { if (arc_debug) debug_printf ("arc: Target description initialization.\n"); @@ -1919,8 +1919,35 @@ arc_tdesc_init (struct gdbarch_info info, const struct target_desc **tdesc, || (i >= ARC_R16_REGNUM && i <= ARC_R25_REGNUM))) continue; - valid_p = tdesc_numbered_register (feature, tdesc_data_loc, i, + /* R58 and R59 can have special names: ACCL and ACCH, however which + one is which depends on target endianness - for little endian R58 + is ACCL, R59 is ACCH; vice versa for big endian. */ + + const char *const r58_names[] = { + "r58", + (info.byte_order == BFD_ENDIAN_LITTLE ? "accl" : "acch"), + NULL + }; + const char *const r59_names[] = { + "r59", + (info.byte_order == BFD_ENDIAN_LITTLE ? "acch" : "accl"), + NULL + }; + + switch (i) + { + case ARC_R58_REGNUM: + valid_p = tdesc_numbered_register_choices (feature, tdesc_data_loc, + i, r58_names); + break; + case ARC_R59_REGNUM: + valid_p = tdesc_numbered_register_choices (feature, tdesc_data_loc, + i, r59_names); + break; + default: + valid_p = tdesc_numbered_register (feature, tdesc_data_loc, i, core_regs[i]); + } /* - Ignore errors in extension registers - they are optional. - Ignore missing ILINK because it doesn't make sense for Linux. @@ -1956,7 +1983,9 @@ arc_tdesc_init (struct gdbarch_info info, const struct target_desc **tdesc, { const char *name = aux_minimal_register_names[i - ARC_FIRST_AUX_REGNUM]; valid_p = tdesc_numbered_register (feature, tdesc_data_loc, i, name); - if (!valid_p) + + /* Only STATUS32 and PC are mandatory. */ + if (!valid_p && (i == ARC_PC_REGNUM || i == ARC_STATUS32_REGNUM)) { arc_print (_("Error: Cannot find required register `%s' " "in feature `%s'.\n"), @@ -1964,6 +1993,11 @@ arc_tdesc_init (struct gdbarch_info info, const struct target_desc **tdesc, tdesc_data_cleanup (tdesc_data_loc); return FALSE; } + /* Hardware loops present if both its registers are. */ + else if (ARC_LP_START_REGNUM == i) + tdep->has_hw_loops = valid_p; + else if (ARC_LP_END_REGNUM == i) + tdep->has_hw_loops &= valid_p; } *tdesc = tdesc_loc; @@ -1983,13 +2017,17 @@ arc_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) if (arc_debug) debug_printf ("arc: Architecture initialization.\n"); - if (!arc_tdesc_init (info, &tdesc, &tdesc_data)) - return NULL; - /* Allocate the ARC-private target-dependent information structure, and the GDB target-independent information structure. */ struct gdbarch_tdep *tdep = XCNEW (struct gdbarch_tdep); tdep->jb_pc = -1; /* No longjmp support by default. */ + + if (!arc_tdesc_init (info, &tdesc, &tdesc_data, tdep)) + { + XDELETE (tdep); + return NULL; + } + struct gdbarch *gdbarch = gdbarch_alloc (&info, tdep); /* Data types. */ @@ -2020,6 +2058,13 @@ arc_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_ps_regnum (gdbarch, ARC_STATUS32_REGNUM); set_gdbarch_fp0_regnum (gdbarch, -1); /* No FPU registers. */ + /* Confirm that register name lists have proper length. */ + gdb_static_assert (ARC_LAST_REGNUM + 1 + == (ARRAY_SIZE (core_v2_register_names) + + ARRAY_SIZE (aux_minimal_register_names))); + gdb_static_assert (ARRAY_SIZE (core_v2_register_names) + == ARRAY_SIZE (core_arcompact_register_names)); + set_gdbarch_dummy_id (gdbarch, arc_dummy_id); set_gdbarch_push_dummy_call (gdbarch, arc_push_dummy_call); set_gdbarch_push_dummy_code (gdbarch, arc_push_dummy_code); diff --git a/gdb/arc-tdep.h b/gdb/arc-tdep.h index 580ccb7..4ea06f6 100644 --- a/gdb/arc-tdep.h +++ b/gdb/arc-tdep.h @@ -53,6 +53,8 @@ enum arc_regnum ARC_R30_REGNUM, /* Return address from function. */ ARC_BLINK_REGNUM, + ARC_R58_REGNUM = 58, + ARC_R59_REGNUM, /* Zero-delay loop counter. */ ARC_LP_COUNT_REGNUM = 60, /* Reserved register number. There should never be a register with such @@ -74,8 +76,14 @@ enum arc_regnum ARC_FIRST_AUX_REGNUM = ARC_PC_REGNUM, /* Status register. */ ARC_STATUS32_REGNUM, - ARC_LAST_REGNUM = ARC_STATUS32_REGNUM, - ARC_LAST_AUX_REGNUM = ARC_STATUS32_REGNUM, + /* Zero-delay loop start instruction. */ + ARC_LP_START_REGNUM, + /* Zero-delay loop next-after-last instruction. */ + ARC_LP_END_REGNUM, + /* Branch target address. */ + ARC_BTA_REGNUM, + ARC_LAST_AUX_REGNUM = ARC_BTA_REGNUM, + ARC_LAST_REGNUM = ARC_LAST_AUX_REGNUM, /* Additional ABI constants. */ ARC_FIRST_ARG_REGNUM = ARC_R0_REGNUM, @@ -100,6 +108,9 @@ struct gdbarch_tdep /* Offset to PC value in jump buffer. If this is negative, longjmp support will be disabled. */ int jb_pc; + + /* Whether target has hardware (aka zero-delay) loops. */ + bool has_hw_loops; }; /* Utility functions used by other ARC-specific modules. */ diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index bfeb7a9..69a4a70 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -41614,7 +41614,8 @@ difference with @samp{org.gnu.gdb.arc.core.v2} feature is in the names of ARC v2, but @samp{ilink2} is optional on ARCompact. The @samp{org.gnu.gdb.arc.aux-minimal} feature is required for all ARC -targets. It should contain registers @samp{pc} and @samp{status32}. +targets. It should contain registers @samp{pc} and @samp{status32}. It may +contain registers @samp{lp_start}, @samp{lp_end} and @samp{bta}. @node ARM Features @subsection ARM Features -- 2.8.3 ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 2/3] arc: Recognize registers available on Linux targets 2017-10-11 14:56 ` [PATCH 2/3] arc: Recognize registers available on " Anton Kolesov @ 2017-10-21 8:23 ` Eli Zaretskii 0 siblings, 0 replies; 13+ messages in thread From: Eli Zaretskii @ 2017-10-21 8:23 UTC (permalink / raw) To: Anton Kolesov; +Cc: gdb-patches, Francois.Bedard > From: Anton Kolesov <Anton.Kolesov@synopsys.com> > Cc: Anton Kolesov <Anton.Kolesov@synopsys.com>, Francois Bedard <Francois.Bedard@synopsys.com> > Date: Wed, 11 Oct 2017 17:56:32 +0300 > > gdb/ChangeLog: > yyyy-mm-dd Anton Kolesov <Anton.Kolesov@synopsys.com> > > * arc-tdep.c (core_v2_register_names): Fix names of R58 and R59. > (aux_minimal_register_names): Add LP_START, LP_END and BTA. > (arc_tdesc_init): Recognize those registers. > * arc-tdep.h (arc_regnum): Add R58, R59, LP_START, LP_END and BTA. > (gdbarch_tdep): New field has_hw_loops. > > gdb/doc/ChangeLog: > yyyy-mm-dd Anton Kolesov <Anton.Kolesov@synopsys.com> > > * gdb.texinfo (Synopsys ARC): Document LP_START, LP_END and BTA. OK for the documentation part. (Sorry for the delay.) ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH 3/3] arc: Add GNU/Linux support for ARC 2017-10-11 14:56 [PATCH 1/3] arc: Add XML target descriptions for Linux targets Anton Kolesov 2017-10-11 14:56 ` [PATCH 2/3] arc: Recognize registers available on " Anton Kolesov @ 2017-10-11 14:56 ` Anton Kolesov 2017-10-12 1:29 ` [PATCH 1/3] arc: Add XML target descriptions for Linux targets Yao Qi 2 siblings, 0 replies; 13+ messages in thread From: Anton Kolesov @ 2017-10-11 14:56 UTC (permalink / raw) To: gdb-patches; +Cc: Anton Kolesov, Francois Bedard ARC Linux targets difference from baremetal: - Don't support hardware single instruction stepping. - Have different access rules to registers. - Use another instruction for breakpoints. yyyy-mm-dd Anton Kolesov <Anton.Kolesov@synopsys.com> * configure.tgt: ARC support for GNU/Linux. * Makefile.in (ALL_TARGET_OBJS): Likewise. * arc-linux-tdep.c: New file. * arc-tdep.h (ARC_STATUS32_L_MASK, ARC_STATUS32_DE_MASK): Declare. * arc-tdep.c (arc_write_pc): Use it. --- gdb/Makefile.in | 1 + gdb/arc-linux-tdep.c | 284 +++++++++++++++++++++++++++++++++++++++++++++++++++ gdb/arc-tdep.c | 3 +- gdb/arc-tdep.h | 5 + gdb/configure.tgt | 6 ++ 5 files changed, 297 insertions(+), 2 deletions(-) create mode 100644 gdb/arc-linux-tdep.c diff --git a/gdb/Makefile.in b/gdb/Makefile.in index 18e7750..51d2b01 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -792,6 +792,7 @@ ALL_64_TARGET_OBS = \ # All other target-dependent objects files (used with --enable-targets=all). ALL_TARGET_OBS = \ + arc-linux-tdep.o \ arc-tdep.o \ arch/arm.o \ arch/arm-get-next-pcs.o \ diff --git a/gdb/arc-linux-tdep.c b/gdb/arc-linux-tdep.c new file mode 100644 index 0000000..c090291 --- /dev/null +++ b/gdb/arc-linux-tdep.c @@ -0,0 +1,284 @@ +/* Target dependent code for GNU/Linux ARC. + + Copyright 2005-2017 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/>. */ + +/* GDB header files. */ +#include "defs.h" +#include "linux-tdep.h" +#include "objfiles.h" +#include "opcode/arc.h" +#include "osabi.h" +#include "solib-svr4.h" + +/* ARC header files. */ +#include "opcodes/arc-dis.h" +#include "arc-tdep.h" + +/* Implement the "cannot_fetch_register" gdbarch method. */ + +static int +arc_linux_cannot_fetch_register (struct gdbarch *gdbarch, int regnum) +{ + /* Assume that register is readable if it is unknown. */ + switch (regnum) + { + case ARC_ILINK_REGNUM: + case ARC_RESERVED_REGNUM: + case ARC_LIMM_REGNUM: + return TRUE; + case ARC_R30_REGNUM: + case ARC_R58_REGNUM: + case ARC_R59_REGNUM: + return !arc_mach_is_arcv2 (gdbarch); + } + if (regnum > ARC_BLINK_REGNUM && regnum < ARC_LP_COUNT_REGNUM) + return TRUE; + return FALSE; +} + +/* Implement the "cannot_store_register" gdbarch method. */ + +static int +arc_linux_cannot_store_register (struct gdbarch *gdbarch, int regnum) +{ + /* Assume that register is writable if it is unknown. */ + switch (regnum) + { + case ARC_ILINK_REGNUM: + case ARC_RESERVED_REGNUM: + case ARC_LIMM_REGNUM: + case ARC_PCL_REGNUM: + return TRUE; + case ARC_R30_REGNUM: + case ARC_R58_REGNUM: + case ARC_R59_REGNUM: + return !arc_mach_is_arcv2 (gdbarch); + } + if (regnum > ARC_BLINK_REGNUM && regnum < ARC_LP_COUNT_REGNUM) + return TRUE; + return FALSE; +} + +/* For ARC Linux, breakpoint uses the 16-bit TRAP_S 1 instruction, which + is 0x3e78 (little endian) or 0x783e (big endian). */ + +static const gdb_byte arc_linux_trap_s_be[] = { 0x78, 0x3e }; +static const gdb_byte arc_linux_trap_s_le[] = { 0x3e, 0x78 }; + +/* Implement the "breakpoint_kind_from_pc" gdbarch method. */ + +static int +arc_linux_breakpoint_kind_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr) +{ + return 2; +} + +/* Implement the "sw_breakpoint_from_kind" gdbarch method. */ + +static const gdb_byte * +arc_linux_sw_breakpoint_from_kind (struct gdbarch *gdbarch, int kind, int *size) +{ + + *size = kind; + return ((gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG) + ? arc_linux_trap_s_be + : arc_linux_trap_s_le); +} + +/* Implement the "software_single_step" gdbarch method. */ + +static std::vector<CORE_ADDR> +arc_linux_software_single_step (struct regcache *regcache) +{ + struct gdbarch *gdbarch = get_regcache_arch (regcache); + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + struct disassemble_info di = arc_disassemble_info (gdbarch); + + /* Read current instruction. */ + struct arc_instruction curr_insn; + arc_insn_decode (regcache_read_pc (regcache), &di, arc_delayed_print_insn, + &curr_insn); + CORE_ADDR next_pc = arc_insn_get_linear_next_pc (curr_insn); + + std::vector<CORE_ADDR> next_pcs; + + /* For instructions with delay slots, the fall thru is not the + instruction immediately after the current instruction, but the one + after that. */ + if (curr_insn.has_delay_slot) + { + struct arc_instruction next_insn; + arc_insn_decode (next_pc, &di, arc_delayed_print_insn, &next_insn); + next_pcs.push_back (arc_insn_get_linear_next_pc (next_insn)); + } + else + { + next_pcs.push_back (next_pc); + } + + ULONGEST status32; + regcache_cooked_read_unsigned (regcache, gdbarch_ps_regnum (gdbarch), + &status32); + + if (curr_insn.is_control_flow) + { + CORE_ADDR branch_pc = arc_insn_get_branch_target (curr_insn); + if (branch_pc != next_pc) + next_pcs.push_back (branch_pc); + } + /* Is current instruction the last in a loop body? */ + else if (tdep->has_hw_loops) + { + /* If STATUS32.L is 1, then ZD-loops are disabled. */ + if (!(status32 & ARC_STATUS32_L_MASK)) + { + ULONGEST lp_end, lp_start, lp_count; + regcache_cooked_read_unsigned (regcache, ARC_LP_START_REGNUM, + &lp_start); + regcache_cooked_read_unsigned (regcache, ARC_LP_END_REGNUM, &lp_end); + regcache_cooked_read_unsigned (regcache, ARC_LP_COUNT_REGNUM, + &lp_count); + + if (arc_debug) + { + debug_printf ("arc-linux: lp_start = %s, lp_end = %s, " + "lp_count = %s, next_pc = %s\n", + paddress (gdbarch, lp_start), + paddress (gdbarch, lp_end), + pulongest (lp_count), + paddress (gdbarch, next_pc)); + } + + if (next_pc == lp_end && lp_count > 1) + { + /* The instruction is in effect a jump back to the start of + the loop. */ + next_pcs.push_back (lp_start); + } + + } + } + + /* Is this a delay slot? Then next PC is in BTA register. */ + if (status32 & ARC_STATUS32_DE_MASK) + { + ULONGEST bta; + regcache_cooked_read_unsigned (regcache, ARC_BTA_REGNUM, &bta); + next_pcs.push_back (bta); + } + + return next_pcs; +} + +/* Implement the "skip_solib_resolver" gdbarch method. + + See glibc_skip_solib_resolver for details. */ + +static CORE_ADDR +arc_linux_skip_solib_resolver (struct gdbarch *gdbarch, CORE_ADDR pc) +{ + /* For uClibc 0.9.26+. + + An unresolved PLT entry points to "__dl_linux_resolve", which calls + "_dl_linux_resolver" to do the resolving and then eventually jumps to + the function. + + So we look for the symbol `_dl_linux_resolver', and if we are there, + gdb sets a breakpoint at the return address, and continues. */ + struct bound_minimal_symbol resolver = + lookup_minimal_symbol ("_dl_linux_resolver", NULL, NULL); + + if (arc_debug) + { + if (resolver.minsym) + { + CORE_ADDR res_addr = BMSYMBOL_VALUE_ADDRESS (resolver); + debug_printf ("arc-linux: skip_solib_resolver (): " + "pc = %s, resolver at %s\n", + print_core_address (gdbarch, pc), + print_core_address (gdbarch, res_addr)); + } + else + { + debug_printf ("arc-linux: skip_solib_resolver (): " + "pc = %s, no resolver found\n", + print_core_address (gdbarch, pc)); + } + } + + if (resolver.minsym && BMSYMBOL_VALUE_ADDRESS (resolver) == pc) + { + /* Find the return address. */ + return frame_unwind_caller_pc (get_current_frame ()); + } + else + { + /* No breakpoint required. */ + return 0; + } +} + +/* Initialization specific to Linux environment. */ + +static void +arc_linux_init_osabi (struct gdbarch_info info, struct gdbarch *gdbarch) +{ + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + + if (arc_debug) + debug_printf ("arc-linux: GNU/Linux OS/ABI initialization.\n"); + + /* If we are using Linux, we have in uClibc + (libc/sysdeps/linux/arc/bits/setjmp.h): + + typedef int __jmp_buf[13+1+1+1]; //r13-r25, fp, sp, blink + + Where "blink" is a stored PC of a caller function. + */ + tdep->jb_pc = 15; + + linux_init_abi (info, gdbarch); + + /* Set up target dependent GDB architecture entries. */ + set_gdbarch_cannot_fetch_register (gdbarch, arc_linux_cannot_fetch_register); + set_gdbarch_cannot_store_register (gdbarch, arc_linux_cannot_store_register); + set_gdbarch_breakpoint_kind_from_pc (gdbarch, + arc_linux_breakpoint_kind_from_pc); + set_gdbarch_sw_breakpoint_from_kind (gdbarch, + arc_linux_sw_breakpoint_from_kind); + set_gdbarch_fetch_tls_load_module_address (gdbarch, + svr4_fetch_objfile_link_map); + set_gdbarch_software_single_step (gdbarch, arc_linux_software_single_step); + set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target); + set_gdbarch_skip_solib_resolver (gdbarch, arc_linux_skip_solib_resolver); + + /* GNU/Linux uses SVR4-style shared libraries, with 32-bit ints, longs + and pointers (ILP32). */ + set_solib_svr4_fetch_link_map_offsets (gdbarch, + svr4_ilp32_fetch_link_map_offsets); +} + +/* Suppress warning from -Wmissing-prototypes. */ +extern initialize_file_ftype _initialize_arc_linux_tdep; + +void +_initialize_arc_linux_tdep (void) +{ + gdbarch_register_osabi (bfd_arch_arc, 0, GDB_OSABI_LINUX, + arc_linux_init_osabi); +} diff --git a/gdb/arc-tdep.c b/gdb/arc-tdep.c index 1643912..7a6fb91 100644 --- a/gdb/arc-tdep.c +++ b/gdb/arc-tdep.c @@ -462,8 +462,7 @@ arc_write_pc (struct regcache *regcache, CORE_ADDR new_pc) regcache_cooked_read_unsigned (regcache, gdbarch_ps_regnum (gdbarch), &status32); - /* Mask for DE bit is 0x40. */ - if (status32 & 0x40) + if (status32 & ARC_STATUS32_DE_MASK) { if (arc_debug) { diff --git a/gdb/arc-tdep.h b/gdb/arc-tdep.h index 4ea06f6..71174e6 100644 --- a/gdb/arc-tdep.h +++ b/gdb/arc-tdep.h @@ -97,6 +97,11 @@ enum arc_regnum Longer registers are represented as pairs of 32-bit registers. */ #define ARC_REGISTER_SIZE 4 +/* STATUS32 register: hardware loops disabled bit. */ +#define ARC_STATUS32_L_MASK (1 << 12) +/* STATUS32 register: current instruction is a delay slot. */ +#define ARC_STATUS32_DE_MASK (1 << 6) + #define arc_print(fmt, args...) fprintf_unfiltered (gdb_stdlog, fmt, ##args) extern int arc_debug; diff --git a/gdb/configure.tgt b/gdb/configure.tgt index f8677b4..ca8aad8 100644 --- a/gdb/configure.tgt +++ b/gdb/configure.tgt @@ -149,6 +149,12 @@ arc*-*-elf32) gdb_target_obs="arc-newlib-tdep.o" ;; +arc*-*-linux*) + # Target: ARC machine running Linux + gdb_target_obs="arc-linux-tdep.o linux-tdep.o solib-svr4.o" + build_gdbserver=yes + ;; + arm*-wince-pe | arm*-*-mingw32ce*) # Target: ARM based machine running Windows CE (win32) gdb_target_obs="arm-wince-tdep.o windows-tdep.o" -- 2.8.3 ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 1/3] arc: Add XML target descriptions for Linux targets 2017-10-11 14:56 [PATCH 1/3] arc: Add XML target descriptions for Linux targets Anton Kolesov 2017-10-11 14:56 ` [PATCH 2/3] arc: Recognize registers available on " Anton Kolesov 2017-10-11 14:56 ` [PATCH 3/3] arc: Add GNU/Linux support for ARC Anton Kolesov @ 2017-10-12 1:29 ` Yao Qi 2017-10-18 15:06 ` Anton Kolesov ` (5 more replies) 2 siblings, 6 replies; 13+ messages in thread From: Yao Qi @ 2017-10-12 1:29 UTC (permalink / raw) To: Anton Kolesov; +Cc: gdb-patches, Francois Bedard On 17-10-11 17:56:31, Anton Kolesov wrote: > Add XML target descriptions for Linux targets. Compared to default Hi, I am converting existing GDB target descriptions in a more flexible way to organize them. I've done the x86 target descriptions, and slowly converting tic6x and nios2 target descriptions. Could you please convert existing arc target descriptions first? It is definitely helpful to simplify this patch. I had a talk about my work in Cauldron. https://slideslive.com/38902354/a-flexible-gdb-target-description-for-processor-diversity If you want to convert existing arc target descriptions, I am happy to share some steps to do that. > Linux descriptions: > > - Explicitly specify CPU machine. > - Remove baremetal only ILINK{,1,2} registers. > - Add LP_START and LP_END registers for hardware loops - required to properly > evaluate possible next instruction during software single instruction > stepping. > - Add BTA register which contains branch target address - address of next > instruction when processor is in the delay slot. > - ARC HS description also adds R30, R58 and R59 registers, specific to this > architecture. IMO, it is not a good practise to linux and non-linux target descriptions have target features of the same name, but same target features have trivial differences, as you described above. The common practise we did is to define each target feature xml file, and use xi:include to "include" each target feature into target description. All existing target descriptions follow this approach. > > gdb/ChangeLog: > yyyy-mm-dd Anton Kolesov <Anton.Kolesov@synopsys.com> > > * arc-tdep (arc_tdesc_init): Use tdesc_arc_arcompact_linux and > tdesc_arc_v2_linux. > (_initialize_arc_tdep): Invoke initialize_tdesc_arc_v2_linux and > initialize_tdesc_arc_arcompact_linux. > * features/Makefile: Add targets to generate new files. > * features/arc-arcompact-linux.xml: New file. > * features/arc-v2-linux.xml: Likewise. > * features/arc-arcompact-linux.c: Generate. > * features/arc-v2-linux.c: Likewise. > * regformats/arc-arcompact-linux.dat: Likewise. > * regformats/arc-v2-linux.dat: Likewise. > --- > gdb/arc-tdep.c | 17 ++++++- > gdb/features/Makefile | 5 ++ > gdb/features/arc-arcompact-linux.c | 76 ++++++++++++++++++++++++++++ > gdb/features/arc-arcompact-linux.xml | 84 +++++++++++++++++++++++++++++++ > gdb/features/arc-v2-linux.c | 83 +++++++++++++++++++++++++++++++ > gdb/features/arc-v2-linux.xml | 91 ++++++++++++++++++++++++++++++++++ > gdb/regformats/arc-arcompact-linux.dat | 42 ++++++++++++++++ > gdb/regformats/arc-v2-linux.dat | 45 +++++++++++++++++ > 8 files changed, 441 insertions(+), 2 deletions(-) > create mode 100644 gdb/features/arc-arcompact-linux.c > create mode 100644 gdb/features/arc-arcompact-linux.xml > create mode 100644 gdb/features/arc-v2-linux.c > create mode 100644 gdb/features/arc-v2-linux.xml > create mode 100644 gdb/regformats/arc-arcompact-linux.dat > create mode 100644 gdb/regformats/arc-v2-linux.dat > > diff --git a/gdb/arc-tdep.c b/gdb/arc-tdep.c > index 771d6df..a825917 100644 > --- a/gdb/arc-tdep.c > +++ b/gdb/arc-tdep.c > @@ -42,6 +42,8 @@ > /* Default target descriptions. */ > #include "features/arc-v2.c" > #include "features/arc-arcompact.c" > +#include "features/arc-v2-linux.c" > +#include "features/arc-arcompact-linux.c" > > /* The frame unwind cache for ARC. */ > > @@ -1799,13 +1801,22 @@ arc_tdesc_init (struct gdbarch_info info, const struct target_desc **tdesc, > { > if (is_arcv2) > { > - tdesc_loc = tdesc_arc_v2; > + /* Usually Linux-specific target description would be provided by > + the gdbserver, but it has to be selected manually when debugging > + core files. */ You need to implement gdbarch method core_read_description in arc-linux-tdep.c to return the right linux target description. It doesn't make much sense to pull in linux target description into arc-tdep.c. > + if (info.osabi == GDB_OSABI_LINUX) > + tdesc_loc = tdesc_arc_v2_linux; > + else > + 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 (info.osabi == GDB_OSABI_LINUX) > + tdesc_loc = tdesc_arc_arcompact_linux; > + else > + tdesc_loc = tdesc_arc_arcompact; > if (arc_debug) > debug_printf ("arc: Using default register set for ARCompact.\n"); > } > @@ -2172,6 +2183,8 @@ _initialize_arc_tdep (void) > > initialize_tdesc_arc_v2 (); > initialize_tdesc_arc_arcompact (); > + initialize_tdesc_arc_v2_linux (); > + initialize_tdesc_arc_arcompact_linux (); > > /* Register ARC-specific commands with gdb. */ > > diff --git a/gdb/features/Makefile b/gdb/features/Makefile > index 8a7f377..8d5e3d3 100644 > --- a/gdb/features/Makefile > +++ b/gdb/features/Makefile > @@ -44,6 +44,7 @@ > # make GDB=/path/to/gdb XMLTOC="xml files" cfiles > > WHICH = aarch64 \ > + arc-v2-linux arc-arcompact-linux \ WHICH is used to generate *.dat file from *.xml file. *.dat files are used to generate *.c files for GDBserver. We don't have arc-linux GDBserver support in this patch, don't need to include this change. This change can be included in your GDBserver support patches, if you have. > arm/arm-with-iwmmxt arm/arm-with-vfpv2 arm/arm-with-vfpv3 \ > arm/arm-with-neon \ > i386/i386 i386/i386-linux \ > @@ -84,6 +85,8 @@ WHICH = aarch64 \ > > # Record which registers should be sent to GDB by default after stop. > aarch64-expedite = x29,sp,pc > +arc-v2-linux-expedite = sp,pc > +arc-arcompact-linux-expedite = sp,pc Again, this is used by GDBserver, don't need this change now. Also, gdb/features/Makefile have something magic that you only need to define a generic one, arc-expedite = sp,pc. -- Yao (é½å°§) ^ permalink raw reply [flat|nested] 13+ messages in thread
* RE: [PATCH 1/3] arc: Add XML target descriptions for Linux targets 2017-10-12 1:29 ` [PATCH 1/3] arc: Add XML target descriptions for Linux targets Yao Qi @ 2017-10-18 15:06 ` Anton Kolesov 2017-10-18 17:33 ` Anton Kolesov ` (4 subsequent siblings) 5 siblings, 0 replies; 13+ messages in thread From: Anton Kolesov @ 2017-10-18 15:06 UTC (permalink / raw) To: Yao Qi, Anton Kolesov; +Cc: gdb-patches, Francois Bedard Hi Yao, > -----Original Message----- > From: Yao Qi [mailto:qiyaoltc@gmail.com] > Sent: Thursday, October 12, 2017 4:29 > To: Anton Kolesov <Anton.Kolesov@synopsys.com> > Cc: gdb-patches@sourceware.org; Francois Bedard > <Francois.Bedard@synopsys.com> > Subject: Re: [PATCH 1/3] arc: Add XML target descriptions for Linux targets > > On 17-10-11 17:56:31, Anton Kolesov wrote: > > Add XML target descriptions for Linux targets. Compared to default > > Hi, > I am converting existing GDB target descriptions in a more flexible way to > organize them. I've done the x86 target descriptions, and slowly converting > tic6x and nios2 target descriptions. Could you please convert existing arc > target descriptions first? It is definitely helpful to simplify this patch. I had a > talk about my work in Cauldron. > https://urldefense.proofpoint.com/v2/url?u=https- > 3A__slideslive.com_38902354_a-2Dflexible-2Dgdb-2Dtarget-2Ddescription- > 2Dfor-2Dprocessor- > 2Ddiversity&d=DwIDaQ&c=DPL6_X_6JkXFx7AXWqB0tg&r=bGeZp_Q7bzMjry > uhhu0vBa43pSPPzpiFmLmHs_6WFqE&m=MppHij0o6FxrwL3TgkCMii1KKmHt_ > nSJaMNwdq8BcUk&s=XrFH1QC31ZrbgC4h4uHLGWxV6YuN5Nz2Q_rGtBg2k_k > &e= > If you want to convert existing arc target descriptions, I am happy to share > some steps to do that. > > > Linux descriptions: > > > > - Explicitly specify CPU machine. > > - Remove baremetal only ILINK{,1,2} registers. > > - Add LP_START and LP_END registers for hardware loops - required to > properly > > evaluate possible next instruction during software single instruction > > stepping. > > - Add BTA register which contains branch target address - address of next > > instruction when processor is in the delay slot. > > - ARC HS description also adds R30, R58 and R59 registers, specific to this > > architecture. > > IMO, it is not a good practise to linux and non-linux target descriptions have > target features of the same name, but same target features have trivial > differences, as you described above. The common practise we did is to > define each target feature xml file, and use xi:include to "include" > each target feature into target description. All existing target descriptions > follow this approach. > If I extract R58, R59 and ILINK/R29 into separate features that would multiple problems: - order of registers in "info registers" will not match architectural numbers of registers. - that would add two XML features because of three registers. Considering amount of code that is needed for each feature it doesn't look like a good tradeoff. Especially since this should be propogated to each and every gdbserver that works with ARC.to produce XML target descriptions that match GDB expectations - almost all of them generate descriptions based on what are the actual registers in the target CPU - gdbserver in GDB is the only one that uses files from gdb/features/. - and that still before we tackle the true complexity of ARC: there are extension core registers R32-R57 that can be added by hardware designers; there is a "reduced register file" configuration where many core registers are removed, but there are two groups of registers removed, so extracting them into separate features would also break order of register (R4 will be after R31, etc). - in addition for each XML feature there is a need to create separate code in arc_gdbarch_init, and feature-reading code tends to be a verbose copy paste with minor edits, so removal of copy-paste in XML files adds more copy paste in GDB code and even more complexity at the side of gdbserver (and some gdbservers are not maintained by Synopsys, so updating them is complicated), so having "fixed" XML features always looked to me like a bad idea for the case of ARC. That's why I've historically decided to If I extract R58, R59 and ILINK/R29 into separate features, then registers will lose their order in "info registers", so R29 will be after R30, blink/R31 or loop_counter/R60. Furthermore, if we extend the paradigm that feature should have a fixed set of register, then things go very bad if we consider a reduced register set configuration for ARC (16 core registers instead of 32) - it creates more holes in the feature. So there would be feature for always-present registers (R0-R3, R10-R15, R26-R28, R30-R31, R63), then registers added in normal configuration (R4-R9, R16-R25), then separate features for R29/ILINK, for R58+R59, for LP_COUNT/R60 (strictly speaking it is optional, though it almost always present). Things get even more complicated if we consider that chip designer can add their own extension registers R32-R57. One option is of course to just add separate XML features for each group of registers to make sure that order of registers in GDB matches architectural order, or to write a more complex logic in the arc_gdbarch_init so it would interleave scanning of different features to maintain order. Even if we ignore reduced register set case and ordering of registers, it means that I need to split "core" feature into: - always present: R0 - R28, BLINK, LP_COUNT, PCL - present at baremetal only : R29 - multiplier (present at Linux, maybe present at baremetal): R58, R59 - flexible feature for extension core registers, that allows to insert R30-R57 when any one is present. Then those changes should be implemented in several GDBservers that work with ARC (most of them generate their own XML target description based on what registers are actually present or not present in the target CPU) ^ permalink raw reply [flat|nested] 13+ messages in thread
* RE: [PATCH 1/3] arc: Add XML target descriptions for Linux targets 2017-10-12 1:29 ` [PATCH 1/3] arc: Add XML target descriptions for Linux targets Yao Qi 2017-10-18 15:06 ` Anton Kolesov @ 2017-10-18 17:33 ` Anton Kolesov 2017-10-26 11:40 ` [PATCH v2 2/4] arc: Add XML target features " Anton Kolesov ` (3 subsequent siblings) 5 siblings, 0 replies; 13+ messages in thread From: Anton Kolesov @ 2017-10-18 17:33 UTC (permalink / raw) To: Yao Qi; +Cc: gdb-patches, Francois Bedard Hi Yao, (This is a right email this time). > > > Linux descriptions: > > > > - Explicitly specify CPU machine. > > - Remove baremetal only ILINK{,1,2} registers. > > - Add LP_START and LP_END registers for hardware loops - required to > properly > > evaluate possible next instruction during software single instruction > > stepping. > > - Add BTA register which contains branch target address - address of next > > instruction when processor is in the delay slot. > > - ARC HS description also adds R30, R58 and R59 registers, specific to this > > architecture. > > IMO, it is not a good practise to linux and non-linux target descriptions have > target features of the same name, but same target features have trivial > differences, as you described above. The common practise we did is to > define each target feature xml file, and use xi:include to "include" > each target feature into target description. All existing target descriptions > follow this approach. > If I extract R58, R59 and ILINK/R29 into separate features that would create multiple problems: - order of registers in "info registers" will not match architectural numbers of registers. - that would add two XML features because of just three registers. Considering amount of code that is needed in *-tdep.c files for each feature it doesn't look like a good trade off. Especially since this should be propagated to each and every RSP-server that works with ARC, so that they will produce XML target descriptions that matches GDB expectations - almost all of them generate descriptions based on what are the actual registers in the target CPU - RSP-server in GDB is the only one that uses files from gdb/features/. So adding new features to make sure that each feature is fixed in its content will add a lot of code overall, but I’m not sure what would be an advantage of this. GDB accepts arbitrary XML features, but explicit C++-code still should be written for an XML feature if there is a need for alternative names or a specific internal number for a register. - and things get worse if we consider other optional registers in ARC: there are extension core registers R32-R57 that can be added by hardware designers; there is a "reduced register file" configuration where many core registers are removed, but there are two groups of registers removed, so extracting them into separate features would also break order of register (R4 will be after R31, etc). That's why in the past I've decided that it is better to have few features, but allow content of features to be flexible - that allows for simple implementation in GDB, RSP-servers and also helped with transition from the pre-XML target descriptions system that was used in GDB fork for ARC. Creating strict features for ARC baseline registers always looked to me us a feasible, but an unnecessarily complex task without clear benefit. Many of ARC registers (not mentioned in GDB anywhere) can be grouped into features successfully, but the core register set doesn't map well into XML features, I think, because there is so much of intermix between optional and non-optional registers. Things would be easier if it would be possible to include another XML file without having a separate feature in that file. What, I think, I can do is to designate a separate XML feature for Linux, so that the content will not clash with a generic "core.arcv2" feature. List of registers available on Linux is fairly certain and fixed, because it depends on Linux rather than on hardware and our Linux port support only certain CPU configuration. Plus there is only one GDBserver for Linux targets and it is a part of GDB itself. However that would be a single feature, so it still will not be able to include registers written in other xml files. But for baremetal I'd prefer to keep the current XML features that allow for semi-arbitrary list of registers, especially since I need to maintain compatibility with existing RSP-servers. Anton ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH v2 2/4] arc: Add XML target features for Linux targets 2017-10-12 1:29 ` [PATCH 1/3] arc: Add XML target descriptions for Linux targets Yao Qi 2017-10-18 15:06 ` Anton Kolesov 2017-10-18 17:33 ` Anton Kolesov @ 2017-10-26 11:40 ` Anton Kolesov 2017-10-26 11:40 ` [PATCH v2 3/4] arc: Recognize registers available on " Anton Kolesov ` (2 subsequent siblings) 5 siblings, 0 replies; 13+ messages in thread From: Anton Kolesov @ 2017-10-26 11:40 UTC (permalink / raw) To: gdb-patches; +Cc: Anton Kolesov, Francois Bedard Add XML target features for Linux targets. Compared to default Linux features: - Explicitly specify CPU machine. - Remove baremetal only ILINK{,1,2} registers. - Add LP_START and LP_END registers for hardware loops - required to properly evaluate possible next instruction during software single instruction stepping. - Add BTA register which contains branch target address - address of next instruction when processor is in the delay slot. - ARC HS description also adds R30, R58 and R59 registers, specific to this architecture. gdb/ChangeLog: yyyy-mm-dd Anton Kolesov <Anton.Kolesov@synopsys.com> * arch/arc.h (arc_create_target_description): Support Linux targets. * arch/arc.c (arc_create_target_description): Likewise. * arc-tdep.c (arc_tdesc_init): Update invocation of arc_create_target_description. * features/Makefile (FEATURE_XMLFILES): Add new files. * features/arc/aux-arcompact-linux.xml: New file. * features/arc/aux-v2-linux.xml: Likewise. * features/arc/core-arcompact-linux.xml: Likewise. * features/arc/core-v2-linux.xml: Likewise. * features/arc/aux-arcompact-linux.c: Generate. * features/arc/aux-v2-linux.c: Likewise. * features/arc/core-arcompact-linux.c: Likewise. * features/arc/core-v2-linux.c: Likewise. --- gdb/arc-tdep.c | 2 +- gdb/arch/arc.c | 42 +++++++++++++++++----- gdb/arch/arc.h | 3 +- gdb/features/Makefile | 4 +++ gdb/features/arc/aux-arcompact-linux.c | 35 +++++++++++++++++++ gdb/features/arc/aux-arcompact-linux.xml | 31 +++++++++++++++++ gdb/features/arc/aux-v2-linux.c | 39 +++++++++++++++++++++ gdb/features/arc/aux-v2-linux.xml | 35 +++++++++++++++++++ gdb/features/arc/core-arcompact-linux.c | 45 ++++++++++++++++++++++++ gdb/features/arc/core-arcompact-linux.xml | 56 +++++++++++++++++++++++++++++ gdb/features/arc/core-v2-linux.c | 48 +++++++++++++++++++++++++ gdb/features/arc/core-v2-linux.xml | 58 +++++++++++++++++++++++++++++++ 12 files changed, 388 insertions(+), 10 deletions(-) create mode 100644 gdb/features/arc/aux-arcompact-linux.c create mode 100644 gdb/features/arc/aux-arcompact-linux.xml create mode 100644 gdb/features/arc/aux-v2-linux.c create mode 100644 gdb/features/arc/aux-v2-linux.xml create mode 100644 gdb/features/arc/core-arcompact-linux.c create mode 100644 gdb/features/arc/core-arcompact-linux.xml create mode 100644 gdb/features/arc/core-v2-linux.c create mode 100644 gdb/features/arc/core-v2-linux.xml diff --git a/gdb/arc-tdep.c b/gdb/arc-tdep.c index 6ed30da..2782535 100644 --- a/gdb/arc-tdep.c +++ b/gdb/arc-tdep.c @@ -1792,7 +1792,7 @@ arc_tdesc_init (struct gdbarch_info info, const struct target_desc **tdesc, /* If target doesn't provide a description - use default one. */ if (!tdesc_has_registers (tdesc_loc)) { - tdesc_loc = arc_create_target_description (arc_debug, is_arcv2); + tdesc_loc = arc_create_target_description (arc_debug, is_arcv2, false); } else { diff --git a/gdb/arch/arc.c b/gdb/arch/arc.c index 8f0d8d6..f0da408 100644 --- a/gdb/arch/arc.c +++ b/gdb/arch/arc.c @@ -24,46 +24,72 @@ /* Target description features. */ #include "features/arc/core-v2.c" #include "features/arc/aux-v2.c" +#include "features/arc/core-v2-linux.c" +#include "features/arc/aux-v2-linux.c" #include "features/arc/core-arcompact.c" #include "features/arc/aux-arcompact.c" +#include "features/arc/core-arcompact-linux.c" +#include "features/arc/aux-arcompact-linux.c" /* Create target description for a target with specified parameters. PRINT_DEBUG defines whether to print debug messages to the stderr stream. IS_ARCV2 defines if this is an ARCv2 (ARC EM or ARC HS) target or ARCompact (ARC600 or ARC700); there is no use for more specific information about - target processor. */ + target processor. IS_LINUX defines if this is a Linux target or not. */ target_desc * -arc_create_target_description (bool print_debug, bool is_arcv2) +arc_create_target_description (bool print_debug, bool is_arcv2, bool is_linux) { target_desc *tdesc = allocate_target_description (); if (print_debug) debug_printf ("arc: Creating target description, " - "is_arcv2=%i\n", is_arcv2); + "is_arcv2=%i, is_linux=%i\n", is_arcv2, is_linux); long regnum = 0; #ifndef IN_PROCESS_AGENT if (is_arcv2) { - set_tdesc_architecture (tdesc, "arc:ARCv2"); + if (is_linux) + /* If this is ARCv2 Linux, then it is ARC HS. */ + set_tdesc_architecture (tdesc, "arc:HS"); + else + set_tdesc_architecture (tdesc, "arc:ARCv2"); } else { set_tdesc_architecture (tdesc, "arc:ARC700"); } + if (is_linux) + set_tdesc_osabi (tdesc, "GNU/Linux"); #endif if (is_arcv2) { - regnum = create_feature_arc_core_v2 (tdesc, regnum); - regnum = create_feature_arc_aux_v2 (tdesc, regnum); + if (is_linux) + { + regnum = create_feature_arc_core_v2_linux (tdesc, regnum); + regnum = create_feature_arc_aux_v2_linux (tdesc, regnum); + } + else + { + regnum = create_feature_arc_core_v2 (tdesc, regnum); + regnum = create_feature_arc_aux_v2 (tdesc, regnum); + } } else { - regnum = create_feature_arc_core_arcompact (tdesc, regnum); - regnum = create_feature_arc_aux_arcompact (tdesc, regnum); + if (is_linux) + { + regnum = create_feature_arc_core_arcompact_linux (tdesc, regnum); + regnum = create_feature_arc_aux_arcompact_linux (tdesc, regnum); + } + else + { + regnum = create_feature_arc_core_arcompact (tdesc, regnum); + regnum = create_feature_arc_aux_arcompact (tdesc, regnum); + } } return tdesc; diff --git a/gdb/arch/arc.h b/gdb/arch/arc.h index 2d1828e..70b5b52 100644 --- a/gdb/arch/arc.h +++ b/gdb/arch/arc.h @@ -17,5 +17,6 @@ #include "tdesc.h" -target_desc *arc_create_target_description (bool print_debug, bool is_arcv2); +target_desc *arc_create_target_description (bool print_debug, bool is_arcv2, + bool is_linux); diff --git a/gdb/features/Makefile b/gdb/features/Makefile index e30a8bd..f12e0ff 100644 --- a/gdb/features/Makefile +++ b/gdb/features/Makefile @@ -208,8 +208,12 @@ $(outdir)/%.dat: %.xml number-regs.xsl sort-regs.xsl gdbserver-regs.xsl FEATURE_XMLFILES = \ arc/core-v2.xml \ arc/aux-v2.xml \ + arc/core-v2-linux.xml \ + arc/aux-v2-linux.xml \ arc/core-arcompact.xml \ arc/aux-arcompact.xml \ + arc/core-arcompact-linux.xml \ + arc/aux-arcompact-linux.xml \ i386/32bit-core.xml \ i386/32bit-sse.xml \ i386/32bit-linux.xml \ diff --git a/gdb/features/arc/aux-arcompact-linux.c b/gdb/features/arc/aux-arcompact-linux.c new file mode 100644 index 0000000..998929e --- /dev/null +++ b/gdb/features/arc/aux-arcompact-linux.c @@ -0,0 +1,35 @@ +/* THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi:set ro: + Original: aux-arcompact-linux.xml */ + +#include "arch/tdesc.h" + +static int +create_feature_arc_aux_arcompact_linux (struct target_desc *result, long regnum) +{ + struct tdesc_feature *feature; + + feature = tdesc_create_feature (result, "org.gnu.gdb.arc.aux-minimal", "aux-arcompact-linux.xml"); + struct tdesc_type *field_type; + struct tdesc_type *type; + type = tdesc_create_flags (feature, "status32_type", 4); + tdesc_add_flag (type, 0, "H"); + tdesc_add_bitfield (type, "E", 1, 2); + tdesc_add_bitfield (type, "A", 3, 4); + tdesc_add_flag (type, 5, "AE"); + tdesc_add_flag (type, 6, "DE"); + tdesc_add_flag (type, 7, "U"); + tdesc_add_flag (type, 8, "V"); + tdesc_add_flag (type, 9, "C"); + tdesc_add_flag (type, 10, "N"); + tdesc_add_flag (type, 11, "Z"); + tdesc_add_flag (type, 12, "L"); + tdesc_add_flag (type, 13, "R"); + tdesc_add_flag (type, 14, "SE"); + + tdesc_create_reg (feature, "pc", regnum++, 1, NULL, 32, "code_ptr"); + tdesc_create_reg (feature, "status32", regnum++, 1, NULL, 32, "status32_type"); + tdesc_create_reg (feature, "lp_start", regnum++, 1, NULL, 32, "code_ptr"); + tdesc_create_reg (feature, "lp_end", regnum++, 1, NULL, 32, "code_ptr"); + tdesc_create_reg (feature, "bta", regnum++, 1, NULL, 32, "code_ptr"); + return regnum; +} diff --git a/gdb/features/arc/aux-arcompact-linux.xml b/gdb/features/arc/aux-arcompact-linux.xml new file mode 100644 index 0000000..2dc0a67 --- /dev/null +++ b/gdb/features/arc/aux-arcompact-linux.xml @@ -0,0 +1,31 @@ +<?xml version="1.0"?> +<!-- Copyright (C) 2017 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"/> + <reg name="lp_start" bitsize="32" type="code_ptr"/> + <reg name="lp_end" bitsize="32" type="code_ptr"/> + <reg name="bta" bitsize="32" type="code_ptr"/> +</feature> diff --git a/gdb/features/arc/aux-v2-linux.c b/gdb/features/arc/aux-v2-linux.c new file mode 100644 index 0000000..48b1550 --- /dev/null +++ b/gdb/features/arc/aux-v2-linux.c @@ -0,0 +1,39 @@ +/* THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi:set ro: + Original: aux-v2-linux.xml */ + +#include "arch/tdesc.h" + +static int +create_feature_arc_aux_v2_linux (struct target_desc *result, long regnum) +{ + struct tdesc_feature *feature; + + feature = tdesc_create_feature (result, "org.gnu.gdb.arc.aux-minimal", "aux-v2-linux.xml"); + struct tdesc_type *field_type; + struct tdesc_type *type; + type = tdesc_create_flags (feature, "status32_type", 4); + tdesc_add_flag (type, 0, "H"); + tdesc_add_bitfield (type, "E", 1, 4); + tdesc_add_flag (type, 5, "AE"); + tdesc_add_flag (type, 6, "DE"); + tdesc_add_flag (type, 7, "U"); + tdesc_add_flag (type, 8, "V"); + tdesc_add_flag (type, 9, "C"); + tdesc_add_flag (type, 10, "N"); + tdesc_add_flag (type, 11, "Z"); + tdesc_add_flag (type, 12, "L"); + tdesc_add_flag (type, 13, "DZ"); + tdesc_add_flag (type, 14, "SC"); + tdesc_add_flag (type, 15, "ES"); + tdesc_add_bitfield (type, "RB", 16, 18); + tdesc_add_flag (type, 19, "AD"); + tdesc_add_flag (type, 20, "US"); + tdesc_add_flag (type, 31, "IE"); + + tdesc_create_reg (feature, "pc", regnum++, 1, NULL, 32, "code_ptr"); + tdesc_create_reg (feature, "status32", regnum++, 1, NULL, 32, "status32_type"); + tdesc_create_reg (feature, "lp_start", regnum++, 1, NULL, 32, "code_ptr"); + tdesc_create_reg (feature, "lp_end", regnum++, 1, NULL, 32, "code_ptr"); + tdesc_create_reg (feature, "bta", regnum++, 1, NULL, 32, "code_ptr"); + return regnum; +} diff --git a/gdb/features/arc/aux-v2-linux.xml b/gdb/features/arc/aux-v2-linux.xml new file mode 100644 index 0000000..d85b577 --- /dev/null +++ b/gdb/features/arc/aux-v2-linux.xml @@ -0,0 +1,35 @@ +<?xml version="1.0"?> +<!-- Copyright (C) 2017 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"/> + <reg name="lp_start" bitsize="32" type="code_ptr"/> + <reg name="lp_end" bitsize="32" type="code_ptr"/> + <reg name="bta" bitsize="32" type="code_ptr"/> +</feature> diff --git a/gdb/features/arc/core-arcompact-linux.c b/gdb/features/arc/core-arcompact-linux.c new file mode 100644 index 0000000..9ccefe3 --- /dev/null +++ b/gdb/features/arc/core-arcompact-linux.c @@ -0,0 +1,45 @@ +/* THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi:set ro: + Original: core-arcompact-linux.xml */ + +#include "arch/tdesc.h" + +static int +create_feature_arc_core_arcompact_linux (struct target_desc *result, long regnum) +{ + struct tdesc_feature *feature; + + feature = tdesc_create_feature (result, "org.gnu.gdb.arc.core.arcompact", "core-arcompact-linux.xml"); + tdesc_create_reg (feature, "r0", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r1", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r2", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r3", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r4", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r5", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r6", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r7", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r8", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r9", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r10", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r11", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r12", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r13", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r14", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r15", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r16", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r17", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r18", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r19", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r20", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r21", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r22", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r23", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r24", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r25", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "gp", regnum++, 1, NULL, 32, "data_ptr"); + tdesc_create_reg (feature, "fp", regnum++, 1, NULL, 32, "data_ptr"); + tdesc_create_reg (feature, "sp", regnum++, 1, NULL, 32, "data_ptr"); + tdesc_create_reg (feature, "blink", regnum++, 1, NULL, 32, "code_ptr"); + tdesc_create_reg (feature, "lp_count", regnum++, 1, NULL, 32, "uint32"); + tdesc_create_reg (feature, "pcl", regnum++, 1, "", 32, "code_ptr"); + return regnum; +} diff --git a/gdb/features/arc/core-arcompact-linux.xml b/gdb/features/arc/core-arcompact-linux.xml new file mode 100644 index 0000000..53183a3 --- /dev/null +++ b/gdb/features/arc/core-arcompact-linux.xml @@ -0,0 +1,56 @@ +<?xml version="1.0"?> +<!-- Copyright (C) 2017 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="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-linux.c b/gdb/features/arc/core-v2-linux.c new file mode 100644 index 0000000..780986b --- /dev/null +++ b/gdb/features/arc/core-v2-linux.c @@ -0,0 +1,48 @@ +/* THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi:set ro: + Original: core-v2-linux.xml */ + +#include "arch/tdesc.h" + +static int +create_feature_arc_core_v2_linux (struct target_desc *result, long regnum) +{ + struct tdesc_feature *feature; + + feature = tdesc_create_feature (result, "org.gnu.gdb.arc.core.v2", "core-v2-linux.xml"); + tdesc_create_reg (feature, "r0", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r1", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r2", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r3", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r4", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r5", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r6", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r7", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r8", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r9", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r10", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r11", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r12", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r13", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r14", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r15", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r16", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r17", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r18", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r19", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r20", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r21", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r22", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r23", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r24", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r25", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "gp", regnum++, 1, NULL, 32, "data_ptr"); + tdesc_create_reg (feature, "fp", regnum++, 1, NULL, 32, "data_ptr"); + tdesc_create_reg (feature, "sp", regnum++, 1, NULL, 32, "data_ptr"); + tdesc_create_reg (feature, "r30", regnum++, 1, "", 32, "int"); + tdesc_create_reg (feature, "blink", regnum++, 1, NULL, 32, "code_ptr"); + tdesc_create_reg (feature, "r58", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r59", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "lp_count", regnum++, 1, NULL, 32, "uint32"); + tdesc_create_reg (feature, "pcl", regnum++, 1, "", 32, "code_ptr"); + return regnum; +} diff --git a/gdb/features/arc/core-v2-linux.xml b/gdb/features/arc/core-v2-linux.xml new file mode 100644 index 0000000..c400874 --- /dev/null +++ b/gdb/features/arc/core-v2-linux.xml @@ -0,0 +1,58 @@ +<?xml version="1.0"?> +<!-- Copyright (C) 2017 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"/> + + <reg name="r30" bitsize="32" group=""/> + <reg name="blink" bitsize="32" type="code_ptr"/> + + <!-- Here goes extension core registers: r32 - r57. --> + <reg name="r58" bitsize="32"/> + <reg name="r59" bitsize="32"/> + + <!-- 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> -- 2.8.3 ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH v2 3/4] arc: Recognize registers available on Linux targets 2017-10-12 1:29 ` [PATCH 1/3] arc: Add XML target descriptions for Linux targets Yao Qi ` (2 preceding siblings ...) 2017-10-26 11:40 ` [PATCH v2 2/4] arc: Add XML target features " Anton Kolesov @ 2017-10-26 11:40 ` Anton Kolesov 2017-10-26 16:02 ` Eli Zaretskii 2017-10-26 11:40 ` [PATCH v2 1/4] arc: Migrate to new target features Anton Kolesov 2017-10-26 11:40 ` [PATCH v2 4/4] arc: Add GNU/Linux support for ARC Anton Kolesov 5 siblings, 1 reply; 13+ messages in thread From: Anton Kolesov @ 2017-10-26 11:40 UTC (permalink / raw) To: gdb-patches; +Cc: Anton Kolesov, Francois Bedard For ARC there are registers that are not part of a required set in XML target descriptions by default, but which are almost always present on ARC targets and are universally exposed by the ptrace interface. This patch adds those registers to those recognized by GDB: - R30 - core register available in user-space on ARC HS processors only (used to be a privileged only ILINK2 on ARC700). - R58, R59 - accumulator register pair for a 64-multiplier and double-precision FPU - only on ARC HS. - LP_START, LP_END - AUX registers, hardware loop start and end. Formally optional, though it is hard to find ARC configuration that doesn't have them and is always present in processors that can run Linux. GDB needs to know about those registers to implement proper software single stepping, since they affect what instruction will be next. - BTA - AUX register that contains branch target address. Value of this register makes sense only when execution halts at the delay slot instruction - in this case branch instruction is already committed, STATUS32.DE is set to 1 and BTA contains address of next PC. GDB needs to understand this register to properly handle situations when breakpoint has been set in the delay slot (delay slot is stepped over when doing software single stepping). Unfortunately, right now this doesn't work very well, because Linux doesn't allow modifications of STATUS32 via ptrace and Linux uses TRAP_S instruction to implement software breakpoints - this instruction commits when executed, therefore when TRAP_S is set in the delay slot and execution halts at it, PC is already advanced to BTA value and STATUS32.DE is reset. BTA register will be more useful for debugger after support for SWI instruction will be added to ARC Linux - this breakpoint instruction doesn't commit, hence it doesn't change processor state. gdb/ChangeLog: yyyy-mm-dd Anton Kolesov <Anton.Kolesov@synopsys.com> * arc-tdep.c (core_v2_register_names): Fix names of R58 and R59. (aux_minimal_register_names): Add LP_START, LP_END and BTA. (arc_tdesc_init): Recognize those registers. * arc-tdep.h (arc_regnum): Add R58, R59, LP_START, LP_END and BTA. (gdbarch_tdep): New field has_hw_loops. gdb/doc/ChangeLog: yyyy-mm-dd Anton Kolesov <Anton.Kolesov@synopsys.com> * gdb.texinfo (Synopsys ARC): Document LP_START, LP_END and BTA. --- gdb/arc-tdep.c | 71 +++++++++++++++++++++++++++++++++++++++++++---------- gdb/arc-tdep.h | 16 ++++++++++-- gdb/doc/gdb.texinfo | 3 ++- 3 files changed, 74 insertions(+), 16 deletions(-) diff --git a/gdb/arc-tdep.c b/gdb/arc-tdep.c index 2782535..0c1a0ab 100644 --- a/gdb/arc-tdep.c +++ b/gdb/arc-tdep.c @@ -117,12 +117,12 @@ static const char *const core_v2_register_names[] = { "r44", "r45", "r46", "r47", "r48", "r49", "r50", "r51", "r52", "r53", "r54", "r55", - "r56", "r57", "accl", "acch", + "r56", "r57", "r58", "r59", "lp_count", "reserved", "limm", "pcl", }; static const char *const aux_minimal_register_names[] = { - "pc", "status32", + "pc", "status32", "lp_start", "lp_end", "bta" }; static const char *const core_arcompact_register_names[] = { @@ -1761,7 +1761,7 @@ static const struct frame_base arc_normal_base = { static int arc_tdesc_init (struct gdbarch_info info, const struct target_desc **tdesc, - struct tdesc_arch_data **tdesc_data) + struct tdesc_arch_data **tdesc_data, struct gdbarch_tdep *tdep) { if (arc_debug) debug_printf ("arc: Target description initialization.\n"); @@ -1892,17 +1892,44 @@ arc_tdesc_init (struct gdbarch_info info, const struct target_desc **tdesc, || (i >= ARC_R16_REGNUM && i <= ARC_R25_REGNUM))) continue; - valid_p = tdesc_numbered_register (feature, tdesc_data_loc, i, + /* R58 and R59 can have special names: ACCL and ACCH, however which + one is which depends on target endianness - for little endian R58 + is ACCL, R59 is ACCH; vice versa for big endian. */ + + const char *const r58_names[] = { + core_regs[58], + (info.byte_order == BFD_ENDIAN_LITTLE ? "accl" : "acch"), + NULL + }; + const char *const r59_names[] = { + core_regs[59], + (info.byte_order == BFD_ENDIAN_LITTLE ? "acch" : "accl"), + NULL + }; + + switch (i) + { + case ARC_R58_REGNUM: + valid_p = tdesc_numbered_register_choices (feature, tdesc_data_loc, + i, r58_names); + break; + case ARC_R59_REGNUM: + valid_p = tdesc_numbered_register_choices (feature, tdesc_data_loc, + i, r59_names); + break; + default: + valid_p = tdesc_numbered_register (feature, tdesc_data_loc, i, core_regs[i]); + } /* - Ignore errors in extension registers - they are optional. - Ignore missing ILINK because it doesn't make sense for Linux. - - Ignore missing ILINK2 when architecture is ARCompact, because it - doesn't make sense for Linux targets. + - Ignore missing ILINK2 when architecture is ARCompact, because + it doesn't make sense for Linux targets. - In theory those optional registers should be in separate features, but - that would create numerous but tiny features, which looks like an - overengineering of a rather simple task. */ + In theory those optional registers should be in separate + features, but that would create numerous but tiny features, which + looks like an overengineering of a rather simple task. */ if (!valid_p && (i <= ARC_SP_REGNUM || i == ARC_BLINK_REGNUM || i == ARC_LP_COUNT_REGNUM || i == ARC_PCL_REGNUM || (i == ARC_R30_REGNUM && is_arcv2))) @@ -1929,7 +1956,9 @@ arc_tdesc_init (struct gdbarch_info info, const struct target_desc **tdesc, { const char *name = aux_minimal_register_names[i - ARC_FIRST_AUX_REGNUM]; valid_p = tdesc_numbered_register (feature, tdesc_data_loc, i, name); - if (!valid_p) + + /* Only STATUS32 and PC are mandatory. */ + if (!valid_p && (i == ARC_PC_REGNUM || i == ARC_STATUS32_REGNUM)) { arc_print (_("Error: Cannot find required register `%s' " "in feature `%s'.\n"), @@ -1937,6 +1966,11 @@ arc_tdesc_init (struct gdbarch_info info, const struct target_desc **tdesc, tdesc_data_cleanup (tdesc_data_loc); return FALSE; } + /* Hardware loops present if both its registers are. */ + else if (ARC_LP_START_REGNUM == i) + tdep->has_hw_loops = valid_p; + else if (ARC_LP_END_REGNUM == i) + tdep->has_hw_loops &= valid_p; } *tdesc = tdesc_loc; @@ -1956,13 +1990,17 @@ arc_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) if (arc_debug) debug_printf ("arc: Architecture initialization.\n"); - if (!arc_tdesc_init (info, &tdesc, &tdesc_data)) - return NULL; - /* Allocate the ARC-private target-dependent information structure, and the GDB target-independent information structure. */ struct gdbarch_tdep *tdep = XCNEW (struct gdbarch_tdep); tdep->jb_pc = -1; /* No longjmp support by default. */ + + if (!arc_tdesc_init (info, &tdesc, &tdesc_data, tdep)) + { + XDELETE (tdep); + return NULL; + } + struct gdbarch *gdbarch = gdbarch_alloc (&info, tdep); /* Data types. */ @@ -1993,6 +2031,13 @@ arc_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_ps_regnum (gdbarch, ARC_STATUS32_REGNUM); set_gdbarch_fp0_regnum (gdbarch, -1); /* No FPU registers. */ + /* Confirm that register name lists have proper length. */ + gdb_static_assert (ARC_LAST_REGNUM + 1 + == (ARRAY_SIZE (core_v2_register_names) + + ARRAY_SIZE (aux_minimal_register_names))); + gdb_static_assert (ARRAY_SIZE (core_v2_register_names) + == ARRAY_SIZE (core_arcompact_register_names)); + set_gdbarch_dummy_id (gdbarch, arc_dummy_id); set_gdbarch_push_dummy_call (gdbarch, arc_push_dummy_call); set_gdbarch_push_dummy_code (gdbarch, arc_push_dummy_code); diff --git a/gdb/arc-tdep.h b/gdb/arc-tdep.h index 580ccb7..12177f0 100644 --- a/gdb/arc-tdep.h +++ b/gdb/arc-tdep.h @@ -53,6 +53,8 @@ enum arc_regnum ARC_R30_REGNUM, /* Return address from function. */ ARC_BLINK_REGNUM, + ARC_R58_REGNUM = 58, + ARC_R59_REGNUM, /* Zero-delay loop counter. */ ARC_LP_COUNT_REGNUM = 60, /* Reserved register number. There should never be a register with such @@ -68,14 +70,21 @@ enum arc_regnum /* Program counter, aligned to 4-bytes, read-only. */ ARC_PCL_REGNUM, ARC_LAST_CORE_REGNUM = ARC_PCL_REGNUM, + /* AUX registers. */ /* Actual program counter. */ ARC_PC_REGNUM, ARC_FIRST_AUX_REGNUM = ARC_PC_REGNUM, /* Status register. */ ARC_STATUS32_REGNUM, - ARC_LAST_REGNUM = ARC_STATUS32_REGNUM, - ARC_LAST_AUX_REGNUM = ARC_STATUS32_REGNUM, + /* Zero-delay loop start instruction. */ + ARC_LP_START_REGNUM, + /* Zero-delay loop next-after-last instruction. */ + ARC_LP_END_REGNUM, + /* Branch target address. */ + ARC_BTA_REGNUM, + ARC_LAST_AUX_REGNUM = ARC_BTA_REGNUM, + ARC_LAST_REGNUM = ARC_LAST_AUX_REGNUM, /* Additional ABI constants. */ ARC_FIRST_ARG_REGNUM = ARC_R0_REGNUM, @@ -100,6 +109,9 @@ struct gdbarch_tdep /* Offset to PC value in jump buffer. If this is negative, longjmp support will be disabled. */ int jb_pc; + + /* Whether target has hardware (aka zero-delay) loops. */ + bool has_hw_loops; }; /* Utility functions used by other ARC-specific modules. */ diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index bfeb7a9..69a4a70 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -41614,7 +41614,8 @@ difference with @samp{org.gnu.gdb.arc.core.v2} feature is in the names of ARC v2, but @samp{ilink2} is optional on ARCompact. The @samp{org.gnu.gdb.arc.aux-minimal} feature is required for all ARC -targets. It should contain registers @samp{pc} and @samp{status32}. +targets. It should contain registers @samp{pc} and @samp{status32}. It may +contain registers @samp{lp_start}, @samp{lp_end} and @samp{bta}. @node ARM Features @subsection ARM Features -- 2.8.3 ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v2 3/4] arc: Recognize registers available on Linux targets 2017-10-26 11:40 ` [PATCH v2 3/4] arc: Recognize registers available on " Anton Kolesov @ 2017-10-26 16:02 ` Eli Zaretskii 0 siblings, 0 replies; 13+ messages in thread From: Eli Zaretskii @ 2017-10-26 16:02 UTC (permalink / raw) To: Anton Kolesov; +Cc: gdb-patches, Francois.Bedard > From: Anton Kolesov <Anton.Kolesov@synopsys.com> > Cc: Anton Kolesov <Anton.Kolesov@synopsys.com>, Francois Bedard <Francois.Bedard@synopsys.com> > Date: Thu, 26 Oct 2017 14:40:19 +0300 > > gdb/ChangeLog: > yyyy-mm-dd Anton Kolesov <Anton.Kolesov@synopsys.com> > > * arc-tdep.c (core_v2_register_names): Fix names of R58 and R59. > (aux_minimal_register_names): Add LP_START, LP_END and BTA. > (arc_tdesc_init): Recognize those registers. > * arc-tdep.h (arc_regnum): Add R58, R59, LP_START, LP_END and BTA. > (gdbarch_tdep): New field has_hw_loops. > > gdb/doc/ChangeLog: > yyyy-mm-dd Anton Kolesov <Anton.Kolesov@synopsys.com> > > * gdb.texinfo (Synopsys ARC): Document LP_START, LP_END and BTA. OK for the gdb.texinfo part. Thanks. ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH v2 1/4] arc: Migrate to new target features 2017-10-12 1:29 ` [PATCH 1/3] arc: Add XML target descriptions for Linux targets Yao Qi ` (3 preceding siblings ...) 2017-10-26 11:40 ` [PATCH v2 3/4] arc: Recognize registers available on " Anton Kolesov @ 2017-10-26 11:40 ` Anton Kolesov 2017-11-08 11:13 ` Anton Kolesov 2017-10-26 11:40 ` [PATCH v2 4/4] arc: Add GNU/Linux support for ARC Anton Kolesov 5 siblings, 1 reply; 13+ messages in thread From: Anton Kolesov @ 2017-10-26 11:40 UTC (permalink / raw) To: gdb-patches; +Cc: Anton Kolesov, Francois Bedard Changes in V2: - Removed regformats .dat from this series. - Removed selection of Linux-specific target description from arc-tdep.c. It is now happens in appropriate locations in arc-linux-tdep.c and arc-linux-nat.c. (with migration to new target description those files only specify if target is Linux or not). - Use new mechanism to manage target description on per feature basis. -- 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: yyyy-mm-dd Anton Kolesov <Anton.Kolesov@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 | 3 ++ gdb/arc-tdep.c | 23 ++-------- gdb/arch/arc.c | 71 ++++++++++++++++++++++++++++ gdb/arch/arc.h | 21 +++++++++ gdb/configure.tgt | 2 +- gdb/features/Makefile | 9 ++-- gdb/features/arc-arcompact.c | 75 ------------------------------ gdb/features/arc-arcompact.xml | 85 ---------------------------------- gdb/features/arc-v2.c | 79 ------------------------------- gdb/features/arc-v2.xml | 92 ------------------------------------- gdb/features/arc/aux-arcompact.c | 32 +++++++++++++ gdb/features/arc/aux-arcompact.xml | 28 +++++++++++ gdb/features/arc/aux-v2.c | 36 +++++++++++++++ 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 +- 19 files changed, 450 insertions(+), 355 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 6cb0970..60d049a 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -795,6 +795,7 @@ ALL_64_TARGET_OBS = \ # All other target-dependent objects files (used with --enable-targets=all). ALL_TARGET_OBS = \ arc-tdep.o \ + arch/arc.o \ arch/arm.o \ arch/arm-get-next-pcs.o \ arch/arm-linux.o \ @@ -1043,6 +1044,7 @@ SFILES = \ agent.c \ annotate.c \ arch-utils.c \ + arch/arc.c \ arch/i386.c \ auto-load.c \ auxv.c \ @@ -1515,6 +1517,7 @@ HFILES_NO_SRCDIR = \ xml-tdesc.h \ xtensa-tdep.h \ arch/aarch64-insn.h \ + arch/arc.h \ arch/arm.h \ arch/i386.h \ cli/cli-cmds.h \ diff --git a/gdb/arc-tdep.c b/gdb/arc-tdep.c index 09572ac..6ed30da 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 @@ -1793,18 +1792,7 @@ arc_tdesc_init (struct gdbarch_info info, const struct target_desc **tdesc, /* If target doesn't provide a description - use default one. */ if (!tdesc_has_registers (tdesc_loc)) { - 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 { @@ -2166,9 +2154,6 @@ _initialize_arc_tdep (void) { 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 0000000..8f0d8d6 --- /dev/null +++ b/gdb/arch/arc.c @@ -0,0 +1,71 @@ +/* Copyright (C) 2017 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 "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 0000000..2d1828e --- /dev/null +++ b/gdb/arch/arc.h @@ -0,0 +1,21 @@ +/* Copyright (C) 2017 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 "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 1fce079..8d26526 100644 --- a/gdb/configure.tgt +++ b/gdb/configure.tgt @@ -55,7 +55,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 2d8e3fe..e30a8bd 100644 --- a/gdb/features/Makefile +++ b/gdb/features/Makefile @@ -120,8 +120,6 @@ OUTPUTS = $(patsubst %,$(outdir)/%.dat,$(WHICH)) # to make on the command line. XMLTOC = \ aarch64.xml \ - arc-v2.xml \ - arc-arcompact.xml \ arm/arm-with-iwmmxt.xml \ arm/arm-with-m-fpa-layout.xml \ arm/arm-with-m-vfp-d16.xml \ @@ -207,7 +205,12 @@ $(outdir)/%.dat: %.xml number-regs.xsl sort-regs.xsl gdbserver-regs.xsl $(XSLTPROC) gdbserver-regs.xsl - >> $(outdir)/$*.tmp sh ../../move-if-change $(outdir)/$*.tmp $(outdir)/$*.dat -FEATURE_XMLFILES = i386/32bit-core.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 \ i386/32bit-avx.xml \ diff --git a/gdb/features/arc-arcompact.c b/gdb/features/arc-arcompact.c deleted file mode 100644 index ea84a40..0000000 --- a/gdb/features/arc-arcompact.c +++ /dev/null @@ -1,75 +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, "", 32, "code_ptr"); - - feature = tdesc_create_feature (result, "org.gnu.gdb.arc.aux-minimal"); - struct tdesc_type *field_type; - struct tdesc_type *type; - type = tdesc_create_flags (feature, "status32_type", 4); - tdesc_add_flag (type, 0, "H"); - tdesc_add_bitfield (type, "E", 1, 2); - tdesc_add_bitfield (type, "A", 3, 4); - tdesc_add_flag (type, 5, "AE"); - tdesc_add_flag (type, 6, "DE"); - tdesc_add_flag (type, 7, "U"); - tdesc_add_flag (type, 8, "V"); - tdesc_add_flag (type, 9, "C"); - tdesc_add_flag (type, 10, "N"); - tdesc_add_flag (type, 11, "Z"); - tdesc_add_flag (type, 12, "L"); - tdesc_add_flag (type, 13, "R"); - tdesc_add_flag (type, 14, "SE"); - - tdesc_create_reg (feature, "pc", 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 295e635..0000000 --- a/gdb/features/arc-arcompact.xml +++ /dev/null @@ -1,85 +0,0 @@ -<?xml version="1.0"?> -<!-- Copyright (C) 2015-2017 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 1eefc24..0000000 --- a/gdb/features/arc-v2.c +++ /dev/null @@ -1,79 +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, "", 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, "", 32, "code_ptr"); - - feature = tdesc_create_feature (result, "org.gnu.gdb.arc.aux-minimal"); - struct tdesc_type *field_type; - struct tdesc_type *type; - type = tdesc_create_flags (feature, "status32_type", 4); - tdesc_add_flag (type, 0, "H"); - tdesc_add_bitfield (type, "E", 1, 4); - tdesc_add_flag (type, 5, "AE"); - tdesc_add_flag (type, 6, "DE"); - tdesc_add_flag (type, 7, "U"); - tdesc_add_flag (type, 8, "V"); - tdesc_add_flag (type, 9, "C"); - tdesc_add_flag (type, 10, "N"); - tdesc_add_flag (type, 11, "Z"); - tdesc_add_flag (type, 12, "L"); - tdesc_add_flag (type, 13, "DZ"); - tdesc_add_flag (type, 14, "SC"); - tdesc_add_flag (type, 15, "ES"); - tdesc_add_bitfield (type, "RB", 16, 18); - tdesc_add_flag (type, 19, "AD"); - tdesc_add_flag (type, 20, "US"); - tdesc_add_flag (type, 31, "IE"); - - tdesc_create_reg (feature, "pc", 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 4f8c9a0..0000000 --- a/gdb/features/arc-v2.xml +++ /dev/null @@ -1,92 +0,0 @@ -<?xml version="1.0"?> -<!-- Copyright (C) 2015-2017 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 0000000..cf85ea8 --- /dev/null +++ b/gdb/features/arc/aux-arcompact.c @@ -0,0 +1,32 @@ +/* THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi:set ro: + Original: aux-arcompact.xml */ + +#include "arch/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", "aux-arcompact.xml"); + struct tdesc_type *field_type; + struct tdesc_type *type; + type = tdesc_create_flags (feature, "status32_type", 4); + tdesc_add_flag (type, 0, "H"); + tdesc_add_bitfield (type, "E", 1, 2); + tdesc_add_bitfield (type, "A", 3, 4); + tdesc_add_flag (type, 5, "AE"); + tdesc_add_flag (type, 6, "DE"); + tdesc_add_flag (type, 7, "U"); + tdesc_add_flag (type, 8, "V"); + tdesc_add_flag (type, 9, "C"); + tdesc_add_flag (type, 10, "N"); + tdesc_add_flag (type, 11, "Z"); + tdesc_add_flag (type, 12, "L"); + tdesc_add_flag (type, 13, "R"); + tdesc_add_flag (type, 14, "SE"); + + tdesc_create_reg (feature, "pc", regnum++, 1, NULL, 32, "code_ptr"); + tdesc_create_reg (feature, "status32", regnum++, 1, NULL, 32, "status32_type"); + return regnum; +} diff --git a/gdb/features/arc/aux-arcompact.xml b/gdb/features/arc/aux-arcompact.xml new file mode 100644 index 0000000..d9c2f74 --- /dev/null +++ b/gdb/features/arc/aux-arcompact.xml @@ -0,0 +1,28 @@ +<?xml version="1.0"?> +<!-- Copyright (C) 2015-2017 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 0000000..f59d759 --- /dev/null +++ b/gdb/features/arc/aux-v2.c @@ -0,0 +1,36 @@ +/* THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi:set ro: + Original: aux-v2.xml */ + +#include "arch/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", "aux-v2.xml"); + struct tdesc_type *field_type; + struct tdesc_type *type; + type = tdesc_create_flags (feature, "status32_type", 4); + tdesc_add_flag (type, 0, "H"); + tdesc_add_bitfield (type, "E", 1, 4); + tdesc_add_flag (type, 5, "AE"); + tdesc_add_flag (type, 6, "DE"); + tdesc_add_flag (type, 7, "U"); + tdesc_add_flag (type, 8, "V"); + tdesc_add_flag (type, 9, "C"); + tdesc_add_flag (type, 10, "N"); + tdesc_add_flag (type, 11, "Z"); + tdesc_add_flag (type, 12, "L"); + tdesc_add_flag (type, 13, "DZ"); + tdesc_add_flag (type, 14, "SC"); + tdesc_add_flag (type, 15, "ES"); + tdesc_add_bitfield (type, "RB", 16, 18); + tdesc_add_flag (type, 19, "AD"); + tdesc_add_flag (type, 20, "US"); + tdesc_add_flag (type, 31, "IE"); + + tdesc_create_reg (feature, "pc", regnum++, 1, NULL, 32, "code_ptr"); + tdesc_create_reg (feature, "status32", regnum++, 1, NULL, 32, "status32_type"); + return regnum; +} diff --git a/gdb/features/arc/aux-v2.xml b/gdb/features/arc/aux-v2.xml new file mode 100644 index 0000000..558a171 --- /dev/null +++ b/gdb/features/arc/aux-v2.xml @@ -0,0 +1,32 @@ +<?xml version="1.0"?> +<!-- Copyright (C) 2015-2017 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 0000000..e08763a --- /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 "arch/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", "core-arcompact.xml"); + tdesc_create_reg (feature, "r0", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r1", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r2", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r3", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r4", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r5", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r6", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r7", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r8", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r9", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r10", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r11", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r12", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r13", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r14", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r15", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r16", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r17", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r18", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r19", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r20", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r21", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r22", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r23", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r24", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r25", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "gp", regnum++, 1, NULL, 32, "data_ptr"); + tdesc_create_reg (feature, "fp", regnum++, 1, NULL, 32, "data_ptr"); + tdesc_create_reg (feature, "sp", regnum++, 1, NULL, 32, "data_ptr"); + tdesc_create_reg (feature, "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, "", 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 0000000..55b566a --- /dev/null +++ b/gdb/features/arc/core-arcompact.xml @@ -0,0 +1,58 @@ +<?xml version="1.0"?> +<!-- Copyright (C) 2015-2017 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 0000000..ebe33be --- /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 "arch/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", "core-v2.xml"); + tdesc_create_reg (feature, "r0", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r1", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r2", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r3", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r4", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r5", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r6", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r7", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r8", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r9", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r10", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r11", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r12", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r13", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r14", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r15", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r16", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r17", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r18", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r19", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r20", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r21", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r22", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r23", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r24", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r25", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "gp", regnum++, 1, NULL, 32, "data_ptr"); + tdesc_create_reg (feature, "fp", regnum++, 1, NULL, 32, "data_ptr"); + tdesc_create_reg (feature, "sp", regnum++, 1, NULL, 32, "data_ptr"); + tdesc_create_reg (feature, "ilink", regnum++, 1, NULL, 32, "code_ptr"); + tdesc_create_reg (feature, "r30", regnum++, 1, "", 32, "int"); + tdesc_create_reg (feature, "blink", regnum++, 1, NULL, 32, "code_ptr"); + tdesc_create_reg (feature, "lp_count", regnum++, 1, NULL, 32, "uint32"); + tdesc_create_reg (feature, "pcl", regnum++, 1, "", 32, "code_ptr"); + return regnum; +} diff --git a/gdb/features/arc/core-v2.xml b/gdb/features/arc/core-v2.xml new file mode 100644 index 0000000..8c8ad39 --- /dev/null +++ b/gdb/features/arc/core-v2.xml @@ -0,0 +1,61 @@ +<?xml version="1.0"?> +<!-- Copyright (C) 2015-2017 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 4f5e9d6..414c8b1 100644 --- a/gdb/target-descriptions.c +++ b/gdb/target-descriptions.c @@ -2327,7 +2327,9 @@ maint_print_c_tdesc_cmd (const char *args, int from_tty) counterparts. */ if (startswith (filename_after_features.c_str (), "i386/32bit-") || startswith (filename_after_features.c_str (), "i386/64bit-") - || startswith (filename_after_features.c_str (), "i386/x32-core.xml")) + || startswith (filename_after_features.c_str (), "i386/x32-core.xml") + || startswith (filename_after_features.c_str (), "arc/core-") + || startswith (filename_after_features.c_str (), "arc/aux-")) { print_c_feature v (filename_after_features); -- 2.8.3 ^ permalink raw reply [flat|nested] 13+ messages in thread
* RE: [PATCH v2 1/4] arc: Migrate to new target features 2017-10-26 11:40 ` [PATCH v2 1/4] arc: Migrate to new target features Anton Kolesov @ 2017-11-08 11:13 ` Anton Kolesov 0 siblings, 0 replies; 13+ messages in thread From: Anton Kolesov @ 2017-11-08 11:13 UTC (permalink / raw) To: gdb-patches; +Cc: Francois Bedard Ping. Anton > -----Original Message----- > From: Anton Kolesov [mailto:Anton.Kolesov@synopsys.com] > Sent: Thursday, October 26, 2017 14:40 > To: gdb-patches@sourceware.org > Cc: Anton Kolesov <Anton.Kolesov@synopsys.com>; Francois Bedard > <Francois.Bedard@synopsys.com> > Subject: [PATCH v2 1/4] arc: Migrate to new target features > > Changes in V2: > > - Removed regformats .dat from this series. > - Removed selection of Linux-specific target description from arc-tdep.c. It is > now happens in appropriate locations in arc-linux-tdep.c and arc-linux-nat.c. > (with migration to new target description those files only specify if target > is Linux or not). > - Use new mechanism to manage target description on per feature basis. > > -- > > 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: > yyyy-mm-dd Anton Kolesov <Anton.Kolesov@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 | 3 ++ > gdb/arc-tdep.c | 23 ++-------- > gdb/arch/arc.c | 71 ++++++++++++++++++++++++++++ > gdb/arch/arc.h | 21 +++++++++ > gdb/configure.tgt | 2 +- > gdb/features/Makefile | 9 ++-- > gdb/features/arc-arcompact.c | 75 ------------------------------ > gdb/features/arc-arcompact.xml | 85 ---------------------------------- > gdb/features/arc-v2.c | 79 ------------------------------- > gdb/features/arc-v2.xml | 92 ------------------------------------- > gdb/features/arc/aux-arcompact.c | 32 +++++++++++++ > gdb/features/arc/aux-arcompact.xml | 28 +++++++++++ > gdb/features/arc/aux-v2.c | 36 +++++++++++++++ > 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 +- > 19 files changed, 450 insertions(+), 355 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 6cb0970..60d049a 100644 > --- a/gdb/Makefile.in > +++ b/gdb/Makefile.in > @@ -795,6 +795,7 @@ ALL_64_TARGET_OBS = \ # All other target- > dependent objects files (used with --enable-targets=all). > ALL_TARGET_OBS = \ > arc-tdep.o \ > + arch/arc.o \ > arch/arm.o \ > arch/arm-get-next-pcs.o \ > arch/arm-linux.o \ > @@ -1043,6 +1044,7 @@ SFILES = \ > agent.c \ > annotate.c \ > arch-utils.c \ > + arch/arc.c \ > arch/i386.c \ > auto-load.c \ > auxv.c \ > @@ -1515,6 +1517,7 @@ HFILES_NO_SRCDIR = \ > xml-tdesc.h \ > xtensa-tdep.h \ > arch/aarch64-insn.h \ > + arch/arc.h \ > arch/arm.h \ > arch/i386.h \ > cli/cli-cmds.h \ > diff --git a/gdb/arc-tdep.c b/gdb/arc-tdep.c index 09572ac..6ed30da 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 > @@ -1793,18 +1792,7 @@ arc_tdesc_init (struct gdbarch_info info, const > struct target_desc **tdesc, > /* If target doesn't provide a description - use default one. */ > if (!tdesc_has_registers (tdesc_loc)) > { > - 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 > { > @@ -2166,9 +2154,6 @@ _initialize_arc_tdep (void) { > 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 > 0000000..8f0d8d6 > --- /dev/null > +++ b/gdb/arch/arc.c > @@ -0,0 +1,71 @@ > +/* Copyright (C) 2017 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 "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 > 0000000..2d1828e > --- /dev/null > +++ b/gdb/arch/arc.h > @@ -0,0 +1,21 @@ > +/* Copyright (C) 2017 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 "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 1fce079..8d26526 > 100644 > --- a/gdb/configure.tgt > +++ b/gdb/configure.tgt > @@ -55,7 +55,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 > 2d8e3fe..e30a8bd 100644 > --- a/gdb/features/Makefile > +++ b/gdb/features/Makefile > @@ -120,8 +120,6 @@ OUTPUTS = $(patsubst %,$(outdir)/%.dat,$(WHICH)) > # to make on the command line. > XMLTOC = \ > aarch64.xml \ > - arc-v2.xml \ > - arc-arcompact.xml \ > arm/arm-with-iwmmxt.xml \ > arm/arm-with-m-fpa-layout.xml \ > arm/arm-with-m-vfp-d16.xml \ > @@ -207,7 +205,12 @@ $(outdir)/%.dat: %.xml number-regs.xsl sort-regs.xsl > gdbserver-regs.xsl > $(XSLTPROC) gdbserver-regs.xsl - >> $(outdir)/$*.tmp > sh ../../move-if-change $(outdir)/$*.tmp $(outdir)/$*.dat > > -FEATURE_XMLFILES = i386/32bit-core.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 \ > i386/32bit-avx.xml \ > diff --git a/gdb/features/arc-arcompact.c b/gdb/features/arc-arcompact.c > deleted file mode 100644 index ea84a40..0000000 > --- a/gdb/features/arc-arcompact.c > +++ /dev/null > @@ -1,75 +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, "", 32, "code_ptr"); > - > - feature = tdesc_create_feature (result, "org.gnu.gdb.arc.aux-minimal"); > - struct tdesc_type *field_type; > - struct tdesc_type *type; > - type = tdesc_create_flags (feature, "status32_type", 4); > - tdesc_add_flag (type, 0, "H"); > - tdesc_add_bitfield (type, "E", 1, 2); > - tdesc_add_bitfield (type, "A", 3, 4); > - tdesc_add_flag (type, 5, "AE"); > - tdesc_add_flag (type, 6, "DE"); > - tdesc_add_flag (type, 7, "U"); > - tdesc_add_flag (type, 8, "V"); > - tdesc_add_flag (type, 9, "C"); > - tdesc_add_flag (type, 10, "N"); > - tdesc_add_flag (type, 11, "Z"); > - tdesc_add_flag (type, 12, "L"); > - tdesc_add_flag (type, 13, "R"); > - tdesc_add_flag (type, 14, "SE"); > - > - tdesc_create_reg (feature, "pc", 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 295e635..0000000 > --- a/gdb/features/arc-arcompact.xml > +++ /dev/null > @@ -1,85 +0,0 @@ > -<?xml version="1.0"?> > -<!-- Copyright (C) 2015-2017 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 1eefc24..0000000 > --- a/gdb/features/arc-v2.c > +++ /dev/null > @@ -1,79 +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, "", 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, "", 32, "code_ptr"); > - > - feature = tdesc_create_feature (result, "org.gnu.gdb.arc.aux-minimal"); > - struct tdesc_type *field_type; > - struct tdesc_type *type; > - type = tdesc_create_flags (feature, "status32_type", 4); > - tdesc_add_flag (type, 0, "H"); > - tdesc_add_bitfield (type, "E", 1, 4); > - tdesc_add_flag (type, 5, "AE"); > - tdesc_add_flag (type, 6, "DE"); > - tdesc_add_flag (type, 7, "U"); > - tdesc_add_flag (type, 8, "V"); > - tdesc_add_flag (type, 9, "C"); > - tdesc_add_flag (type, 10, "N"); > - tdesc_add_flag (type, 11, "Z"); > - tdesc_add_flag (type, 12, "L"); > - tdesc_add_flag (type, 13, "DZ"); > - tdesc_add_flag (type, 14, "SC"); > - tdesc_add_flag (type, 15, "ES"); > - tdesc_add_bitfield (type, "RB", 16, 18); > - tdesc_add_flag (type, 19, "AD"); > - tdesc_add_flag (type, 20, "US"); > - tdesc_add_flag (type, 31, "IE"); > - > - tdesc_create_reg (feature, "pc", 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 4f8c9a0..0000000 > --- a/gdb/features/arc-v2.xml > +++ /dev/null > @@ -1,92 +0,0 @@ > -<?xml version="1.0"?> > -<!-- Copyright (C) 2015-2017 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 0000000..cf85ea8 > --- /dev/null > +++ b/gdb/features/arc/aux-arcompact.c > @@ -0,0 +1,32 @@ > +/* THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi:set ro: > + Original: aux-arcompact.xml */ > + > +#include "arch/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", "aux-arcompact.xml"); struct > + tdesc_type *field_type; struct tdesc_type *type; type = > + tdesc_create_flags (feature, "status32_type", 4); tdesc_add_flag > + (type, 0, "H"); tdesc_add_bitfield (type, "E", 1, 2); > + tdesc_add_bitfield (type, "A", 3, 4); tdesc_add_flag (type, 5, "AE"); > + tdesc_add_flag (type, 6, "DE"); tdesc_add_flag (type, 7, "U"); > + tdesc_add_flag (type, 8, "V"); tdesc_add_flag (type, 9, "C"); > + tdesc_add_flag (type, 10, "N"); tdesc_add_flag (type, 11, "Z"); > + tdesc_add_flag (type, 12, "L"); tdesc_add_flag (type, 13, "R"); > + tdesc_add_flag (type, 14, "SE"); > + > + tdesc_create_reg (feature, "pc", regnum++, 1, NULL, 32, "code_ptr"); > + tdesc_create_reg (feature, "status32", regnum++, 1, NULL, 32, > +"status32_type"); > + return regnum; > +} > diff --git a/gdb/features/arc/aux-arcompact.xml b/gdb/features/arc/aux- > arcompact.xml > new file mode 100644 > index 0000000..d9c2f74 > --- /dev/null > +++ b/gdb/features/arc/aux-arcompact.xml > @@ -0,0 +1,28 @@ > +<?xml version="1.0"?> > +<!-- Copyright (C) 2015-2017 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 0000000..f59d759 > --- /dev/null > +++ b/gdb/features/arc/aux-v2.c > @@ -0,0 +1,36 @@ > +/* THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi:set ro: > + Original: aux-v2.xml */ > + > +#include "arch/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", "aux-v2.xml"); struct tdesc_type > + *field_type; struct tdesc_type *type; type = tdesc_create_flags > + (feature, "status32_type", 4); tdesc_add_flag (type, 0, "H"); > + tdesc_add_bitfield (type, "E", 1, 4); tdesc_add_flag (type, 5, "AE"); > + tdesc_add_flag (type, 6, "DE"); tdesc_add_flag (type, 7, "U"); > + tdesc_add_flag (type, 8, "V"); tdesc_add_flag (type, 9, "C"); > + tdesc_add_flag (type, 10, "N"); tdesc_add_flag (type, 11, "Z"); > + tdesc_add_flag (type, 12, "L"); tdesc_add_flag (type, 13, "DZ"); > + tdesc_add_flag (type, 14, "SC"); tdesc_add_flag (type, 15, "ES"); > + tdesc_add_bitfield (type, "RB", 16, 18); tdesc_add_flag (type, 19, > + "AD"); tdesc_add_flag (type, 20, "US"); tdesc_add_flag (type, 31, > + "IE"); > + > + tdesc_create_reg (feature, "pc", regnum++, 1, NULL, 32, "code_ptr"); > + tdesc_create_reg (feature, "status32", regnum++, 1, NULL, 32, > +"status32_type"); > + return regnum; > +} > diff --git a/gdb/features/arc/aux-v2.xml b/gdb/features/arc/aux-v2.xml new > file mode 100644 index 0000000..558a171 > --- /dev/null > +++ b/gdb/features/arc/aux-v2.xml > @@ -0,0 +1,32 @@ > +<?xml version="1.0"?> > +<!-- Copyright (C) 2015-2017 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 0000000..e08763a > --- /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 "arch/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", "core-arcompact.xml"); > + tdesc_create_reg (feature, "r0", regnum++, 1, NULL, 32, "int"); > + tdesc_create_reg (feature, "r1", regnum++, 1, NULL, 32, "int"); > + tdesc_create_reg (feature, "r2", regnum++, 1, NULL, 32, "int"); > + tdesc_create_reg (feature, "r3", regnum++, 1, NULL, 32, "int"); > + tdesc_create_reg (feature, "r4", regnum++, 1, NULL, 32, "int"); > + tdesc_create_reg (feature, "r5", regnum++, 1, NULL, 32, "int"); > + tdesc_create_reg (feature, "r6", regnum++, 1, NULL, 32, "int"); > + tdesc_create_reg (feature, "r7", regnum++, 1, NULL, 32, "int"); > + tdesc_create_reg (feature, "r8", regnum++, 1, NULL, 32, "int"); > + tdesc_create_reg (feature, "r9", regnum++, 1, NULL, 32, "int"); > + tdesc_create_reg (feature, "r10", regnum++, 1, NULL, 32, "int"); > + tdesc_create_reg (feature, "r11", regnum++, 1, NULL, 32, "int"); > + tdesc_create_reg (feature, "r12", regnum++, 1, NULL, 32, "int"); > + tdesc_create_reg (feature, "r13", regnum++, 1, NULL, 32, "int"); > + tdesc_create_reg (feature, "r14", regnum++, 1, NULL, 32, "int"); > + tdesc_create_reg (feature, "r15", regnum++, 1, NULL, 32, "int"); > + tdesc_create_reg (feature, "r16", regnum++, 1, NULL, 32, "int"); > + tdesc_create_reg (feature, "r17", regnum++, 1, NULL, 32, "int"); > + tdesc_create_reg (feature, "r18", regnum++, 1, NULL, 32, "int"); > + tdesc_create_reg (feature, "r19", regnum++, 1, NULL, 32, "int"); > + tdesc_create_reg (feature, "r20", regnum++, 1, NULL, 32, "int"); > + tdesc_create_reg (feature, "r21", regnum++, 1, NULL, 32, "int"); > + tdesc_create_reg (feature, "r22", regnum++, 1, NULL, 32, "int"); > + tdesc_create_reg (feature, "r23", regnum++, 1, NULL, 32, "int"); > + tdesc_create_reg (feature, "r24", regnum++, 1, NULL, 32, "int"); > + tdesc_create_reg (feature, "r25", regnum++, 1, NULL, 32, "int"); > + tdesc_create_reg (feature, "gp", regnum++, 1, NULL, 32, "data_ptr"); > + tdesc_create_reg (feature, "fp", regnum++, 1, NULL, 32, "data_ptr"); > + tdesc_create_reg (feature, "sp", regnum++, 1, NULL, 32, "data_ptr"); > + tdesc_create_reg (feature, "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, "", 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 0000000..55b566a > --- /dev/null > +++ b/gdb/features/arc/core-arcompact.xml > @@ -0,0 +1,58 @@ > +<?xml version="1.0"?> > +<!-- Copyright (C) 2015-2017 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 0000000..ebe33be > --- /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 "arch/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", > +"core-v2.xml"); > + tdesc_create_reg (feature, "r0", regnum++, 1, NULL, 32, "int"); > + tdesc_create_reg (feature, "r1", regnum++, 1, NULL, 32, "int"); > + tdesc_create_reg (feature, "r2", regnum++, 1, NULL, 32, "int"); > + tdesc_create_reg (feature, "r3", regnum++, 1, NULL, 32, "int"); > + tdesc_create_reg (feature, "r4", regnum++, 1, NULL, 32, "int"); > + tdesc_create_reg (feature, "r5", regnum++, 1, NULL, 32, "int"); > + tdesc_create_reg (feature, "r6", regnum++, 1, NULL, 32, "int"); > + tdesc_create_reg (feature, "r7", regnum++, 1, NULL, 32, "int"); > + tdesc_create_reg (feature, "r8", regnum++, 1, NULL, 32, "int"); > + tdesc_create_reg (feature, "r9", regnum++, 1, NULL, 32, "int"); > + tdesc_create_reg (feature, "r10", regnum++, 1, NULL, 32, "int"); > + tdesc_create_reg (feature, "r11", regnum++, 1, NULL, 32, "int"); > + tdesc_create_reg (feature, "r12", regnum++, 1, NULL, 32, "int"); > + tdesc_create_reg (feature, "r13", regnum++, 1, NULL, 32, "int"); > + tdesc_create_reg (feature, "r14", regnum++, 1, NULL, 32, "int"); > + tdesc_create_reg (feature, "r15", regnum++, 1, NULL, 32, "int"); > + tdesc_create_reg (feature, "r16", regnum++, 1, NULL, 32, "int"); > + tdesc_create_reg (feature, "r17", regnum++, 1, NULL, 32, "int"); > + tdesc_create_reg (feature, "r18", regnum++, 1, NULL, 32, "int"); > + tdesc_create_reg (feature, "r19", regnum++, 1, NULL, 32, "int"); > + tdesc_create_reg (feature, "r20", regnum++, 1, NULL, 32, "int"); > + tdesc_create_reg (feature, "r21", regnum++, 1, NULL, 32, "int"); > + tdesc_create_reg (feature, "r22", regnum++, 1, NULL, 32, "int"); > + tdesc_create_reg (feature, "r23", regnum++, 1, NULL, 32, "int"); > + tdesc_create_reg (feature, "r24", regnum++, 1, NULL, 32, "int"); > + tdesc_create_reg (feature, "r25", regnum++, 1, NULL, 32, "int"); > + tdesc_create_reg (feature, "gp", regnum++, 1, NULL, 32, "data_ptr"); > + tdesc_create_reg (feature, "fp", regnum++, 1, NULL, 32, "data_ptr"); > + tdesc_create_reg (feature, "sp", regnum++, 1, NULL, 32, "data_ptr"); > + tdesc_create_reg (feature, "ilink", regnum++, 1, NULL, 32, > +"code_ptr"); > + tdesc_create_reg (feature, "r30", regnum++, 1, "", 32, "int"); > + tdesc_create_reg (feature, "blink", regnum++, 1, NULL, 32, > +"code_ptr"); > + tdesc_create_reg (feature, "lp_count", regnum++, 1, NULL, 32, > +"uint32"); > + tdesc_create_reg (feature, "pcl", regnum++, 1, "", 32, "code_ptr"); > + return regnum; > +} > diff --git a/gdb/features/arc/core-v2.xml b/gdb/features/arc/core-v2.xml > new file mode 100644 index 0000000..8c8ad39 > --- /dev/null > +++ b/gdb/features/arc/core-v2.xml > @@ -0,0 +1,61 @@ > +<?xml version="1.0"?> > +<!-- Copyright (C) 2015-2017 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 > 4f5e9d6..414c8b1 100644 > --- a/gdb/target-descriptions.c > +++ b/gdb/target-descriptions.c > @@ -2327,7 +2327,9 @@ maint_print_c_tdesc_cmd (const char *args, int > from_tty) > counterparts. */ > if (startswith (filename_after_features.c_str (), "i386/32bit-") > || startswith (filename_after_features.c_str (), "i386/64bit-") > - || startswith (filename_after_features.c_str (), "i386/x32-core.xml")) > + || startswith (filename_after_features.c_str (), "i386/x32-core.xml") > + || startswith (filename_after_features.c_str (), "arc/core-") > + || startswith (filename_after_features.c_str (), "arc/aux-")) > { > print_c_feature v (filename_after_features); > > -- > 2.8.3 ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH v2 4/4] arc: Add GNU/Linux support for ARC 2017-10-12 1:29 ` [PATCH 1/3] arc: Add XML target descriptions for Linux targets Yao Qi ` (4 preceding siblings ...) 2017-10-26 11:40 ` [PATCH v2 1/4] arc: Migrate to new target features Anton Kolesov @ 2017-10-26 11:40 ` Anton Kolesov 5 siblings, 0 replies; 13+ messages in thread From: Anton Kolesov @ 2017-10-26 11:40 UTC (permalink / raw) To: gdb-patches; +Cc: Anton Kolesov, Francois Bedard ARC Linux targets difference from baremetal: - Don't support hardware single instruction stepping. - Have different access rules to registers. - Use another instruction for breakpoints. yyyy-mm-dd Anton Kolesov <Anton.Kolesov@synopsys.com> * configure.tgt: ARC support for GNU/Linux. * Makefile.in (ALL_TARGET_OBJS): Likewise. * arc-linux-tdep.c: New file. * arc-tdep.h (ARC_STATUS32_L_MASK, ARC_STATUS32_DE_MASK): Declare. * arc-tdep.c (arc_write_pc): Use it. --- gdb/Makefile.in | 1 + gdb/arc-linux-tdep.c | 284 +++++++++++++++++++++++++++++++++++++++++++++++++++ gdb/arc-tdep.c | 3 +- gdb/arc-tdep.h | 5 + gdb/configure.tgt | 6 ++ 5 files changed, 297 insertions(+), 2 deletions(-) create mode 100644 gdb/arc-linux-tdep.c diff --git a/gdb/Makefile.in b/gdb/Makefile.in index 60d049a..c941c5a 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -794,6 +794,7 @@ ALL_64_TARGET_OBS = \ # All other target-dependent objects files (used with --enable-targets=all). ALL_TARGET_OBS = \ + arc-linux-tdep.o \ arc-tdep.o \ arch/arc.o \ arch/arm.o \ diff --git a/gdb/arc-linux-tdep.c b/gdb/arc-linux-tdep.c new file mode 100644 index 0000000..7b54e8b --- /dev/null +++ b/gdb/arc-linux-tdep.c @@ -0,0 +1,284 @@ +/* Target dependent code for GNU/Linux ARC. + + Copyright 2005-2017 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/>. */ + +/* GDB header files. */ +#include "defs.h" +#include "linux-tdep.h" +#include "objfiles.h" +#include "opcode/arc.h" +#include "osabi.h" +#include "solib-svr4.h" + +/* ARC header files. */ +#include "opcodes/arc-dis.h" +#include "arc-tdep.h" + +/* Implement the "cannot_fetch_register" gdbarch method. */ + +static int +arc_linux_cannot_fetch_register (struct gdbarch *gdbarch, int regnum) +{ + /* Assume that register is readable if it is unknown. */ + switch (regnum) + { + case ARC_ILINK_REGNUM: + case ARC_RESERVED_REGNUM: + case ARC_LIMM_REGNUM: + return TRUE; + case ARC_R30_REGNUM: + case ARC_R58_REGNUM: + case ARC_R59_REGNUM: + return !arc_mach_is_arcv2 (gdbarch); + } + if (regnum > ARC_BLINK_REGNUM && regnum < ARC_LP_COUNT_REGNUM) + return TRUE; + return FALSE; +} + +/* Implement the "cannot_store_register" gdbarch method. */ + +static int +arc_linux_cannot_store_register (struct gdbarch *gdbarch, int regnum) +{ + /* Assume that register is writable if it is unknown. */ + switch (regnum) + { + case ARC_ILINK_REGNUM: + case ARC_RESERVED_REGNUM: + case ARC_LIMM_REGNUM: + case ARC_PCL_REGNUM: + return TRUE; + case ARC_R30_REGNUM: + case ARC_R58_REGNUM: + case ARC_R59_REGNUM: + return !arc_mach_is_arcv2 (gdbarch); + } + if (regnum > ARC_BLINK_REGNUM && regnum < ARC_LP_COUNT_REGNUM) + return TRUE; + return FALSE; +} + +/* For ARC Linux, breakpoint uses the 16-bit TRAP_S 1 instruction, which + is 0x3e78 (little endian) or 0x783e (big endian). */ + +static const gdb_byte arc_linux_trap_s_be[] = { 0x78, 0x3e }; +static const gdb_byte arc_linux_trap_s_le[] = { 0x3e, 0x78 }; + +/* Implement the "breakpoint_kind_from_pc" gdbarch method. */ + +static int +arc_linux_breakpoint_kind_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr) +{ + return 2; +} + +/* Implement the "sw_breakpoint_from_kind" gdbarch method. */ + +static const gdb_byte * +arc_linux_sw_breakpoint_from_kind (struct gdbarch *gdbarch, int kind, int *size) +{ + + *size = kind; + return ((gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG) + ? arc_linux_trap_s_be + : arc_linux_trap_s_le); +} + +/* Implement the "software_single_step" gdbarch method. */ + +static std::vector<CORE_ADDR> +arc_linux_software_single_step (struct regcache *regcache) +{ + struct gdbarch *gdbarch = regcache->arch (); + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + struct disassemble_info di = arc_disassemble_info (gdbarch); + + /* Read current instruction. */ + struct arc_instruction curr_insn; + arc_insn_decode (regcache_read_pc (regcache), &di, arc_delayed_print_insn, + &curr_insn); + CORE_ADDR next_pc = arc_insn_get_linear_next_pc (curr_insn); + + std::vector<CORE_ADDR> next_pcs; + + /* For instructions with delay slots, the fall thru is not the + instruction immediately after the current instruction, but the one + after that. */ + if (curr_insn.has_delay_slot) + { + struct arc_instruction next_insn; + arc_insn_decode (next_pc, &di, arc_delayed_print_insn, &next_insn); + next_pcs.push_back (arc_insn_get_linear_next_pc (next_insn)); + } + else + { + next_pcs.push_back (next_pc); + } + + ULONGEST status32; + regcache_cooked_read_unsigned (regcache, gdbarch_ps_regnum (gdbarch), + &status32); + + if (curr_insn.is_control_flow) + { + CORE_ADDR branch_pc = arc_insn_get_branch_target (curr_insn); + if (branch_pc != next_pc) + next_pcs.push_back (branch_pc); + } + /* Is current instruction the last in a loop body? */ + else if (tdep->has_hw_loops) + { + /* If STATUS32.L is 1, then ZD-loops are disabled. */ + if (!(status32 & ARC_STATUS32_L_MASK)) + { + ULONGEST lp_end, lp_start, lp_count; + regcache_cooked_read_unsigned (regcache, ARC_LP_START_REGNUM, + &lp_start); + regcache_cooked_read_unsigned (regcache, ARC_LP_END_REGNUM, &lp_end); + regcache_cooked_read_unsigned (regcache, ARC_LP_COUNT_REGNUM, + &lp_count); + + if (arc_debug) + { + debug_printf ("arc-linux: lp_start = %s, lp_end = %s, " + "lp_count = %s, next_pc = %s\n", + paddress (gdbarch, lp_start), + paddress (gdbarch, lp_end), + pulongest (lp_count), + paddress (gdbarch, next_pc)); + } + + if (next_pc == lp_end && lp_count > 1) + { + /* The instruction is in effect a jump back to the start of + the loop. */ + next_pcs.push_back (lp_start); + } + + } + } + + /* Is this a delay slot? Then next PC is in BTA register. */ + if (status32 & ARC_STATUS32_DE_MASK) + { + ULONGEST bta; + regcache_cooked_read_unsigned (regcache, ARC_BTA_REGNUM, &bta); + next_pcs.push_back (bta); + } + + return next_pcs; +} + +/* Implement the "skip_solib_resolver" gdbarch method. + + See glibc_skip_solib_resolver for details. */ + +static CORE_ADDR +arc_linux_skip_solib_resolver (struct gdbarch *gdbarch, CORE_ADDR pc) +{ + /* For uClibc 0.9.26+. + + An unresolved PLT entry points to "__dl_linux_resolve", which calls + "_dl_linux_resolver" to do the resolving and then eventually jumps to + the function. + + So we look for the symbol `_dl_linux_resolver', and if we are there, + gdb sets a breakpoint at the return address, and continues. */ + struct bound_minimal_symbol resolver = + lookup_minimal_symbol ("_dl_linux_resolver", NULL, NULL); + + if (arc_debug) + { + if (resolver.minsym) + { + CORE_ADDR res_addr = BMSYMBOL_VALUE_ADDRESS (resolver); + debug_printf ("arc-linux: skip_solib_resolver (): " + "pc = %s, resolver at %s\n", + print_core_address (gdbarch, pc), + print_core_address (gdbarch, res_addr)); + } + else + { + debug_printf ("arc-linux: skip_solib_resolver (): " + "pc = %s, no resolver found\n", + print_core_address (gdbarch, pc)); + } + } + + if (resolver.minsym && BMSYMBOL_VALUE_ADDRESS (resolver) == pc) + { + /* Find the return address. */ + return frame_unwind_caller_pc (get_current_frame ()); + } + else + { + /* No breakpoint required. */ + return 0; + } +} + +/* Initialization specific to Linux environment. */ + +static void +arc_linux_init_osabi (struct gdbarch_info info, struct gdbarch *gdbarch) +{ + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + + if (arc_debug) + debug_printf ("arc-linux: GNU/Linux OS/ABI initialization.\n"); + + /* If we are using Linux, we have in uClibc + (libc/sysdeps/linux/arc/bits/setjmp.h): + + typedef int __jmp_buf[13+1+1+1]; //r13-r25, fp, sp, blink + + Where "blink" is a stored PC of a caller function. + */ + tdep->jb_pc = 15; + + linux_init_abi (info, gdbarch); + + /* Set up target dependent GDB architecture entries. */ + set_gdbarch_cannot_fetch_register (gdbarch, arc_linux_cannot_fetch_register); + set_gdbarch_cannot_store_register (gdbarch, arc_linux_cannot_store_register); + set_gdbarch_breakpoint_kind_from_pc (gdbarch, + arc_linux_breakpoint_kind_from_pc); + set_gdbarch_sw_breakpoint_from_kind (gdbarch, + arc_linux_sw_breakpoint_from_kind); + set_gdbarch_fetch_tls_load_module_address (gdbarch, + svr4_fetch_objfile_link_map); + set_gdbarch_software_single_step (gdbarch, arc_linux_software_single_step); + set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target); + set_gdbarch_skip_solib_resolver (gdbarch, arc_linux_skip_solib_resolver); + + /* GNU/Linux uses SVR4-style shared libraries, with 32-bit ints, longs + and pointers (ILP32). */ + set_solib_svr4_fetch_link_map_offsets (gdbarch, + svr4_ilp32_fetch_link_map_offsets); +} + +/* Suppress warning from -Wmissing-prototypes. */ +extern initialize_file_ftype _initialize_arc_linux_tdep; + +void +_initialize_arc_linux_tdep (void) +{ + gdbarch_register_osabi (bfd_arch_arc, 0, GDB_OSABI_LINUX, + arc_linux_init_osabi); +} diff --git a/gdb/arc-tdep.c b/gdb/arc-tdep.c index 0c1a0ab..9635012 100644 --- a/gdb/arc-tdep.c +++ b/gdb/arc-tdep.c @@ -459,8 +459,7 @@ arc_write_pc (struct regcache *regcache, CORE_ADDR new_pc) regcache_cooked_read_unsigned (regcache, gdbarch_ps_regnum (gdbarch), &status32); - /* Mask for DE bit is 0x40. */ - if (status32 & 0x40) + if (status32 & ARC_STATUS32_DE_MASK) { if (arc_debug) { diff --git a/gdb/arc-tdep.h b/gdb/arc-tdep.h index 12177f0..e8ee12c 100644 --- a/gdb/arc-tdep.h +++ b/gdb/arc-tdep.h @@ -98,6 +98,11 @@ enum arc_regnum Longer registers are represented as pairs of 32-bit registers. */ #define ARC_REGISTER_SIZE 4 +/* STATUS32 register: hardware loops disabled bit. */ +#define ARC_STATUS32_L_MASK (1 << 12) +/* STATUS32 register: current instruction is a delay slot. */ +#define ARC_STATUS32_DE_MASK (1 << 6) + #define arc_print(fmt, args...) fprintf_unfiltered (gdb_stdlog, fmt, ##args) extern int arc_debug; diff --git a/gdb/configure.tgt b/gdb/configure.tgt index 8d26526..779d6f6 100644 --- a/gdb/configure.tgt +++ b/gdb/configure.tgt @@ -149,6 +149,12 @@ arc*-*-elf32) gdb_target_obs="arc-newlib-tdep.o" ;; +arc*-*-linux*) + # Target: ARC machine running Linux + gdb_target_obs="arc-linux-tdep.o linux-tdep.o solib-svr4.o" + build_gdbserver=yes + ;; + arm*-wince-pe | arm*-*-mingw32ce*) # Target: ARM based machine running Windows CE (win32) gdb_target_obs="arm-wince-tdep.o windows-tdep.o" -- 2.8.3 ^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2017-11-08 11:13 UTC | newest] Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2017-10-11 14:56 [PATCH 1/3] arc: Add XML target descriptions for Linux targets Anton Kolesov 2017-10-11 14:56 ` [PATCH 2/3] arc: Recognize registers available on " Anton Kolesov 2017-10-21 8:23 ` Eli Zaretskii 2017-10-11 14:56 ` [PATCH 3/3] arc: Add GNU/Linux support for ARC Anton Kolesov 2017-10-12 1:29 ` [PATCH 1/3] arc: Add XML target descriptions for Linux targets Yao Qi 2017-10-18 15:06 ` Anton Kolesov 2017-10-18 17:33 ` Anton Kolesov 2017-10-26 11:40 ` [PATCH v2 2/4] arc: Add XML target features " Anton Kolesov 2017-10-26 11:40 ` [PATCH v2 3/4] arc: Recognize registers available on " Anton Kolesov 2017-10-26 16:02 ` Eli Zaretskii 2017-10-26 11:40 ` [PATCH v2 1/4] arc: Migrate to new target features Anton Kolesov 2017-11-08 11:13 ` Anton Kolesov 2017-10-26 11:40 ` [PATCH v2 4/4] arc: Add GNU/Linux support for ARC Anton Kolesov
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox