From e2a035485a80651a5dc1711fee5a811e41ab131b Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Sun, 19 Aug 2018 11:50:44 -0600 Subject: [PATCH] Remove cleanups from coffread.c This removes the remaining cleanups from coffread.c. Tested by the buildbot and also some manual testing. This version includes the fix provided by Joel. gdb/ChangeLog 2019-03-06 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/ChangeLog b/gdb/ChangeLog index 14231bacace..b17b6a98820 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,23 @@ +2019-03-06 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. + 2019-03-06 Pedro Alves * linux-fork.c (fork_info::clobber_regs): Delete. diff --git a/gdb/coffread.c b/gdb/coffread.c index 91a112e190d..b89c0e2e803 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); } } @@ -567,13 +551,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 */ @@ -592,10 +579,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 @@ -625,22 +612,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); @@ -698,7 +688,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) { @@ -715,7 +705,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)) @@ -742,8 +732,6 @@ coff_symfile_read (struct objfile *objfile, symfile_add_flags symfile_flags) symfile_flags, objfile); } } - - do_cleanups (back_to); } static void @@ -1295,17 +1283,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) @@ -1322,7 +1306,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); @@ -1337,20 +1322,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) { @@ -1404,24 +1375,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; @@ -1429,9 +1395,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; @@ -1441,20 +1408,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.30.2