From patchwork Thu Mar 22 08:44:24 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alan Hayward X-Patchwork-Id: 26422 Received: (qmail 47331 invoked by alias); 22 Mar 2018 08:45:41 -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 43218 invoked by uid 89); 22 Mar 2018 08:45:24 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-23.5 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, UNWANTED_LANGUAGE_BODY autolearn=ham version=3.3.2 spammy= 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:20 +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:55 +0000 From: alan.hayward@arm.com To: gdb-patches@sourceware.org Cc: nd@arm.com, Alan Hayward Subject: [PATCH v4 05/10] Commonise tdesc types Date: Thu, 22 Mar 2018 08:44:24 +0000 Message-Id: <20180322084429.26250-6-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: 8d00ce05-54da-4772-a5b6-08d58fd12fef 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:UdWD6yx0kCXDDBzpEqOpteu4roQYkYZ/hMGBXDBrmfzso5saOiUc3jqtTi1BHq5O5bDNRe9yrwD9DV+IPQxP00wgWzwVAHGfOheXF5O0zcC5MWTr8BFCdVL1eD6HaYnr/61PmVg+6kmTrFS1Pd/ER1UUnCkfiULg8HXgLP4r9ViP5x+hPUl4bzmstdwnJoSdl8x9kRZBndNTn9BQ35SuNuJVgrlWV7pX/KQi1WP1Th07hLGEEqx7NPRgZN0AX+yH; 25:mBZoP8enAEBnf6x3jC3T1FHP69wxtsCcldSvb3M1A/dkurctGiyb4DZhA9hAI/V18J6rE04qwezR6p7E4GSwIBlOCtVsmhjKOb/1wuYslFdZTSWUl//kUZpYpauuO436uz68IX0g+haT2OKC83PTLlhC0UkX+itlWwYzPlg/HNKFvPOCMj+aMQrtJeOTR3Pt9mgqFc8CM6cvp3gbaPxdjAmNAWuAibBWtLIXmB2qpw7Mx4LEPPzt1QsbVFZUtOwCw+IgVebJSkcSTbmemdhXwL1HQoOe1w+FXJELLQ3E/kkcQ0s1pjG0VQcI+z30Vx2T4hPDrBdPS8N3YGpsa3LQPw==; 31:YB4O9beGl89jXH9XbSyQTGxYv4eYsy/JNlptVFJfI/Mj3Ncn5N8lFF+naowZ8J8ZGaM+RmIHpwceCItNrgZk2ulD9Orhazk98w3xtnH83wjj/k67rFSMqw+c33ei9ahi/qnbE6iTWvLajDh8DNKRz1qUywFvFC5jZv/RXHu5DuE1FGKDPReGk6mCUIBSSlkRVmLHAOTHdjSQM4SeP5SWluSmc7OlO2SGTBXtbkeiFds= X-MS-TrafficTypeDiagnostic: AM2PR08MB0097: NoDisclaimer: True X-Microsoft-Exchange-Diagnostics: 1; AM2PR08MB0097; 20:tuHcO+K7h9okuMNKmsagSidQVnYhcK1LrgCy4ArI6J69e0QBFZUpWf5GryVnzqV+I7KbFMF2pGKt08PuzMg+J06Th9aRhajbyu9+/CEQnk5W1yiGPIp2D16/i/SXogyqZNqDuFj8AT0YZ0l+DheOKQ1z502+Woy+4m5r0YFgg8Q=; 4:fQIFS/maC83v7HlIwXeYakcH+oAvblTG2Q1NqE9v9U83eQP+0JftBdCsNRfRXQdsR9hlGvHfl7uIA4bgsH/z9js2MEfIhLHPPtemeToW+PYo9/4XqmQB/xCY25eC7NLUVjpuqvNkNIUYuQkMGhV9d6j2R+FV9tAJQ9YyEMEaLuH3rEX5IsGWdre/0Mwt8nBM1cD75N+iPVdnr16Vp6jOJ+dM4Vi/07H6TgOoKN/782B4CEPx5Rh+t9YMjWHtYIEfKJloY3KW2Be03KtLVM9FTguoO4TqxIuSUbxZdIUecORPHL5R7SqHEYVLF9hLuA/Ozr4p04ACmYbUFH86LmNdYDwk/YSu5MF5JBNqhFfU/Mk= 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)(575784001)(6916009)(2906002)(2950100002)(66066001)(47776003)(6486002)(25786009)(53936002)(51416003)(4326008)(106356001)(1076002)(8676002)(105586002)(478600001)(53416004)(6116002)(305945005)(50226002)(36756003)(386003)(7736002)(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:bFR53tIY+gr351p4nQAEiCwe7Un6qiZWrZDjoz2W4?= =?us-ascii?Q?mRrWtxyhpXP2d6NZ+I299qQXQ9kUuSsJf4EyjAglyzftvO4DDW20d5JIc9ic?= =?us-ascii?Q?Ve+y2Wr6p8oj/GhyxHT1tRTMKR3/1d594YQvn67tEoXqiTiZiLn45YXPmCTe?= =?us-ascii?Q?OspMT663t2dMu4pHcsdYQq3CtHrCdh7oAhoqtVNBfCf9yJkYNuulGYuLMYY5?= =?us-ascii?Q?fs/LdS3JLnDXbdzUQPNzK2rwpBdrCUtZjdk9DgeZk+IqZSVTZ2kPAqa7jVK1?= =?us-ascii?Q?SVSVRwL5qYzVzlp+OIvUwaUnp/dAjDjFbIPHSRQ+ZLFA7lt4Byxuz3X0Ny/Q?= =?us-ascii?Q?Fh2TZKCN4+J8dckRlkGy91zDOjcxwYeUtGOlxao7T4ISpLaBFrEiA91S2fKr?= =?us-ascii?Q?T/cLeK8NYrXTgvkdS8gyTh9hjfV44GLHIWvCE6rRux7tiClJ4zq7k+r96cYL?= =?us-ascii?Q?TlQRadZ9ZrgHRX1UBEzZYs7la6O0d2csVkY5Uh1O/1uCM6p9djQCElH6QU52?= =?us-ascii?Q?ryU8pWPwvBPwNf/OFoTTChFc8U05/htvfGsRfRyvg2Wdh2ambABOOQTGicnO?= =?us-ascii?Q?+iRYZMRvDHeLrvMOKvVGuiXmWJfezJCIIQ4sex40nokPA43FMrbCpxxgod/2?= =?us-ascii?Q?7uT0L+OQwa5AUHcg20w6EtWjUO3ExKoB7+cgeWyknPmO03nB3QZBoIYpl0Od?= =?us-ascii?Q?RSZeEGvrAyh2IkEXbjXTpAmybmT0QYIYVFixecaQy7IExKE1XsLBBA0VYM1i?= =?us-ascii?Q?jeZTpcZdR01Yxfya1A9gcVOK8BeRaF2VHTajnItgJfXGdzrTZ37NzDKo0Xdq?= =?us-ascii?Q?7nWpiPrZcB/FxLHe3kA8D7CdGByFdudbM8qvrqDhdaTmB/GC7TbnumhM8dLv?= =?us-ascii?Q?4j2ECv2YjQikhHRUnh5t9KvSyfsB9O5ZXDSXFHMlHfn64qv+HHmLBAgUEBc+?= =?us-ascii?Q?XZ4ty+irhp39RGjzaJBQdXFt9YBVKYQ0hvw11Us3WRFVG/RNyBVXk3Q+88+k?= =?us-ascii?Q?6ZDtN4abwlRKT2UyDL95SgupLZtBv/Yw5XtPNMVi1T4sji+n5BkjMgwA/2/N?= =?us-ascii?Q?/PA01K50CHIFxlZH2HXfi/glFb2u9vcAsCEUZjkQtIOAlP3zNmydDKzqIpdd?= =?us-ascii?Q?Ta9I2rM273KoFw2VNmxT+IALwfZdM0HHse3OLgrCy8mToLH1hGBuOQlH8nRB?= =?us-ascii?Q?HIOwpq4xzR9Nhn8XhD6tN3NuaKR6XMeZ7B0+cPnB+P3jC/nr5cAKpZcFdbns?= =?us-ascii?Q?wsqg2CEHVuMqWwNtxwBXUHs+4U3PLMu3CvIw2yrTxeL2QDLwR963NoxIEn+m?= =?us-ascii?Q?tgAmQPekZfB9WM00+p8raM=3D?= X-Microsoft-Antispam-Message-Info: LuiwoIDrjRspD0O2KYQy6LYNS5yZToPGSVgxdjz4WfyFfKZD0Ern10TNZl4rhihWMUKwIvVjAVimGXkRwa7Fscx6CHwtKkdh9Y4nNyIVjpLf+ug3+OaIa6G2kpLDgTd+OI4YNRdb3ni2n215gk+suGd9GYNmtHLoMWdIKNxvCv1D16oaBMLWjp9pRPH7zfM4 X-Microsoft-Exchange-Diagnostics: 1; AM2PR08MB0097; 6:mUE+lubGZjuQYF7H0sEHTsoNp2vPoYnZZcgC1VRYtDkUfSdYHVldenTAO+NGIjROk1/2rMHzgSsiRH6rnTa6vXypeAqYhoRiiCCCC3CXz/UGdwxYaW6RiAXqJ8lTQ/KHzwkR/l9U8XANVh3qtN0vLzkmbbCwvZkfO0sWiOF4BIMCrc0rCgecAuS6drf+bnBaP/QYZFD+pCQpQSfpYQ6jXUdeiuE4K69UuHvU+5BQazgyDLaTY+U6u/kOn2DhI19ldUDJkyWAmGUTEkXIkULHHW/zUPSjMcOSkN89bwOo3LRmTXU7+lC4VanL/8txXmCQKKRmNSUvJrXnuFPoHYOcUqfKxlNPZp4LWuUkguzy5W//cmKJHBugsLL/DXOaWyvE6kZau7pHolK7BsQ/QJOMlt5pnAW2u8jyNgdoBSuHV8RhGR8eWPjTrI+Xl+Vug1LDb289RoyiHuqL7GwJ1F5o9w==; 5:GSB+ZDgQ5uNCHVXDhvZBDgm0dDI3Ha7/wWFq1Xc0gIDdTDap1nN+WEbDVn7afUa1Gjycef7PU39ZL/YlfGyY073t1SNijnYvw+zFPxHNcruEpCOB3z3QifvWE6IOQ2tVmf4X6ott/gckBE8xWefquL97MdqGenMMRjxRXBJD0+s=; 24:2bi4lgINvT2i+lYLjqXhauVuCnm8F9zhyovQW7RevCx54VOSFp3NND3QooyJKj+NaVps9Dm6qxnddTXGMoNHrpr7ES6Y0d3/xlWYXKNEHRc= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; AM2PR08MB0097; 7:LkSu3Y63Pf7vooLPFiSh52xneYtOulDrNzmCfS80tG/y94QGV/zC2nQw59u3xJGxCQKcFBEUQIJ5moHx5tvZ7i1Pq8+FA4OL2dJDmVVQ+kwD/lpYCaE9CjfOYurpjMHl1DMIh59hbk5D4h6qyHY8oWWuaI39CvoRbdhmXzaM7kiOWMqpniZxJPhj4PNeqTjmk20FzL7FrMDXNMpk4ael+ORLFdyycgk4bHg4rNSxFcRN78ECtjSaXI7xFFlpnkNo X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Mar 2018 08:44:55.5464 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 8d00ce05-54da-4772-a5b6-08d58fd12fef 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 moves all the various tdesc types to common code. It also commonises all the tdesc_ functions that are stubbed out in gdbserver. This is a lot of code to move across, but it is the simplest way of getting gdbserver to retain the target description information. With this patch, gdb and gdbserver will now parse a target description in the same way. Identical to V3 version. Alan. 2018-03-21 Alan Hayward gdb/ * common/tdesc.c (tdesc_predefined_type): Move to here. (tdesc_named_type): Likewise. (tdesc_create_vector): Likewise. (tdesc_create_struct): Likewise. (tdesc_set_struct_size): Likewise. (tdesc_create_union): Likewise. (tdesc_create_flags): Likewise. (tdesc_create_enum): Likewise. (tdesc_add_field): Likewise. (tdesc_add_typed_bitfield): Likewise. (tdesc_add_bitfield): Likewise. (tdesc_add_flag): Likewise. (tdesc_add_enum_value): Likewise. * common/tdesc.h (tdesc_type_builtin): Likewise. (tdesc_type_vector): Likewise. (tdesc_type_field): Likewise. (tdesc_type_with_fields): Likewise. * target-descriptions.c (tdesc_type_field): Move from here. (tdesc_type_builtin): Likewise. (tdesc_type_vector): Likewise. (tdesc_type_with_fields): Likewise. (tdesc_predefined_types): Likewise. (tdesc_named_type): Likewise. (tdesc_create_vector): Likewise. (tdesc_create_struct): Likewise. (tdesc_set_struct_size): Likewise. (tdesc_create_union): Likewise. (tdesc_create_flags): Likewise. (tdesc_create_enum): Likewise. (tdesc_add_field): Likewise. (tdesc_add_typed_bitfield): Likewise. (tdesc_add_bitfield): Likewise. (tdesc_add_flag): Likewise. (tdesc_add_enum_value): Likewise. gdbserver/ * tdesc.c (tdesc_create_flags): Remove. (tdesc_add_flag): Likewise. (tdesc_named_type): Likewise. (tdesc_create_union): Likewise. (tdesc_create_struct): Likewise. (tdesc_create_vector): Likewise. (tdesc_add_bitfield): Likewise. (tdesc_add_field): Likewise. (tdesc_set_struct_size): Likewise. --- gdb/common/tdesc.c | 193 ++++++++++++++++++++++++++++++++++ gdb/common/tdesc.h | 66 ++++++++++++ gdb/gdbserver/tdesc.c | 68 ------------ gdb/target-descriptions.c | 258 ---------------------------------------------- 4 files changed, 259 insertions(+), 326 deletions(-) diff --git a/gdb/common/tdesc.c b/gdb/common/tdesc.c index ef6ed944df..a0ed7c5115 100644 --- a/gdb/common/tdesc.c +++ b/gdb/common/tdesc.c @@ -39,6 +39,28 @@ tdesc_reg::tdesc_reg (struct tdesc_feature *feature, const std::string &name_, tdesc_type = tdesc_named_type (feature, type.c_str ()); } +/* Predefined types. */ +static tdesc_type_builtin tdesc_predefined_types[] = +{ + { "bool", TDESC_TYPE_BOOL }, + { "int8", TDESC_TYPE_INT8 }, + { "int16", TDESC_TYPE_INT16 }, + { "int32", TDESC_TYPE_INT32 }, + { "int64", TDESC_TYPE_INT64 }, + { "int128", TDESC_TYPE_INT128 }, + { "uint8", TDESC_TYPE_UINT8 }, + { "uint16", TDESC_TYPE_UINT16 }, + { "uint32", TDESC_TYPE_UINT32 }, + { "uint64", TDESC_TYPE_UINT64 }, + { "uint128", TDESC_TYPE_UINT128 }, + { "code_ptr", TDESC_TYPE_CODE_PTR }, + { "data_ptr", TDESC_TYPE_DATA_PTR }, + { "ieee_single", TDESC_TYPE_IEEE_SINGLE }, + { "ieee_double", TDESC_TYPE_IEEE_DOUBLE }, + { "arm_fpa_ext", TDESC_TYPE_ARM_FPA_EXT }, + { "i387_ext", TDESC_TYPE_I387_EXT } +}; + void tdesc_feature::accept (tdesc_element_visitor &v) const { v.visit_pre (this); @@ -84,6 +106,36 @@ bool tdesc_feature::operator== (const tdesc_feature &other) const return true; } +/* Lookup a predefined type. */ + +static struct tdesc_type * +tdesc_predefined_type (enum tdesc_type_kind kind) +{ + for (int ix = 0; ix < ARRAY_SIZE (tdesc_predefined_types); ix++) + if (tdesc_predefined_types[ix].kind == kind) + return &tdesc_predefined_types[ix]; + + gdb_assert_not_reached ("bad predefined tdesc type"); +} + +/* See common/tdesc.h. */ + +struct tdesc_type * +tdesc_named_type (const struct tdesc_feature *feature, const char *id) +{ + /* First try target-defined types. */ + for (const tdesc_type_up &type : feature->types) + if (type->name == id) + return type.get (); + + /* Next try the predefined types. */ + for (int ix = 0; ix < ARRAY_SIZE (tdesc_predefined_types); ix++) + if (tdesc_predefined_types[ix].name == id) + return &tdesc_predefined_types[ix]; + + return NULL; +} + /* See common/tdesc.h. */ void @@ -96,3 +148,144 @@ tdesc_create_reg (struct tdesc_feature *feature, const char *name, feature->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) +{ + tdesc_type_vector *type = new tdesc_type_vector (name, field_type, count); + feature->types.emplace_back (type); + + return type; +} + +/* See common/tdesc.h. */ + +tdesc_type_with_fields * +tdesc_create_struct (struct tdesc_feature *feature, const char *name) +{ + tdesc_type_with_fields *type + = new tdesc_type_with_fields (name, TDESC_TYPE_STRUCT); + feature->types.emplace_back (type); + + return type; +} + +/* See common/tdesc.h. */ + +void +tdesc_set_struct_size (tdesc_type_with_fields *type, int size) +{ + gdb_assert (type->kind == TDESC_TYPE_STRUCT); + gdb_assert (size > 0); + type->size = size; +} + +/* See common/tdesc.h. */ + +tdesc_type_with_fields * +tdesc_create_union (struct tdesc_feature *feature, const char *name) +{ + tdesc_type_with_fields *type + = new tdesc_type_with_fields (name, TDESC_TYPE_UNION); + feature->types.emplace_back (type); + + return type; +} + +/* See common/tdesc.h. */ + +tdesc_type_with_fields * +tdesc_create_flags (struct tdesc_feature *feature, const char *name, + int size) +{ + gdb_assert (size > 0); + + tdesc_type_with_fields *type + = new tdesc_type_with_fields (name, TDESC_TYPE_FLAGS, size); + feature->types.emplace_back (type); + + return type; +} + +tdesc_type_with_fields * +tdesc_create_enum (struct tdesc_feature *feature, const char *name, + int size) +{ + gdb_assert (size > 0); + + tdesc_type_with_fields *type + = new tdesc_type_with_fields (name, TDESC_TYPE_ENUM, size); + feature->types.emplace_back (type); + + return type; +} + +/* See common/tdesc.h. */ + +void +tdesc_add_field (tdesc_type_with_fields *type, const char *field_name, + struct tdesc_type *field_type) +{ + gdb_assert (type->kind == TDESC_TYPE_UNION + || type->kind == TDESC_TYPE_STRUCT); + + /* Initialize start and end so we know this is not a bit-field + when we print-c-tdesc. */ + type->fields.emplace_back (field_name, field_type, -1, -1); +} + +void +tdesc_add_typed_bitfield (tdesc_type_with_fields *type, const char *field_name, + int start, int end, struct tdesc_type *field_type) +{ + gdb_assert (type->kind == TDESC_TYPE_STRUCT + || type->kind == TDESC_TYPE_FLAGS); + gdb_assert (start >= 0 && end >= start); + + type->fields.emplace_back (field_name, field_type, start, end); +} + +/* See common/tdesc.h. */ + +void +tdesc_add_bitfield (tdesc_type_with_fields *type, const char *field_name, + int start, int end) +{ + struct tdesc_type *field_type; + + gdb_assert (start >= 0 && end >= start); + + if (type->size > 4) + field_type = tdesc_predefined_type (TDESC_TYPE_UINT64); + else + field_type = tdesc_predefined_type (TDESC_TYPE_UINT32); + + tdesc_add_typed_bitfield (type, field_name, start, end, field_type); +} + +/* See common/tdesc.h. */ + +void +tdesc_add_flag (tdesc_type_with_fields *type, int start, + const char *flag_name) +{ + gdb_assert (type->kind == TDESC_TYPE_FLAGS + || type->kind == TDESC_TYPE_STRUCT); + + type->fields.emplace_back (flag_name, + tdesc_predefined_type (TDESC_TYPE_BOOL), + start, start); +} + +void +tdesc_add_enum_value (tdesc_type_with_fields *type, int value, + const char *name) +{ + gdb_assert (type->kind == TDESC_TYPE_ENUM); + type->fields.emplace_back (name, + tdesc_predefined_type (TDESC_TYPE_INT32), + value, -1); +} diff --git a/gdb/common/tdesc.h b/gdb/common/tdesc.h index 58d7126c7b..986625e685 100644 --- a/gdb/common/tdesc.h +++ b/gdb/common/tdesc.h @@ -195,6 +195,72 @@ struct tdesc_type : tdesc_element 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) + : tdesc_type (name, kind) + {} + + void accept (tdesc_element_visitor &v) const override + { + v.visit (this); + } +}; + +/* tdesc_type for vector types. */ + +struct tdesc_type_vector : tdesc_type +{ + tdesc_type_vector (const std::string &name, tdesc_type *element_type_, + int count_) + : tdesc_type (name, TDESC_TYPE_VECTOR), + element_type (element_type_), count (count_) + {} + + void accept (tdesc_element_visitor &v) const override + { + v.visit (this); + } + + struct tdesc_type *element_type; + int count; +}; + +/* A named type from a target description. */ + +struct tdesc_type_field +{ + tdesc_type_field (const std::string &name_, tdesc_type *type_, + int start_, int end_) + : name (name_), type (type_), start (start_), end (end_) + {} + + std::string name; + struct tdesc_type *type; + /* For non-enum-values, either both are -1 (non-bitfield), or both are + not -1 (bitfield). For enum values, start is the value (which could be + -1), end is -1. */ + int start, end; +}; + +/* tdesc_type for struct, union, flags, and enum types. */ + +struct tdesc_type_with_fields : tdesc_type +{ + tdesc_type_with_fields (const std::string &name, tdesc_type_kind kind, + int size_ = 0) + : tdesc_type (name, kind), size (size_) + {} + + void accept (tdesc_element_visitor &v) const override + { + v.visit (this); + } + + std::vector fields; + int size; +}; + /* A feature from a target description. Each feature is a collection of other elements, e.g. registers and types. */ diff --git a/gdb/gdbserver/tdesc.c b/gdb/gdbserver/tdesc.c index da1dbdf651..1f30a32431 100644 --- a/gdb/gdbserver/tdesc.c +++ b/gdb/gdbserver/tdesc.c @@ -201,71 +201,3 @@ tdesc_create_feature (struct target_desc *tdesc, const char *name, tdesc->features.emplace_back (new_feature); return new_feature; } - -/* See common/tdesc.h. */ - -tdesc_type_with_fields * -tdesc_create_flags (struct tdesc_feature *feature, const char *name, - int size) -{ - return NULL; -} - -/* See common/tdesc.h. */ - -void -tdesc_add_flag (tdesc_type_with_fields *type, int start, - const char *flag_name) -{} - -/* See common/tdesc.h. */ - -struct tdesc_type * -tdesc_named_type (const struct tdesc_feature *feature, const char *id) -{ - return NULL; -} - -/* See common/tdesc.h. */ - -tdesc_type_with_fields * -tdesc_create_union (struct tdesc_feature *feature, const char *id) -{ - return NULL; -} - -/* See common/tdesc.h. */ - -tdesc_type_with_fields * -tdesc_create_struct (struct tdesc_feature *feature, const char *id) -{ - return NULL; -} - -/* See common/tdesc.h. */ - -struct tdesc_type * -tdesc_create_vector (struct tdesc_feature *feature, const char *name, - struct tdesc_type *field_type, int count) -{ - return NULL; -} - -void -tdesc_add_bitfield (tdesc_type_with_fields *type, const char *field_name, - int start, int end) -{} - -/* See common/tdesc.h. */ - -void -tdesc_add_field (tdesc_type_with_fields *type, const char *field_name, - struct tdesc_type *field_type) -{} - -/* See common/tdesc.h. */ - -void -tdesc_set_struct_size (tdesc_type_with_fields *type, int size) -{ -} diff --git a/gdb/target-descriptions.c b/gdb/target-descriptions.c index a453eddec0..2782ffaab9 100644 --- a/gdb/target-descriptions.c +++ b/gdb/target-descriptions.c @@ -50,71 +50,6 @@ struct property std::string value; }; -/* A named type from a target description. */ - -struct tdesc_type_field -{ - tdesc_type_field (const std::string &name_, tdesc_type *type_, - int start_, int end_) - : name (name_), type (type_), start (start_), end (end_) - {} - - std::string name; - struct tdesc_type *type; - /* For non-enum-values, either both are -1 (non-bitfield), or both are - not -1 (bitfield). For enum values, start is the value (which could be - -1), end is -1. */ - int start, end; -}; - -struct tdesc_type_builtin : tdesc_type -{ - tdesc_type_builtin (const std::string &name, enum tdesc_type_kind kind) - : tdesc_type (name, kind) - {} - - void accept (tdesc_element_visitor &v) const override - { - v.visit (this); - } -}; - -/* tdesc_type for vector types. */ - -struct tdesc_type_vector : tdesc_type -{ - tdesc_type_vector (const std::string &name, tdesc_type *element_type_, int count_) - : tdesc_type (name, TDESC_TYPE_VECTOR), - element_type (element_type_), count (count_) - {} - - void accept (tdesc_element_visitor &v) const override - { - v.visit (this); - } - - struct tdesc_type *element_type; - int count; -}; - -/* tdesc_type for struct, union, flags, and enum types. */ - -struct tdesc_type_with_fields : tdesc_type -{ - tdesc_type_with_fields (const std::string &name, tdesc_type_kind kind, - int size_ = 0) - : tdesc_type (name, kind), size (size_) - {} - - void accept (tdesc_element_visitor &v) const override - { - v.visit (this); - } - - std::vector fields; - int size; -}; - /* Convert a tdesc_type to a gdb type. */ static type * @@ -741,58 +676,6 @@ tdesc_feature_name (const struct tdesc_feature *feature) return feature->name.c_str (); } -/* Predefined types. */ -static tdesc_type_builtin tdesc_predefined_types[] = -{ - { "bool", TDESC_TYPE_BOOL }, - { "int8", TDESC_TYPE_INT8 }, - { "int16", TDESC_TYPE_INT16 }, - { "int32", TDESC_TYPE_INT32 }, - { "int64", TDESC_TYPE_INT64 }, - { "int128", TDESC_TYPE_INT128 }, - { "uint8", TDESC_TYPE_UINT8 }, - { "uint16", TDESC_TYPE_UINT16 }, - { "uint32", TDESC_TYPE_UINT32 }, - { "uint64", TDESC_TYPE_UINT64 }, - { "uint128", TDESC_TYPE_UINT128 }, - { "code_ptr", TDESC_TYPE_CODE_PTR }, - { "data_ptr", TDESC_TYPE_DATA_PTR }, - { "ieee_single", TDESC_TYPE_IEEE_SINGLE }, - { "ieee_double", TDESC_TYPE_IEEE_DOUBLE }, - { "arm_fpa_ext", TDESC_TYPE_ARM_FPA_EXT }, - { "i387_ext", TDESC_TYPE_I387_EXT } -}; - -/* Lookup a predefined type. */ - -static struct tdesc_type * -tdesc_predefined_type (enum tdesc_type_kind kind) -{ - for (int ix = 0; ix < ARRAY_SIZE (tdesc_predefined_types); ix++) - if (tdesc_predefined_types[ix].kind == kind) - return &tdesc_predefined_types[ix]; - - gdb_assert_not_reached ("bad predefined tdesc type"); -} - -/* See common/tdesc.h. */ - -struct tdesc_type * -tdesc_named_type (const struct tdesc_feature *feature, const char *id) -{ - /* First try target-defined types. */ - for (const tdesc_type_up &type : feature->types) - if (type->name == id) - return type.get (); - - /* Next try the predefined types. */ - for (int ix = 0; ix < ARRAY_SIZE (tdesc_predefined_types); ix++) - if (tdesc_predefined_types[ix].name == id) - return &tdesc_predefined_types[ix]; - - return NULL; -} - /* Lookup type associated with ID. */ struct type * @@ -1227,147 +1110,6 @@ tdesc_use_registers (struct gdbarch *gdbarch, /* See common/tdesc.h. */ -struct tdesc_type * -tdesc_create_vector (struct tdesc_feature *feature, const char *name, - struct tdesc_type *field_type, int count) -{ - tdesc_type_vector *type = new tdesc_type_vector (name, field_type, count); - feature->types.emplace_back (type); - - return type; -} - -/* See common/tdesc.h. */ - -tdesc_type_with_fields * -tdesc_create_struct (struct tdesc_feature *feature, const char *name) -{ - tdesc_type_with_fields *type - = new tdesc_type_with_fields (name, TDESC_TYPE_STRUCT); - feature->types.emplace_back (type); - - return type; -} - -/* See common/tdesc.h. */ - -void -tdesc_set_struct_size (tdesc_type_with_fields *type, int size) -{ - gdb_assert (type->kind == TDESC_TYPE_STRUCT); - gdb_assert (size > 0); - type->size = size; -} - -/* See common/tdesc.h. */ - -tdesc_type_with_fields * -tdesc_create_union (struct tdesc_feature *feature, const char *name) -{ - tdesc_type_with_fields *type - = new tdesc_type_with_fields (name, TDESC_TYPE_UNION); - feature->types.emplace_back (type); - - return type; -} - -/* See common/tdesc.h. */ - -tdesc_type_with_fields * -tdesc_create_flags (struct tdesc_feature *feature, const char *name, - int size) -{ - gdb_assert (size > 0); - - tdesc_type_with_fields *type - = new tdesc_type_with_fields (name, TDESC_TYPE_FLAGS, size); - feature->types.emplace_back (type); - - return type; -} - -tdesc_type_with_fields * -tdesc_create_enum (struct tdesc_feature *feature, const char *name, - int size) -{ - gdb_assert (size > 0); - - tdesc_type_with_fields *type - = new tdesc_type_with_fields (name, TDESC_TYPE_ENUM, size); - feature->types.emplace_back (type); - - return type; -} - -/* See common/tdesc.h. */ - -void -tdesc_add_field (tdesc_type_with_fields *type, const char *field_name, - struct tdesc_type *field_type) -{ - gdb_assert (type->kind == TDESC_TYPE_UNION - || type->kind == TDESC_TYPE_STRUCT); - - /* Initialize start and end so we know this is not a bit-field - when we print-c-tdesc. */ - type->fields.emplace_back (field_name, field_type, -1, -1); -} - -void -tdesc_add_typed_bitfield (tdesc_type_with_fields *type, const char *field_name, - int start, int end, struct tdesc_type *field_type) -{ - gdb_assert (type->kind == TDESC_TYPE_STRUCT - || type->kind == TDESC_TYPE_FLAGS); - gdb_assert (start >= 0 && end >= start); - - type->fields.emplace_back (field_name, field_type, start, end); -} - -/* See common/tdesc.h. */ - -void -tdesc_add_bitfield (tdesc_type_with_fields *type, const char *field_name, - int start, int end) -{ - struct tdesc_type *field_type; - - gdb_assert (start >= 0 && end >= start); - - if (type->size > 4) - field_type = tdesc_predefined_type (TDESC_TYPE_UINT64); - else - field_type = tdesc_predefined_type (TDESC_TYPE_UINT32); - - tdesc_add_typed_bitfield (type, field_name, start, end, field_type); -} - -/* See common/tdesc.h. */ - -void -tdesc_add_flag (tdesc_type_with_fields *type, int start, - const char *flag_name) -{ - gdb_assert (type->kind == TDESC_TYPE_FLAGS - || type->kind == TDESC_TYPE_STRUCT); - - type->fields.emplace_back (flag_name, - tdesc_predefined_type (TDESC_TYPE_BOOL), - start, start); -} - -void -tdesc_add_enum_value (tdesc_type_with_fields *type, int value, - const char *name) -{ - gdb_assert (type->kind == TDESC_TYPE_ENUM); - type->fields.emplace_back (name, - tdesc_predefined_type (TDESC_TYPE_INT32), - value, -1); -} - -/* See common/tdesc.h. */ - struct tdesc_feature * tdesc_create_feature (struct target_desc *tdesc, const char *name, const char *xml)