From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 17337 invoked by alias); 13 Feb 2019 21:29:35 -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 17311 invoked by uid 89); 13 Feb 2019 21:29:35 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-25.4 required=5.0 tests=BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_STOCKGEN,RCVD_IN_DNSWL_NONE,SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=WILL, HERE, 7087, kludge X-HELO: gateway36.websitewelcome.com Received: from gateway36.websitewelcome.com (HELO gateway36.websitewelcome.com) (192.185.194.2) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 13 Feb 2019 21:29:32 +0000 Received: from cm12.websitewelcome.com (cm12.websitewelcome.com [100.42.49.8]) by gateway36.websitewelcome.com (Postfix) with ESMTP id 01DBB400C91FA for ; Wed, 13 Feb 2019 14:43:43 -0600 (CST) Received: from box5379.bluehost.com ([162.241.216.53]) by cmsmtp with SMTP id u25ygulj5iQeru25ygA23e; Wed, 13 Feb 2019 15:29:30 -0600 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=7hlUasj3aPRVitYEh6QKOnwwu6jV270a3sKz1i50wv4=; b=NpY2FBWajZa7moPjQgTjuPcacE 8sdCdvOT+Wem65aZ4LwPe5mNlrxZ00QorbnFLrk5TdRV/PkVYmg2uX0nZg8PAC6zaKS0oGNWQ+Sd/ 0pngEPKXGmVG5tjtINmnOxKdy; Received: from 75-166-72-210.hlrn.qwest.net ([75.166.72.210]:42554 helo=bapiya.Home) by box5379.bluehost.com with esmtpsa (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.91) (envelope-from ) id 1gu25y-001UWe-AV; Wed, 13 Feb 2019 15:29:30 -0600 From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [PATCH 01/20] Remove cleanups from coffread.c Date: Wed, 13 Feb 2019 21:29:00 -0000 Message-Id: <20190213212927.9474-2-tom@tromey.com> In-Reply-To: <20190213212927.9474-1-tom@tromey.com> References: <20190213212927.9474-1-tom@tromey.com> X-SW-Source: 2019-02/txt/msg00188.txt.bz2 This removes the remaining cleanups from coffread.c. Tested by the buildbot. However, I don't think the buildbot really tests these code paths, and TBH I am not sure how to do it manually. I did manage to crash an earlier version of the patch using a mingw .exe file, though I would have thought that was only going to test coff-pe-read.c. This version includes the fix provided by Joel. gdb/ChangeLog 2019-02-13 Joel Brobecker Tom Tromey * stabsread.h (struct stab_section_list): Remove. (coffstab_build_psymtabs): Update. * dbxread.c (symbuf_sections): Now a std::vector. (sect_idx): New global. (fill_symbuf): Update. (coffstab_build_psymtabs): Change type of stabsects parameter. Update. * coffread.c (struct coff_symfile_info) : Now a std::vector. (linetab, linetab_offset, linetab_size, stringtab): Move earlier. (coff_locate_sections): Update. (coff_symfile_read): Remove cleanups. Update. (init_stringtab): Add storage parameter. (free_stringtab, free_stringtab_cleanup): Remove. (init_lineno): Add storage parameter. (free_linetab, free_linetab_cleanup): Remove. --- gdb/ChangeLog | 20 +++++++++ gdb/coffread.c | 115 ++++++++++++++---------------------------------- gdb/dbxread.c | 32 +++++++------- gdb/stabsread.h | 14 +----- 4 files changed, 72 insertions(+), 109 deletions(-) diff --git a/gdb/coffread.c b/gdb/coffread.c index 6381cd3f370..4fbeece5fb7 100644 --- a/gdb/coffread.c +++ b/gdb/coffread.c @@ -58,7 +58,7 @@ struct coff_symfile_info CORE_ADDR textaddr; /* Addr of .text section. */ unsigned int textsize; /* Size of .text section. */ - struct stab_section_list *stabsects; /* .stab sections. */ + std::vector *stabsects; /* .stab sections. */ asection *stabstrsect; /* Section pointer for .stab section. */ char *stabstrdata; }; @@ -155,6 +155,12 @@ static int type_vector_length; #define INITIAL_TYPE_VECTOR_LENGTH 160 +static char *linetab = NULL; +static long linetab_offset; +static unsigned long linetab_size; + +static char *stringtab = NULL; + extern void stabsread_clear_cache (void); static struct type *coff_read_struct_type (int, int, int, @@ -185,21 +191,13 @@ static void patch_opaque_types (struct symtab *); static void enter_linenos (long, int, int, struct objfile *); -static void free_linetab (void); - -static void free_linetab_cleanup (void *ignore); - -static int init_lineno (bfd *, long, int); +static int init_lineno (bfd *, long, int, gdb::unique_xmalloc_ptr *); static char *getsymname (struct internal_syment *); static const char *coff_getfilename (union internal_auxent *); -static void free_stringtab (void); - -static void free_stringtab_cleanup (void *ignore); - -static int init_stringtab (bfd *, long); +static int init_stringtab (bfd *, long, gdb::unique_xmalloc_ptr *); static void read_one_sym (struct coff_symbol *, struct internal_syment *, @@ -249,21 +247,7 @@ coff_locate_sections (bfd *abfd, asection *sectp, void *csip) if (!isdigit (*s)) break; if (*s == '\0') - { - struct stab_section_list *n, **pn; - - n = XNEW (struct stab_section_list); - n->section = sectp; - n->next = NULL; - for (pn = &csi->stabsects; *pn != NULL; pn = &(*pn)->next) - ; - *pn = n; - - /* This will be run after coffstab_build_psymtabs is called - in coff_symfile_read, at which point we no longer need - the information. */ - make_cleanup (xfree, n); - } + csi->stabsects->push_back (sectp); } } @@ -570,13 +554,16 @@ coff_symfile_read (struct objfile *objfile, symfile_add_flags symfile_flags) unsigned int num_symbols; int symtab_offset; int stringtab_offset; - struct cleanup *back_to; int stabstrsize; info = (struct coff_symfile_info *) objfile_data (objfile, coff_objfile_data_key); symfile_bfd = abfd; /* Kludge for swap routines. */ + std::vector stabsects; + scoped_restore restore_stabsects + = make_scoped_restore (&info->stabsects, &stabsects); + /* WARNING WILL ROBINSON! ACCESSING BFD-PRIVATE DATA HERE! FIXME! */ num_symbols = bfd_get_symcount (abfd); /* How many syms */ symtab_offset = cdata->sym_filepos; /* Symbol table file offset */ @@ -595,10 +582,10 @@ coff_symfile_read (struct objfile *objfile, symfile_add_flags symfile_flags) /* Allocate space for raw symbol and aux entries, based on their space requirements as reported by BFD. */ - temp_sym = (char *) xmalloc - (cdata->local_symesz + cdata->local_auxesz); + gdb::def_vector temp_storage (cdata->local_symesz + + cdata->local_auxesz); + temp_sym = temp_storage.data (); temp_aux = temp_sym + cdata->local_symesz; - back_to = make_cleanup (free_current_contents, &temp_sym); /* We need to know whether this is a PE file, because in PE files, unlike standard COFF files, symbol values are stored as offsets @@ -628,22 +615,25 @@ coff_symfile_read (struct objfile *objfile, symfile_add_flags symfile_flags) can avoid spurious error messages (and maybe run a little faster!) by not even reading the line number table unless we have symbols. */ + scoped_restore restore_linetab = make_scoped_restore (&linetab); + gdb::unique_xmalloc_ptr linetab_storage; if (num_symbols > 0) { /* Read the line number table, all at once. */ bfd_map_over_sections (abfd, find_linenos, (void *) info); - make_cleanup (free_linetab_cleanup, 0 /*ignore*/); val = init_lineno (abfd, info->min_lineno_offset, - info->max_lineno_offset - info->min_lineno_offset); + info->max_lineno_offset - info->min_lineno_offset, + &linetab_storage); if (val < 0) error (_("\"%s\": error reading line numbers."), filename); } /* Now read the string table, all at once. */ - make_cleanup (free_stringtab_cleanup, 0 /*ignore*/); - val = init_stringtab (abfd, stringtab_offset); + scoped_restore restore_stringtab = make_scoped_restore (&stringtab); + gdb::unique_xmalloc_ptr stringtab_storage; + val = init_stringtab (abfd, stringtab_offset, &stringtab_storage); if (val < 0) error (_("\"%s\": can't get string table"), filename); @@ -701,7 +691,7 @@ coff_symfile_read (struct objfile *objfile, symfile_add_flags symfile_flags) if (!(objfile->flags & OBJF_READNEVER)) bfd_map_over_sections (abfd, coff_locate_sections, (void *) info); - if (info->stabsects) + if (! info->stabsects->empty()) { if (!info->stabstrsect) { @@ -718,7 +708,7 @@ coff_symfile_read (struct objfile *objfile, symfile_add_flags symfile_flags) coffstab_build_psymtabs (objfile, info->textaddr, info->textsize, - info->stabsects, + *info->stabsects, info->stabstrsect->filepos, stabstrsize); } if (dwarf2_has_info (objfile, NULL)) @@ -745,8 +735,6 @@ coff_symfile_read (struct objfile *objfile, symfile_add_flags symfile_flags) symfile_flags, objfile); } } - - do_cleanups (back_to); } static void @@ -1298,17 +1286,13 @@ read_one_sym (struct coff_symbol *cs, /* Support for string table handling. */ -static char *stringtab = NULL; - static int -init_stringtab (bfd *abfd, long offset) +init_stringtab (bfd *abfd, long offset, gdb::unique_xmalloc_ptr *storage) { long length; int val; unsigned char lengthbuf[4]; - free_stringtab (); - /* If the file is stripped, the offset might be zero, indicating no string table. Just return with `stringtab' set to null. */ if (offset == 0) @@ -1325,7 +1309,8 @@ init_stringtab (bfd *abfd, long offset) if (val != sizeof lengthbuf || length < sizeof lengthbuf) return 0; - stringtab = (char *) xmalloc (length); + storage->reset ((char *) xmalloc (length)); + stringtab = storage->get (); /* This is in target format (probably not very useful, and not currently used), not host format. */ memcpy (stringtab, lengthbuf, sizeof lengthbuf); @@ -1340,20 +1325,6 @@ init_stringtab (bfd *abfd, long offset) return 0; } -static void -free_stringtab (void) -{ - if (stringtab) - xfree (stringtab); - stringtab = NULL; -} - -static void -free_stringtab_cleanup (void *ignore) -{ - free_stringtab (); -} - static char * getsymname (struct internal_syment *symbol_entry) { @@ -1407,24 +1378,19 @@ coff_getfilename (union internal_auxent *aux_entry) /* Support for line number handling. */ -static char *linetab = NULL; -static long linetab_offset; -static unsigned long linetab_size; - /* Read in all the line numbers for fast lookups later. Leave them in external (unswapped) format in memory; we'll swap them as we enter them into GDB's data structures. */ static int -init_lineno (bfd *abfd, long offset, int size) +init_lineno (bfd *abfd, long offset, int size, + gdb::unique_xmalloc_ptr *storage) { int val; linetab_offset = offset; linetab_size = size; - free_linetab (); - if (size == 0) return 0; @@ -1432,9 +1398,10 @@ init_lineno (bfd *abfd, long offset, int size) return -1; /* Allocate the desired table, plus a sentinel. */ - linetab = (char *) xmalloc (size + local_linesz); + storage->reset ((char *) xmalloc (size + local_linesz)); + linetab = storage->get (); - val = bfd_bread (linetab, size, abfd); + val = bfd_bread (storage->get (), size, abfd); if (val != size) return -1; @@ -1444,20 +1411,6 @@ init_lineno (bfd *abfd, long offset, int size) return 0; } -static void -free_linetab (void) -{ - if (linetab) - xfree (linetab); - linetab = NULL; -} - -static void -free_linetab_cleanup (void *ignore) -{ - free_linetab (); -} - #if !defined (L_LNNO32) #define L_LNNO32(lp) ((lp)->l_lnno) #endif diff --git a/gdb/dbxread.c b/gdb/dbxread.c index 60d384b27fe..ad2edc3ff4b 100644 --- a/gdb/dbxread.c +++ b/gdb/dbxread.c @@ -747,7 +747,8 @@ static char *stringtab_global; /* These variables are used to control fill_symbuf when the stabs symbols are not contiguous (as may be the case when a COFF file is linked using --split-by-reloc). */ -static struct stab_section_list *symbuf_sections; +static const std::vector *symbuf_sections; +static size_t sect_idx; static unsigned int symbuf_left; static unsigned int symbuf_read; @@ -783,13 +784,13 @@ fill_symbuf (bfd *sym_bfd) { if (symbuf_left <= 0) { - file_ptr filepos = symbuf_sections->section->filepos; + file_ptr filepos = (*symbuf_sections)[sect_idx]->filepos; if (bfd_seek (sym_bfd, filepos, SEEK_SET) != 0) perror_with_name (bfd_get_filename (sym_bfd)); - symbuf_left = bfd_section_size (sym_bfd, symbuf_sections->section); + symbuf_left = bfd_section_size (sym_bfd, (*symbuf_sections)[sect_idx]); symbol_table_offset = filepos - symbuf_read; - symbuf_sections = symbuf_sections->next; + ++sect_idx; } count = symbuf_left; @@ -2942,7 +2943,7 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, const char *name, void coffstab_build_psymtabs (struct objfile *objfile, CORE_ADDR textaddr, unsigned int textsize, - struct stab_section_list *stabsects, + const std::vector &stabsects, file_ptr stabstroffset, unsigned int stabstrsize) { int val; @@ -2981,27 +2982,28 @@ coffstab_build_psymtabs (struct objfile *objfile, /* In a coff file, we've already installed the minimal symbols that came from the coff (non-stab) symbol table, so always act like an incremental load here. */ - if (stabsects->next == NULL) + scoped_restore save_symbuf_sections + = make_scoped_restore (&symbuf_sections); + if (stabsects.size () == 1) { - stabsize = bfd_section_size (sym_bfd, stabsects->section); + stabsize = bfd_section_size (sym_bfd, stabsects[0]); DBX_SYMCOUNT (objfile) = stabsize / DBX_SYMBOL_SIZE (objfile); - DBX_SYMTAB_OFFSET (objfile) = stabsects->section->filepos; + DBX_SYMTAB_OFFSET (objfile) = stabsects[0]->filepos; } else { - struct stab_section_list *stabsect; - DBX_SYMCOUNT (objfile) = 0; - for (stabsect = stabsects; stabsect != NULL; stabsect = stabsect->next) + for (asection *section : stabsects) { - stabsize = bfd_section_size (sym_bfd, stabsect->section); + stabsize = bfd_section_size (sym_bfd, section); DBX_SYMCOUNT (objfile) += stabsize / DBX_SYMBOL_SIZE (objfile); } - DBX_SYMTAB_OFFSET (objfile) = stabsects->section->filepos; + DBX_SYMTAB_OFFSET (objfile) = stabsects[0]->filepos; - symbuf_sections = stabsects->next; - symbuf_left = bfd_section_size (sym_bfd, stabsects->section); + sect_idx = 1; + symbuf_sections = &stabsects; + symbuf_left = bfd_section_size (sym_bfd, stabsects[0]); symbuf_read = 0; } diff --git a/gdb/stabsread.h b/gdb/stabsread.h index fc989bc8994..f6928083d7c 100644 --- a/gdb/stabsread.h +++ b/gdb/stabsread.h @@ -167,18 +167,6 @@ extern void end_stabs (void); extern void finish_global_stabs (struct objfile *objfile); -/* COFF files can have multiple .stab sections, if they are linked - using --split-by-reloc. This linked list is used to pass the - information into the functions in dbxread.c. */ -struct stab_section_list - { - /* Next in list. */ - struct stab_section_list *next; - - /* Stab section. */ - asection *section; - }; - /* Functions exported by dbxread.c. These are not in stabsread.c because they are only used by some stabs readers. */ @@ -201,7 +189,7 @@ extern void elfstab_build_psymtabs (struct objfile *objfile, extern void coffstab_build_psymtabs (struct objfile *objfile, CORE_ADDR textaddr, unsigned int textsize, - struct stab_section_list *stabs, + const std::vector &stabs, file_ptr stabstroffset, unsigned int stabstrsize); extern void stabsect_build_psymtabs (struct objfile *objfile, char *stab_name, -- 2.17.2