From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 63293 invoked by alias); 9 Oct 2017 14:30:53 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 63146 invoked by uid 89); 9 Oct 2017 14:30:52 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.2 required=5.0 tests=BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,RCVD_IN_DNSWL_NONE,SPF_SOFTFAIL autolearn=ham version=3.3.2 spammy=events, 1820, dll X-HELO: barracuda.ebox.ca Received: from barracuda.ebox.ca (HELO barracuda.ebox.ca) (96.127.255.19) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 09 Oct 2017 14:30:46 +0000 X-ASG-Debug-ID: 1507559439-0c856e65d53651f10001-fS2M51 Received: from smtp.electronicbox.net (smtp.electronicbox.net [96.127.255.82]) by barracuda.ebox.ca with ESMTP id rItK52OexTu4AsEi (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Mon, 09 Oct 2017 10:30:39 -0400 (EDT) X-Barracuda-Envelope-From: simon.marchi@polymtl.ca X-Barracuda-RBL-Trusted-Forwarder: 96.127.255.82 Received: from simark.lan (cable-192.222.251.162.electronicbox.net [192.222.251.162]) by smtp.electronicbox.net (Postfix) with ESMTP id 6C291441B21; Mon, 9 Oct 2017 10:30:39 -0400 (EDT) From: Simon Marchi X-Barracuda-Effective-Source-IP: cable-192.222.251.162.electronicbox.net[192.222.251.162] X-Barracuda-Apparent-Source-IP: 192.222.251.162 X-Barracuda-RBL-IP: 192.222.251.162 To: gdb-patches@sourceware.org Cc: Simon Marchi Subject: [PATCH 1/3] gdbserver: Use std::list for all_dlls Date: Mon, 09 Oct 2017 14:30:00 -0000 X-ASG-Orig-Subj: [PATCH 1/3] gdbserver: Use std::list for all_dlls Message-Id: <20171009143036.10215-2-simon.marchi@polymtl.ca> In-Reply-To: <20171009143036.10215-1-simon.marchi@polymtl.ca> References: <20171009143036.10215-1-simon.marchi@polymtl.ca> X-Barracuda-Connect: smtp.electronicbox.net[96.127.255.82] X-Barracuda-Start-Time: 1507559439 X-Barracuda-Encrypted: DHE-RSA-AES256-SHA X-Barracuda-URL: https://96.127.255.19:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 6085 X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.50 X-Barracuda-Spam-Status: No, SCORE=1.50 using global scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=8.0 tests=BSF_SC0_MV0713, BSF_SC0_MV0713_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.43737 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_SC0_MV0713 Custom rule MV0713 1.00 BSF_SC0_MV0713_2 BSF_SC0_MV0713_2 X-IsSubscribed: yes X-SW-Source: 2017-10/txt/msg00206.txt.bz2 As a small step towards removing inferior_list/inferior_list_entry, this patch replaces the usage of inferior_list for the list of dlls by an std::list. I am able to build gdbserver with mingw on Linux, but I am not able to test this on a Windows machine (the only platform that uses this code). gdb/gdbserver/ChangeLog: * dll.h: Include . (struct dll_info) : Remove field. (all_dlls): Change type to std::list. * dll.c: Include . (get_dll): Remove macro. (all_dlls): Change type to std::list. (free_one_dll): Change parameter type to dll_info *. (match_dll): Likewise. (loaded_dll): Adjust to removal of entry field and all_dlls type change. (unloaded_dll): Adjust to all_dlls type change, use std::find_if. (clear_dlls): Adjust to all_dlls type change. * server.c (emit_dll_description): Remove. (handle_qxfer_libraries): Adjust to all_dlls type change, integrate emit_dll_description's functionality. --- gdb/gdbserver/dll.c | 36 ++++++++++++++++++------------------ gdb/gdbserver/dll.h | 8 +++----- gdb/gdbserver/server.c | 20 ++++---------------- 3 files changed, 25 insertions(+), 39 deletions(-) diff --git a/gdb/gdbserver/dll.c b/gdb/gdbserver/dll.c index c74601a5f4..ec672be797 100644 --- a/gdb/gdbserver/dll.c +++ b/gdb/gdbserver/dll.c @@ -18,20 +18,20 @@ #include "server.h" #include "dll.h" -#define get_dll(inf) ((struct dll_info *)(inf)) +#include /* An "unspecified" CORE_ADDR, for match_dll. */ #define UNSPECIFIED_CORE_ADDR (~(CORE_ADDR) 0) -struct inferior_list all_dlls; +std::list all_dlls; int dlls_changed; static void -free_one_dll (struct inferior_list_entry *inf) +free_one_dll (dll_info *dll) { - struct dll_info *dll = get_dll (inf); if (dll->name != NULL) free (dll->name); + free (dll); } @@ -39,11 +39,8 @@ free_one_dll (struct inferior_list_entry *inf) the key is ignored; so is an all-ones base address. */ static int -match_dll (struct inferior_list_entry *inf, void *arg) +match_dll (dll_info *iter, dll_info *key) { - struct dll_info *iter = (struct dll_info *) inf; - struct dll_info *key = (struct dll_info *) arg; - if (key->base_addr != UNSPECIFIED_CORE_ADDR && iter->base_addr == key->base_addr) return 1; @@ -62,12 +59,10 @@ loaded_dll (const char *name, CORE_ADDR base_addr) { struct dll_info *new_dll = XCNEW (struct dll_info); - new_dll->entry.id = minus_one_ptid; - new_dll->name = xstrdup (name); new_dll->base_addr = base_addr; - add_inferior_to_list (&all_dlls, &new_dll->entry); + all_dlls.push_back (new_dll); dlls_changed = 1; } @@ -76,16 +71,19 @@ loaded_dll (const char *name, CORE_ADDR base_addr) void unloaded_dll (const char *name, CORE_ADDR base_addr) { - struct dll_info *dll; struct dll_info key_dll; /* Be careful not to put the key DLL in any list. */ key_dll.name = (char *) name; key_dll.base_addr = base_addr; - dll = (struct dll_info *) find_inferior (&all_dlls, match_dll, &key_dll); + auto pred = [&key_dll] (dll_info *dll) { + return match_dll (dll, &key_dll); + }; - if (dll == NULL) + auto dll = std::find_if (all_dlls.begin (), all_dlls.end (), pred); + + if (dll == all_dlls.end ()) /* For some inferiors we might get unloaded_dll events without having a corresponding loaded_dll. In that case, the dll cannot be found in ALL_DLL, and there is nothing further for us to do. @@ -99,8 +97,8 @@ unloaded_dll (const char *name, CORE_ADDR base_addr) { /* DLL has been found so remove the entry and free associated resources. */ - remove_inferior (&all_dlls, &dll->entry); - free_one_dll (&dll->entry); + free_one_dll (*dll); + all_dlls.erase (dll); dlls_changed = 1; } } @@ -108,6 +106,8 @@ unloaded_dll (const char *name, CORE_ADDR base_addr) void clear_dlls (void) { - for_each_inferior (&all_dlls, free_one_dll); - clear_inferior_list (&all_dlls); + for (dll_info *dll : all_dlls) + free_one_dll (dll); + + all_dlls.clear (); } diff --git a/gdb/gdbserver/dll.h b/gdb/gdbserver/dll.h index 39e5eb0653..52f924bc85 100644 --- a/gdb/gdbserver/dll.h +++ b/gdb/gdbserver/dll.h @@ -18,17 +18,15 @@ #ifndef DLL_H #define DLL_H +#include + struct dll_info { - /* This must appear first. See inferiors.h. - The list iterator functions assume it. */ - struct inferior_list_entry entry; - char *name; CORE_ADDR base_addr; }; -extern struct inferior_list all_dlls; +extern std::list all_dlls; extern int dlls_changed; extern void clear_dlls (void); diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c index a95973547c..3d2c2ff5a0 100644 --- a/gdb/gdbserver/server.c +++ b/gdb/gdbserver/server.c @@ -1533,21 +1533,6 @@ handle_qxfer_features (const char *annex, return len; } -/* Worker routine for handle_qxfer_libraries. - Emit the XML to describe the library in INF. */ - -static void -emit_dll_description (struct inferior_list_entry *inf, void *arg) -{ - struct dll_info *dll = (struct dll_info *) inf; - std::string *document = (std::string *) arg; - std::string name = xml_escape_text (dll->name); - - *document += string_printf - (" \n", - name.c_str (), (long) dll->base_addr); -} - /* Handle qXfer:libraries:read. */ static int @@ -1563,7 +1548,10 @@ handle_qxfer_libraries (const char *annex, std::string document = "\n"; - for_each_inferior_with_data (&all_dlls, emit_dll_description, &document); + for (const dll_info *dll : all_dlls) + document += string_printf + (" \n", + dll->name, (long) dll->base_addr); document += "\n"; -- 2.14.2