From patchwork Wed Jan 24 09:28:01 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alan Hayward X-Patchwork-Id: 25488 Received: (qmail 113872 invoked by alias); 24 Jan 2018 09:28:12 -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 91695 invoked by uid 89); 24 Jan 2018 09:28:07 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.7 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_LOTSOFHASH, RCVD_IN_DNSWL_NONE, SPF_HELO_PASS, SPF_PASS autolearn=ham version=3.3.2 spammy=expedite X-HELO: EUR01-HE1-obe.outbound.protection.outlook.com Received: from mail-he1eur01on0075.outbound.protection.outlook.com (HELO EUR01-HE1-obe.outbound.protection.outlook.com) (104.47.0.75) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 24 Jan 2018 09:28:05 +0000 Received: from DB3PR08MB0106.eurprd08.prod.outlook.com (10.161.56.20) by DB3PR08MB0108.eurprd08.prod.outlook.com (10.161.56.22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.428.17; Wed, 24 Jan 2018 09:28:01 +0000 Received: from DB3PR08MB0106.eurprd08.prod.outlook.com ([fe80::958e:90c2:6108:af75]) by DB3PR08MB0106.eurprd08.prod.outlook.com ([fe80::958e:90c2:6108:af75%14]) with mapi id 15.20.0428.019; Wed, 24 Jan 2018 09:28:01 +0000 From: Alan Hayward To: "gdb-patches@sourceware.org" CC: nd Subject: [PATCH v2 3/8] Use tdesc_feature in gdbserver tdesc Date: Wed, 24 Jan 2018 09:28:01 +0000 Message-ID: References: <7C97CC6A-92CB-4702-820D-206022F07102@arm.com> In-Reply-To: <7C97CC6A-92CB-4702-820D-206022F07102@arm.com> authentication-results: spf=none (sender IP is ) smtp.mailfrom=Alan.Hayward@arm.com; x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1; DB3PR08MB0108; 7:OHqu70ugAKA+JTiytVyWxeDF7ST6n/QbL9yQQQ4oLtWHMKws2p+kkDUGzJbONMmJLlFNTWlwMu/581SvHvZFpOSN9f+fx3SM2CfJMkJPiCrtT3tMyZ8M6YYFKph6HMQOntNoBHWIR/qCYV49uZwQH5IOsOMKUx8ixgTaujOszeMPw38ZlGEktgPWoohPPTWB+OKH51H4jSoorvwRJQUIEs2HF2tw7qMHvR0yz1JlI1u8QKg8kdC1qCvwcfNcqOUj x-ms-exchange-antispam-srfa-diagnostics: SSOS; x-ms-office365-filtering-ht: Tenant x-ms-office365-filtering-correlation-id: f640d4b2-9b73-43d8-b2a3-08d5630cc37f x-microsoft-antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(48565401081)(4534165)(4627221)(201703031133081)(201702281549075)(5600026)(4604075)(3008032)(2017052603307)(7153060)(7193020); SRVR:DB3PR08MB0108; x-ms-traffictypediagnostic: DB3PR08MB0108: nodisclaimer: True x-microsoft-antispam-prvs: x-exchange-antispam-report-test: UriScan:(180628864354917)(131327999870524); x-exchange-antispam-report-cfa-test: BCL:0; PCL:0; RULEID:(6040501)(2401047)(5005006)(8121501046)(3231023)(2400081)(944501161)(93006095)(93001095)(10201501046)(3002001)(6055026)(6041288)(20161123558120)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123564045)(20161123562045)(20161123560045)(6072148)(201708071742011); SRVR:DB3PR08MB0108; BCL:0; PCL:0; RULEID:; SRVR:DB3PR08MB0108; x-forefront-prvs: 056297E276 x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(979002)(39860400002)(366004)(376002)(346002)(396003)(39380400002)(377424004)(189003)(199004)(2351001)(3280700002)(4326008)(25786009)(82746002)(3660700001)(83716003)(6506007)(106356001)(97736004)(76176011)(6916009)(305945005)(99286004)(105586002)(6436002)(86362001)(575784001)(478600001)(59450400001)(5640700003)(72206003)(2950100002)(2900100001)(5250100002)(81166006)(53946003)(2501003)(8936002)(8676002)(2906002)(7736002)(5660300001)(81156014)(26005)(36756003)(4743002)(68736007)(6486002)(14454004)(33656002)(316002)(66066001)(6116002)(102836004)(3846002)(53936002)(6512007)(969003)(989001)(999001)(1009001)(1019001); DIR:OUT; SFP:1101; SCL:1; SRVR:DB3PR08MB0108; H:DB3PR08MB0106.eurprd08.prod.outlook.com; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; received-spf: None (protection.outlook.com: arm.com does not designate permitted sender hosts) x-microsoft-antispam-message-info: JJ0A3JYYTzNykgJntslp8+IodeYwih/xskxg/VZrCH2GAKmuIbZDDHU2jXdrz02HltHApm+SrbLXGAbuohi+sA== spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM Content-ID: <9FFF63DCB10D994CBED3748B0157D4E9@eurprd08.prod.outlook.com> MIME-Version: 1.0 X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-Network-Message-Id: f640d4b2-9b73-43d8-b2a3-08d5630cc37f X-MS-Exchange-CrossTenant-originalarrivaltime: 24 Jan 2018 09:28:01.2382 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB3PR08MB0108 X-IsSubscribed: yes This patch commonises tdesc_feature and makes use of it in gdbserver tdesc. Updated tdesc_create_feature so that it now creates a vector of features. I am now able to commonise tdesc_create_reg (wanted to do this in the previous patch). I also had to commonise tdesc_type. This is ok, because I will need them in a later patch. Alan. 2018-01-24 Alan Hayward gdb/ * arch/tdesc.c (tdesc_feature::accept): Move to here. (tdesc_feature::operator==): Likewise. (tdesc_create_reg): Likewise. * arch/tdesc.h (tdesc_type_kind): Likewise. (struct tdesc_type): Likewise. (struct tdesc_feature): Likewise. * regformats/regdat.sh: Create a feature. * target-descriptions.c (tdesc_type_kind): Move from here. (tdesc_type): Likewise. (tdesc_type_up): Likewise. (tdesc_feature): Likewise. (tdesc_create_reg): Likewise. gdbserver/ * tdesc.c (~target_desc): Remove implictly deleted items. (init_target_desc): Iterate all features. (tdesc_get_features_xml): Use vector. (tdesc_create_feature): Create feature. * tdesc.h (tdesc_feature) Remove (target_desc): Add features. diff --git a/gdb/arch/tdesc.h b/gdb/arch/tdesc.h index e957822b348182b8cae9809cd21f72974ffe05c5..480475fff873a19710befdf39e2bf3053be3efb3 100644 --- a/gdb/arch/tdesc.h +++ b/gdb/arch/tdesc.h @@ -31,6 +31,7 @@ struct tdesc_type_vector; struct tdesc_type_with_fields; struct tdesc_reg; struct target_desc; +struct type; /* The interface to visit different elements of target description. */ @@ -125,6 +126,104 @@ struct tdesc_reg : tdesc_element typedef std::unique_ptr tdesc_reg_up; +enum tdesc_type_kind +{ + /* Predefined types. */ + TDESC_TYPE_BOOL, + TDESC_TYPE_INT8, + TDESC_TYPE_INT16, + TDESC_TYPE_INT32, + TDESC_TYPE_INT64, + TDESC_TYPE_INT128, + TDESC_TYPE_UINT8, + TDESC_TYPE_UINT16, + TDESC_TYPE_UINT32, + TDESC_TYPE_UINT64, + TDESC_TYPE_UINT128, + TDESC_TYPE_CODE_PTR, + TDESC_TYPE_DATA_PTR, + TDESC_TYPE_IEEE_SINGLE, + TDESC_TYPE_IEEE_DOUBLE, + TDESC_TYPE_ARM_FPA_EXT, + TDESC_TYPE_I387_EXT, + + /* Types defined by a target feature. */ + TDESC_TYPE_VECTOR, + TDESC_TYPE_STRUCT, + TDESC_TYPE_UNION, + TDESC_TYPE_FLAGS, + TDESC_TYPE_ENUM +}; + +struct tdesc_type : tdesc_element +{ + tdesc_type (const std::string &name_, enum tdesc_type_kind kind_) + : name (name_), kind (kind_) + {} + + virtual ~tdesc_type () = default; + + DISABLE_COPY_AND_ASSIGN (tdesc_type); + + /* The name of this type. */ + std::string name; + + /* Identify the kind of this type. */ + enum tdesc_type_kind kind; + + bool operator== (const tdesc_type &other) const + { + return name == other.name && kind == other.kind; + } + + bool operator!= (const tdesc_type &other) const + { + return !(*this == other); + } + + /* Construct, if necessary, and return the GDB type implementing this + target type for architecture GDBARCH. */ + + virtual type *make_gdb_type (struct gdbarch *gdbarch) const = 0; +}; + +typedef std::unique_ptr tdesc_type_up; + +/* A feature from a target description. Each feature is a collection + of other elements, e.g. registers and types. */ + +struct tdesc_feature : tdesc_element +{ + tdesc_feature (const std::string &name_) + : name (name_) + {} + + virtual ~tdesc_feature () = default; + + DISABLE_COPY_AND_ASSIGN (tdesc_feature); + + /* The name of this feature. It may be recognized by the architecture + support code. */ + std::string name; + + /* The registers associated with this feature. */ + std::vector registers; + + /* The types associated with this feature. */ + std::vector types; + + void accept (tdesc_element_visitor &v) const override; + + bool operator== (const tdesc_feature &other) const; + + bool operator!= (const tdesc_feature &other) const + { + return !(*this == other); + } +}; + +typedef std::unique_ptr tdesc_feature_up; + /* Allocate a new target_desc. */ target_desc *allocate_target_description (void); diff --git a/gdb/arch/tdesc.c b/gdb/arch/tdesc.c index 3d84ad8d3fa2e017f4c6f7d137a3be2b58427370..603ccd79434e1dccd17e69ef193193e673835dd0 100644 --- a/gdb/arch/tdesc.c +++ b/gdb/arch/tdesc.c @@ -38,3 +38,61 @@ tdesc_reg::tdesc_reg (struct tdesc_feature *feature, const std::string &name_, have easy access to the containing feature when we want it later. */ tdesc_type = tdesc_named_type (feature, type.c_str ()); } + +void tdesc_feature::accept (tdesc_element_visitor &v) const +{ + v.visit_pre (this); + + for (const tdesc_type_up &type : types) + type->accept (v); + + for (const tdesc_reg_up ® : registers) + reg->accept (v); + + v.visit_post (this); +} + +bool tdesc_feature::operator== (const tdesc_feature &other) const +{ + if (name != other.name) + return false; + + if (registers.size () != other.registers.size ()) + return false; + + for (int ix = 0; ix < registers.size (); ix++) + { + const tdesc_reg_up ®1 = registers[ix]; + const tdesc_reg_up ®2 = other.registers[ix]; + + if (reg1 != reg2 && *reg1 != *reg2) + return false; + } + + if (types.size () != other.types.size ()) + return false; + + for (int ix = 0; ix < types.size (); ix++) + { + const tdesc_type_up &type1 = types[ix]; + const tdesc_type_up &type2 = other.types[ix]; + + if (type1 != type2 && *type1 != *type2) + return false; + } + + return true; +} + +/* See arch/tdesc.h. */ + +void +tdesc_create_reg (struct tdesc_feature *feature, const char *name, + int regnum, int save_restore, const char *group, + int bitsize, const char *type) +{ + tdesc_reg *reg = new tdesc_reg (feature, name, regnum, save_restore, + group, bitsize, type); + + feature->registers.emplace_back (reg); +} diff --git a/gdb/gdbserver/tdesc.h b/gdb/gdbserver/tdesc.h index cfc1a194def019ecf899e9184385be94de39d08c..8ae6cddc1896af99d86206d159fb952a0f666043 100644 --- a/gdb/gdbserver/tdesc.h +++ b/gdb/gdbserver/tdesc.h @@ -24,16 +24,10 @@ #include "regdef.h" #include -struct tdesc_feature -{ - /* The registers associated with this feature. */ - std::vector registers; -}; - /* A target description. Inherit from tdesc_feature so that target_desc can be used as tdesc_feature. */ -struct target_desc : tdesc_feature +struct target_desc { /* A vector of elements of register definitions that describe the inferior's register set. */ @@ -42,6 +36,9 @@ struct target_desc : tdesc_feature /* The register cache size, in bytes. */ int registers_size; + /* XML features in this target description. */ + std::vector features; + #ifndef IN_PROCESS_AGENT /* An array of register names. These are the "expedite" registers: registers whose values are sent along with stop replies. */ @@ -56,9 +53,6 @@ struct target_desc : tdesc_feature fields features, arch, and osabi in tdesc_get_features_xml. */ const char *xmltarget = NULL; - /* XML features in this target description. */ - VEC (char_ptr) *features = NULL; - /* The value of element in the XML, replying GDB. */ const char *arch = NULL; diff --git a/gdb/gdbserver/tdesc.c b/gdb/gdbserver/tdesc.c index 5dec636baa6b899490e8c700eea21d363fb79fa3..bc94d83ae58b9e79d8b71d0ce21c073f11765dd4 100644 --- a/gdb/gdbserver/tdesc.c +++ b/gdb/gdbserver/tdesc.c @@ -23,19 +23,11 @@ target_desc::~target_desc () { - int i; - for (reg *reg : reg_defs) xfree (reg); 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 target_desc::operator== (const target_desc &other) const @@ -73,28 +65,29 @@ init_target_desc (struct target_desc *tdesc) int offset = 0; /* Go through all the features and populate reg_defs. */ - for (const tdesc_reg_up &treg : tdesc->registers) - { - /* Fill in any blank spaces. */ - while (tdesc->reg_defs.size () < treg->target_regnum) - { - struct reg *reg = XCNEW (struct reg); - reg->name = ""; - reg->size = 0; - reg->offset = offset; - tdesc->reg_defs.push_back (reg); - } - - gdb_assert (treg->target_regnum == 0 - || treg->target_regnum == tdesc->reg_defs.size ()); - - struct reg *reg = XCNEW (struct reg); - reg->name = treg->name.c_str (); - reg->size = treg->bitsize; - reg->offset = offset; - tdesc->reg_defs.push_back (reg); - offset += reg->size; - } + for (const tdesc_feature_up &feature : tdesc->features) + for (const tdesc_reg_up &treg : feature->registers) + { + /* Fill in any blank spaces. */ + while (tdesc->reg_defs.size () < treg->target_regnum) + { + struct reg *reg = XCNEW (struct reg); + reg->name = ""; + reg->size = 0; + reg->offset = offset; + tdesc->reg_defs.push_back (reg); + } + + gdb_assert (treg->target_regnum == 0 + || treg->target_regnum == tdesc->reg_defs.size ()); + + struct reg *reg = XCNEW (struct reg); + reg->name = treg->name.c_str (); + reg->size = treg->bitsize; + reg->offset = offset; + tdesc->reg_defs.push_back (reg); + offset += reg->size; + } tdesc->registers_size = offset / 8; @@ -157,7 +150,7 @@ tdesc_get_features_xml (target_desc *tdesc) { /* Either .xmltarget or .features is not NULL. */ gdb_assert (tdesc->xmltarget != NULL - || (tdesc->features != NULL + || (!tdesc->features.empty () && tdesc->arch != NULL)); if (tdesc->xmltarget == NULL) @@ -177,12 +170,10 @@ tdesc_get_features_xml (target_desc *tdesc) buffer += ""; } - char *xml; - - for (int i = 0; VEC_iterate (char_ptr, tdesc->features, i, xml); i++) + for (const tdesc_feature_up &feature : tdesc->features) { buffer += "name; buffer += "\"/>"; } @@ -195,19 +186,15 @@ tdesc_get_features_xml (target_desc *tdesc) } #endif -struct tdesc_type -{}; - /* See arch/tdesc.h. */ struct tdesc_feature * 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; + struct tdesc_feature *new_feature = new tdesc_feature (name); + tdesc->features.emplace_back (new_feature); + return new_feature; } /* See arch/tdesc.h. */ @@ -252,21 +239,6 @@ tdesc_create_struct (struct tdesc_feature *feature, const char *id) /* See arch/tdesc.h. */ -void -tdesc_create_reg (struct tdesc_feature *feature, const char *name, - int regnum, int save_restore, const char *group, - int bitsize, const char *type) -{ - struct target_desc *tdesc = (struct target_desc *) feature; - - tdesc_reg *reg = new tdesc_reg (feature, name, regnum, save_restore, - group, bitsize, type); - - tdesc->registers.emplace_back (reg); -} - -/* See arch/tdesc.h. */ - struct tdesc_type * tdesc_create_vector (struct tdesc_feature *feature, const char *name, struct tdesc_type *field_type, int count) diff --git a/gdb/regformats/regdat.sh b/gdb/regformats/regdat.sh index ce1627120d9439082709c82c5804724f39477eb1..8c6e191596350fb4e983f8736985d9832f41e2d3 100755 --- a/gdb/regformats/regdat.sh +++ b/gdb/regformats/regdat.sh @@ -131,7 +131,7 @@ do echo "{" echo " static struct target_desc tdesc_${name}_s;" echo " struct target_desc *result = &tdesc_${name}_s;" - + echo " struct tdesc_feature *feature = tdesc_create_feature (result, \"${name}\");" continue elif test "${type}" = "xmltarget"; then xmltarget="${entry}" @@ -149,7 +149,7 @@ do echo "$0: $1 does not specify \`\`name''." 1>&2 exit 1 else - echo " tdesc_create_reg ((struct tdesc_feature *) result, \"${entry}\"," + echo " tdesc_create_reg (feature, \"${entry}\"," echo " 0, 0, NULL, ${type}, NULL);" offset=`expr ${offset} + ${type}` diff --git a/gdb/target-descriptions.c b/gdb/target-descriptions.c index 881ef78d2e3adde409e8585deb67c96e2f0594ed..6df29521eb2319919c7e20df14ca5aebc1d25321 100644 --- a/gdb/target-descriptions.c +++ b/gdb/target-descriptions.c @@ -67,69 +67,6 @@ struct tdesc_type_field int start, end; }; -enum tdesc_type_kind -{ - /* Predefined types. */ - TDESC_TYPE_BOOL, - TDESC_TYPE_INT8, - TDESC_TYPE_INT16, - TDESC_TYPE_INT32, - TDESC_TYPE_INT64, - TDESC_TYPE_INT128, - TDESC_TYPE_UINT8, - TDESC_TYPE_UINT16, - TDESC_TYPE_UINT32, - TDESC_TYPE_UINT64, - TDESC_TYPE_UINT128, - TDESC_TYPE_CODE_PTR, - TDESC_TYPE_DATA_PTR, - TDESC_TYPE_IEEE_SINGLE, - TDESC_TYPE_IEEE_DOUBLE, - TDESC_TYPE_ARM_FPA_EXT, - TDESC_TYPE_I387_EXT, - - /* Types defined by a target feature. */ - TDESC_TYPE_VECTOR, - TDESC_TYPE_STRUCT, - TDESC_TYPE_UNION, - TDESC_TYPE_FLAGS, - TDESC_TYPE_ENUM -}; - -struct tdesc_type : tdesc_element -{ - tdesc_type (const std::string &name_, enum tdesc_type_kind kind_) - : name (name_), kind (kind_) - {} - - virtual ~tdesc_type () = default; - - DISABLE_COPY_AND_ASSIGN (tdesc_type); - - /* The name of this type. */ - std::string name; - - /* Identify the kind of this type. */ - enum tdesc_type_kind kind; - - bool operator== (const tdesc_type &other) const - { - return name == other.name && kind == other.kind; - } - - bool operator!= (const tdesc_type &other) const - { - return !(*this == other); - } - - /* Construct, if necessary, and return the GDB type implementing this - target type for architecture GDBARCH. */ - - virtual type *make_gdb_type (struct gdbarch *gdbarch) const = 0; -}; - -typedef std::unique_ptr tdesc_type_up; - struct tdesc_type_builtin : tdesc_type { tdesc_type_builtin (const std::string &name, enum tdesc_type_kind kind) @@ -408,82 +345,6 @@ struct tdesc_type_with_fields : tdesc_type int size; }; -/* A feature from a target description. Each feature is a collection - of other elements, e.g. registers and types. */ - -struct tdesc_feature : tdesc_element -{ - tdesc_feature (const std::string &name_) - : name (name_) - {} - - virtual ~tdesc_feature () = default; - - DISABLE_COPY_AND_ASSIGN (tdesc_feature); - - /* The name of this feature. It may be recognized by the architecture - support code. */ - std::string name; - - /* The registers associated with this feature. */ - std::vector registers; - - /* The types associated with this feature. */ - std::vector types; - - void accept (tdesc_element_visitor &v) const override - { - v.visit_pre (this); - - for (const tdesc_type_up &type : types) - type->accept (v); - - for (const tdesc_reg_up ® : registers) - reg->accept (v); - - v.visit_post (this); - } - - bool operator== (const tdesc_feature &other) const - { - if (name != other.name) - return false; - - if (registers.size () != other.registers.size ()) - return false; - - for (int ix = 0; ix < registers.size (); ix++) - { - const tdesc_reg_up ®1 = registers[ix]; - const tdesc_reg_up ®2 = other.registers[ix]; - - if (reg1 != reg2 && *reg1 != *reg2) - return false; - } - - if (types.size () != other.types.size ()) - return false; - - for (int ix = 0; ix < types.size (); ix++) - { - const tdesc_type_up &type1 = types[ix]; - const tdesc_type_up &type2 = other.types[ix]; - - if (type1 != type2 && *type1 != *type2) - return false; - } - - return true; - } - - bool operator!= (const tdesc_feature &other) const - { - return !(*this == other); - } -}; - -typedef std::unique_ptr tdesc_feature_up; - /* A target description. */ struct target_desc : tdesc_element @@ -1338,20 +1199,6 @@ tdesc_use_registers (struct gdbarch *gdbarch, tdesc_remote_register_number); set_gdbarch_register_reggroup_p (gdbarch, tdesc_register_reggroup_p); } - - -/* See arch/tdesc.h. */ - -void -tdesc_create_reg (struct tdesc_feature *feature, const char *name, - int regnum, int save_restore, const char *group, - int bitsize, const char *type) -{ - tdesc_reg *reg = new tdesc_reg (feature, name, regnum, save_restore, - group, bitsize, type); - - feature->registers.emplace_back (reg); -} /* See arch/tdesc.h. */