aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPedro Alves <palves@redhat.com>2017-06-27 16:22:08 +0100
committerPedro Alves <palves@redhat.com>2017-06-27 16:22:08 +0100
commit23732b1e32dd58f7c731d9aee56ff0b22a645d53 (patch)
treea6d65195915105e05e8dd4ee05b21b91f8cb1243
parenta4d1e79aaa4b9d994cd9790fc3b756748dc5571c (diff)
downloadfsf-binutils-gdb-23732b1e32dd58f7c731d9aee56ff0b22a645d53.zip
fsf-binutils-gdb-23732b1e32dd58f7c731d9aee56ff0b22a645d53.tar.gz
fsf-binutils-gdb-23732b1e32dd58f7c731d9aee56ff0b22a645d53.tar.bz2
objfile_per_bfd_storage non-POD
A following patch will want to add a std::vector to objfile_per_bfd_storage. That makes it non-trivially constructible/destructible. Since objfile_per_bfd_storage objects are allocated on an obstack, we need to call their ctors/dtors manually. This is what this patch does. And then since we can now rely on ctors/dtors being run, make objfile_per_bfd_storage::storage_obstack be an auto_obstack. gdb/ChangeLog: 2017-06-27 Pedro Alves <palves@redhat.com> * objfiles.c (get_objfile_bfd_data): Call bfd_alloc instead of bfd_zalloc. Call objfile_per_bfd_storage's ctor. (free_objfile_per_bfd_storage): Call objfile_per_bfd_storage's dtor. * objfiles.h (objfile_per_bfd_storage): Add ctor. Make 'storage_obstack' field an auto_obstack. In-class initialize all non-bitfield fields. Make minsyms_read bool. * symfile.c (read_symbols): Adjust.
-rw-r--r--gdb/ChangeLog11
-rw-r--r--gdb/objfiles.c15
-rw-r--r--gdb/objfiles.h32
-rw-r--r--gdb/symfile.c2
4 files changed, 41 insertions, 19 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 1534468..c455d41 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,14 @@
+2017-06-27 Pedro Alves <palves@redhat.com>
+
+ * objfiles.c (get_objfile_bfd_data): Call bfd_alloc instead of
+ bfd_zalloc. Call objfile_per_bfd_storage's ctor.
+ (free_objfile_per_bfd_storage): Call objfile_per_bfd_storage's
+ dtor.
+ * objfiles.h (objfile_per_bfd_storage): Add ctor. Make
+ 'storage_obstack' field an auto_obstack. In-class initialize all
+ non-bitfield fields. Make minsyms_read bool.
+ * symfile.c (read_symbols): Adjust.
+
2017-06-27 Alan Hayward <alan.hayward@arm.com>
* remote-sim.c (gdbsim_fetch_register): Use byte_vector.
diff --git a/gdb/objfiles.c b/gdb/objfiles.c
index 9500b1c..d261c87 100644
--- a/gdb/objfiles.c
+++ b/gdb/objfiles.c
@@ -142,12 +142,19 @@ get_objfile_bfd_data (struct objfile *objfile, struct bfd *abfd)
{
storage
= ((struct objfile_per_bfd_storage *)
- bfd_zalloc (abfd, sizeof (struct objfile_per_bfd_storage)));
+ bfd_alloc (abfd, sizeof (struct objfile_per_bfd_storage)));
set_bfd_data (abfd, objfiles_bfd_data, storage);
}
else
- storage = OBSTACK_ZALLOC (&objfile->objfile_obstack,
- struct objfile_per_bfd_storage);
+ {
+ storage = (objfile_per_bfd_storage *)
+ obstack_alloc (&objfile->objfile_obstack,
+ sizeof (objfile_per_bfd_storage));
+ }
+
+ /* objfile_per_bfd_storage is not trivially constructible, must
+ call the ctor manually. */
+ storage = new (storage) objfile_per_bfd_storage ();
/* Look up the gdbarch associated with the BFD. */
if (abfd != NULL)
@@ -171,7 +178,7 @@ free_objfile_per_bfd_storage (struct objfile_per_bfd_storage *storage)
bcache_xfree (storage->macro_cache);
if (storage->demangled_names_hash)
htab_delete (storage->demangled_names_hash);
- obstack_free (&storage->storage_obstack, 0);
+ storage->~objfile_per_bfd_storage ();
}
/* A wrapper for free_objfile_per_bfd_storage that can be passed as a
diff --git a/gdb/objfiles.h b/gdb/objfiles.h
index 58db6c9..3260425 100644
--- a/gdb/objfiles.h
+++ b/gdb/objfiles.h
@@ -184,24 +184,28 @@ extern void print_symbol_bcache_statistics (void);
struct objfile_per_bfd_storage
{
+ objfile_per_bfd_storage ()
+ : minsyms_read (false)
+ {}
+
/* The storage has an obstack of its own. */
- struct obstack storage_obstack;
+ auto_obstack storage_obstack;
/* Byte cache for file names. */
- struct bcache *filename_cache;
+ bcache *filename_cache = NULL;
/* Byte cache for macros. */
- struct bcache *macro_cache;
+ bcache *macro_cache = NULL;
/* The gdbarch associated with the BFD. Note that this gdbarch is
determined solely from BFD information, without looking at target
information. The gdbarch determined from a running target may
differ from this e.g. with respect to register types and names. */
- struct gdbarch *gdbarch;
+ struct gdbarch *gdbarch = NULL;
/* Hash table for mapping symbol names to demangled names. Each
entry in the hash table is actually two consecutive strings,
@@ -209,19 +213,19 @@ struct objfile_per_bfd_storage
name, and the second is the demangled name or just a zero byte
if the name doesn't demangle. */
- struct htab *demangled_names_hash;
+ htab *demangled_names_hash = NULL;
/* The per-objfile information about the entry point, the scope (file/func)
containing the entry point, and the scope of the user's main() func. */
- struct entry_info ei;
+ entry_info ei {};
/* The name and language of any "main" found in this objfile. The
name can be NULL, which means that the information was not
recorded. */
- const char *name_of_main;
- enum language language_of_main;
+ const char *name_of_main = NULL;
+ enum language language_of_main = language_unknown;
/* Each file contains a pointer to an array of minimal symbols for all
global symbols that are defined within the file. The array is
@@ -233,15 +237,15 @@ struct objfile_per_bfd_storage
as all the data that it points to, should be allocated on the
objfile_obstack for this file. */
- struct minimal_symbol *msymbols;
- int minimal_symbol_count;
+ minimal_symbol *msymbols = NULL;
+ int minimal_symbol_count = 0;
/* The number of minimal symbols read, before any minimal symbol
de-duplication is applied. Note in particular that this has only
a passing relationship with the actual size of the table above;
use minimal_symbol_count if you need the true size. */
- int n_minsyms;
+ int n_minsyms = 0;
/* This is true if minimal symbols have already been read. Symbol
readers can use this to bypass minimal symbol reading. Also, the
@@ -251,16 +255,16 @@ struct objfile_per_bfd_storage
for multiple readers to install minimal symbols into a given
per-BFD. */
- unsigned int minsyms_read : 1;
+ bool minsyms_read : 1;
/* This is a hash table used to index the minimal symbols by name. */
- struct minimal_symbol *msymbol_hash[MINIMAL_SYMBOL_HASH_SIZE];
+ minimal_symbol *msymbol_hash[MINIMAL_SYMBOL_HASH_SIZE] {};
/* This hash table is used to index the minimal symbols by their
demangled names. */
- struct minimal_symbol *msymbol_demangled_hash[MINIMAL_SYMBOL_HASH_SIZE];
+ minimal_symbol *msymbol_demangled_hash[MINIMAL_SYMBOL_HASH_SIZE] {};
};
/* Master structure for keeping track of each file from which
diff --git a/gdb/symfile.c b/gdb/symfile.c
index f936cf3..aa53415 100644
--- a/gdb/symfile.c
+++ b/gdb/symfile.c
@@ -859,7 +859,7 @@ static void
read_symbols (struct objfile *objfile, symfile_add_flags add_flags)
{
(*objfile->sf->sym_read) (objfile, add_flags);
- objfile->per_bfd->minsyms_read = 1;
+ objfile->per_bfd->minsyms_read = true;
/* find_separate_debug_file_in_section should be called only if there is
single binary with no existing separate debug info file. */