From patchwork Mon Dec 16 03:39:14 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Marchi X-Patchwork-Id: 36892 Received: (qmail 25773 invoked by alias); 16 Dec 2019 03:39:27 -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 25614 invoked by uid 89); 16 Dec 2019 03:39:24 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-18.2 required=5.0 tests=AWL, 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.1 spammy=converts 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, 16 Dec 2019 03:39:22 +0000 Received: from smtp.ebox.ca (smtp.ebox.ca [96.127.255.82]) by barracuda.ebox.ca with ESMTP id S7e02tPZ7eEqgCt7 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Sun, 15 Dec 2019 22:39:20 -0500 (EST) Received: from simark.lan (unknown [192.222.164.54]) by smtp.ebox.ca (Postfix) with ESMTP id A4545441B21; Sun, 15 Dec 2019 22:39:20 -0500 (EST) From: Simon Marchi To: gdb-patches@sourceware.org Cc: Simon Marchi Subject: [PATCH v2 2/5] jit: c++-ify gdb_symtab Date: Sun, 15 Dec 2019 22:39:14 -0500 Message-Id: <20191216033917.2936248-3-simon.marchi@polymtl.ca> In-Reply-To: <20191216033917.2936248-1-simon.marchi@polymtl.ca> References: <20191216033917.2936248-1-simon.marchi@polymtl.ca> MIME-Version: 1.0 X-IsSubscribed: yes This patch makes the gdb_symtab bit more c++y, in preparation for the next patch that will use an std::forward_list. It changes the fields to use automatic memory management, in the form of std::string and gdb::unique_xmalloc_ptr, and adds a constructor and a destructor. gdb/ChangeLog: * jit.c (struct gdb_symtab): Add constructor, destructor, initialize fields. : Change type to unique_xmalloc_ptr. : Change type to std::string. (jit_symtab_open_impl): Allocate gdb_symtab with new. (jit_symtab_line_mapping_add_impl): Adjust. (finalize_symtab): Adjust, call delete on stab. --- gdb/jit.c | 62 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 33 insertions(+), 29 deletions(-) diff --git a/gdb/jit.c b/gdb/jit.c index 1cd487502c5e..07767275f533 100644 --- a/gdb/jit.c +++ b/gdb/jit.c @@ -450,19 +450,39 @@ struct gdb_block struct gdb_symtab { + explicit gdb_symtab (const char *file_name) + : file_name (file_name != nullptr ? file_name : "") + {} + + ~gdb_symtab () + { + gdb_block *gdb_block_iter, *gdb_block_iter_tmp; + + for ((gdb_block_iter = this->blocks, + gdb_block_iter_tmp = gdb_block_iter->next); + gdb_block_iter; + gdb_block_iter = gdb_block_iter_tmp) + { + gdb_block_iter_tmp = gdb_block_iter->next; + xfree ((void *) gdb_block_iter->name); + xfree (gdb_block_iter); + } + } + /* The list of blocks in this symtab. These will eventually be converted to real blocks. */ - struct gdb_block *blocks; + struct gdb_block *blocks = nullptr; /* The number of blocks inserted. */ - int nblocks; + int nblocks = 0; /* A mapping between line numbers to PC. */ - struct linetable *linetable; + gdb::unique_xmalloc_ptr linetable; /* The source file for this symtab. */ - const char *file_name; - struct gdb_symtab *next; + std::string file_name; + + struct gdb_symtab *next = nullptr; }; /* Proxy object for building an object. */ @@ -512,12 +532,9 @@ jit_symtab_open_impl (struct gdb_symbol_callbacks *cb, struct gdb_object *object, const char *file_name) { - struct gdb_symtab *ret; - /* CB stays unused. See comment in jit_object_open_impl. */ - ret = XCNEW (struct gdb_symtab); - ret->file_name = file_name ? xstrdup (file_name) : xstrdup (""); + gdb_symtab *ret = new gdb_symtab (file_name); ret->next = object->symtabs; object->symtabs = ret; return ret; @@ -605,7 +622,7 @@ jit_symtab_line_mapping_add_impl (struct gdb_symbol_callbacks *cb, alloc_len = sizeof (struct linetable) + (nlines - 1) * sizeof (struct linetable_entry); - stab->linetable = (struct linetable *) xmalloc (alloc_len); + stab->linetable.reset (XNEWVAR (struct linetable, alloc_len)); stab->linetable->nitems = nlines; for (i = 0; i < nlines; i++) { @@ -632,7 +649,7 @@ static void finalize_symtab (struct gdb_symtab *stab, struct objfile *objfile) { struct compunit_symtab *cust; - struct gdb_block *gdb_block_iter, *gdb_block_iter_tmp; + struct gdb_block *gdb_block_iter; struct block *block_iter; int actual_nblocks, i; size_t blockvector_size; @@ -641,8 +658,8 @@ finalize_symtab (struct gdb_symtab *stab, struct objfile *objfile) actual_nblocks = FIRST_LOCAL_BLOCK + stab->nblocks; - cust = allocate_compunit_symtab (objfile, stab->file_name); - allocate_symtab (cust, stab->file_name); + cust = allocate_compunit_symtab (objfile, stab->file_name.c_str ()); + allocate_symtab (cust, stab->file_name.c_str ()); add_compunit_symtab_to_objfile (cust); /* JIT compilers compile in memory. */ @@ -656,8 +673,8 @@ finalize_symtab (struct gdb_symtab *stab, struct objfile *objfile) + sizeof (struct linetable)); SYMTAB_LINETABLE (COMPUNIT_FILETABS (cust)) = (struct linetable *) obstack_alloc (&objfile->objfile_obstack, size); - memcpy (SYMTAB_LINETABLE (COMPUNIT_FILETABS (cust)), stab->linetable, - size); + memcpy (SYMTAB_LINETABLE (COMPUNIT_FILETABS (cust)), + stab->linetable.get (), size); } blockvector_size = (sizeof (struct blockvector) @@ -758,20 +775,7 @@ finalize_symtab (struct gdb_symtab *stab, struct objfile *objfile) } } - /* Free memory. */ - gdb_block_iter = stab->blocks; - - for (gdb_block_iter = stab->blocks, gdb_block_iter_tmp = gdb_block_iter->next; - gdb_block_iter; - gdb_block_iter = gdb_block_iter_tmp) - { - gdb_block_iter_tmp = gdb_block_iter->next; - xfree ((void *) gdb_block_iter->name); - xfree (gdb_block_iter); - } - xfree (stab->linetable); - xfree ((char *) stab->file_name); - xfree (stab); + delete stab; } /* Called when closing a gdb_objfile. Converts OBJ to a proper