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:
parent
a4d1e79aaa
commit
23732b1e32
|
@ -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.
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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. */
|
||||||
|
|
Loading…
Reference in New Issue