diff options
author | Tom Tromey <tom@tromey.com> | 2019-03-02 12:11:26 -0700 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2019-03-15 16:02:09 -0600 |
commit | d6797f465c3f67b41a0db38870bbd33384b6551f (patch) | |
tree | 170543bd51da158cd4fd08805038d8973e9e6b1c | |
parent | 741d7538b7540fea1086fe6ab962227d2cf7418e (diff) | |
download | gdb-d6797f465c3f67b41a0db38870bbd33384b6551f.zip gdb-d6797f465c3f67b41a0db38870bbd33384b6551f.tar.gz gdb-d6797f465c3f67b41a0db38870bbd33384b6551f.tar.bz2 |
Simplify per-BFD storage management
There's no reason that the objfile_per_bfd_storage must be allocated
via bfd_alloc. This patch changes objfile_per_bfd_storage to be
managed more simply, via ordinary new and delete; and moves some code
into its (new) destructor.
While doing this I also noticed an extra initialization of
language_of_main, and removed it.
gdb/ChangeLog
2019-03-15 Tom Tromey <tom@tromey.com>
* objfiles.h (struct objfile_per_bfd_storage): Declare
destructor.
* objfiles.c (objfile_per_bfd_storage::~objfile_per_bfd_storage):
New.
(get_objfile_bfd_data): Use new. Don't initialize
language_of_main.
(free_objfile_per_bfd_storage): Remove.
(objfile_bfd_data_free, objfile::~objfile): Use delete.
-rw-r--r-- | gdb/ChangeLog | 11 | ||||
-rw-r--r-- | gdb/objfiles.c | 46 | ||||
-rw-r--r-- | gdb/objfiles.h | 2 |
3 files changed, 27 insertions, 32 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index e1adb08..13c207d 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,16 @@ 2019-03-15 Tom Tromey <tom@tromey.com> + * objfiles.h (struct objfile_per_bfd_storage): Declare + destructor. + * objfiles.c (objfile_per_bfd_storage::~objfile_per_bfd_storage): + New. + (get_objfile_bfd_data): Use new. Don't initialize + language_of_main. + (free_objfile_per_bfd_storage): Remove. + (objfile_bfd_data_free, objfile::~objfile): Use delete. + +2019-03-15 Tom Tromey <tom@tromey.com> + * symfile.c (reread_symbols): Update. * objfiles.c (objfile::objfile): Update. * minsyms.h (terminate_minimal_symbol_table): Don't declare. diff --git a/gdb/objfiles.c b/gdb/objfiles.c index 2468ca7..ff8b6fc 100644 --- a/gdb/objfiles.c +++ b/gdb/objfiles.c @@ -117,13 +117,17 @@ get_objfile_pspace_data (struct program_space *pspace) static const struct bfd_data *objfiles_bfd_data; +objfile_per_bfd_storage::~objfile_per_bfd_storage () +{ + if (demangled_names_hash) + htab_delete (demangled_names_hash); +} + /* Create the per-BFD storage object for OBJFILE. If ABFD is not NULL, and it already has a per-BFD storage object, use that. - Otherwise, allocate a new per-BFD storage object. If ABFD is not - NULL, the object is allocated on the BFD; otherwise it is allocated - on OBJFILE's obstack. Note that it is not safe to call this - multiple times for a given OBJFILE -- it can only be called when - allocating or re-initializing OBJFILE. */ + Otherwise, allocate a new per-BFD storage object. Note that it is + not safe to call this multiple times for a given OBJFILE -- it can + only be called when allocating or re-initializing OBJFILE. */ static struct objfile_per_bfd_storage * get_objfile_bfd_data (struct objfile *objfile, struct bfd *abfd) @@ -136,50 +140,28 @@ get_objfile_bfd_data (struct objfile *objfile, struct bfd *abfd) if (storage == NULL) { + storage = new objfile_per_bfd_storage; /* If the object requires gdb to do relocations, we simply fall back to not sharing data across users. These cases are rare enough that this seems reasonable. */ if (abfd != NULL && !gdb_bfd_requires_relocations (abfd)) - { - storage - = ((struct objfile_per_bfd_storage *) - bfd_alloc (abfd, sizeof (struct objfile_per_bfd_storage))); - /* objfile_per_bfd_storage is not trivially constructible, must - call the ctor manually. */ - storage = new (storage) objfile_per_bfd_storage (); - set_bfd_data (abfd, objfiles_bfd_data, storage); - } - else - storage - = obstack_new<objfile_per_bfd_storage> (&objfile->objfile_obstack); + set_bfd_data (abfd, objfiles_bfd_data, storage); /* Look up the gdbarch associated with the BFD. */ if (abfd != NULL) storage->gdbarch = gdbarch_from_bfd (abfd); - - storage->language_of_main = language_unknown; } return storage; } -/* Free STORAGE. */ - -static void -free_objfile_per_bfd_storage (struct objfile_per_bfd_storage *storage) -{ - if (storage->demangled_names_hash) - htab_delete (storage->demangled_names_hash); - storage->~objfile_per_bfd_storage (); -} - -/* A wrapper for free_objfile_per_bfd_storage that can be passed as a +/* A deleter for objfile_per_bfd_storage that can be passed as a cleanup function to the BFD registry. */ static void objfile_bfd_data_free (struct bfd *unused, void *d) { - free_objfile_per_bfd_storage ((struct objfile_per_bfd_storage *) d); + delete (struct objfile_per_bfd_storage *) d; } /* See objfiles.h. */ @@ -670,7 +652,7 @@ objfile::~objfile () if (obfd) gdb_bfd_unref (obfd); else - free_objfile_per_bfd_storage (per_bfd); + delete per_bfd; /* Remove it from the chain of all objfiles. */ diff --git a/gdb/objfiles.h b/gdb/objfiles.h index 47df002..6f8eb7f 100644 --- a/gdb/objfiles.h +++ b/gdb/objfiles.h @@ -235,6 +235,8 @@ struct objfile_per_bfd_storage : minsyms_read (false) {} + ~objfile_per_bfd_storage (); + /* The storage has an obstack of its own. */ auto_obstack storage_obstack; |