From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR02-AM0-obe.outbound.protection.outlook.com (mail-am0eur02on2041.outbound.protection.outlook.com [40.107.247.41]) by sourceware.org (Postfix) with ESMTPS id 12EE63858D38 for ; Wed, 1 Feb 2023 09:53:00 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 12EE63858D38 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=arm.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector2-armh-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=FhluP4lXjvXSKWTZ9wFJTZQQXne+sijhHvDBrFELE8I=; b=UUiZBBeW1tBpHEBDK7khKhDfCSV/mjbua1skxZcTZTrchKmtNrfivOvpBr77+FI+CHfUevAppOPFx/9ZKdQwJp/yvQZXQGiHaUSBDxSGgDs2f4VCrNCtw9XlFQkQNL63/7pAB1Yd0L4Aj90viBkuXaLHEHJ6F/UFUiLzFC2bco4= Received: from DBBPR09CA0001.eurprd09.prod.outlook.com (2603:10a6:10:c0::13) by PAXPR08MB6509.eurprd08.prod.outlook.com (2603:10a6:102:12e::6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6043.38; Wed, 1 Feb 2023 09:52:55 +0000 Received: from DBAEUR03FT060.eop-EUR03.prod.protection.outlook.com (2603:10a6:10:c0:cafe::10) by DBBPR09CA0001.outlook.office365.com (2603:10a6:10:c0::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6064.22 via Frontend Transport; Wed, 1 Feb 2023 09:52:55 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 63.35.35.123) smtp.mailfrom=arm.com; dkim=pass (signature was verified) header.d=armh.onmicrosoft.com;dmarc=pass action=none header.from=arm.com; Received-SPF: Pass (protection.outlook.com: domain of arm.com designates 63.35.35.123 as permitted sender) receiver=protection.outlook.com; client-ip=63.35.35.123; helo=64aa7808-outbound-1.mta.getcheckrecipient.com; pr=C Received: from 64aa7808-outbound-1.mta.getcheckrecipient.com (63.35.35.123) by DBAEUR03FT060.mail.protection.outlook.com (100.127.142.238) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6043.23 via Frontend Transport; Wed, 1 Feb 2023 09:52:55 +0000 Received: ("Tessian outbound 333ca28169fa:v132"); Wed, 01 Feb 2023 09:52:55 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: 01cf923286e7686d X-CR-MTA-TID: 64aa7808 Received: from c51190510313.1 by 64aa7808-outbound-1.mta.getcheckrecipient.com id 280811CA-3A02-450D-95E8-D0DBAF101196.1; Wed, 01 Feb 2023 09:52:48 +0000 Received: from EUR01-DB5-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id c51190510313.1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Wed, 01 Feb 2023 09:52:48 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=b++fzhC6b0Z2fiAfqf6CzuASvKHq9MjoysrvGM7ya4zXK439O1hDl3B5yjRmTu8jWQhTvcc9FyMJOUA9PCsrDBlnKXgAB6b2255f7SSrh8wOrJpmiBQIbzsEbawighblzPV8AFmObcXxaizhubnRjcQPzvJPXHdninAqNRDjCE6JBjcDJKuf2DkGzod5R4P5Z2/wzupS0+WQpBqwSuTzrJfGfbkZLJGMt59cFUdAzRUjNf5z66aFtMgMgG35waNFsPf4zGayDorQ6dXHDJ3o0414lcvWxGSyjA6N0qAgcU90mqB6gSpKHYedOdrpdviPAJW+8HZfrk15zH1ZEMl5Dg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=FhluP4lXjvXSKWTZ9wFJTZQQXne+sijhHvDBrFELE8I=; b=TxlCL3Pl+4B3hTUBt0GCwAYnrATaXbYR7kYzNvILf9Hlu1zAodSuIG25eweErLWh/CKkkjZw9BHVB3ggoaaIIZB5bWFsVXolWOTPr4lTzcIu89j5cKojubjb9iMQ8hEPR0Ck+bERXULPl0/N/sScRKC6xCxS5keDN6sypDYSmmFgw1ol902F7VmxIM3CGI3b/m0ybcgJaNT76j/frUcgkA6cPvC0qVxd2R6O1HvGhFeyj3r9YEKJQXjFh5vbKwr9jZkmPMPaGuWmJWuxd4VDhoeIxBAViW+x0bh/iEdH9L2O7VukaN9Ulpn29Pqk+BO5NmrZ5WkMu+bxfXLRfrp1XA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=arm.com; dmarc=pass action=none header.from=arm.com; dkim=pass header.d=arm.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector2-armh-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=FhluP4lXjvXSKWTZ9wFJTZQQXne+sijhHvDBrFELE8I=; b=UUiZBBeW1tBpHEBDK7khKhDfCSV/mjbua1skxZcTZTrchKmtNrfivOvpBr77+FI+CHfUevAppOPFx/9ZKdQwJp/yvQZXQGiHaUSBDxSGgDs2f4VCrNCtw9XlFQkQNL63/7pAB1Yd0L4Aj90viBkuXaLHEHJ6F/UFUiLzFC2bco4= Authentication-Results-Original: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com; Received: from VI1PR08MB3919.eurprd08.prod.outlook.com (2603:10a6:803:c4::31) by DU0PR08MB9439.eurprd08.prod.outlook.com (2603:10a6:10:42d::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6043.36; Wed, 1 Feb 2023 09:52:46 +0000 Received: from VI1PR08MB3919.eurprd08.prod.outlook.com ([fe80::bced:32a3:b77e:90a6]) by VI1PR08MB3919.eurprd08.prod.outlook.com ([fe80::bced:32a3:b77e:90a6%3]) with mapi id 15.20.6043.036; Wed, 1 Feb 2023 09:52:46 +0000 Message-ID: <249be3dc-668e-9aa3-d3cc-5fc9fea3f99a@arm.com> Date: Wed, 1 Feb 2023 09:52:43 +0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.4.2 Subject: Re: [PATCH v3 6/8] gdb/remote: Parse tdesc field in stop reply and threads list XML Content-Language: en-US To: Thiago Jung Bauermann , gdb-patches@sourceware.org References: <20230130044518.3322695-1-thiago.bauermann@linaro.org> <20230130044518.3322695-7-thiago.bauermann@linaro.org> From: Luis Machado In-Reply-To: <20230130044518.3322695-7-thiago.bauermann@linaro.org> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-ClientProxiedBy: LO2P265CA0300.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:a5::24) To VI1PR08MB3919.eurprd08.prod.outlook.com (2603:10a6:803:c4::31) MIME-Version: 1.0 X-MS-TrafficTypeDiagnostic: VI1PR08MB3919:EE_|DU0PR08MB9439:EE_|DBAEUR03FT060:EE_|PAXPR08MB6509:EE_ X-MS-Office365-Filtering-Correlation-Id: 3ea8a2a4-d3c4-4f5d-3562-08db043a17c8 x-checkrecipientrouted: true NoDisclaimer: true X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam-Untrusted: BCL:0; X-Microsoft-Antispam-Message-Info-Original: IBXQsnInZUyj8q10j2qpZ0ZGZ5vVO519CPPdsS9Xg4B1naEYHefXqZjRierz5fMIyWay9OCwt+1k2j2tvhWlUF1ZJj6y0dqauBqJVW7DWOZFpvqiMWI4ahqIoVNXO2vfSg4VTesjiKzFs1RrLsffLfO6HkIQOQ2W4x6FcHwXx1yqOt0UQj9XayT5sR9MeHe7dVfzTWJGOcWgmyGeh+KAahAdpTqPv2kshPYYh324eN82yhCLuwORwNGZsa8M7gAXGzhKVUW8LBJyhADmYV9pGG0ijM+DN3fK6tcbzI2fbxCGzb2nah0dObNziuSQeQLC2LAhweFfrLPzla5NbACtFkR0p+arUCMc+MsgThNaPEkA0KUyUI/XzpFn57Ll3pzlto+4a6GhYtRqvuV0GnB5nTltQ9Q4AGuFEJ2InexKCFCLAJ9hk7/Waolr2MPAfjJ4ek2BuUgPZq/qnuAgRanhSpKSkGwtcJYLyxM/mhYDTUPBk9kM6lcyYEpgi0YQOTH9wxxmmaVBQUM5YMt68bQvlXIQb0k7rRLJ2okb4DF83WwOmcdjyF0Onn3voBYQns6CEiAMqPn+96d5qNefc0BcNbp/ApErU5PxUqrTNTLmCmMKYIn6dfKXmkTxCDywqPkKZmt881kVd7+4AR+hrngcRHp+7yQU7s9vqP4AcouYEKf4FNw8sXjcV/t/hEeedrYSiSsodVF9cXZroa/l0C8AI++niVNQh8NHhSDgFOn7VOY= X-Forefront-Antispam-Report-Untrusted: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:VI1PR08MB3919.eurprd08.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230025)(4636009)(39860400002)(366004)(346002)(376002)(396003)(136003)(451199018)(2616005)(186003)(26005)(6506007)(66476007)(6512007)(66899018)(478600001)(6486002)(2906002)(31686004)(83380400001)(6666004)(66946007)(66556008)(53546011)(8676002)(316002)(41300700001)(44832011)(8936002)(5660300002)(30864003)(38100700002)(36756003)(86362001)(31696002)(45980500001)(43740500002);DIR:OUT;SFP:1101; X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU0PR08MB9439 Original-Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com; X-EOPAttributedMessage: 0 X-MS-Exchange-Transport-CrossTenantHeadersStripped: DBAEUR03FT060.eop-EUR03.prod.protection.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: 8e37e26d-0167-4cdb-8083-08db043a11e7 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 30GgK9LLbGRu0s+4SJzID4bIDZoQyhT2g0XOleyainX+1Xs+81FDtuGw7elO59XpwxXxL/k0uWwH+JxERTWshwXQGxmBPTx25e8h3Z5sjhszv89uUN0tzr9rQarn5R1QugwxqTXwn74epMJbIHdHGtKHXzvJrSs9rR/YvryBJc7BktQpO/yxl75qBP8cI5mai8gvBAWRb59QpJzpuxUKDJ2tKB81xAL5D4GXE4Q3gfhrIIrnHLx7GwhVoHinPjug73x0reqxEBidLnAxztikImQXVcx5ZLdlj8oHLFtGVB9YcXyBiHKaWq4patHYSvWCVE7+8lf2adNUt1EIIGkey6Ttoq3Zj+RJn4ipq85gwaRHJr/rtCGJpT0lh44tqZLh1SGGnep1opK9V/6gz1Baa0nSYJgovpeq9cFTkNZ98wBIz+dLYj41W1pVEljMDu1FfmVdLrhHLH+NrQDpU98x++HzsYsd79F0O0JXSf47jKs/U7kIuvvkL222D3nJxUVboQ1ZdNI+Y+7xXVQzVcQg3I3beptzAxyzM/KKy65tn1BXuMJD0zp5hA0qa/SpRCCo4kZaAwajdb1K3xJ/antqyJKaDdq7PeKH8oJA4EGtjaKhfECnvrT+tCghIxYI3jNQtrs25pJyEgZ7hJf8Z7wIim/Fnu/f0CAAKdIx9Tv3g7AOlbUfXWuRZHE2gAJ9t0hfX6CURZsWBVgiJC9zf2q1/ozhq5WF+r95+GBWs3tsSAo= X-Forefront-Antispam-Report: CIP:63.35.35.123;CTRY:IE;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:64aa7808-outbound-1.mta.getcheckrecipient.com;PTR:ec2-63-35-35-123.eu-west-1.compute.amazonaws.com;CAT:NONE;SFS:(13230025)(4636009)(396003)(39860400002)(346002)(136003)(376002)(451199018)(36840700001)(46966006)(40470700004)(30864003)(44832011)(31686004)(66899018)(5660300002)(8936002)(2906002)(41300700001)(8676002)(70586007)(70206006)(82310400005)(316002)(186003)(40460700003)(6512007)(6666004)(26005)(86362001)(36756003)(478600001)(6506007)(2616005)(6486002)(82740400003)(83380400001)(336012)(47076005)(40480700001)(31696002)(53546011)(81166007)(36860700001)(356005)(43740500002);DIR:OUT;SFP:1101; X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Feb 2023 09:52:55.6512 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 3ea8a2a4-d3c4-4f5d-3562-08db043a17c8 X-MS-Exchange-CrossTenant-Id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=f34e5979-57d9-4aaa-ad4d-b122a662184d;Ip=[63.35.35.123];Helo=[64aa7808-outbound-1.mta.getcheckrecipient.com] X-MS-Exchange-CrossTenant-AuthSource: DBAEUR03FT060.eop-EUR03.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: PAXPR08MB6509 X-Spam-Status: No, score=-12.1 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,FORGED_SPF_HELO,GIT_PATCH_0,KAM_DMARC_NONE,NICE_REPLY_A,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_PASS,SPF_NONE,TXREP,UNPARSEABLE_RELAY autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: On 1/30/23 04:45, Thiago Jung Bauermann via Gdb-patches wrote: > gdbserver added the concept of target description IDs to the remote > protocol and uses them in the threads list XML and in the 'T AA' stop > reply packet. It also allows fetching a target description with a given > ID. This patch is for the GDB-side support. The target descriptions > obtained this way aren't yet used but will be in the next patch. > > In the DTD for the threads list XML, add a "tdesc" attribute to the > node. A tdesc_id field is added to the stop_reply and > thread_item structs. An m_remote member is added to the > threads_listing_context struct, and to simplify its initialisation a > constructor is added as well. This is to provide access to the remote > state in start_thread. > > Finally, the remote_state object keeps a map of the target descriptions > that have been received from the target, keyed by their ID. There are > also methods to get a target description given its ID, and to fetch target > descriptions for IDs that were mentioned by gdbserver but not yet > retrieved by GDB. The latter gets called after parsing the response of > qXfer:threads:read and of the stop reply packet. > --- > gdb/features/threads.dtd | 1 + > gdb/remote.c | 85 +++++++++++++++++++++++++++++++++++++++- > gdb/xml-tdesc.c | 27 ++++++++++--- > gdb/xml-tdesc.h | 6 +++ > 4 files changed, 112 insertions(+), 7 deletions(-) > > diff --git a/gdb/features/threads.dtd b/gdb/features/threads.dtd > index 036b2ce58837..3102d1352978 100644 > --- a/gdb/features/threads.dtd > +++ b/gdb/features/threads.dtd > @@ -11,3 +11,4 @@ > > > > + > diff --git a/gdb/remote.c b/gdb/remote.c > index 218bca30d047..f1d1944414c3 100644 > --- a/gdb/remote.c > +++ b/gdb/remote.c > @@ -80,6 +80,7 @@ > #include > #include "async-event.h" > #include "gdbsupport/selftest.h" > +#include "xml-tdesc.h" > > /* The remote target. */ > > @@ -238,6 +239,16 @@ class remote_state > /* Get the remote arch state for GDBARCH. */ > struct remote_arch_state *get_remote_arch_state (struct gdbarch *gdbarch); > > + /* Add new ID to the target description list. The corresponding XML will be > + requested soon. */ Will it be requested soon or can gdb just ignore it if the user doesn't switch to that thread? If gdb can ignore it, then it might be nice to mention it here that gdb can chose to request it at any point in time, but may opt not to do it at all. > + void add_tdesc_id (ULONGEST id); > + > + /* Get the target description corresponding to remote protocol ID. */ s/remote protocol/remote target description? > + const target_desc *get_tdesc (ULONGEST id) const; > + > + /* Get the target descriptions we don't know about from the target. */ > + void fetch_unknown_tdescs (remote_target *remote); > + > public: /* data */ > > /* A buffer to use for incoming packets, and its current size. The > @@ -387,6 +398,10 @@ class remote_state > support multi-process. */ > std::unordered_map > m_arch_states; > + > + /* The target descriptions that have been received from the target. The key > + is the ID used to reference it in the remote protocol. */ > + std::unordered_map m_tdescs; > }; > > static const target_info remote_target_info = { > @@ -1009,6 +1024,9 @@ struct stop_reply : public notif_event > fetch them is avoided). */ > std::vector regcache; > > + /* The target description ID communicated in the stop reply packet. */ > + gdb::optional tdesc_id; > + > enum target_stop_reason stop_reason; > > CORE_ADDR watch_data_address; > @@ -3689,6 +3707,9 @@ struct thread_item > > /* The thread handle associated with the thread. */ > gdb::byte_vector thread_handle; > + > + /* The ID of the thread's target description, if provided. */ > + gdb::optional tdesc_id; > }; > > /* Context passed around to the various methods listing remote > @@ -3697,6 +3718,12 @@ struct thread_item > > struct threads_listing_context > { > + threads_listing_context (remote_target *remote) > + : m_remote (remote) > + {} > + > + DISABLE_COPY_AND_ASSIGN (threads_listing_context); > + > /* Return true if this object contains an entry for a thread with ptid > PTID. */ > > @@ -3733,6 +3760,9 @@ struct threads_listing_context > > /* The threads found on the remote target. */ > std::vector items; > + > + /* The remote target associated with this context. */ > + remote_target *m_remote; > }; > > static int > @@ -3814,6 +3844,13 @@ start_thread (struct gdb_xml_parser *parser, > attr = xml_find_attribute (attributes, "handle"); > if (attr != NULL) > item.thread_handle = hex2bin ((const char *) attr->value.get ()); > + > + attr = xml_find_attribute (attributes, "tdesc"); > + if (attr != NULL) s/NULL/nullptr > + { > + item.tdesc_id = *(ULONGEST *) attr->value.get (); > + data->m_remote->get_remote_state ()->add_tdesc_id (*item.tdesc_id); > + } > } > > static void > @@ -3833,6 +3870,7 @@ const struct gdb_xml_attribute thread_attributes[] = { > { "core", GDB_XML_AF_OPTIONAL, gdb_xml_parse_attr_ulongest, NULL }, > { "name", GDB_XML_AF_OPTIONAL, NULL, NULL }, > { "handle", GDB_XML_AF_OPTIONAL, NULL, NULL }, > + { "tdesc", GDB_XML_AF_OPTIONAL, gdb_xml_parse_attr_ulongest, NULL }, > { NULL, GDB_XML_AF_NONE, NULL, NULL } > }; > > @@ -3870,6 +3908,7 @@ remote_target::remote_get_threads_with_qxfer (threads_listing_context *context) > { > gdb_xml_parse_quick (_("threads"), "threads.dtd", > threads_elements, xml->data (), context); > + get_remote_state ()->fetch_unknown_tdescs (this); > } > > return 1; > @@ -3937,7 +3976,7 @@ has_single_non_exited_thread (inferior *inf) > void > remote_target::update_thread_list () > { > - struct threads_listing_context context; > + struct threads_listing_context context (this); > int got_list = 0; > > /* We have a few different mechanisms to fetch the thread list. Try > @@ -7223,7 +7262,11 @@ remote_notif_stop_parse (remote_target *remote, > struct notif_client *self, const char *buf, > struct notif_event *event) > { > - remote->remote_parse_stop_reply (buf, (struct stop_reply *) event); > + struct stop_reply *stop_reply = (struct stop_reply *) event; > + > + remote->remote_parse_stop_reply (buf, stop_reply); > + > + stop_reply->rs->fetch_unknown_tdescs (remote); > } > > static void > @@ -7516,6 +7559,36 @@ strprefix (const char *p, const char *pend, const char *prefix) > return *prefix == '\0'; > } > > +void > +remote_state::add_tdesc_id (ULONGEST id) > +{ > + /* Check whether the ID was already added. */ > + if (m_tdescs.find (id) != m_tdescs.cend ()) > + return; > + > + m_tdescs[id] = nullptr; > +} > + > +const target_desc * > +remote_state::get_tdesc (ULONGEST id) const > +{ > + auto found = m_tdescs.find (id); > + > + /* Check if the given ID was already provided. */ > + if (found == m_tdescs.cend ()) > + return nullptr; > + > + return found->second; > +} > + > +void > +remote_state::fetch_unknown_tdescs (remote_target *remote) > +{ > + for (auto &pair : m_tdescs) > + if (pair.second == nullptr) > + m_tdescs[pair.first] = target_read_description_xml (remote, pair.first); > +} > + > /* Parse the stop reply in BUF. Either the function succeeds, and the > result is stored in EVENT, or throws an error. */ > > @@ -7674,6 +7747,14 @@ Packet: '%s'\n"), > event->ws.set_thread_created (); > p = strchrnul (p1 + 1, ';'); > } > + else if (strprefix (p, p1, "tdesc")) > + { > + ULONGEST tdesc_id; > + > + p = unpack_varlen_hex (++p1, &tdesc_id); > + event->rs->add_tdesc_id (tdesc_id); > + event->tdesc_id = tdesc_id; > + } > else > { > ULONGEST pnum; > diff --git a/gdb/xml-tdesc.c b/gdb/xml-tdesc.c > index ba7154c5d56f..302863e12365 100644 > --- a/gdb/xml-tdesc.c > +++ b/gdb/xml-tdesc.c > @@ -698,14 +698,13 @@ fetch_available_features_from_target (const char *name, target_ops *ops) > } > > > -/* Read an XML target description using OPS. Parse it, and return the > - parsed description. */ > +/* Actual implementation of the target_read_description_xml variants. */ > > -const struct target_desc * > -target_read_description_xml (struct target_ops *ops) > +static const struct target_desc * > +target_read_description_xml (struct target_ops *ops, const char *desc_name) > { > gdb::optional tdesc_str > - = fetch_available_features_from_target ("target.xml", ops); > + = fetch_available_features_from_target (desc_name, ops); > if (!tdesc_str) > return NULL; > > @@ -717,6 +716,24 @@ target_read_description_xml (struct target_ops *ops) > return tdesc_parse_xml (tdesc_str->data (), fetch_another); > } > > +/* See xml-tdesc.h. */ > + > +const struct target_desc * > +target_read_description_xml (struct target_ops *ops) > +{ > + return target_read_description_xml (ops, "target.xml"); > +} > + > +/* See xml-tdesc.h. */ > + > +const struct target_desc * > +target_read_description_xml (struct target_ops *ops, ULONGEST id) > +{ > + std::string desc_name = string_printf ("target-id-%" PRIu64 ".xml", id); > + > + return target_read_description_xml (ops, desc_name.c_str ()); > +} > + > /* Fetches an XML target description using OPS, processing > includes, but not parsing it. Used to dump whole tdesc > as a single XML file. */ > diff --git a/gdb/xml-tdesc.h b/gdb/xml-tdesc.h > index 0fbfc7e043e9..c7cc97c5dfc0 100644 > --- a/gdb/xml-tdesc.h > +++ b/gdb/xml-tdesc.h > @@ -38,6 +38,12 @@ const struct target_desc *file_read_description_xml (const char *filename); > > const struct target_desc *target_read_description_xml (struct target_ops *); > > +/* Read an XML target description with the given ID using OPS. Parse it, and > + return the parsed description. */ > + > +const struct target_desc *target_read_description_xml (struct target_ops *ops, > + ULONGEST id); > + > /* Fetches an XML target description using OPS, processing includes, > but not parsing it. Used to dump whole tdesc as a single XML file. > Returns the description on success, and a disengaged optional I noticed we're dealing with the target description id as ULONGEST on gdb's side, but as unsigned int on gdbserver's side. Should we make them the same, if possible?