From patchwork Tue Oct 10 20:40:08 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Marchi X-Patchwork-Id: 77455 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 22CD53856275 for ; Tue, 10 Oct 2023 20:45:16 +0000 (GMT) X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from simark.ca (simark.ca [158.69.221.121]) by sourceware.org (Postfix) with ESMTPS id E72293858D28 for ; Tue, 10 Oct 2023 20:44:19 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org E72293858D28 Authentication-Results: sourceware.org; dmarc=fail (p=none dis=none) header.from=efficios.com Authentication-Results: sourceware.org; spf=fail smtp.mailfrom=efficios.com Received: from smarchi-efficios.internal.efficios.com (192-222-143-198.qc.cable.ebox.net [192.222.143.198]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPSA id 25DAC1E1A7; Tue, 10 Oct 2023 16:44:18 -0400 (EDT) From: Simon Marchi To: gdb-patches@sourceware.org Cc: Simon Marchi Subject: [PATCH 13/24] gdb: make solib-rocm not use so_list internally Date: Tue, 10 Oct 2023 16:40:08 -0400 Message-ID: <20231010204213.111285-14-simon.marchi@efficios.com> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20231010204213.111285-1-simon.marchi@efficios.com> References: <20231010204213.111285-1-simon.marchi@efficios.com> MIME-Version: 1.0 X-Spam-Status: No, score=-3496.9 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_NONE, KAM_DMARC_STATUS, SPF_HELO_PASS, SPF_SOFTFAIL, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org Same rationale as the previous patch, but for solib-rocm. - Introduce rocm_so, which is a name a unique_name (see comment in rocm_update_solib_list for that) and a unique_ptr to the lm_info_svr4. - Change the internal lists from so_list lists to vectors of rocm_so. - Remove rocm_free_solib_list, as everything is automatic now. - Replace rocm_solib_copy_list with so_list_from_rocm_sos. Change-Id: I71e06e3ea22d6420c9e4e500501c06e9a13398a8 --- gdb/solib-rocm.c | 92 ++++++++++++++++++++++-------------------------- 1 file changed, 42 insertions(+), 50 deletions(-) diff --git a/gdb/solib-rocm.c b/gdb/solib-rocm.c index 403173ecc998..5016c383a807 100644 --- a/gdb/solib-rocm.c +++ b/gdb/solib-rocm.c @@ -126,14 +126,26 @@ rocm_solib_fd_cache::close (int fd, fileio_error *target_errno) /* ROCm-specific inferior data. */ +struct rocm_so +{ + rocm_so (const char *name, std::string unique_name, lm_info_svr4_up lm_info) + : name (name), + unique_name (std::move(unique_name)), + lm_info (std::move (lm_info)) + {} + + std::string name, unique_name; + lm_info_svr4_up lm_info; +}; + struct solib_info { explicit solib_info (inferior *inf) - : solib_list (nullptr), fd_cache (inf) + : fd_cache (inf) {}; /* List of code objects loaded into the inferior. */ - so_list *solib_list; + std::vector solib_list; /* Cache of opened FD in the inferior. */ rocm_solib_fd_cache fd_cache; @@ -144,23 +156,6 @@ static const registry::key rocm_solib_data; static target_so_ops rocm_solib_ops; -/* Free the solib linked list. */ - -static void -rocm_free_solib_list (struct solib_info *info) -{ - while (info->solib_list != nullptr) - { - struct so_list *next = info->solib_list->next; - - free_so (*info->solib_list); - info->solib_list = next; - } - - info->solib_list = nullptr; -} - - /* Fetch the solib_info data for INF. */ static struct solib_info * @@ -207,27 +202,29 @@ rocm_solib_handle_event () rocm_update_solib_list (); } -/* Make a deep copy of the solib linked list. */ +/* Create so_list objects from rocm_so objects in SOS. */ static so_list * -rocm_solib_copy_list (const so_list *src) +so_list_from_rocm_sos (const std::vector &sos) { struct so_list *dst = nullptr; struct so_list **link = &dst; - while (src != nullptr) + for (const rocm_so &so : sos) { so_list *newobj = new so_list; - memcpy (newobj, src, sizeof (struct so_list)); + newobj->lm_info = new lm_info_svr4 (*so.lm_info); + + strncpy (newobj->so_name, so.name.c_str (), sizeof (newobj->so_name)); + newobj->so_name[sizeof (newobj->so_name) - 1] = '\0'; - auto *src_li = gdb::checked_static_cast (src->lm_info); - newobj->lm_info = new lm_info_svr4 (*src_li); + strncpy (newobj->so_original_name, so.unique_name.c_str (), + sizeof (newobj->so_original_name)); + newobj->so_original_name[sizeof (newobj->so_original_name) - 1] = '\0'; newobj->next = nullptr; *link = newobj; link = &newobj->next; - - src = src->next; } return dst; @@ -243,21 +240,21 @@ rocm_solib_current_sos () so_list *head = svr4_so_ops.current_sos (); /* Then, the device-side shared library list. */ - so_list *list = get_solib_info (current_inferior ())->solib_list; + std::vector &dev_sos = get_solib_info (current_inferior ())->solib_list; - if (list == nullptr) + if (dev_sos.empty ()) return head; - list = rocm_solib_copy_list (list); + so_list *dev_so_list = so_list_from_rocm_sos (dev_sos); if (head == nullptr) - return list; + return dev_so_list; /* Append our libraries to the end of the list. */ so_list *tail; for (tail = head; tail->next; tail = tail->next) /* Nothing. */; - tail->next = list; + tail->next = dev_so_list; return head; } @@ -687,7 +684,7 @@ rocm_solib_bfd_open (const char *pathname) static void rocm_solib_create_inferior_hook (int from_tty) { - rocm_free_solib_list (get_solib_info (current_inferior ())); + get_solib_info (current_inferior ())->solib_list.clear (); svr4_so_ops.solib_create_inferior_hook (from_tty); } @@ -703,8 +700,8 @@ rocm_update_solib_list () solib_info *info = get_solib_info (inf); - rocm_free_solib_list (info); - struct so_list **link = &info->solib_list; + info->solib_list.clear (); + std::vector &sos = info->solib_list; amd_dbgapi_code_object_id_t *code_object_list; size_t count; @@ -736,24 +733,18 @@ rocm_update_solib_list () if (status != AMD_DBGAPI_STATUS_SUCCESS) continue; - so_list *so = new so_list; - lm_info_svr4 *li = new lm_info_svr4; - li->l_addr = l_addr; - so->lm_info = li; + gdb::unique_xmalloc_ptr uri_bytes_holder (uri_bytes); - strncpy (so->so_name, uri_bytes, sizeof (so->so_name)); - so->so_name[sizeof (so->so_name) - 1] = '\0'; - xfree (uri_bytes); + lm_info_svr4_up li = gdb::make_unique (); + li->l_addr = l_addr; - /* Make so_original_name unique so that code objects with the same URI - but different load addresses are seen by gdb core as different shared + /* Generate a unique name so that code objects with the same URI but + different load addresses are seen by gdb core as different shared objects. */ - xsnprintf (so->so_original_name, sizeof (so->so_original_name), - "code_object_%ld", code_object_list[i].handle); + std::string unique_name + = string_printf ("code_object_%ld", code_object_list[i].handle); - so->next = nullptr; - *link = so; - link = &so->next; + sos.emplace_back (uri_bytes, std::move (unique_name), std::move (li)); } xfree (code_object_list); @@ -778,7 +769,8 @@ rocm_update_solib_list () static void rocm_solib_target_inferior_created (inferior *inf) { - rocm_free_solib_list (get_solib_info (inf)); + get_solib_info (inf)->solib_list.clear (); + rocm_update_solib_list (); /* Force GDB to reload the solibs. */