From patchwork Thu Mar 22 08:44:23 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alan Hayward X-Patchwork-Id: 26419 Received: (qmail 43092 invoked by alias); 22 Mar 2018 08:45:23 -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 37362 invoked by uid 89); 22 Mar 2018 08:45:10 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.0 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_HELO_PASS, SPF_PASS autolearn=ham version=3.3.2 spammy=expedite, 1317 X-HELO: EUR03-DB5-obe.outbound.protection.outlook.com Received: from mail-eopbgr40079.outbound.protection.outlook.com (HELO EUR03-DB5-obe.outbound.protection.outlook.com) (40.107.4.79) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 22 Mar 2018 08:45:03 +0000 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Alan.Hayward@arm.com; Received: from C02TF0U7HF1T.arm.com (217.140.96.140) by AM2PR08MB0097.eurprd08.prod.outlook.com (2a01:111:e400:841e::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.609.10; Thu, 22 Mar 2018 08:44:54 +0000 From: alan.hayward@arm.com To: gdb-patches@sourceware.org Cc: nd@arm.com, Alan Hayward Subject: [PATCH v4 04/10] Commonise tdesc_feature Date: Thu, 22 Mar 2018 08:44:23 +0000 Message-Id: <20180322084429.26250-5-alan.hayward@arm.com> In-Reply-To: <20180322084429.26250-1-alan.hayward@arm.com> References: <20180322084429.26250-1-alan.hayward@arm.com> MIME-Version: 1.0 X-ClientProxiedBy: CWXP265CA0052.GBRP265.PROD.OUTLOOK.COM (2603:10a6:400:2c::16) To AM2PR08MB0097.eurprd08.prod.outlook.com (2a01:111:e400:841e::18) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: 1db4713e-7e83-47b7-f8ff-08d58fd12f81 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(48565401081)(5600026)(4604075)(4534165)(4627221)(201703031133081)(201702281549075)(2017052603328)(7153060)(7193020); SRVR:AM2PR08MB0097; X-Microsoft-Exchange-Diagnostics: 1; AM2PR08MB0097; 3:FEUiMXO6b8KzTRVD2Htksvy9ZEkO1zfh5UMqGSoiwCF5zFWAECCKM4dd84XtPDWz2vtIBxzkESZ/pBke6/bsRKMZc3925D30Q2T+ref6/FqkNF8dBXlGtkaeAHGhOuXp8a2VGIEuELx2jpmSPnMzu9lApNh/kBxzwkBKvgxtwckzu9yWIo3WvCKsVY7VKlwQArJdRI+zpWbTxL7JYdMXn6RLZFlqvqu53xwWHx4SDyzULyUoVpR0zxS7l1TtYOrA; 25:TThmCpGGDVT19eXzWnbd0tO+E7MQf6usATnL6xJiNjnly1JJLbQ5Blu422GdCl6Zwc7RlAfPzHTe2JJyYIkJqVUZOhmsemDw5dmrs5dR3pWa2KeD5c5xf0scC5msXETzKUMfafTgPEvSiSF2cVTB8qU/NSgAUxjQnO6ZHggcA1+wT5Axu0JYD7pxUwm/JXPGN0zZnva0Va6zeBbGYIqqUC+XgIyjQdwSH1/oTThGJyMJ0Lja5vBOjLY+RNNPGgeAbf9jENF3AXDMWOea5E0AGvX1prOfgyCQpwfnp+yEcAOCWdxps8bbU6gr8MJGHGaBJ5vDydCzYMC9raOiodyGaQ==; 31:F2qrQdj6fDDAagbQod0p2qZKDbW9yQsxV0A71Qirkzdz1/VpdJs20SHzdkfjEgAII91ujaucPUe4PM3vlpVUrJY3S5OlPMgvsFiaPdMbYX60l9YJhlX4JPPqq4oSFDgdd9LeyCUn3TdUOzggUNtrK+fvMYmfkbuMip5GNYXkzyiEsQoNWVPZbvKSZRjLQNq3mxoPhXLeJaHmKu5bvpIqr4p6BtrOJVMzjwTlABAeJe4= X-MS-TrafficTypeDiagnostic: AM2PR08MB0097: NoDisclaimer: True X-Microsoft-Exchange-Diagnostics: 1; AM2PR08MB0097; 20:onsVhsjIrUlEkAFpnZQ3Ldw4ADaMkcxRgZTEDjFA22eji5WN/7YzqycCndzK8rVCdtzteCpsXljUsKZ9lPtdV46MxV+XSHx5c3o65BBNfkeg/pngCUZS42cO2JxPa4AjltT1ZKDZe1TnJuhc6iDQxsXJJpuMLGTumd3XbJESJaw=; 4:DCfQdqYwhY7Vd2u3Y79WPYGYCIcktfN+iUMjuWC6xGzC3pXfCWiqZNUi2AJolqh13iMcPHrL7z5YPsv0UB7S3sd/fronKTinuNrOpEmiv6jBVPw1H588zaCq49ciAbf9MFVIihEK3Xv9tDGgxWaPw5yzyZ9IpIKIX1UbbkAuvhaEsofMsNGVTpVivqJ0IY6NdKSxz5eDxEdj2EaLmd5tmcKqBUwNaqiJ6zydAHKrYD9YKPLOvnfFpf37wCAgd6UsSuSF020cui1nmsfoTMOyZGfKlVObWiUsRhaE9cXzDUgdEAGqYYDCBl39uQSKbuJajnU/EJJXPLXyD29qbgNs9YKzVMLFGoKdy1xA4bvYYaA= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(180628864354917)(131327999870524); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(8211001083)(6040522)(2401047)(8121501046)(5005006)(3002001)(10201501046)(93006095)(93001095)(3231221)(944501327)(52105095)(6055026)(6041310)(20161123562045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123560045)(20161123564045)(20161123558120)(6072148)(201708071742011); SRVR:AM2PR08MB0097; BCL:0; PCL:0; RULEID:; SRVR:AM2PR08MB0097; X-Forefront-PRVS: 0619D53754 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(346002)(366004)(376002)(39380400002)(396003)(39860400002)(377424004)(189003)(199004)(97736004)(72206003)(16586007)(7696005)(6666003)(86362001)(6916009)(2906002)(2950100002)(66066001)(47776003)(6486002)(25786009)(53936002)(51416003)(4326008)(106356001)(1076002)(8676002)(105586002)(478600001)(53416004)(6116002)(305945005)(50226002)(36756003)(386003)(7736002)(59450400001)(52116002)(3846002)(81156014)(81166006)(9686003)(68736007)(76176011)(50466002)(8936002)(186003)(2351001)(16526019)(85782001)(26005)(316002)(5660300001)(2361001)(48376002)(446003)(85772001); DIR:OUT; SFP:1101; SCL:1; SRVR:AM2PR08MB0097; H:C02TF0U7HF1T.arm.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-Exchange-Diagnostics: =?us-ascii?Q?1; AM2PR08MB0097; 23:Vi7FkiXCdsFm6aItkjpdBtPeSkypOTFfG9FVIk7YN?= =?us-ascii?Q?Afga59J45gRMb4obYSA8CM+e9gYkh4efI6o79DlR62DexIGEeFaQz3YMGEPd?= =?us-ascii?Q?ARJ1qoBX953IcoDU8LIUAjRN6i/Yk5ANG1wXXblXRGruf+Z4VHloh6V+PZtn?= =?us-ascii?Q?7y/XS1+6/gh/ymmwl8i508D4lAJJqzkKD6paGyuXI/qzETa9nU7lGk1Bdmjj?= =?us-ascii?Q?TN6V+eco1h2TgZyi9xA8vLsod518F9TsGvWKD+ehqPL9GUyV/Sae+/Nn/ExL?= =?us-ascii?Q?C5uEfXdEblm92O7zFU2+p8oEA14zN87D/xwruDTo7jsrYKtQ/AynMbkKvoxb?= =?us-ascii?Q?DJB1aAwKL4T+J9gBwcN6h8qRx4gIScSaLFtQEp1mnyDZw5qsurd7n679ki7E?= =?us-ascii?Q?p11eKtwcn2p581kCBn4fCN6Qd+futT+joRknM7QYG/kH6bx7c6slcbxVtDkI?= =?us-ascii?Q?2pF8bP/wujNsJPcCDIkBQUeqDPwEgZBxxvY7iX9SpCdSpu0eNOq9+l1UFxm3?= =?us-ascii?Q?UzmDS0w3Pcw65VmQnzXhonjITehYCaW18n7ebFAtGN3pxvvekwjLvMoLNjKq?= =?us-ascii?Q?7BcgXONH/+uaAu2M4CYoTQp6yiINj0+K+d7rTGYpMbx0Qc5rbz0Bzh976zkp?= =?us-ascii?Q?ttTJuVRfEShYwwZIn+uEWw4McyNHR5Mm/cfJAymPnycxeFrZ9KafdHqH5ivW?= =?us-ascii?Q?LY8aWWloG2H9i+PI0FjY41CrYyRdnztOomomJml14J3W21p0Ge/B+UHL1AWV?= =?us-ascii?Q?B9Irk5w3xPTS6REeQ8tyijeM4E3HF4cmxpj52ohfkyjbvKrL2FEqzyOSUFra?= =?us-ascii?Q?+aL12kzE5Uxz6TbfW3TwAdreTbKvi2ELQhEArfiMZ1F1CPNk7VZfuw9gqhrx?= =?us-ascii?Q?Vv9NiBieHxo+239V98jwKv4jXH0hyRr8ObMgPDBg2LQW5TbbDBaXPOiK6WkZ?= =?us-ascii?Q?aZsnpaMCudT8Xhj7NWEsw1T9Lziz9T0NuMyPcB7FZRiGCt85o9KZJ/KhamHs?= =?us-ascii?Q?W9wpb8tGMuCmh527b967sUh+qzIW5/rBTaunkklmG5npQG7AsrT+iW4UsbTO?= =?us-ascii?Q?SYAqtwEQBMIbbMk8I5RpTbtRJQ9GVdQkwqScxT061UosltJHE2cspzb35el1?= =?us-ascii?Q?JSmywTomHDkstXUAJmApfCJtPQUZf0cEQMGX3U2DdvVUlAN24OSaoVZTohpm?= =?us-ascii?Q?v/zqVU8MADuHx/QVp9+Ig/Tvwi40Aj1GL8VZajJNFVYZcPa1AnrPfk12VPX5?= =?us-ascii?Q?qHfDJWkhw13XMsCU1HzYDNsvHGLUcxPRxY3N5rYlbKtT6oRnrChruU5rIgHp?= =?us-ascii?Q?XkR65mzJytrEAAbQu0Q1HA=3D?= X-Microsoft-Antispam-Message-Info: JHECmsM67sVlJL6WTn31F/RmKBIRohjSAHXXBtpm65M++eoKrdNO5dL2rAi4/Jxzw3erWKsxWvR0xYioDG9coUbrwzYClm7ASfunvGeZpERMslJVAGByedycahBSBc2NEwR+zKRQs5gR/MWV+1bu1IXZH9V44GKFdc6eyZYlbUc75OjWsBYvfzxZJylPGdGY X-Microsoft-Exchange-Diagnostics: 1; AM2PR08MB0097; 6:nc12jhyznU/OAjtlCWlK79bXmRJH9SgJ9XIMFTmul7rE0Bryf2WTGeE5+UYY3b2PGOMr5t8BJ5aDdPaEgHTT2iZQGX/o6RZHLOtoNxCPjLfMrCZEwBcpPedR2duYGYlLGxJzE8DDVq1ZL039MNa1xijEznclDXJGiaKgCgnn5oINQFVFwKNjWonWmtyfBAqxTkQTzq7I0oCwGxYK0g0toSbvJYTOvjahws1AX+hLm10moBZe4gU/cwCzLOKWKl//HDcM81Ba+mpYI3Nw19k8nJkGrYa6E52TK88iAaSkZreFdwEcHvADN8szs3U5OFjWZCg+rVD2Br9nKJtIZbUoDWDGxgNsn8LFBRqIQm1MFQOHGM9H6WYwR2T135iKnQhUsIvYwOPu6gtuieItxO1qCGKWXm5Dc29hFzfB6FVX+/aWNV3zFtV5iau8Hjhmq7SO3z1F0OZc2l8dO6KDyy9rRQ==; 5:TYfXPqGsO/NarUcFwpk5iBy+uBSTCtAikO5XT+peIvB8uHdWkyz8fQX7+bUOVBf4ew+wJ2H7BGijCNkLL/49mY0UypC/F4Xztx8vUPW/PgjndvFkgJ/FlBqoklsO6HUwn4ueTvyNaEjekHi7wAcVLojCawHM+9To1PHKMvPqaso=; 24:b1AvCS7VQv0iDlcX17iY8K1oNx/omA29MFJIp+1GLbMlen49r+jKU2k1JNUabf+qYWD1GmJZITE/Ki2UGEY84Ukg5NKOU9wjhBbVFkq7cLw= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; AM2PR08MB0097; 7:PvqIBhgIRFH/o/Nrj6wMtH/MIiDpG6+u6zKKZomSM1M6hiSVn7/WUb+PKJxKb1SZtX0v3/72Q6Q6LByjN/M5fdOV5XAPZ+AHG5u7pgx+RcRMyJQXPYQL+eEXG+LOVgmIHqffsqFEGrrVEIeFecqzlqRgXDPg/QX2BM0gaSuTUe3d1dkEmXfYSFsyaFvbRNbVcqLPzGRymgfZ65D/A8G1UoOtiAfp9vzn1pnpYH76pr4fX3q98LYnqURuJGBslRgb X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Mar 2018 08:44:54.8277 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 1db4713e-7e83-47b7-f8ff-08d58fd12f81 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM2PR08MB0097 X-IsSubscribed: yes From: Alan Hayward This patch commonises tdesc_feature and makes use of it in gdbserver tdesc. Previously in gdbserver, target_desc was interchangeable with tdesc_feature. Now gdbserver target_desc contains a vector of tdesc_feature. 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 the next patch. Identical to V3 except for removal of "struct type;" at the top of common/tdesc.h Alan. 2018-03-21 Alan Hayward gdb/ * common/tdesc.c (tdesc_feature::accept): Move to here. (tdesc_feature::operator==): Likewise. (tdesc_create_reg): Likewise. * common/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. --- gdb/common/tdesc.c | 58 ++++++++++++++++++ gdb/common/tdesc.h | 93 +++++++++++++++++++++++++++++ gdb/gdbserver/tdesc.c | 89 ++++++++++------------------ gdb/gdbserver/tdesc.h | 14 ++--- gdb/regformats/regdat.sh | 4 +- gdb/target-descriptions.c | 148 ---------------------------------------------- 6 files changed, 189 insertions(+), 217 deletions(-) diff --git a/gdb/common/tdesc.c b/gdb/common/tdesc.c index a5f2de4b5b..ef6ed944df 100644 --- a/gdb/common/tdesc.c +++ b/gdb/common/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 common/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/common/tdesc.h b/gdb/common/tdesc.h index ac6dfdf7bb..58d7126c7b 100644 --- a/gdb/common/tdesc.h +++ b/gdb/common/tdesc.h @@ -137,6 +137,99 @@ 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); + } +}; + +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/gdbserver/tdesc.c b/gdb/gdbserver/tdesc.c index dbf07b2c8d..da1dbdf651 100644 --- a/gdb/gdbserver/tdesc.c +++ b/gdb/gdbserver/tdesc.c @@ -23,16 +23,8 @@ target_desc::~target_desc () { - int i; - 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 @@ -70,35 +62,36 @@ 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) - { - int current_size = tdesc->reg_defs.size (); + for (const tdesc_feature_up &feature : tdesc->features) + for (const tdesc_reg_up &treg : feature->registers) + { + int current_size = tdesc->reg_defs.size (); - /* Register number will either increase (possibly with gaps) or be - zero. */ - gdb_assert (treg->target_regnum == 0 - || treg->target_regnum >= current_size); + /* Register number will either increase (possibly with gaps) or be + zero. */ + gdb_assert (treg->target_regnum == 0 + || treg->target_regnum >= current_size); - tdesc->reg_defs.resize (treg->target_regnum != 0 + tdesc->reg_defs.resize (treg->target_regnum != 0 ? treg->target_regnum + 1 : current_size + 1); - /* Fill in any blank spaces. */ - while (current_size < treg->target_regnum) - { - struct reg *reg = &tdesc->reg_defs[current_size]; - reg->name = ""; - reg->size = 0; - reg->offset = offset; - current_size++; - } - - struct reg *reg = &tdesc->reg_defs.back (); - reg->name = treg->name.c_str (); - reg->size = treg->bitsize; - reg->offset = offset; - offset += reg->size; - } + /* Fill in any blank spaces. */ + while (current_size < treg->target_regnum) + { + struct reg *reg = &tdesc->reg_defs[current_size]; + reg->name = ""; + reg->size = 0; + reg->offset = offset; + current_size++; + } + + struct reg *reg = &tdesc->reg_defs.back (); + reg->name = treg->name.c_str (); + reg->size = treg->bitsize; + reg->offset = offset; + offset += reg->size; + } tdesc->registers_size = offset / 8; @@ -161,7 +154,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) @@ -181,12 +174,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 += "\"/>"; } @@ -199,19 +190,16 @@ tdesc_get_features_xml (target_desc *tdesc) } #endif -struct tdesc_type -{}; - /* See common/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 + (xml != nullptr ? xml : name); + tdesc->features.emplace_back (new_feature); + return new_feature; } /* See common/tdesc.h. */ @@ -256,19 +244,6 @@ tdesc_create_struct (struct tdesc_feature *feature, const char *id) /* See common/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); - - tdesc->registers.emplace_back (reg); -} - -/* See common/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/gdbserver/tdesc.h b/gdb/gdbserver/tdesc.h index c64ce13b25..197fb59127 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/regformats/regdat.sh b/gdb/regformats/regdat.sh index ce1627120d..8c6e191596 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 3186bf886f..a453eddec0 100644 --- a/gdb/target-descriptions.c +++ b/gdb/target-descriptions.c @@ -67,64 +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); - } -}; - -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) @@ -428,82 +370,6 @@ make_gdb_type (struct gdbarch *gdbarch, struct tdesc_type *ttype) return gdb_type.get_type (); } -/* 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 @@ -1358,20 +1224,6 @@ tdesc_use_registers (struct gdbarch *gdbarch, tdesc_remote_register_number); set_gdbarch_register_reggroup_p (gdbarch, tdesc_register_reggroup_p); } - - -/* See common/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 common/tdesc.h. */