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-".
This commit is contained in:
parent
6eb1e6a8c1
commit
25aa13e522
|
@ -1,3 +1,26 @@
|
||||||
|
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>
|
2017-07-26 Yao Qi <yao.qi@linaro.org>
|
||||||
|
|
||||||
* target-descriptions.c (tdesc_element_visitor): New class.
|
* target-descriptions.c (tdesc_element_visitor): New class.
|
||||||
|
|
|
@ -235,7 +235,7 @@ XMLTOC = \
|
||||||
tic6x-c64xp-linux.xml \
|
tic6x-c64xp-linux.xml \
|
||||||
tic6x-c64xp.xml
|
tic6x-c64xp.xml
|
||||||
|
|
||||||
CFILES = $(patsubst %.xml,%.c,$(XMLTOC))
|
TDESC_CFILES = $(patsubst %.xml,%.c,$(XMLTOC))
|
||||||
GDB = false
|
GDB = false
|
||||||
|
|
||||||
all: $(OUTPUTS)
|
all: $(OUTPUTS)
|
||||||
|
@ -252,11 +252,40 @@ $(outdir)/%.dat: %.xml number-regs.xsl sort-regs.xsl gdbserver-regs.xsl
|
||||||
$(XSLTPROC) gdbserver-regs.xsl - >> $(outdir)/$*.tmp
|
$(XSLTPROC) gdbserver-regs.xsl - >> $(outdir)/$*.tmp
|
||||||
sh ../../move-if-change $(outdir)/$*.tmp $(outdir)/$*.dat
|
sh ../../move-if-change $(outdir)/$*.tmp $(outdir)/$*.dat
|
||||||
|
|
||||||
cfiles: $(CFILES)
|
FEATURE_XMLFILES = i386/32bit-core.xml \
|
||||||
%.c: %.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
|
$(GDB) -nx -q -batch -ex 'maint print c-tdesc $<' > $@.tmp
|
||||||
sh ../../move-if-change $@.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.
|
# Other dependencies.
|
||||||
$(outdir)/arm/arm-with-iwmmxt.dat: arm/arm-core.xml arm/xscale-iwmmxt.xml
|
$(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
|
$(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'
|
# 'all' doesn't build the C files, so don't delete them in 'clean'
|
||||||
# either.
|
# either.
|
||||||
clean-cfiles:
|
clean-cfiles:
|
||||||
rm -f $(CFILES)
|
rm -f $(TDESC_CFILES) $(FEATURE_CFILES)
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f $(OUTPUTS)
|
rm -f $(OUTPUTS)
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
|
@ -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;
|
||||||
|
}
|
|
@ -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;
|
||||||
|
}
|
|
@ -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;
|
||||||
|
}
|
|
@ -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;
|
||||||
|
}
|
|
@ -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;
|
||||||
|
}
|
|
@ -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;
|
||||||
|
}
|
|
@ -34,6 +34,7 @@
|
||||||
#include "gdb_obstack.h"
|
#include "gdb_obstack.h"
|
||||||
#include "hashtab.h"
|
#include "hashtab.h"
|
||||||
#include "inferior.h"
|
#include "inferior.h"
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
/* The interface to visit different elements of target description. */
|
/* 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_pre (const target_desc *e) = 0;
|
||||||
virtual void visit_post (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_type *e) = 0;
|
||||||
virtual void visit (const tdesc_reg *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
|
void accept (tdesc_element_visitor &v) const override
|
||||||
{
|
{
|
||||||
v.visit (this);
|
v.visit_pre (this);
|
||||||
|
|
||||||
struct tdesc_type *type;
|
struct tdesc_type *type;
|
||||||
|
|
||||||
|
@ -306,8 +309,9 @@ typedef struct tdesc_feature : tdesc_element
|
||||||
ix++)
|
ix++)
|
||||||
reg->accept (v);
|
reg->accept (v);
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
v.visit_post (this);
|
||||||
|
}
|
||||||
} *tdesc_feature_p;
|
} *tdesc_feature_p;
|
||||||
DEF_VEC_P(tdesc_feature_p);
|
DEF_VEC_P(tdesc_feature_p);
|
||||||
|
|
||||||
|
@ -1806,7 +1810,6 @@ public:
|
||||||
printf_unfiltered ("/* THIS FILE IS GENERATED. "
|
printf_unfiltered ("/* THIS FILE IS GENERATED. "
|
||||||
"-*- buffer-read-only: t -*- vi"
|
"-*- buffer-read-only: t -*- vi"
|
||||||
":set ro:\n");
|
":set ro:\n");
|
||||||
printf_unfiltered (" Original: %s */\n\n", filename);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
~print_c_tdesc ()
|
~print_c_tdesc ()
|
||||||
|
@ -1816,6 +1819,9 @@ public:
|
||||||
|
|
||||||
void visit_pre (const target_desc *e) override
|
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 \"defs.h\"\n");
|
||||||
printf_unfiltered ("#include \"osabi.h\"\n");
|
printf_unfiltered ("#include \"osabi.h\"\n");
|
||||||
printf_unfiltered ("#include \"target-descriptions.h\"\n");
|
printf_unfiltered ("#include \"target-descriptions.h\"\n");
|
||||||
|
@ -1868,12 +1874,15 @@ public:
|
||||||
printf_unfiltered (" struct tdesc_feature *feature;\n");
|
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",
|
printf_unfiltered ("\n feature = tdesc_create_feature (result, \"%s\");\n",
|
||||||
e->name);
|
e->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void visit_post (const tdesc_feature *e) override
|
||||||
|
{}
|
||||||
|
|
||||||
void visit_post (const target_desc *e) override
|
void visit_post (const target_desc *e) override
|
||||||
{
|
{
|
||||||
printf_unfiltered ("\n tdesc_%s = result;\n", m_function);
|
printf_unfiltered ("\n tdesc_%s = result;\n", m_function);
|
||||||
|
@ -2032,13 +2041,80 @@ public:
|
||||||
printf_unfiltered ("%d, \"%s\");\n", reg->bitsize, reg->type);
|
printf_unfiltered ("%d, \"%s\");\n", reg->bitsize, reg->type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
std::string m_filename_after_features;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
char *m_function;
|
char *m_function;
|
||||||
std::string m_filename_after_features;
|
|
||||||
bool m_printed_field_type = false;
|
bool m_printed_field_type = false;
|
||||||
bool m_printed_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
|
static void
|
||||||
maint_print_c_tdesc_cmd (char *args, int from_tty)
|
maint_print_c_tdesc_cmd (char *args, int from_tty)
|
||||||
{
|
{
|
||||||
|
@ -2073,10 +2149,22 @@ maint_print_c_tdesc_cmd (char *args, int from_tty)
|
||||||
if (loc != std::string::npos)
|
if (loc != std::string::npos)
|
||||||
filename_after_features = filename_after_features.substr (loc + 10);
|
filename_after_features = filename_after_features.substr (loc + 10);
|
||||||
|
|
||||||
|
/* 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);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
print_c_tdesc v (filename_after_features);
|
print_c_tdesc v (filename_after_features);
|
||||||
|
|
||||||
tdesc->accept (v);
|
tdesc->accept (v);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Provide a prototype to silence -Wmissing-prototypes. */
|
/* Provide a prototype to silence -Wmissing-prototypes. */
|
||||||
extern initialize_file_ftype _initialize_target_descriptions;
|
extern initialize_file_ftype _initialize_target_descriptions;
|
||||||
|
|
Loading…
Reference in New Issue