diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 4eeea5c12fb..32fe0bbe814 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,13 @@ +2019-01-10 Tom Tromey + + * objfiles.h (objfile::reset_psymtabs): Update. + * objfiles.c (objfile::objfile): Update. + * psymtab.h (psymtab_storage::obstack): Update. + (psymtab_storage::m_obstack): Use gdb::optional. + (class psymtab_storage): Update comment. Remove objfile + parameter. + * psymtab.c (psymtab_storage::psymtab_storage): Update. + 2019-01-10 Tom Tromey * psymtab.h (psymtab_storage::allocate_psymtab): New method. diff --git a/gdb/objfiles.c b/gdb/objfiles.c index 34154482124..255a3d636d1 100644 --- a/gdb/objfiles.c +++ b/gdb/objfiles.c @@ -369,7 +369,7 @@ build_objfile_section_table (struct objfile *objfile) objfile::objfile (bfd *abfd, const char *name, objfile_flags flags_) : flags (flags_), pspace (current_program_space), - partial_symtabs (new psymtab_storage (this)), + partial_symtabs (new psymtab_storage ()), obfd (abfd) { const char *expanded_name; diff --git a/gdb/objfiles.h b/gdb/objfiles.h index cde025d9d91..f7d08c43b3b 100644 --- a/gdb/objfiles.h +++ b/gdb/objfiles.h @@ -298,7 +298,7 @@ struct objfile void reset_psymtabs () { psymbol_map.clear (); - partial_symtabs.reset (new psymtab_storage (this)); + partial_symtabs.reset (new psymtab_storage ()); } diff --git a/gdb/psymtab.c b/gdb/psymtab.c index 7ead0eb81ad..e034fda3402 100644 --- a/gdb/psymtab.c +++ b/gdb/psymtab.c @@ -67,9 +67,8 @@ static struct compunit_symtab *psymtab_to_symtab (struct objfile *objfile, -psymtab_storage::psymtab_storage (struct objfile *objfile) - : psymbol_cache (psymbol_bcache_init ()), - m_obstack (&objfile->objfile_obstack) +psymtab_storage::psymtab_storage () + : psymbol_cache (psymbol_bcache_init ()) { } diff --git a/gdb/psymtab.h b/gdb/psymtab.h index a21e88fd0a0..26aeb29646e 100644 --- a/gdb/psymtab.h +++ b/gdb/psymtab.h @@ -31,13 +31,26 @@ struct partial_symbol; struct psymbol_bcache; /* An instance of this class manages the partial symbol tables and - partial symbols for a given objfile. */ + partial symbols for a given objfile. + + The core psymtab functions -- those in psymtab.c -- arrange for + nearly all psymtab- and psymbol-related allocations to happen + either in the psymtab_storage object (either on its obstack or in + other memory managed by this class), or on the per-BFD object. The + only link from the psymtab storage object back to the objfile (or + objfile_obstack) that is made by the core psymtab code is the + compunit_symtab member in the psymtab. + + However, it is up to each symbol reader to maintain this invariant + in other ways, if it wants to reuse psymtabs across multiple + objfiles. The main issue here is ensuring that read_symtab_private + does not point into objfile_obstack. */ class psymtab_storage { public: - explicit psymtab_storage (struct objfile *objfile); + psymtab_storage (); ~psymtab_storage (); @@ -60,7 +73,9 @@ public: struct obstack *obstack () { - return m_obstack; + if (!m_obstack.has_value ()) + m_obstack.emplace (); + return &*m_obstack; } /* Allocate storage for the "dependencies" field of a psymtab. @@ -108,9 +123,10 @@ private: struct partial_symtab *free_psymtabs = nullptr; - /* The obstack where allocations are made. */ + /* The obstack where allocations are made. This is lazily allocated + so that we don't waste memory when there are no psymtabs. */ - struct obstack *m_obstack; + gdb::optional m_obstack; };