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:
Yao Qi 2017-07-26 14:24:08 +01:00
parent 6eb1e6a8c1
commit 25aa13e522
10 changed files with 425 additions and 12 deletions

View File

@ -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>
* target-descriptions.c (tdesc_element_visitor): New class.

View File

@ -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)

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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. */