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.
This commit is contained in:
Tom Tromey 2019-03-02 12:11:26 -07:00
parent 741d7538b7
commit d6797f465c
3 changed files with 27 additions and 32 deletions

View File

@ -1,3 +1,14 @@
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.

View File

@ -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);
/* 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. */

View File

@ -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;