From patchwork Mon Jun 12 08:41:47 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yao Qi X-Patchwork-Id: 20931 Received: (qmail 73024 invoked by alias); 12 Jun 2017 08:42:37 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 71447 invoked by uid 89); 12 Jun 2017 08:42:22 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-27.6 required=5.0 tests=BAYES_00, FREEMAIL_FROM, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 spammy=UD:dtd, DOCTYPE, !DOCTYPE, SYSTEM X-HELO: mail-it0-f50.google.com Received: from mail-it0-f50.google.com (HELO mail-it0-f50.google.com) (209.85.214.50) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 12 Jun 2017 08:42:14 +0000 Received: by mail-it0-f50.google.com with SMTP id l6so9182365iti.1 for ; Mon, 12 Jun 2017 01:42:18 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=6GiNa+r6NXg8WYzEgWAimBUeQiprRF36yKrN4KFGYsA=; b=ndaAth4hzVjv4c/CAHW3vmid05xhDUSbhn3LCFtIcMszEP5dTpqbjhj84TdSjuWyUn 8igVl+4TVAGssIeHCSBmlhYq8q9VHIRiGXnaukhTmxQ+4mujWAH9be+Y1HsovJUCSM4M 0Ok+LKT3t+IFDQqf6WbMzGmy92i9bh+aSBj5aYs2jrMOnsHETOwea9Hc+nA7YKK/+9Yq o1mAK9A454JP2JyE5lj8cHRHKWLUUup+kFbspUfQV/vyuNiaTDbD4ejKRrLzT4GCeuiQ Ws0iipBUyOkLx+oPWDC2/cPDG//vIGUOLgfrNw5fW8+ZGB/WkKt5+gy3YFskWxjtT9Ba arhQ== X-Gm-Message-State: AKS2vOzhTSJkhOuz5Wa+nfVf5qo6jyzOLTiANc5kR+ZAl1gQ08vPMpzv //KoruJs7ZQxttIb X-Received: by 10.36.41.138 with SMTP id p132mr8021351itp.49.1497256937280; Mon, 12 Jun 2017 01:42:17 -0700 (PDT) Received: from E107787-LIN.cambridge.arm.com (static.42.136.251.148.clients.your-server.de. [148.251.136.42]) by smtp.gmail.com with ESMTPSA id u4sm5280289itu.1.2017.06.12.01.42.16 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 12 Jun 2017 01:42:16 -0700 (PDT) From: Yao Qi X-Google-Original-From: Yao Qi To: gdb-patches@sourceware.org Subject: [PATCH 16/25] Dynamically composite xml in reply to GDB Date: Mon, 12 Jun 2017 09:41:47 +0100 Message-Id: <1497256916-4958-17-git-send-email-yao.qi@linaro.org> In-Reply-To: <1497256916-4958-1-git-send-email-yao.qi@linaro.org> References: <1497256916-4958-1-git-send-email-yao.qi@linaro.org> X-IsSubscribed: yes 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 ... ... and send this buffer back to GDB. gdb/gdbserver: 2017-05-24 Yao Qi * 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) : New field. : New field. : 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. --- gdb/features/i386/32bit-avx.c | 2 +- gdb/features/i386/32bit-avx512.c | 2 +- gdb/features/i386/32bit-core.c | 2 +- gdb/features/i386/32bit-linux.c | 2 +- gdb/features/i386/32bit-mpx.c | 2 +- gdb/features/i386/32bit-pkeys.c | 2 +- gdb/features/i386/32bit-sse.c | 2 +- gdb/gdbserver/linux-x86-tdesc.c | 35 +++++------------------- gdb/gdbserver/server.c | 10 ++++--- gdb/gdbserver/tdesc.c | 58 +++++++++++++++++++++++++++++++++++++++- gdb/gdbserver/tdesc.h | 26 +++++++++++++++--- gdb/target-descriptions.c | 9 ++++--- 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 428a9db..b862d48 100644 --- a/gdb/gdbserver/server.c +++ b/gdb/gdbserver/server.c @@ -850,12 +850,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 ("@"); + + buffer += ""; + buffer += ""; + buffer += ""; + buffer += tdesc->arch; + buffer += ""; + + buffer += ""; + buffer += tdesc->osabi; + buffer += ""; + + char *xml; + + for (int i = 0; VEC_iterate (char_ptr, tdesc->features, i, xml); i++) + { + buffer += ""; + } + + buffer += ""; + + 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 38e28d3..a12fd7e 100644 --- a/gdb/target-descriptions.c +++ b/gdb/target-descriptions.c @@ -1746,7 +1746,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); @@ -2195,8 +2196,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,