aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2019-03-02 12:11:26 -0700
committerTom Tromey <tom@tromey.com>2019-03-15 16:02:09 -0600
commitd6797f465c3f67b41a0db38870bbd33384b6551f (patch)
tree170543bd51da158cd4fd08805038d8973e9e6b1c /gdb
parent741d7538b7540fea1086fe6ab962227d2cf7418e (diff)
downloadgdb-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.
Diffstat (limited to 'gdb')
-rw-r--r--gdb/ChangeLog11
-rw-r--r--gdb/objfiles.c46
-rw-r--r--gdb/objfiles.h2
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;