From patchwork Tue Apr 10 14:33:31 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alan Hayward X-Patchwork-Id: 26668 Received: (qmail 52900 invoked by alias); 10 Apr 2018 14:34:11 -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 52804 invoked by uid 89); 10 Apr 2018 14:34:11 -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=Identify, expedite, interchangeable X-HELO: EUR02-HE1-obe.outbound.protection.outlook.com Received: from mail-eopbgr10088.outbound.protection.outlook.com (HELO EUR02-HE1-obe.outbound.protection.outlook.com) (40.107.1.88) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 10 Apr 2018 14:34:05 +0000 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Alan.Hayward@arm.com; Received: from c02tf0u7hf1t.manchester.arm.com (217.140.96.140) by HE1PR0802MB2138.eurprd08.prod.outlook.com (2603:10a6:3:c2::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.653.12; Tue, 10 Apr 2018 14:33:53 +0000 From: Alan Hayward To: gdb-patches@sourceware.org Cc: nd@arm.com, Alan Hayward Subject: [PATCH v5 2/8] Commonise tdesc_feature Date: Tue, 10 Apr 2018 15:33:31 +0100 Message-Id: <20180410143337.71768-3-alan.hayward@arm.com> In-Reply-To: <20180410143337.71768-1-alan.hayward@arm.com> References: <20180410143337.71768-1-alan.hayward@arm.com> MIME-Version: 1.0 X-ClientProxiedBy: CWXP265CA0019.GBRP265.PROD.OUTLOOK.COM (2603:10a6:400:2e::31) To HE1PR0802MB2138.eurprd08.prod.outlook.com (2603:10a6:3:c2::10) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: 4ed2a1ba-05d4-4043-a2fa-08d59ef015fb X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(48565401081)(5600026)(4604075)(4534165)(4627221)(201703031133081)(201702281549075)(2017052603328)(7153060)(7193020); SRVR:HE1PR0802MB2138; X-Microsoft-Exchange-Diagnostics: 1; HE1PR0802MB2138; 3:pfNHpWeQ3TVJz2lVlZP5dqnmbrYA5alAycf9RdLFdQKOT7rVUWZQzchdjqRT3GXXUm65JYrZM4cQDEEmloJ8wcP5fxajjmP1lhAmlEqMQrwr3COElYooZ7g51LhHzpe0R4q/66Lf4gCUu8H73Eu265U0cbglo4+dLhPlp1dhM4Z/gjMqBDl0iRXKhdG0iSkU60WtscYiXU/Cm/lwAPfQAW754lWwAc442UGHCAyMwlHjmt1ub7yjLc6ah+5Qbwn6; 25:wMmy6mVweGMd14nfp5uhLCdHxQPWahcv0kFgCxE4soRmrKe/2HXQr9tzIozJb/f0pd8sysvoPK6WQySVHveWfwBpBmqoGl4xNMWKBFAztBjPQhOb2r/Aee9wIZKnpQDwImJxmAyWTQiDqR3gzYbPvyekajilcTVI8GDFoQaO/CyYJX0yZznSB/9dQQL9hTC047oLaMJbpk2uMijNCgtynSErvlgikk9lWqXF79uSUJQ0kAW1jYm8JCg1srdBWPXgqPPQnYcUgzsx2wNOkJmFLqf3VaTX6cGv2vTVmU9JcLFt5f3dHROgD7BSb/6fAVadRebLuQThVf184xnTijIkNQ==; 31:4jUSbtWWisgq/KE5WSPoznGeljIGUKFZE5DHOotQtTxXOJarKxfaMF/IUg83q8BYcK8zBJl36y20KsJatap2zv8mLvLVYotFvYlBgaYqC3ggyicSHLcmVaRDtn02W6VcTeoXe17mUvMeIFNqSxpQbN9Q3BztHuZHb5AjF6+WICS5ynz2RrraWXeSf60JoGWTiRFIZWuw1xj0C6olhLWxc7vRFVALt3kaMGv8Qbx0mjI= X-MS-TrafficTypeDiagnostic: HE1PR0802MB2138: NoDisclaimer: True X-Microsoft-Exchange-Diagnostics: 1; HE1PR0802MB2138; 20:jNpQNy3+SXQr4iyF2xmvR1bkqZXaAAhkiwP821NJhGH916VJg2qqRUHp0l5VPYF2cKFWx1jmrZ0SVuGfhQ8FMaSfyQBtCyTiK1o74tgmfhoruEs3+yFrDQuI1KQSZgEyF4mK8XHs9xpF7qMd8zx9fifF+cKtIyEedt1tFFQrMv0=; 4:nyDrYfZbwTmNKvwSMhAlZUtkd7lz/AfK+NsjTOQSfvX1siijeBB4onGkgypKwPPdx0oJ85ZpD85Ewd1a82EMLAuUgyintMWtM28IyC6eVcDh9F/5FKCmy4cXPwXdkHzktdESg3/32WyeNsEJg1/ygr95EfODDWsWVxVQPzx9yD4fDBkXyjrpqLOEvKhUoS1P5sS+53Icvb7Mwa3gxp/6NnqP+CYKKEVdO5rDGJ4bt04vmEdqeanVtmUdjvFwRY5vWMRMtTNBYuCv/n4K2GleRxxzIUjSaTgLDT09k8zUIp1Bjyo5Fb9fYKz3g0iuwwy5oU5gJ//gSqIKbxCRBDgnRZXznUDvC3w2LLERVeXsaKI= 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)(5005006)(8121501046)(93006095)(93001095)(3231221)(944501327)(52105095)(3002001)(10201501046)(6055026)(6041310)(20161123560045)(20161123564045)(20161123558120)(20161123562045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(6072148)(201708071742011); SRVR:HE1PR0802MB2138; BCL:0; PCL:0; RULEID:; SRVR:HE1PR0802MB2138; X-Forefront-PRVS: 0638FD5066 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(979002)(39380400002)(396003)(346002)(39860400002)(366004)(376002)(377424004)(189003)(199004)(76176011)(386003)(52116002)(7696005)(36756003)(59450400001)(51416003)(6486002)(105586002)(486006)(6666003)(11346002)(6916009)(476003)(2906002)(3846002)(2616005)(6116002)(956004)(2361001)(446003)(1076002)(2351001)(186003)(316002)(26005)(86362001)(16526019)(8676002)(68736007)(16586007)(81166006)(81156014)(5660300001)(7736002)(8936002)(53936002)(106356001)(4326008)(478600001)(66066001)(305945005)(25786009)(48376002)(97736004)(72206003)(50226002)(50466002)(47776003)(969003)(989001)(999001)(1009001)(1019001); DIR:OUT; SFP:1101; SCL:1; SRVR:HE1PR0802MB2138; H:c02tf0u7hf1t.manchester.arm.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; MX:1; A:1; Received-SPF: None (protection.outlook.com: arm.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; HE1PR0802MB2138; 23:m7WMrQjICncFBiRXSiITOkbWkjHTfROVRXD63wJ?= =?us-ascii?Q?AX0suugQpJSvxPXcqoSCn9W5juQSxiMTQDAdad4gT+l5Q4HDWXkpNWNJUYap?= =?us-ascii?Q?uwFnOOb8chPjtfleKYvn/kODAVdNVUidqVRz9MOHjj8wiXIVae/QKL6zA52l?= =?us-ascii?Q?q4nMW0nmLuqjFPxEAc/bAHFmWXWnOEfim97Hv3XDomIccEifhwB8gEtVhqfu?= =?us-ascii?Q?n9yK2wzvD7WntdDr8Z9M5RGCWoLg72VF1skJCx5cBtU56S1CxUAVNKR8Rl5j?= =?us-ascii?Q?mJhC3C1W1q3fIkVKFqk2KyO0BY930zwMDo+RYk8YQpsGgr/Ki5/3H66F+2p1?= =?us-ascii?Q?b/TM+0Cezw31/i505eWzRcbWFknOyyPAjsAWPbKvyFmenzBcjLU3kqvnDaDq?= =?us-ascii?Q?CcLi6YIrOByx8Hyo3V07Hy8qgOyDb9puI4VCnygT3bjQZEVTeQhFne0Kwm10?= =?us-ascii?Q?tFr7yrH4mmTtIOPGNFrgkTzeyRPBhC0gnLRf/mm5ryfHh7Ffwp2TBucI9FrG?= =?us-ascii?Q?KaIRzho+BDO9loXXQnF75ysLVgoVQqPqcFjojbCPdjUDryaocT+iywfgfeff?= =?us-ascii?Q?0Eua36nTMZ9FSpJxVz5yU8J+Y2lSRWlBccV0upViXVHvcvOBp3kWg8SeQgfF?= =?us-ascii?Q?JhMfu+iSEjOnKKk0DFG7HtqTki8fSMIrrtLnSY5nd8ndDeZxbJiAsKzUxAxD?= =?us-ascii?Q?JQ8WyHy1PVDSitpbjXsGrbV7k78tTzPgwnsHHv++DJl9yuReVEt7rAIY+uqo?= =?us-ascii?Q?hxAPMyezDbm70MbTugXTjtgg13kstnqQqVGzGiieF24fbVCCGUmYoaVNcurL?= =?us-ascii?Q?qC6ABiykLx0W8ImIKcb2cacEpinqtf2YJz9js9UxTi18iJcmDM/aGV/sUMp9?= =?us-ascii?Q?rlITbw/dC+oCqDElyOJ+swqRdCNJRDIVBNMTGPUQEBnZp8oV2WHf7iRRrU/8?= =?us-ascii?Q?012bG7PT1zbQNci+bFQl10rspHY2KUHcydBQibJg8EfDTze6uUIQfbY6J+4V?= =?us-ascii?Q?gvm3LV/6vlgw8z22/nyApjiNwORPYXOkNg9Ge1dpn7sunAbAuw278TWpvc8H?= =?us-ascii?Q?zFYzPqGi++0xHeWUDq2D39BYsXowDqxlOlzVDnCk6p0YJPPOBRdcItOylvXK?= =?us-ascii?Q?FcV3lGPnRkBtQG0vUF1iJHldXZL5nrn7xKkLx5U30d2uQbc8KBB/y5CnAHes?= =?us-ascii?Q?F72yt7KnyCkv4r3O0beMIoeXh8SHWMdoLEGR1uVoJK0Ez9qIRdI0BvYtmFVE?= =?us-ascii?Q?7eLxBzPlhOnZQeL5Wrt6mwRxef4Rvqzg5u0aLTX6w1IFQewH43xP4hhepRog?= =?us-ascii?Q?0k0g05QBNVEJV9ail4WF7hFt/7MbKkjmAVESMwAysZaHMRPFMAWd64ofq2Fg?= =?us-ascii?Q?dnZnriYAnwU22qEL50j81tAAceZE=3D?= X-Microsoft-Antispam-Message-Info: R0ObKmXBLmsjRIRvK5eiwxFczKGsdtuHjc/3kE3qWQBE9YlaEMJBD2CGiCo6mYDbwUw/SCWDc/BRmXiKeSyr7RBXPyJScJu6WqWNqYXdy7covNec6NL5m6fA95AqMRM4u6DHS08dorrlY2MzDGuRCzQ/f2I73T5yEo5IEWPZ8cS9gIqqpWUngGFJRGX40mp/ X-Microsoft-Exchange-Diagnostics: 1; HE1PR0802MB2138; 6:3GEnpmf90awxvL6AKOHONsov0c1lxXnoDB3EjscgS+AkGST+20N4FOUvdQzavmKj6jsEdAwmWqOCCTTft3UhHyhxMFb1ZyzrIPLdK3+lxzBwkHLFmTxa8ZsGhRVMVol5peL9FZxAEAYlvcpxDxNURlncTVqzspe/nj+P2FMJnQwg6BI8BfdRpi4UczKixRPUrYEPmjIFzdSEFEOurvHF9m9pWvxUPzOUcpZQ4OJff/sSjmTlrY97VnKMnpwzoZ+y1cMbAt1hMBz4fWM13wjUU1uTGE2cInsoetu7VEbR4uZrhJQKfKL4p9vSGt7sl8diROt8ydfNBQZetrjW7lKqFvP0sQ8z/PjyVw+Nb2cGZqvLF8wOJfOSx/ESjEtsHIQm9fGa9t+anBWa8kLr+/+FUYR1EBPcvJlKvOS+PNJPgmTeIbB5g+xfezArGsFUHlaRvCs3jEAxcnvP5e1Rho8y1g==; 5:1u39YsJ6QrmR7aepevW3e7pCpvBlqMxlZs2HRFaSl+7JuRKT64NRG2mgNU7Vytuwb1lDUXsTUlwgh9YnWIHFu4FwTYwnl/jqB2UPei0vtXCggfCfcK0kcnOuYf5aUaIduB/rFGyMtvb1e0ZQ8QcVx2tt6l5BSFGly9YRRpvHNZ0=; 24:zzPufY1GFVJKuyU6CfRQenSOapNI29AzzI4YprxaSI8JNLYK7JLNDztZ2QEr0pa7bb9SpCbM2O8Ujk5rBNq5oOONtK0Qxafn7wADwZFpUL4= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; HE1PR0802MB2138; 7:o01EqNY371xLE8pUh1iLriQqwUpcMxP6YpfDRHxQAxqo9vi7/nHPrGYkMvYG+sRLvJ+EASMD1lWyGWLEVUSOiXW+8bibWHZRXzfs/R92lBxBybkbYmGSqsIW8SygldBX90g6+ltUPEUhnlfrpwmQRxlg5hLjOMcZM5010ljSlTLYmpvFOAhcaX4ukPBohPU7U/bDLVM7lWpnjCTjZsTkEb4PpzENipD6fjRX9IgZLtbt7sxko39/+LOv7SONCzx7 X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 10 Apr 2018 14:33:53.6883 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 4ed2a1ba-05d4-4043-a2fa-08d59ef015fb X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-Transport-CrossTenantHeadersStamped: HE1PR0802MB2138 X-IsSubscribed: yes 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 V4 except for removal of "struct type;" at the top of common/tdesc.h Alan. 2018-04-10 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 | 55 ++++++----------- gdb/gdbserver/tdesc.h | 14 ++--- gdb/regformats/regdat.sh | 4 +- gdb/target-descriptions.c | 148 ---------------------------------------------- 6 files changed, 175 insertions(+), 197 deletions(-) diff --git a/gdb/common/tdesc.c b/gdb/common/tdesc.c index 8a3d620b04..eefb2016f6 100644 --- a/gdb/common/tdesc.c +++ b/gdb/common/tdesc.c @@ -33,3 +33,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 0ec45af3b4..b501dfa995 100644 --- a/gdb/common/tdesc.h +++ b/gdb/common/tdesc.h @@ -131,6 +131,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 afe0187aeb..1047949e6d 100644 --- a/gdb/gdbserver/tdesc.c +++ b/gdb/gdbserver/tdesc.c @@ -23,8 +23,6 @@ target_desc::~target_desc () { - int i; - xfree ((char *) arch); xfree ((char *) osabi); } @@ -55,19 +53,21 @@ 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 regnum = treg->target_regnum; + for (const tdesc_feature_up &feature : tdesc->features) + for (const tdesc_reg_up &treg : feature->registers) + { + int regnum = treg->target_regnum; - /* Register number will increase (possibly with gaps) or be zero. */ - gdb_assert (regnum == 0 || regnum >= tdesc->reg_defs.size ()); + /* Register number will increase (possibly with gaps) or be zero. */ + gdb_assert (regnum == 0 || regnum >= tdesc->reg_defs.size ()); - if (regnum != 0) - tdesc->reg_defs.resize (regnum, reg (offset)); + if (regnum != 0) + tdesc->reg_defs.resize (regnum, reg (offset)); - tdesc->reg_defs.emplace_back (treg->name.c_str (), offset, treg->bitsize); - offset += treg->bitsize; - } + tdesc->reg_defs.emplace_back (treg->name.c_str (), offset, + treg->bitsize); + offset += treg->bitsize; + } tdesc->registers_size = offset / 8; @@ -150,11 +150,10 @@ tdesc_get_features_xml (target_desc *tdesc) buffer += ""; } - - for (const std::string &xml : tdesc->features) + for (const tdesc_feature_up &feature : tdesc->features) { buffer += "name; buffer += "\"/>"; } @@ -167,19 +166,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 - tdesc->features.emplace_back (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. */ @@ -224,21 +220,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) -{ - 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 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 8eb88eedce..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. */ - std::vector features; - /* 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. */