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>
* 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
objfile's obstack is still uselessly kept around. However,
freeing it seems unsafe. */
psymtab_discarder psymtabs (objfile);
psymtab_discarder psymtabs (objfile->partial_symtabs.get ());
dwarf2_build_psymtabs_hard (per_objfile);
psymtabs.keep ();

View File

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