diff options
author | Yao Qi <yao.qi@linaro.org> | 2017-05-24 14:59:37 +0100 |
---|---|---|
committer | Yao Qi <yao.qi@linaro.org> | 2017-06-20 11:34:14 +0100 |
commit | 16e89d7f76cc36db1a2f404867aea1223aa363f4 (patch) | |
tree | 7b43c45b19066a598eeb3182214338209110e9e2 | |
parent | 188e9303d5e8e9e2a7663b9136a7c282458ca78e (diff) | |
download | gdb-16e89d7f76cc36db1a2f404867aea1223aa363f4.zip gdb-16e89d7f76cc36db1a2f404867aea1223aa363f4.tar.gz gdb-16e89d7f76cc36db1a2f404867aea1223aa363f4.tar.bz2 |
Dynamically composite xml in reply to GDB
GDBserver still uses pre-generated target descriptions in order to
reply to GDB's query on target description (see xml-builtin-generated.c
in GDBserver build directory). This patch teaches GDBserver to
create XML contents according to the target descriptions rather than
using pre-generated ones.
First, change target feature c files to pass the feature xml file
name to tdesc_create_feature, so that target description in GDBserver
can record them, and create XML contents from these features in
buffer, like
...
<xi:include href="$FEATURE1_XML_NAME"/>
<xi:include href="$FEATURE2_XML_NAME"/>
...
and send this buffer back to GDB.
gdb/gdbserver:
2017-05-24 Yao Qi <yao.qi@linaro.org>
* linux-x86-tdesc.c (i386_get_ipa_tdesc): Call
set_tdesc_architecture and set_tdesc_osabi. Don't set
xmltarget field.
* server.c (get_features_xml): Call tdesc_get_features_xml.
* tdesc.c (set_tdesc_architecture): New function.
(set_tdesc_osabi): New function.
(tdesc_get_features_xml): New function.
(tdesc_create_feature): Add one argument.
* tdesc.h (struct target_desc) <features>: New field.
<arch>: New field.
<osabi>: New field.
(target_desc::~target_desc): xfree arch, osabi, and
features.
(set_tdesc_architecture): Declare.
(set_tdesc_osabi): Declare.
(tdesc_get_features_xml): Declare.
* target-descriptions.c (tdesc_create_feature): Add one
argument.
* target-descriptions.h (tdesc_create_feature): Update
the declaration.
-rw-r--r-- | gdb/features/i386/32bit-avx.c | 2 | ||||
-rw-r--r-- | gdb/features/i386/32bit-avx512.c | 2 | ||||
-rw-r--r-- | gdb/features/i386/32bit-core.c | 2 | ||||
-rw-r--r-- | gdb/features/i386/32bit-linux.c | 2 | ||||
-rw-r--r-- | gdb/features/i386/32bit-mpx.c | 2 | ||||
-rw-r--r-- | gdb/features/i386/32bit-pkeys.c | 2 | ||||
-rw-r--r-- | gdb/features/i386/32bit-sse.c | 2 | ||||
-rw-r--r-- | gdb/gdbserver/linux-x86-tdesc.c | 35 | ||||
-rw-r--r-- | gdb/gdbserver/server.c | 10 | ||||
-rw-r--r-- | gdb/gdbserver/tdesc.c | 58 | ||||
-rw-r--r-- | gdb/gdbserver/tdesc.h | 26 | ||||
-rw-r--r-- | gdb/target-descriptions.c | 9 | ||||
-rw-r--r-- | gdb/target-descriptions.h | 3 |
13 files changed, 106 insertions, 49 deletions
diff --git a/gdb/features/i386/32bit-avx.c b/gdb/features/i386/32bit-avx.c index bae025d..2146e00 100644 --- a/gdb/features/i386/32bit-avx.c +++ b/gdb/features/i386/32bit-avx.c @@ -14,7 +14,7 @@ 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"); + feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx", "32bit-avx.xml"); 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"); diff --git a/gdb/features/i386/32bit-avx512.c b/gdb/features/i386/32bit-avx512.c index ca15f8b..d36b4b0 100644 --- a/gdb/features/i386/32bit-avx512.c +++ b/gdb/features/i386/32bit-avx512.c @@ -14,7 +14,7 @@ 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"); + feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx512", "32bit-avx512.xml"); struct tdesc_type *field_type; field_type = tdesc_named_type (feature, "uint128"); tdesc_create_vector (feature, "v2ui128", field_type, 2); diff --git a/gdb/features/i386/32bit-core.c b/gdb/features/i386/32bit-core.c index 8db91ab..72694b8 100644 --- a/gdb/features/i386/32bit-core.c +++ b/gdb/features/i386/32bit-core.c @@ -14,7 +14,7 @@ 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"); + feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core", "32bit-core.xml"); struct tdesc_type *field_type; struct tdesc_type *type; type = tdesc_create_flags (feature, "i386_eflags", 4); diff --git a/gdb/features/i386/32bit-linux.c b/gdb/features/i386/32bit-linux.c index 7535c55..9ba9ae1 100644 --- a/gdb/features/i386/32bit-linux.c +++ b/gdb/features/i386/32bit-linux.c @@ -14,7 +14,7 @@ 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"); + feature = tdesc_create_feature (result, "org.gnu.gdb.i386.linux", "32bit-linux.xml"); regnum = 41; 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 index 9f1ae67..19fbae5 100644 --- a/gdb/features/i386/32bit-mpx.c +++ b/gdb/features/i386/32bit-mpx.c @@ -14,7 +14,7 @@ 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"); + feature = tdesc_create_feature (result, "org.gnu.gdb.i386.mpx", "32bit-mpx.xml"); struct tdesc_type *field_type; struct tdesc_type *type; type = tdesc_create_struct (feature, "br128"); diff --git a/gdb/features/i386/32bit-pkeys.c b/gdb/features/i386/32bit-pkeys.c index 86035ab..ee8208a 100644 --- a/gdb/features/i386/32bit-pkeys.c +++ b/gdb/features/i386/32bit-pkeys.c @@ -14,7 +14,7 @@ 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"); + feature = tdesc_create_feature (result, "org.gnu.gdb.i386.pkeys", "32bit-pkeys.xml"); 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 index 876c04d..d57cf49 100644 --- a/gdb/features/i386/32bit-sse.c +++ b/gdb/features/i386/32bit-sse.c @@ -14,7 +14,7 @@ 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"); + feature = tdesc_create_feature (result, "org.gnu.gdb.i386.sse", "32bit-sse.xml"); struct tdesc_type *field_type; field_type = tdesc_named_type (feature, "ieee_single"); tdesc_create_vector (feature, "v4f", field_type, 4); diff --git a/gdb/gdbserver/linux-x86-tdesc.c b/gdb/gdbserver/linux-x86-tdesc.c index 06e5bf9..0dc5275 100644 --- a/gdb/gdbserver/linux-x86-tdesc.c +++ b/gdb/gdbserver/linux-x86-tdesc.c @@ -132,6 +132,12 @@ i386_get_ipa_tdesc (int idx) if (*tdesc == NULL) { *tdesc = new target_desc (); + +#ifndef IN_PROCESS_AGENT + set_tdesc_architecture (*tdesc, "i386"); + set_tdesc_osabi (*tdesc, "GNU/Linux"); +#endif + long regnum = 0; regnum = create_feature_i386_32bit_core (*tdesc, regnum); @@ -162,35 +168,6 @@ i386_get_ipa_tdesc (int idx) #ifndef IN_PROCESS_AGENT static const char *expedite_regs_i386[] = { "ebp", "esp", "eip", NULL }; (*tdesc)->expedite_regs = expedite_regs_i386; - - switch (idx) - { - case X86_TDESC_MMX: - (*tdesc)->xmltarget = "i386-mmx-linux.xml"; - break; - case X86_TDESC_SSE: - (*tdesc)->xmltarget = "i386-linux.xml"; - break; - case X86_TDESC_AVX: - (*tdesc)->xmltarget = "i386-avx-linux.xml"; - break; - case X86_TDESC_MPX: - (*tdesc)->xmltarget = "i386-mpx-linux.xml"; - break; - case X86_TDESC_AVX_MPX: - (*tdesc)->xmltarget = "i386-avx-mpx-linux.xml"; - break; - case X86_TDESC_AVX_AVX512: - (*tdesc)->xmltarget = "i386-avx-avx512-linux.xml"; - break; - case X86_TDESC_AVX_MPX_AVX512_PKU: - (*tdesc)->xmltarget = "i386-avx-mpx-avx512-pku-linux.xml"; - break; - default: - internal_error (__FILE__, __LINE__, - "unknown ipa tdesc index: %d", idx); - } - #endif } return *tdesc;; diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c index d0dcbee..f54ff46 100644 --- a/gdb/gdbserver/server.c +++ b/gdb/gdbserver/server.c @@ -810,12 +810,14 @@ get_features_xml (const char *annex) This variable is set up from the auto-generated init_registers_... routine for the current target. */ - if (desc->xmltarget != NULL && strcmp (annex, "target.xml") == 0) + if (strcmp (annex, "target.xml") == 0) { - if (*desc->xmltarget == '@') - return desc->xmltarget + 1; + const char *ret = tdesc_get_features_xml ((target_desc*) desc); + + if (*ret == '@') + return ret + 1; else - annex = desc->xmltarget; + annex = ret; } #ifdef USE_XML diff --git a/gdb/gdbserver/tdesc.c b/gdb/gdbserver/tdesc.c index 686c76a..6b4c4b7 100644 --- a/gdb/gdbserver/tdesc.c +++ b/gdb/gdbserver/tdesc.c @@ -61,14 +61,70 @@ current_target_desc (void) return current_process ()->tdesc; } +void +set_tdesc_architecture (struct target_desc *target_desc, + const char *name) +{ + target_desc->arch = xstrdup (name); +} + +void +set_tdesc_osabi (struct target_desc *target_desc, const char *name) +{ + target_desc->osabi = xstrdup (name); +} + +const char * +tdesc_get_features_xml (target_desc *tdesc) +{ + /* Either .xmltarget or .features is not NULL. */ + gdb_assert (tdesc->xmltarget != NULL + || (tdesc->features != NULL + && tdesc->arch != NULL + && tdesc->osabi != NULL)); + + if (tdesc->xmltarget == NULL) + { + std::string buffer ("@<?xml version=\"1.0\"?>"); + + buffer += "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">"; + buffer += "<target>"; + buffer += "<architecture>"; + buffer += tdesc->arch; + buffer += "</architecture>"; + + buffer += "<osabi>"; + buffer += tdesc->osabi; + buffer += "</osabi>"; + + char *xml; + + for (int i = 0; VEC_iterate (char_ptr, tdesc->features, i, xml); i++) + { + buffer += "<xi:include href=\""; + buffer += xml; + buffer += "\"/>"; + } + + buffer += "</target>"; + + tdesc->xmltarget = xstrdup (buffer.c_str ()); + } + + return tdesc->xmltarget; +} #endif struct tdesc_type {}; struct tdesc_feature * -tdesc_create_feature (struct target_desc *tdesc, const char *name) +tdesc_create_feature (struct target_desc *tdesc, const char *name, + const char *xml) { +#ifndef IN_PROCESS_AGENT + VEC_safe_push (char_ptr, tdesc->features, xstrdup (xml)); +#endif return tdesc; } diff --git a/gdb/gdbserver/tdesc.h b/gdb/gdbserver/tdesc.h index e64f0b3..c3ab30d 100644 --- a/gdb/gdbserver/tdesc.h +++ b/gdb/gdbserver/tdesc.h @@ -47,6 +47,12 @@ struct target_desc actual XML file to be used in place of "target.xml". */ const char *xmltarget = NULL; + VEC (char_ptr) *features = NULL; + + const char *arch = NULL; + + const char *osabi = NULL; + public: target_desc () : reg_defs (NULL), registers_size (0) @@ -60,6 +66,15 @@ public: for (i = 0; VEC_iterate (tdesc_reg_p, reg_defs, i, reg); i++) xfree (reg); VEC_free (tdesc_reg_p, reg_defs); + + xfree ((char *) arch); + xfree ((char *) osabi); + + char *f; + + for (i = 0; VEC_iterate (char_ptr, features, i, f); i++) + xfree (f); + VEC_free (char_ptr, features); } bool operator!= (const target_desc &other) const { @@ -90,9 +105,6 @@ public: if (other.expedite_regs[i] != NULL) return true; - if (strcmp (xmltarget, other.xmltarget) != 0) - return true; - return false; } @@ -118,6 +130,11 @@ void init_target_desc (struct target_desc *tdesc); const struct target_desc *current_target_desc (void); #ifndef IN_PROCESS_AGENT +void set_tdesc_architecture (struct target_desc *target_desc, + const char *name); +void set_tdesc_osabi (struct target_desc *target_desc, const char *name); + +const char *tdesc_get_features_xml (struct target_desc *tdesc); #endif #define tdesc_feature target_desc @@ -125,7 +142,8 @@ const struct target_desc *current_target_desc (void); struct tdesc_type; struct tdesc_feature *tdesc_create_feature (struct target_desc *tdesc, - const char *name); + const char *name, + const char *xml = NULL); struct tdesc_type *tdesc_create_flags (struct tdesc_feature *feature, const char *name, int size); diff --git a/gdb/target-descriptions.c b/gdb/target-descriptions.c index 1795518..2476082 100644 --- a/gdb/target-descriptions.c +++ b/gdb/target-descriptions.c @@ -1743,7 +1743,8 @@ tdesc_add_enum_value (struct tdesc_type *type, int value, } struct tdesc_feature * -tdesc_create_feature (struct target_desc *tdesc, const char *name) +tdesc_create_feature (struct target_desc *tdesc, const char *name, + const char *xml) { struct tdesc_feature *new_feature = new tdesc_feature (name); @@ -2192,8 +2193,10 @@ public: printf_unfiltered ("{\n"); printf_unfiltered (" struct tdesc_feature *feature;\n"); - printf_unfiltered ("\n feature = tdesc_create_feature (result, \"%s\");\n", - e->name); + + printf_unfiltered + ("\n feature = tdesc_create_feature (result, \"%s\", \"%s\");\n", + e->name, lbasename (m_filename_after_features.c_str ())); } void visit_end (const tdesc_feature *e) override diff --git a/gdb/target-descriptions.h b/gdb/target-descriptions.h index d730672..25afaf0 100644 --- a/gdb/target-descriptions.h +++ b/gdb/target-descriptions.h @@ -222,7 +222,8 @@ void tdesc_add_compatible (struct target_desc *, const struct bfd_arch_info *); struct tdesc_feature *tdesc_create_feature (struct target_desc *tdesc, - const char *name); + const char *name, + const char *xml = NULL); struct tdesc_type *tdesc_create_vector (struct tdesc_feature *feature, const char *name, struct tdesc_type *field_type, |