aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorYao Qi <yao.qi@linaro.org>2017-07-26 14:24:08 +0100
committerYao Qi <yao.qi@linaro.org>2017-07-26 14:24:08 +0100
commit25aa13e522c595cbdbb3868f1daa434a17ba2ab2 (patch)
tree34f287e234ff4b50267473aa05fce5629358c8bc /gdb
parent6eb1e6a8c1c83d0fb5b06192d1ec218d3a358f23 (diff)
downloadgdb-25aa13e522c595cbdbb3868f1daa434a17ba2ab2.zip
gdb-25aa13e522c595cbdbb3868f1daa434a17ba2ab2.tar.gz
gdb-25aa13e522c595cbdbb3868f1daa434a17ba2ab2.tar.bz2
Generate c for feature instead of tdesc
This patch changes Makefile and command "maint print c-files" so that GDB can print c files for features instead target description. Previously, we feed GDB a target description xml file, which generate c files including multiple features. With this patch, in Makefile, we wrap each feature xml file, and create a temp target description which include only one feature. Then, adjust the target description printer for them, and print a c function for each given feature, so that we can use these c functions later to create target description in a flexible way. gdb: 2017-07-26 Yao Qi <yao.qi@linaro.org> * features/Makefile (CFILES): Rename with TDESC_CFILES. (FEATURE_XMLFILES): New. (FEATURE_CFILES): New. New rules. (clean-cfiles): Remove generated c files. * features/i386/32bit-avx.c: Generated. * features/i386/32bit-avx512.c: Generated. * features/i386/32bit-core.c: Generated. * features/i386/32bit-linux.c: Generated. * features/i386/32bit-mpx.c: Generated. * features/i386/32bit-pkeys.c: Generated. * features/i386/32bit-sse.c: Generated. * target-descriptions.c: Include algorithm. (tdesc_element_visitor): Add method visit_end. (print_c_tdesc): Implement visit_end. (print_c_tdesc:: m_filename_after_features): Move it to protected. (print_c_feature): New class. (maint_print_c_tdesc_cmd): Use print_c_feature if XML file name starts with "i386/32bit-".
Diffstat (limited to 'gdb')
-rw-r--r--gdb/ChangeLog23
-rw-r--r--gdb/features/Makefile37
-rw-r--r--gdb/features/i386/32bit-avx.c21
-rw-r--r--gdb/features/i386/32bit-avx512.c33
-rw-r--r--gdb/features/i386/32bit-core.c66
-rw-r--r--gdb/features/i386/32bit-linux.c14
-rw-r--r--gdb/features/i386/32bit-mpx.c51
-rw-r--r--gdb/features/i386/32bit-pkeys.c14
-rw-r--r--gdb/features/i386/32bit-sse.c74
-rw-r--r--gdb/target-descriptions.c104
10 files changed, 425 insertions, 12 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 577c598..0f4ec46 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,28 @@
2017-07-26 Yao Qi <yao.qi@linaro.org>
+ * features/Makefile (CFILES): Rename with TDESC_CFILES.
+ (FEATURE_XMLFILES): New.
+ (FEATURE_CFILES): New.
+ New rules.
+ (clean-cfiles): Remove generated c files.
+ * features/i386/32bit-avx.c: Generated.
+ * features/i386/32bit-avx512.c: Generated.
+ * features/i386/32bit-core.c: Generated.
+ * features/i386/32bit-linux.c: Generated.
+ * features/i386/32bit-mpx.c: Generated.
+ * features/i386/32bit-pkeys.c: Generated.
+ * features/i386/32bit-sse.c: Generated.
+ * target-descriptions.c: Include algorithm.
+ (tdesc_element_visitor): Add method visit_end.
+ (print_c_tdesc): Implement visit_end.
+ (print_c_tdesc:: m_filename_after_features): Move it to
+ protected.
+ (print_c_feature): New class.
+ (maint_print_c_tdesc_cmd): Use print_c_feature if XML file
+ name starts with "i386/32bit-".
+
+2017-07-26 Yao Qi <yao.qi@linaro.org>
+
* target-descriptions.c (tdesc_element_visitor): New class.
(tdesc_element): New class.
(tdesc_reg): Inherit from tdesc_element.
diff --git a/gdb/features/Makefile b/gdb/features/Makefile
index 7ddb578..670f8f3 100644
--- a/gdb/features/Makefile
+++ b/gdb/features/Makefile
@@ -235,7 +235,7 @@ XMLTOC = \
tic6x-c64xp-linux.xml \
tic6x-c64xp.xml
-CFILES = $(patsubst %.xml,%.c,$(XMLTOC))
+TDESC_CFILES = $(patsubst %.xml,%.c,$(XMLTOC))
GDB = false
all: $(OUTPUTS)
@@ -252,11 +252,40 @@ $(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
-cfiles: $(CFILES)
-%.c: %.xml
+FEATURE_XMLFILES = i386/32bit-core.xml \
+ i386/32bit-sse.xml \
+ i386/32bit-linux.xml \
+ i386/32bit-avx.xml \
+ i386/32bit-mpx.xml \
+ i386/32bit-avx512.xml \
+ i386/32bit-pkeys.xml
+
+FEATURE_CFILES = $(patsubst %.xml,%.c,$(FEATURE_XMLFILES))
+
+cfiles: $(TDESC_CFILES) $(FEATURE_CFILES)
+
+$(TDESC_CFILES): %.c: %.xml
$(GDB) -nx -q -batch -ex 'maint print c-tdesc $<' > $@.tmp
sh ../../move-if-change $@.tmp $@
+$(FEATURE_CFILES): %.c: %.xml.tmp
+ $(GDB) -nx -q -batch \
+ -ex 'maint print c-tdesc $<' > $@.tmp
+ sh ../../move-if-change $@.tmp $@
+ rm $<
+
+# %.xml is the XML file for each target description feature, and
+# %.xml.tmp is the XML file target description which only includes
+# one target description feature.
+
+%.xml.tmp: %.xml
+ echo "<?xml version=\"1.0\"?>" > $@.tmp
+ echo "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">" >> $@.tmp
+ echo "<target>" >> $@.tmp
+ echo " <xi:include href=\"$(notdir $<)\"/>" >> $@.tmp
+ echo "</target>" >> $@.tmp
+ sh ../../move-if-change $@.tmp $@
+
# Other dependencies.
$(outdir)/arm/arm-with-iwmmxt.dat: arm/arm-core.xml arm/xscale-iwmmxt.xml
$(outdir)/i386/i386.dat: i386/32bit-core.xml i386/32bit-sse.xml
@@ -327,7 +356,7 @@ $(outdir)/i386/x32-avx-avx512-linux.dat: i386/x32-core.xml i386/64bit-avx.xml \
# 'all' doesn't build the C files, so don't delete them in 'clean'
# either.
clean-cfiles:
- rm -f $(CFILES)
+ rm -f $(TDESC_CFILES) $(FEATURE_CFILES)
clean:
rm -f $(OUTPUTS)
diff --git a/gdb/features/i386/32bit-avx.c b/gdb/features/i386/32bit-avx.c
new file mode 100644
index 0000000..0e71515
--- /dev/null
+++ b/gdb/features/i386/32bit-avx.c
@@ -0,0 +1,21 @@
+/* THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi:set ro:
+ Original: 32bit-avx.xml */
+
+#include "target-descriptions.h"
+
+static int
+create_feature_i386_32bit_avx (struct target_desc *result, long regnum)
+{
+ struct tdesc_feature *feature;
+
+ feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx");
+ tdesc_create_reg (feature, "ymm0h", regnum++, 1, NULL, 128, "uint128");
+ tdesc_create_reg (feature, "ymm1h", regnum++, 1, NULL, 128, "uint128");
+ tdesc_create_reg (feature, "ymm2h", regnum++, 1, NULL, 128, "uint128");
+ tdesc_create_reg (feature, "ymm3h", regnum++, 1, NULL, 128, "uint128");
+ tdesc_create_reg (feature, "ymm4h", regnum++, 1, NULL, 128, "uint128");
+ tdesc_create_reg (feature, "ymm5h", regnum++, 1, NULL, 128, "uint128");
+ tdesc_create_reg (feature, "ymm6h", regnum++, 1, NULL, 128, "uint128");
+ tdesc_create_reg (feature, "ymm7h", regnum++, 1, NULL, 128, "uint128");
+ return regnum;
+}
diff --git a/gdb/features/i386/32bit-avx512.c b/gdb/features/i386/32bit-avx512.c
new file mode 100644
index 0000000..034f557
--- /dev/null
+++ b/gdb/features/i386/32bit-avx512.c
@@ -0,0 +1,33 @@
+/* THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi:set ro:
+ Original: 32bit-avx512.xml */
+
+#include "target-descriptions.h"
+
+static int
+create_feature_i386_32bit_avx512 (struct target_desc *result, long regnum)
+{
+ struct tdesc_feature *feature;
+
+ feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx512");
+ struct tdesc_type *field_type;
+ field_type = tdesc_named_type (feature, "uint128");
+ tdesc_create_vector (feature, "v2ui128", field_type, 2);
+
+ tdesc_create_reg (feature, "k0", regnum++, 1, NULL, 64, "uint64");
+ tdesc_create_reg (feature, "k1", regnum++, 1, NULL, 64, "uint64");
+ tdesc_create_reg (feature, "k2", regnum++, 1, NULL, 64, "uint64");
+ tdesc_create_reg (feature, "k3", regnum++, 1, NULL, 64, "uint64");
+ tdesc_create_reg (feature, "k4", regnum++, 1, NULL, 64, "uint64");
+ tdesc_create_reg (feature, "k5", regnum++, 1, NULL, 64, "uint64");
+ tdesc_create_reg (feature, "k6", regnum++, 1, NULL, 64, "uint64");
+ tdesc_create_reg (feature, "k7", regnum++, 1, NULL, 64, "uint64");
+ tdesc_create_reg (feature, "zmm0h", regnum++, 1, NULL, 256, "v2ui128");
+ tdesc_create_reg (feature, "zmm1h", regnum++, 1, NULL, 256, "v2ui128");
+ tdesc_create_reg (feature, "zmm2h", regnum++, 1, NULL, 256, "v2ui128");
+ tdesc_create_reg (feature, "zmm3h", regnum++, 1, NULL, 256, "v2ui128");
+ tdesc_create_reg (feature, "zmm4h", regnum++, 1, NULL, 256, "v2ui128");
+ tdesc_create_reg (feature, "zmm5h", regnum++, 1, NULL, 256, "v2ui128");
+ tdesc_create_reg (feature, "zmm6h", regnum++, 1, NULL, 256, "v2ui128");
+ tdesc_create_reg (feature, "zmm7h", regnum++, 1, NULL, 256, "v2ui128");
+ return regnum;
+}
diff --git a/gdb/features/i386/32bit-core.c b/gdb/features/i386/32bit-core.c
new file mode 100644
index 0000000..b43de4d
--- /dev/null
+++ b/gdb/features/i386/32bit-core.c
@@ -0,0 +1,66 @@
+/* THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi:set ro:
+ Original: 32bit-core.xml */
+
+#include "target-descriptions.h"
+
+static int
+create_feature_i386_32bit_core (struct target_desc *result, long regnum)
+{
+ struct tdesc_feature *feature;
+
+ feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
+ struct tdesc_type *field_type;
+ struct tdesc_type *type;
+ type = tdesc_create_flags (feature, "i386_eflags", 4);
+ tdesc_add_flag (type, 0, "CF");
+ tdesc_add_flag (type, 1, "");
+ tdesc_add_flag (type, 2, "PF");
+ tdesc_add_flag (type, 4, "AF");
+ tdesc_add_flag (type, 6, "ZF");
+ tdesc_add_flag (type, 7, "SF");
+ tdesc_add_flag (type, 8, "TF");
+ tdesc_add_flag (type, 9, "IF");
+ tdesc_add_flag (type, 10, "DF");
+ tdesc_add_flag (type, 11, "OF");
+ tdesc_add_flag (type, 14, "NT");
+ tdesc_add_flag (type, 16, "RF");
+ tdesc_add_flag (type, 17, "VM");
+ tdesc_add_flag (type, 18, "AC");
+ tdesc_add_flag (type, 19, "VIF");
+ tdesc_add_flag (type, 20, "VIP");
+ tdesc_add_flag (type, 21, "ID");
+
+ tdesc_create_reg (feature, "eax", regnum++, 1, NULL, 32, "int32");
+ tdesc_create_reg (feature, "ecx", regnum++, 1, NULL, 32, "int32");
+ tdesc_create_reg (feature, "edx", regnum++, 1, NULL, 32, "int32");
+ tdesc_create_reg (feature, "ebx", regnum++, 1, NULL, 32, "int32");
+ tdesc_create_reg (feature, "esp", regnum++, 1, NULL, 32, "data_ptr");
+ tdesc_create_reg (feature, "ebp", regnum++, 1, NULL, 32, "data_ptr");
+ tdesc_create_reg (feature, "esi", regnum++, 1, NULL, 32, "int32");
+ tdesc_create_reg (feature, "edi", regnum++, 1, NULL, 32, "int32");
+ tdesc_create_reg (feature, "eip", regnum++, 1, NULL, 32, "code_ptr");
+ tdesc_create_reg (feature, "eflags", regnum++, 1, NULL, 32, "i386_eflags");
+ tdesc_create_reg (feature, "cs", regnum++, 1, NULL, 32, "int32");
+ tdesc_create_reg (feature, "ss", regnum++, 1, NULL, 32, "int32");
+ tdesc_create_reg (feature, "ds", regnum++, 1, NULL, 32, "int32");
+ tdesc_create_reg (feature, "es", regnum++, 1, NULL, 32, "int32");
+ tdesc_create_reg (feature, "fs", regnum++, 1, NULL, 32, "int32");
+ tdesc_create_reg (feature, "gs", regnum++, 1, NULL, 32, "int32");
+ tdesc_create_reg (feature, "st0", regnum++, 1, NULL, 80, "i387_ext");
+ tdesc_create_reg (feature, "st1", regnum++, 1, NULL, 80, "i387_ext");
+ tdesc_create_reg (feature, "st2", regnum++, 1, NULL, 80, "i387_ext");
+ tdesc_create_reg (feature, "st3", regnum++, 1, NULL, 80, "i387_ext");
+ tdesc_create_reg (feature, "st4", regnum++, 1, NULL, 80, "i387_ext");
+ tdesc_create_reg (feature, "st5", regnum++, 1, NULL, 80, "i387_ext");
+ tdesc_create_reg (feature, "st6", regnum++, 1, NULL, 80, "i387_ext");
+ tdesc_create_reg (feature, "st7", regnum++, 1, NULL, 80, "i387_ext");
+ tdesc_create_reg (feature, "fctrl", regnum++, 1, "float", 32, "int");
+ tdesc_create_reg (feature, "fstat", regnum++, 1, "float", 32, "int");
+ tdesc_create_reg (feature, "ftag", regnum++, 1, "float", 32, "int");
+ tdesc_create_reg (feature, "fiseg", regnum++, 1, "float", 32, "int");
+ tdesc_create_reg (feature, "fioff", regnum++, 1, "float", 32, "int");
+ tdesc_create_reg (feature, "foseg", regnum++, 1, "float", 32, "int");
+ tdesc_create_reg (feature, "fooff", regnum++, 1, "float", 32, "int");
+ tdesc_create_reg (feature, "fop", regnum++, 1, "float", 32, "int");
+ return regnum;
+}
diff --git a/gdb/features/i386/32bit-linux.c b/gdb/features/i386/32bit-linux.c
new file mode 100644
index 0000000..686a2f1
--- /dev/null
+++ b/gdb/features/i386/32bit-linux.c
@@ -0,0 +1,14 @@
+/* THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi:set ro:
+ Original: 32bit-linux.xml */
+
+#include "target-descriptions.h"
+
+static int
+create_feature_i386_32bit_linux (struct target_desc *result, long regnum)
+{
+ struct tdesc_feature *feature;
+
+ feature = tdesc_create_feature (result, "org.gnu.gdb.i386.linux");
+ tdesc_create_reg (feature, "orig_eax", regnum++, 1, NULL, 32, "int");
+ return regnum;
+}
diff --git a/gdb/features/i386/32bit-mpx.c b/gdb/features/i386/32bit-mpx.c
new file mode 100644
index 0000000..6ed3b2e
--- /dev/null
+++ b/gdb/features/i386/32bit-mpx.c
@@ -0,0 +1,51 @@
+/* THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi:set ro:
+ Original: 32bit-mpx.xml */
+
+#include "target-descriptions.h"
+
+static int
+create_feature_i386_32bit_mpx (struct target_desc *result, long regnum)
+{
+ struct tdesc_feature *feature;
+
+ feature = tdesc_create_feature (result, "org.gnu.gdb.i386.mpx");
+ struct tdesc_type *field_type;
+ struct tdesc_type *type;
+ type = tdesc_create_struct (feature, "br128");
+ field_type = tdesc_named_type (feature, "uint64");
+ tdesc_add_field (type, "lbound", field_type);
+ field_type = tdesc_named_type (feature, "uint64");
+ tdesc_add_field (type, "ubound_raw", field_type);
+
+ type = tdesc_create_struct (feature, "_bndstatus");
+ tdesc_set_struct_size (type, 8);
+ tdesc_add_bitfield (type, "bde", 2, 31);
+ tdesc_add_bitfield (type, "error", 0, 1);
+
+ type = tdesc_create_union (feature, "status");
+ field_type = tdesc_named_type (feature, "data_ptr");
+ tdesc_add_field (type, "raw", field_type);
+ field_type = tdesc_named_type (feature, "_bndstatus");
+ tdesc_add_field (type, "status", field_type);
+
+ type = tdesc_create_struct (feature, "_bndcfgu");
+ tdesc_set_struct_size (type, 8);
+ tdesc_add_bitfield (type, "base", 12, 31);
+ tdesc_add_bitfield (type, "reserved", 2, 11);
+ tdesc_add_bitfield (type, "preserved", 1, 1);
+ tdesc_add_bitfield (type, "enabled", 0, 0);
+
+ type = tdesc_create_union (feature, "cfgu");
+ field_type = tdesc_named_type (feature, "data_ptr");
+ tdesc_add_field (type, "raw", field_type);
+ field_type = tdesc_named_type (feature, "_bndcfgu");
+ tdesc_add_field (type, "config", field_type);
+
+ tdesc_create_reg (feature, "bnd0raw", regnum++, 1, NULL, 128, "br128");
+ tdesc_create_reg (feature, "bnd1raw", regnum++, 1, NULL, 128, "br128");
+ tdesc_create_reg (feature, "bnd2raw", regnum++, 1, NULL, 128, "br128");
+ tdesc_create_reg (feature, "bnd3raw", regnum++, 1, NULL, 128, "br128");
+ tdesc_create_reg (feature, "bndcfgu", regnum++, 1, NULL, 64, "cfgu");
+ tdesc_create_reg (feature, "bndstatus", regnum++, 1, NULL, 64, "status");
+ return regnum;
+}
diff --git a/gdb/features/i386/32bit-pkeys.c b/gdb/features/i386/32bit-pkeys.c
new file mode 100644
index 0000000..24a40aa3
--- /dev/null
+++ b/gdb/features/i386/32bit-pkeys.c
@@ -0,0 +1,14 @@
+/* THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi:set ro:
+ Original: 32bit-pkeys.xml */
+
+#include "target-descriptions.h"
+
+static int
+create_feature_i386_32bit_pkeys (struct target_desc *result, long regnum)
+{
+ struct tdesc_feature *feature;
+
+ feature = tdesc_create_feature (result, "org.gnu.gdb.i386.pkeys");
+ tdesc_create_reg (feature, "pkru", regnum++, 1, NULL, 32, "uint32");
+ return regnum;
+}
diff --git a/gdb/features/i386/32bit-sse.c b/gdb/features/i386/32bit-sse.c
new file mode 100644
index 0000000..032623e
--- /dev/null
+++ b/gdb/features/i386/32bit-sse.c
@@ -0,0 +1,74 @@
+/* THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi:set ro:
+ Original: 32bit-sse.xml */
+
+#include "target-descriptions.h"
+
+static int
+create_feature_i386_32bit_sse (struct target_desc *result, long regnum)
+{
+ struct tdesc_feature *feature;
+
+ feature = tdesc_create_feature (result, "org.gnu.gdb.i386.sse");
+ struct tdesc_type *field_type;
+ field_type = tdesc_named_type (feature, "ieee_single");
+ tdesc_create_vector (feature, "v4f", field_type, 4);
+
+ field_type = tdesc_named_type (feature, "ieee_double");
+ tdesc_create_vector (feature, "v2d", field_type, 2);
+
+ field_type = tdesc_named_type (feature, "int8");
+ tdesc_create_vector (feature, "v16i8", field_type, 16);
+
+ field_type = tdesc_named_type (feature, "int16");
+ tdesc_create_vector (feature, "v8i16", field_type, 8);
+
+ field_type = tdesc_named_type (feature, "int32");
+ tdesc_create_vector (feature, "v4i32", field_type, 4);
+
+ field_type = tdesc_named_type (feature, "int64");
+ tdesc_create_vector (feature, "v2i64", field_type, 2);
+
+ struct tdesc_type *type;
+ type = tdesc_create_union (feature, "vec128");
+ field_type = tdesc_named_type (feature, "v4f");
+ tdesc_add_field (type, "v4_float", field_type);
+ field_type = tdesc_named_type (feature, "v2d");
+ tdesc_add_field (type, "v2_double", field_type);
+ field_type = tdesc_named_type (feature, "v16i8");
+ tdesc_add_field (type, "v16_int8", field_type);
+ field_type = tdesc_named_type (feature, "v8i16");
+ tdesc_add_field (type, "v8_int16", field_type);
+ field_type = tdesc_named_type (feature, "v4i32");
+ tdesc_add_field (type, "v4_int32", field_type);
+ field_type = tdesc_named_type (feature, "v2i64");
+ tdesc_add_field (type, "v2_int64", field_type);
+ field_type = tdesc_named_type (feature, "uint128");
+ tdesc_add_field (type, "uint128", field_type);
+
+ type = tdesc_create_flags (feature, "i386_mxcsr", 4);
+ tdesc_add_flag (type, 0, "IE");
+ tdesc_add_flag (type, 1, "DE");
+ tdesc_add_flag (type, 2, "ZE");
+ tdesc_add_flag (type, 3, "OE");
+ tdesc_add_flag (type, 4, "UE");
+ tdesc_add_flag (type, 5, "PE");
+ tdesc_add_flag (type, 6, "DAZ");
+ tdesc_add_flag (type, 7, "IM");
+ tdesc_add_flag (type, 8, "DM");
+ tdesc_add_flag (type, 9, "ZM");
+ tdesc_add_flag (type, 10, "OM");
+ tdesc_add_flag (type, 11, "UM");
+ tdesc_add_flag (type, 12, "PM");
+ tdesc_add_flag (type, 15, "FZ");
+
+ tdesc_create_reg (feature, "xmm0", regnum++, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "xmm1", regnum++, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "xmm2", regnum++, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "xmm3", regnum++, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "xmm4", regnum++, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "xmm5", regnum++, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "xmm6", regnum++, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "xmm7", regnum++, 1, NULL, 128, "vec128");
+ tdesc_create_reg (feature, "mxcsr", regnum++, 1, "vector", 32, "i386_mxcsr");
+ return regnum;
+}
diff --git a/gdb/target-descriptions.c b/gdb/target-descriptions.c
index 46a8ecc..5fd07ef 100644
--- a/gdb/target-descriptions.c
+++ b/gdb/target-descriptions.c
@@ -34,6 +34,7 @@
#include "gdb_obstack.h"
#include "hashtab.h"
#include "inferior.h"
+#include <algorithm>
/* The interface to visit different elements of target description. */
@@ -43,7 +44,9 @@ public:
virtual void visit_pre (const target_desc *e) = 0;
virtual void visit_post (const target_desc *e) = 0;
- virtual void visit (const tdesc_feature *e) = 0;
+ virtual void visit_pre (const tdesc_feature *e) = 0;
+ virtual void visit_post (const tdesc_feature *e) = 0;
+
virtual void visit (const tdesc_type *e) = 0;
virtual void visit (const tdesc_reg *e) = 0;
};
@@ -290,7 +293,7 @@ typedef struct tdesc_feature : tdesc_element
void accept (tdesc_element_visitor &v) const override
{
- v.visit (this);
+ v.visit_pre (this);
struct tdesc_type *type;
@@ -306,8 +309,9 @@ typedef struct tdesc_feature : tdesc_element
ix++)
reg->accept (v);
- }
+ v.visit_post (this);
+ }
} *tdesc_feature_p;
DEF_VEC_P(tdesc_feature_p);
@@ -1806,7 +1810,6 @@ public:
printf_unfiltered ("/* THIS FILE IS GENERATED. "
"-*- buffer-read-only: t -*- vi"
":set ro:\n");
- printf_unfiltered (" Original: %s */\n\n", filename);
}
~print_c_tdesc ()
@@ -1816,6 +1819,9 @@ public:
void visit_pre (const target_desc *e) override
{
+ printf_unfiltered (" Original: %s */\n\n",
+ lbasename (m_filename_after_features.c_str ()));
+
printf_unfiltered ("#include \"defs.h\"\n");
printf_unfiltered ("#include \"osabi.h\"\n");
printf_unfiltered ("#include \"target-descriptions.h\"\n");
@@ -1868,12 +1874,15 @@ public:
printf_unfiltered (" struct tdesc_feature *feature;\n");
}
- void visit (const tdesc_feature *e) override
+ void visit_pre (const tdesc_feature *e) override
{
printf_unfiltered ("\n feature = tdesc_create_feature (result, \"%s\");\n",
e->name);
}
+ void visit_post (const tdesc_feature *e) override
+ {}
+
void visit_post (const target_desc *e) override
{
printf_unfiltered ("\n tdesc_%s = result;\n", m_function);
@@ -2032,13 +2041,80 @@ public:
printf_unfiltered ("%d, \"%s\");\n", reg->bitsize, reg->type);
}
+protected:
+ std::string m_filename_after_features;
+
private:
char *m_function;
- std::string m_filename_after_features;
bool m_printed_field_type = false;
bool m_printed_type = false;
};
+/* Print target description feature in C. */
+
+class print_c_feature : public print_c_tdesc
+{
+public:
+ print_c_feature (std::string &file)
+ : print_c_tdesc (file)
+ {
+ /* Trim ".tmp". */
+ auto const pos = m_filename_after_features.find_last_of ('.');
+
+ m_filename_after_features = m_filename_after_features.substr (0, pos);
+ }
+
+ void visit_pre (const target_desc *e) override
+ {
+ printf_unfiltered (" Original: %s */\n\n",
+ lbasename (m_filename_after_features.c_str ()));
+
+ printf_unfiltered ("#include \"target-descriptions.h\"\n");
+ printf_unfiltered ("\n");
+ }
+
+ void visit_post (const target_desc *e) override
+ {}
+
+ void visit_pre (const tdesc_feature *e) override
+ {
+ std::string name (m_filename_after_features);
+
+ auto pos = name.find_first_of ('.');
+
+ name = name.substr (0, pos);
+ std::replace (name.begin (), name.end (), '/', '_');
+ std::replace (name.begin (), name.end (), '-', '_');
+
+ printf_unfiltered ("static int\n");
+ printf_unfiltered ("create_feature_%s ", name.c_str ());
+ printf_unfiltered ("(struct target_desc *result, long regnum)\n");
+
+ printf_unfiltered ("{\n");
+ printf_unfiltered (" struct tdesc_feature *feature;\n");
+ printf_unfiltered ("\n feature = tdesc_create_feature (result, \"%s\");\n",
+ e->name);
+ }
+
+ void visit_post (const tdesc_feature *e) override
+ {
+ printf_unfiltered (" return regnum;\n");
+ printf_unfiltered ("}\n");
+ }
+
+ void visit (const tdesc_reg *reg) override
+ {
+ printf_unfiltered (" tdesc_create_reg (feature, \"%s\", regnum++, %d, ",
+ reg->name, reg->save_restore);
+ if (reg->group)
+ printf_unfiltered ("\"%s\", ", reg->group);
+ else
+ printf_unfiltered ("NULL, ");
+ printf_unfiltered ("%d, \"%s\");\n", reg->bitsize, reg->type);
+ }
+
+};
+
static void
maint_print_c_tdesc_cmd (char *args, int from_tty)
{
@@ -2073,9 +2149,21 @@ maint_print_c_tdesc_cmd (char *args, int from_tty)
if (loc != std::string::npos)
filename_after_features = filename_after_features.substr (loc + 10);
- print_c_tdesc v (filename_after_features);
+ /* Print c files for target features instead of target descriptions,
+ because c files got from target features are more flexible than the
+ counterparts. */
+ if (startswith (filename_after_features.c_str (), "i386/32bit-"))
+ {
+ print_c_feature v (filename_after_features);
- tdesc->accept (v);
+ tdesc->accept (v);
+ }
+ else
+ {
+ print_c_tdesc v (filename_after_features);
+
+ tdesc->accept (v);
+ }
}
/* Provide a prototype to silence -Wmissing-prototypes. */