From patchwork Sat Sep 15 22:24:10 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Tromey X-Patchwork-Id: 29398 Received: (qmail 36090 invoked by alias); 15 Sep 2018 22:24:48 -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 35971 invoked by uid 89); 15 Sep 2018 22:24:34 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-25.8 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=function's, replacing, Destroy, sk:types_ X-HELO: gateway22.websitewelcome.com Received: from gateway22.websitewelcome.com (HELO gateway22.websitewelcome.com) (192.185.47.109) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Sat, 15 Sep 2018 22:24:25 +0000 Received: from cm14.websitewelcome.com (cm14.websitewelcome.com [100.42.49.7]) by gateway22.websitewelcome.com (Postfix) with ESMTP id EC9581A7EC for ; Sat, 15 Sep 2018 17:24:13 -0500 (CDT) Received: from box5379.bluehost.com ([162.241.216.53]) by cmsmtp with SMTP id 1Iz7gyWlRkBj61Iz7g90At; Sat, 15 Sep 2018 17:24:13 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=tromey.com; s=default; h=References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From: Sender:Reply-To:MIME-Version:Content-Type:Content-Transfer-Encoding: Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender: Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=Zy1pncDVLsJnD1ULjFK0mjZf5HpbKekXRvNvqC1YDm8=; b=BPVjvRV7SU3h+1RDftFXyBB6nl 5O4Xv3pYgz5Rx5B2vCUZKGaBJn/PjaTfuCL9DEp+ngu1BqdrUO+WfXOcDinQfN05spY9X+3KLFMKB Rj8szzQSxDXpH2LEl8DjlYJsJ; Received: from 97-122-190-66.hlrn.qwest.net ([97.122.190.66]:44280 helo=bapiya.Home) by box5379.bluehost.com with esmtpsa (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.91) (envelope-from ) id 1g1Iz7-000qVN-NF; Sat, 15 Sep 2018 17:24:13 -0500 From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [PATCH 1/2] Remove munmap_listp_free_cleanup Date: Sat, 15 Sep 2018 16:24:10 -0600 Message-Id: <20180915222411.24764-2-tom@tromey.com> In-Reply-To: <20180915222411.24764-1-tom@tromey.com> References: <20180915222411.24764-1-tom@tromey.com> This removes munmap_listp_free_cleanup, replacing it with a std::unique_ptr at one spot and an explicit delete in another. It seemed simplest to completely change this data structure. gdb/ChangeLog 2018-09-15 Tom Tromey * compile/compile-object-run.c (do_module_cleanup): Use delete. * compile/compile-object-load.c (struct munmap_list): Move to header file. (munmap_list::add): Rename from munmap_list_add; rewrite. (munmap_list::~munmap_list): Rename from munmap_list_free. (munmap_listp_free_cleanup): Remove. (compile_object_load): Update. * compile/compile-object-load.h (struct munmap_list): Move from compile-object-load.c. Rewrite.n --- gdb/ChangeLog | 12 +++++ gdb/compile/compile-object-load.c | 88 ++++++++----------------------- gdb/compile/compile-object-load.h | 25 ++++++++- gdb/compile/compile-object-run.c | 2 +- 4 files changed, 59 insertions(+), 68 deletions(-) diff --git a/gdb/compile/compile-object-load.c b/gdb/compile/compile-object-load.c index 40053d281a1..db792792327 100644 --- a/gdb/compile/compile-object-load.c +++ b/gdb/compile/compile-object-load.c @@ -34,56 +34,22 @@ #include "arch-utils.h" #include -/* Track inferior memory reserved by inferior mmap. */ - -struct munmap_list -{ - struct munmap_list *next; - CORE_ADDR addr, size; -}; - -/* Add inferior mmap memory range ADDR..ADDR+SIZE (exclusive) to list - HEADP. *HEADP needs to be initialized to NULL. */ - -static void -munmap_list_add (struct munmap_list **headp, CORE_ADDR addr, CORE_ADDR size) -{ - struct munmap_list *head_new = XNEW (struct munmap_list); - - head_new->next = *headp; - *headp = head_new; - head_new->addr = addr; - head_new->size = size; -} - -/* Free list of inferior mmap memory ranges HEAD. HEAD is the first - element of the list, it can be NULL. After calling this function - HEAD pointer is invalid and the possible list needs to be - reinitialized by caller to NULL. */ +/* Add inferior mmap memory range ADDR..ADDR+SIZE (exclusive) to the + list. */ void -munmap_list_free (struct munmap_list *head) +munmap_list::add (CORE_ADDR addr, CORE_ADDR size) { - while (head) - { - struct munmap_list *todo = head; - - head = todo->next; - gdbarch_infcall_munmap (target_gdbarch (), todo->addr, todo->size); - xfree (todo); - } + struct munmap_item item = { addr, size }; + items.push_front (item); } -/* Stub for munmap_list_free suitable for make_cleanup. Contrary to - munmap_list_free this function's parameter is a pointer to the first - list element pointer. */ +/* Destroy an munmap_list. */ -static void -munmap_listp_free_cleanup (void *headp_voidp) +munmap_list::~munmap_list () { - struct munmap_list **headp = (struct munmap_list **) headp_voidp; - - munmap_list_free (*headp); + for (auto &item : items) + gdbarch_infcall_munmap (target_gdbarch (), item.addr, item.size); } /* Helper data for setup_sections. */ @@ -105,7 +71,7 @@ struct setup_sections_data /* List of inferior mmap ranges where setup_sections should add its next range. */ - struct munmap_list **munmap_list_headp; + std::unique_ptr munmap_list; }; /* Place all ABFD sections next to each other obeying all constraints. */ @@ -155,7 +121,7 @@ setup_sections (bfd *abfd, asection *sect, void *data_voidp) { addr = gdbarch_infcall_mmap (target_gdbarch (), data->last_size, data->last_prot); - munmap_list_add (data->munmap_list_headp, addr, data->last_size); + data->munmap_list->add (addr, data->last_size); if (compile_debug) fprintf_unfiltered (gdb_stdlog, "allocated %s bytes at %s prot %u\n", @@ -611,7 +577,6 @@ struct compile_module * compile_object_load (const compile_file_names &file_names, enum compile_i_scope_types scope, void *scope_data) { - struct cleanup *cleanups; struct setup_sections_data setup_sections_data; CORE_ADDR regs_addr, out_value_addr = 0; struct symbol *func_sym; @@ -626,7 +591,6 @@ compile_object_load (const compile_file_names &file_names, struct objfile *objfile; int expect_parameters; struct type *expect_return_type; - struct munmap_list *munmap_list_head = NULL; gdb::unique_xmalloc_ptr filename (tilde_expand (file_names.object_file ())); @@ -648,15 +612,15 @@ compile_object_load (const compile_file_names &file_names, setup_sections_data.last_section_first = abfd->sections; setup_sections_data.last_prot = -1; setup_sections_data.last_max_alignment = 1; - setup_sections_data.munmap_list_headp = &munmap_list_head; - cleanups = make_cleanup (munmap_listp_free_cleanup, &munmap_list_head); + setup_sections_data.munmap_list.reset (new struct munmap_list); + bfd_map_over_sections (abfd.get (), setup_sections, &setup_sections_data); setup_sections (abfd.get (), NULL, &setup_sections_data); storage_needed = bfd_get_symtab_upper_bound (abfd.get ()); if (storage_needed < 0) error (_("Cannot read symbols of compiled module \"%s\": %s"), - filename.get (), bfd_errmsg (bfd_get_error ())); + filename.get (), bfd_errmsg (bfd_get_error ())); /* SYMFILE_VERBOSE is not passed even if FROM_TTY, user is not interested in "Reading symbols from ..." message for automatically generated file. */ @@ -703,8 +667,8 @@ compile_object_load (const compile_file_names &file_names, objfile_name (objfile)); if (!types_deeply_equal (expect_return_type, TYPE_TARGET_TYPE (func_type))) error (_("Invalid return type of function \"%s\" in compiled " - "module \"%s\"."), - GCC_FE_WRAPPER_FUNCTION, objfile_name (objfile)); + "module \"%s\"."), + GCC_FE_WRAPPER_FUNCTION, objfile_name (objfile)); /* The memory may be later needed by bfd_generic_get_relocated_section_contents @@ -714,7 +678,7 @@ compile_object_load (const compile_file_names &file_names, number_of_symbols = bfd_canonicalize_symtab (abfd.get (), symbol_table); if (number_of_symbols < 0) error (_("Cannot parse symbols of compiled module \"%s\": %s"), - filename.get (), bfd_errmsg (bfd_get_error ())); + filename.get (), bfd_errmsg (bfd_get_error ())); missing_symbols = 0; for (symp = symbol_table; symp < symbol_table + number_of_symbols; symp++) @@ -784,7 +748,7 @@ compile_object_load (const compile_file_names &file_names, TYPE_LENGTH (regs_type), GDB_MMAP_PROT_READ); gdb_assert (regs_addr != 0); - munmap_list_add (&munmap_list_head, regs_addr, TYPE_LENGTH (regs_type)); + setup_sections_data.munmap_list->add (regs_addr, TYPE_LENGTH (regs_type)); if (compile_debug) fprintf_unfiltered (gdb_stdlog, "allocated %s bytes at %s for registers\n", @@ -799,18 +763,15 @@ compile_object_load (const compile_file_names &file_names, { out_value_type = get_out_value_type (func_sym, objfile, scope); if (out_value_type == NULL) - { - do_cleanups (cleanups); - return NULL; - } + return NULL; check_typedef (out_value_type); out_value_addr = gdbarch_infcall_mmap (target_gdbarch (), TYPE_LENGTH (out_value_type), (GDB_MMAP_PROT_READ | GDB_MMAP_PROT_WRITE)); gdb_assert (out_value_addr != 0); - munmap_list_add (&munmap_list_head, out_value_addr, - TYPE_LENGTH (out_value_type)); + setup_sections_data.munmap_list->add (out_value_addr, + TYPE_LENGTH (out_value_type)); if (compile_debug) fprintf_unfiltered (gdb_stdlog, "allocated %s bytes at %s for printed value\n", @@ -828,12 +789,7 @@ compile_object_load (const compile_file_names &file_names, retval->scope_data = scope_data; retval->out_value_type = out_value_type; retval->out_value_addr = out_value_addr; - - /* CLEANUPS will free MUNMAP_LIST_HEAD. */ - retval->munmap_list_head = munmap_list_head; - munmap_list_head = NULL; - - do_cleanups (cleanups); + retval->munmap_list_head = setup_sections_data.munmap_list.release (); return retval; } diff --git a/gdb/compile/compile-object-load.h b/gdb/compile/compile-object-load.h index 6f62535878a..7569c42bf5c 100644 --- a/gdb/compile/compile-object-load.h +++ b/gdb/compile/compile-object-load.h @@ -18,8 +18,31 @@ #define GDB_COMPILE_OBJECT_LOAD_H #include "compile-internal.h" +#include -struct munmap_list; +struct munmap_list +{ +public: + + munmap_list () = default; + ~munmap_list (); + + DISABLE_COPY_AND_ASSIGN (munmap_list); + + /* Add a region to the list. */ + void add (CORE_ADDR addr, CORE_ADDR size); + +private: + + /* Track inferior memory reserved by inferior mmap. */ + + struct munmap_item + { + CORE_ADDR addr, size; + }; + + std::list items; +}; struct compile_module { diff --git a/gdb/compile/compile-object-run.c b/gdb/compile/compile-object-run.c index 0846c735fe2..f3ec932365e 100644 --- a/gdb/compile/compile-object-run.c +++ b/gdb/compile/compile-object-run.c @@ -99,7 +99,7 @@ do_module_cleanup (void *arg, int registers_valid) unlink (data->source_file); xfree (data->source_file); - munmap_list_free (data->munmap_list_head); + delete data->munmap_list_head; /* Delete the .o file. */ unlink (data->objfile_name_string);