Do not pass objfile to psymtab_discarder

This changes the psymtab_discarder to not assume that partial symtabs
are attached to the objfile.  Instead, a psymtab_storage object is
passed directly to it.

gdb/ChangeLog
2021-03-20  Tom Tromey  <tom@tromey.com>

	* psympriv.h (psymtab_discarder): Take psymtab_storage parameter.
	(~psymtab_discarder, keep): Update.
	<m_objfile>: Remove.
	<m_partial_symtabs>: New member.
	* dwarf2/read.c (dwarf2_build_psymtabs): Update.
This commit is contained in:
Tom Tromey 2021-03-20 17:23:40 -06:00
parent 7e9c0476a7
commit 484b109063
3 changed files with 17 additions and 10 deletions

View File

@ -1,3 +1,11 @@
2021-03-20 Tom Tromey <tom@tromey.com>
* psympriv.h (psymtab_discarder): Take psymtab_storage parameter.
(~psymtab_discarder, keep): Update.
<m_objfile>: Remove.
<m_partial_symtabs>: New member.
* dwarf2/read.c (dwarf2_build_psymtabs): Update.
2021-03-20 Tom Tromey <tom@tromey.com> 2021-03-20 Tom Tromey <tom@tromey.com>
* xcoffread.c (xcoff_end_psymtab): Add partial_symtabs parameter. * xcoffread.c (xcoff_end_psymtab): Add partial_symtabs parameter.

View File

@ -6142,7 +6142,7 @@ dwarf2_build_psymtabs (struct objfile *objfile)
/* This isn't really ideal: all the data we allocate on the /* This isn't really ideal: all the data we allocate on the
objfile's obstack is still uselessly kept around. However, objfile's obstack is still uselessly kept around. However,
freeing it seems unsafe. */ freeing it seems unsafe. */
psymtab_discarder psymtabs (objfile); psymtab_discarder psymtabs (objfile->partial_symtabs.get ());
dwarf2_build_psymtabs_hard (per_objfile); dwarf2_build_psymtabs_hard (per_objfile);
psymtabs.keep (); psymtabs.keep ();

View File

@ -446,29 +446,28 @@ class psymtab_discarder
{ {
public: public:
psymtab_discarder (struct objfile *objfile) psymtab_discarder (psymtab_storage *partial_symtabs)
: m_objfile (objfile), : m_partial_symtabs (partial_symtabs),
m_psymtab (objfile->partial_symtabs->psymtabs) m_psymtab (partial_symtabs->psymtabs)
{ {
} }
~psymtab_discarder () ~psymtab_discarder ()
{ {
if (m_objfile != NULL) if (m_partial_symtabs != nullptr)
m_objfile->partial_symtabs->discard_psymtabs_to (m_psymtab); m_partial_symtabs->discard_psymtabs_to (m_psymtab);
} }
/* Keep any partial symbol tables that were built. */ /* Keep any partial symbol tables that were built. */
void keep () void keep ()
{ {
m_objfile = NULL; m_partial_symtabs = nullptr;
} }
private: private:
/* The objfile. If NULL this serves as a sentinel to indicate that /* The partial symbol storage object. */
the psymtabs should be kept. */ psymtab_storage *m_partial_symtabs;
struct objfile *m_objfile;
/* How far back to free. */ /* How far back to free. */
struct partial_symtab *m_psymtab; struct partial_symtab *m_psymtab;
}; };