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.
This commit is contained in:
Pedro Alves 2017-06-27 16:22:08 +01:00
parent a4d1e79aaa
commit 23732b1e32
4 changed files with 41 additions and 19 deletions

View File

@ -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> 2017-06-27 Alan Hayward <alan.hayward@arm.com>
* remote-sim.c (gdbsim_fetch_register): Use byte_vector. * remote-sim.c (gdbsim_fetch_register): Use byte_vector.

View File

@ -142,12 +142,19 @@ get_objfile_bfd_data (struct objfile *objfile, struct bfd *abfd)
{ {
storage storage
= ((struct objfile_per_bfd_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); set_bfd_data (abfd, objfiles_bfd_data, storage);
} }
else 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. */ /* Look up the gdbarch associated with the BFD. */
if (abfd != NULL) if (abfd != NULL)
@ -171,7 +178,7 @@ free_objfile_per_bfd_storage (struct objfile_per_bfd_storage *storage)
bcache_xfree (storage->macro_cache); bcache_xfree (storage->macro_cache);
if (storage->demangled_names_hash) if (storage->demangled_names_hash)
htab_delete (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 /* A wrapper for free_objfile_per_bfd_storage that can be passed as a

View File

@ -184,24 +184,28 @@ extern void print_symbol_bcache_statistics (void);
struct objfile_per_bfd_storage struct objfile_per_bfd_storage
{ {
objfile_per_bfd_storage ()
: minsyms_read (false)
{}
/* The storage has an obstack of its own. */ /* The storage has an obstack of its own. */
struct obstack storage_obstack; auto_obstack storage_obstack;
/* Byte cache for file names. */ /* Byte cache for file names. */
struct bcache *filename_cache; bcache *filename_cache = NULL;
/* Byte cache for macros. */ /* Byte cache for macros. */
struct bcache *macro_cache; bcache *macro_cache = NULL;
/* The gdbarch associated with the BFD. Note that this gdbarch is /* The gdbarch associated with the BFD. Note that this gdbarch is
determined solely from BFD information, without looking at target determined solely from BFD information, without looking at target
information. The gdbarch determined from a running target may information. The gdbarch determined from a running target may
differ from this e.g. with respect to register types and names. */ 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 /* Hash table for mapping symbol names to demangled names. Each
entry in the hash table is actually two consecutive strings, 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 name, and the second is the demangled name or just a zero byte
if the name doesn't demangle. */ 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) /* 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. */ 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 /* The name and language of any "main" found in this objfile. The
name can be NULL, which means that the information was not name can be NULL, which means that the information was not
recorded. */ recorded. */
const char *name_of_main; const char *name_of_main = NULL;
enum language language_of_main; enum language language_of_main = language_unknown;
/* Each file contains a pointer to an array of minimal symbols for all /* Each file contains a pointer to an array of minimal symbols for all
global symbols that are defined within the file. The array is 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 as all the data that it points to, should be allocated on the
objfile_obstack for this file. */ objfile_obstack for this file. */
struct minimal_symbol *msymbols; minimal_symbol *msymbols = NULL;
int minimal_symbol_count; int minimal_symbol_count = 0;
/* The number of minimal symbols read, before any minimal symbol /* The number of minimal symbols read, before any minimal symbol
de-duplication is applied. Note in particular that this has only de-duplication is applied. Note in particular that this has only
a passing relationship with the actual size of the table above; a passing relationship with the actual size of the table above;
use minimal_symbol_count if you need the true size. */ 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 /* This is true if minimal symbols have already been read. Symbol
readers can use this to bypass minimal symbol reading. Also, the 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 for multiple readers to install minimal symbols into a given
per-BFD. */ per-BFD. */
unsigned int minsyms_read : 1; bool minsyms_read : 1;
/* This is a hash table used to index the minimal symbols by name. */ /* 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 /* This hash table is used to index the minimal symbols by their
demangled names. */ 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 /* Master structure for keeping track of each file from which

View File

@ -859,7 +859,7 @@ static void
read_symbols (struct objfile *objfile, symfile_add_flags add_flags) read_symbols (struct objfile *objfile, symfile_add_flags add_flags)
{ {
(*objfile->sf->sym_read) (objfile, 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 /* find_separate_debug_file_in_section should be called only if there is
single binary with no existing separate debug info file. */ single binary with no existing separate debug info file. */