[08/14] Remove symtab links from dwarf2_psymtab and dwarf2_per_cu_quick_data

Message ID 20200215165444.32653-9-tom@tromey.com
State New
Headers show
Series
  • Share DWARF partial symtabs between objfiles
Related show

Commit Message

Tom Tromey Feb. 15, 2020, 4:54 p.m.
This removes the links from dwarf2_psymtab and
dwarf2_per_cu_quick_data to the compunit_symtab.  Now, the DWARF code
uses the index in these objects to find the corresponding symtab in
the "unshared" object.

2020-02-15  Tom Tromey  <tom@tromey.com>

	* dwarf2/read.h (struct dwarf2_unshareable) <symtabs>: New
	member.
	(struct dwarf2_psymtab): Derive from partial_symtab.
	<readin_p, get_compunit_symtab>: Declare methods.
	* dwarf2/read.c (struct dwarf2_per_cu_quick_data)
	<compunit_symtab>: Remove.
	(dw2_do_instantiate_symtab, dw2_instantiate_symtab)
	(dw2_map_expand_apply, dw2_map_symtabs_matching_filename)
	(dw2_symtab_iter_next, dw2_print_stats)
	(dw2_expand_symtabs_with_fullname)
	(dw2_expand_symtabs_matching_one)
	(dw_expand_symtabs_matching_file_matcher)
	(dw2_find_pc_sect_compunit_symtab, dw2_map_symbol_filenames)
	(dw2_debug_names_iterator::next, does)
	(fill_in_sig_entry_from_dwo_entry, dwarf2_psymtab::read_symtab)
	(process_queue, dwarf2_psymtab::expand_psymtab): Update.
	(dwarf2_psymtab::readin_p, dwarf2_psymtab::get_compunit_symtab):
	New methods.
	(get_compunit_symtab, process_full_comp_unit)
	(process_full_type_unit): Update.
	(dwarf2_build_psymtabs): Resize the symtabs vector.
	(dwarf2_resize_unshareable): New function.
	(dwarf2_initialize_objfile): Call dwarf2_resize_unshareable.
---
 gdb/ChangeLog     |  26 +++++++
 gdb/dwarf2/read.c | 194 +++++++++++++++++++++++++++++++---------------
 gdb/dwarf2/read.h |  14 +++-
 3 files changed, 170 insertions(+), 64 deletions(-)

-- 
2.17.2

Comments

Luis Machado Feb. 18, 2020, 11:50 a.m. | #1
A comment below...

On 2/15/20 1:54 PM, Tom Tromey wrote:
> This removes the links from dwarf2_psymtab and

> dwarf2_per_cu_quick_data to the compunit_symtab.  Now, the DWARF code

> uses the index in these objects to find the corresponding symtab in

> the "unshared" object.

> 

> 2020-02-15  Tom Tromey  <tom@tromey.com>

> 

> 	* dwarf2/read.h (struct dwarf2_unshareable) <symtabs>: New

> 	member.

> 	(struct dwarf2_psymtab): Derive from partial_symtab.

> 	<readin_p, get_compunit_symtab>: Declare methods.

> 	* dwarf2/read.c (struct dwarf2_per_cu_quick_data)

> 	<compunit_symtab>: Remove.

> 	(dw2_do_instantiate_symtab, dw2_instantiate_symtab)

> 	(dw2_map_expand_apply, dw2_map_symtabs_matching_filename)

> 	(dw2_symtab_iter_next, dw2_print_stats)

> 	(dw2_expand_symtabs_with_fullname)

> 	(dw2_expand_symtabs_matching_one)

> 	(dw_expand_symtabs_matching_file_matcher)

> 	(dw2_find_pc_sect_compunit_symtab, dw2_map_symbol_filenames)

> 	(dw2_debug_names_iterator::next, does)

> 	(fill_in_sig_entry_from_dwo_entry, dwarf2_psymtab::read_symtab)

> 	(process_queue, dwarf2_psymtab::expand_psymtab): Update.

> 	(dwarf2_psymtab::readin_p, dwarf2_psymtab::get_compunit_symtab):

> 	New methods.

> 	(get_compunit_symtab, process_full_comp_unit)

> 	(process_full_type_unit): Update.

> 	(dwarf2_build_psymtabs): Resize the symtabs vector.

> 	(dwarf2_resize_unshareable): New function.

> 	(dwarf2_initialize_objfile): Call dwarf2_resize_unshareable.

> ---

>   gdb/ChangeLog     |  26 +++++++

>   gdb/dwarf2/read.c | 194 +++++++++++++++++++++++++++++++---------------

>   gdb/dwarf2/read.h |  14 +++-

>   3 files changed, 170 insertions(+), 64 deletions(-)

> 

> diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c

> index 281d39ad271..44fdb070e49 100644

> --- a/gdb/dwarf2/read.c

> +++ b/gdb/dwarf2/read.c

> @@ -2205,10 +2205,6 @@ struct dwarf2_per_cu_quick_data

>        NOTE: This points into dwarf2_per_objfile->quick_file_names_table.  */

>     struct quick_file_names *file_names;

>   

> -  /* The corresponding symbol table.  This is NULL if symbols for this

> -     CU have not yet been read.  */

> -  struct compunit_symtab *compunit_symtab;

> -

>     /* A temporary mark bit used when iterating over all CUs in

>        expand_symtabs_matching.  */

>     unsigned int mark : 1;

> @@ -2332,9 +2328,9 @@ dw2_do_instantiate_symtab (struct dwarf2_per_cu_data *per_cu, bool skip_partial)

>        with the dwarf queue empty.  */

>     dwarf2_queue_guard q_guard (dwarf2_per_objfile);

>   

> -  if (dwarf2_per_objfile->using_index

> -      ? per_cu->v.quick->compunit_symtab == NULL

> -      : (per_cu->v.psymtab == NULL || !per_cu->v.psymtab->readin))

> +  gdb::optional<compunit_symtab *> &symtab

> +    = dwarf2_per_objfile->unshareable->symtabs[per_cu->index];

> +  if (!symtab.has_value ())


I noticed the above sequence gets repeated a lot throughout the code. 
Can we turn it into a function/method and reduce the duplication?

There are other sequences that get repeated, but not as often.

>       {

>         queue_comp_unit (per_cu, language_minimal);

>         load_cu (per_cu, skip_partial);

> @@ -2369,7 +2365,10 @@ dw2_instantiate_symtab (struct dwarf2_per_cu_data *per_cu, bool skip_partial)

>     struct dwarf2_per_objfile *dwarf2_per_objfile = per_cu->dwarf2_per_objfile;

>   

>     gdb_assert (dwarf2_per_objfile->using_index);

> -  if (!per_cu->v.quick->compunit_symtab)

> +  gdb::optional<compunit_symtab *> &symtab

> +    = dwarf2_per_objfile->unshareable->symtabs[per_cu->index];

> +

> +  if (!symtab.has_value ())

>       {

>         free_cached_comp_units freer (dwarf2_per_objfile);

>         scoped_restore decrementer = increment_reading_symtab ();

> @@ -2377,7 +2376,7 @@ dw2_instantiate_symtab (struct dwarf2_per_cu_data *per_cu, bool skip_partial)

>         process_cu_includes (dwarf2_per_objfile);

>       }

>   

> -  return per_cu->v.quick->compunit_symtab;

> +  return *symtab;

>   }

>   

>   /* See declaration.  */

> @@ -3289,7 +3288,11 @@ dw2_map_expand_apply (struct objfile *objfile,

>     struct compunit_symtab *last_made = objfile->compunit_symtabs;

>   

>     /* Don't visit already-expanded CUs.  */

> -  if (per_cu->v.quick->compunit_symtab)

> +  struct dwarf2_per_objfile *dwarf2_per_objfile

> +    = get_dwarf2_per_objfile (objfile);

> +  gdb::optional<compunit_symtab *> &symtab

> +    = dwarf2_per_objfile->unshareable->symtabs[per_cu->index];

> +  if (symtab.has_value ())

>       return 0;

>   

>     /* This may expand more than one symtab, and we want to iterate over

> @@ -3317,7 +3320,9 @@ dw2_map_symtabs_matching_filename

>     for (dwarf2_per_cu_data *per_cu : dwarf2_per_objfile->all_comp_units)

>       {

>         /* We only need to look at symtabs not already expanded.  */

> -      if (per_cu->v.quick->compunit_symtab)

> +      gdb::optional<compunit_symtab *> &symtab

> +	= dwarf2_per_objfile->unshareable->symtabs[per_cu->index];

> +      if (symtab.has_value ())

>   	continue;

>   

>         quick_file_names *file_data = dw2_get_file_names (per_cu);

> @@ -3458,7 +3463,9 @@ dw2_symtab_iter_next (struct dw2_symtab_iterator *iter)

>         dwarf2_per_cu_data *per_cu = dwarf2_per_objfile->get_cutu (cu_index);

>   

>         /* Skip if already read in.  */

> -      if (per_cu->v.quick->compunit_symtab)

> +      gdb::optional<compunit_symtab *> &symtab

> +	= dwarf2_per_objfile->unshareable->symtabs[per_cu->index];

> +      if (symtab.has_value ())

>   	continue;

>   

>         /* Check static vs global.  */

> @@ -3573,7 +3580,9 @@ dw2_print_stats (struct objfile *objfile)

>       {

>         dwarf2_per_cu_data *per_cu = dwarf2_per_objfile->get_cutu (i);

>   

> -      if (!per_cu->v.quick->compunit_symtab)

> +      gdb::optional<compunit_symtab *> &symtab

> +	= dwarf2_per_objfile->unshareable->symtabs[per_cu->index];

> +      if (!symtab.has_value ())

>   	++count;

>       }

>     printf_filtered (_("  Number of read CUs: %d\n"), total - count);

> @@ -3656,7 +3665,9 @@ dw2_expand_symtabs_with_fullname (struct objfile *objfile,

>     for (dwarf2_per_cu_data *per_cu : dwarf2_per_objfile->all_comp_units)

>       {

>         /* We only need to look at symtabs not already expanded.  */

> -      if (per_cu->v.quick->compunit_symtab)

> +      gdb::optional<compunit_symtab *> &symtab

> +	= dwarf2_per_objfile->unshareable->symtabs[per_cu->index];

> +      if (symtab.has_value ())

>   	continue;

>   

>         quick_file_names *file_data = dw2_get_file_names (per_cu);

> @@ -4455,15 +4466,19 @@ dw2_expand_symtabs_matching_one

>   {

>     if (file_matcher == NULL || per_cu->v.quick->mark)

>       {

> -      bool symtab_was_null

> -	= (per_cu->v.quick->compunit_symtab == NULL);

> +      struct dwarf2_per_objfile *dwarf2_per_objfile

> +	= per_cu->dwarf2_per_objfile;

> +      gdb::optional<compunit_symtab *> &symtab

> +	= dwarf2_per_objfile->unshareable->symtabs[per_cu->index];

> +      bool symtab_was_null = !symtab.has_value () || *symtab == nullptr;

>   

>         dw2_instantiate_symtab (per_cu, false);

>   

>         if (expansion_notify != NULL

>   	  && symtab_was_null

> -	  && per_cu->v.quick->compunit_symtab != NULL)

> -	expansion_notify (per_cu->v.quick->compunit_symtab);

> +	  && symtab.has_value ()

> +	  && *symtab != nullptr)

> +	expansion_notify (*symtab);

>       }

>   }

>   

> @@ -4583,7 +4598,9 @@ dw_expand_symtabs_matching_file_matcher

>         per_cu->v.quick->mark = 0;

>   

>         /* We only need to look at symtabs not already expanded.  */

> -      if (per_cu->v.quick->compunit_symtab)

> +      gdb::optional<compunit_symtab *> &symtab

> +	= dwarf2_per_objfile->unshareable->symtabs[per_cu->index];

> +      if (symtab.has_value ())

>   	continue;

>   

>         quick_file_names *file_data = dw2_get_file_names (per_cu);

> @@ -4708,7 +4725,11 @@ dw2_find_pc_sect_compunit_symtab (struct objfile *objfile,

>     if (!data)

>       return NULL;

>   

> -  if (warn_if_readin && data->v.quick->compunit_symtab)

> +  struct dwarf2_per_objfile *dwarf2_per_objfile

> +    = get_dwarf2_per_objfile (objfile);

> +  gdb::optional<compunit_symtab *> &symtab

> +    = dwarf2_per_objfile->unshareable->symtabs[data->index];

> +  if (warn_if_readin && symtab.has_value ())

>       warning (_("(Internal error: pc %s in read in CU, but not in symtab.)"),

>   	     paddress (get_objfile_arch (objfile), pc));

>   

> @@ -4741,7 +4762,9 @@ dw2_map_symbol_filenames (struct objfile *objfile, symbol_filename_ftype *fun,

>   

>         for (dwarf2_per_cu_data *per_cu : dwarf2_per_objfile->all_comp_units)

>   	{

> -	  if (per_cu->v.quick->compunit_symtab)

> +	  gdb::optional<compunit_symtab *> &symtab

> +	    = dwarf2_per_objfile->unshareable->symtabs[per_cu->index];

> +	  if (symtab.has_value ())

>   	    {

>   	      void **slot = htab_find_slot (visited.get (),

>   					    per_cu->v.quick->file_names,

> @@ -4754,7 +4777,9 @@ dw2_map_symbol_filenames (struct objfile *objfile, symbol_filename_ftype *fun,

>         for (dwarf2_per_cu_data *per_cu : dwarf2_per_objfile->all_comp_units)

>   	{

>   	  /* We only need to look at symtabs not already expanded.  */

> -	  if (per_cu->v.quick->compunit_symtab)

> +	  gdb::optional<compunit_symtab *> &symtab

> +	    = dwarf2_per_objfile->unshareable->symtabs[per_cu->index];

> +	  if (symtab.has_value ())

>   	    continue;

>   

>   	  quick_file_names *file_data = dw2_get_file_names (per_cu);

> @@ -5386,7 +5411,9 @@ dw2_debug_names_iterator::next ()

>       }

>   

>     /* Skip if already read in.  */

> -  if (per_cu->v.quick->compunit_symtab)

> +  gdb::optional<compunit_symtab *> &symtab

> +    = dwarf2_per_objfile->unshareable->symtabs[per_cu->index];

> +  if (symtab.has_value ())

>       goto again;

>   

>     /* Check static vs global.  */

> @@ -5627,11 +5654,12 @@ dw2_debug_names_map_matching_symbols

>        the psymtab code does.  */

>     for (dwarf2_per_cu_data *per_cu : dwarf2_per_objfile->all_comp_units)

>       {

> -      struct compunit_symtab *cust = per_cu->v.quick->compunit_symtab;

> -      if (cust != nullptr)

> +      gdb::optional<compunit_symtab *> &symtab

> +	= dwarf2_per_objfile->unshareable->symtabs[per_cu->index];

> +      if (symtab.has_value () && *symtab != nullptr)

>   	{

>   	  const struct block *block

> -	    = BLOCKVECTOR_BLOCK (COMPUNIT_BLOCKVECTOR (cust), block_kind);

> +	    = BLOCKVECTOR_BLOCK (COMPUNIT_BLOCKVECTOR (*symtab), block_kind);

>   	  if (!iterate_over_symbols_terminated (block, name,

>   						domain, callback))

>   	    break;

> @@ -5748,6 +5776,15 @@ get_gdb_index_contents_from_cache_dwz (objfile *obj, dwz_file *dwz)

>     return global_index_cache.lookup_gdb_index (build_id, &dwz->index_cache_res);

>   }

>   

> +/* Make sure we have space for the compunit_symtabs we may need.  */

> +

> +static void

> +dwarf2_resize_unshareable (dwarf2_per_objfile *dwarf2_per_objfile)

> +{

> +  dwarf2_per_objfile->unshareable->symtabs.resize

> +    (dwarf2_per_objfile->num_psymtabs);

> +}

> +

>   /* See symfile.h.  */

>   

>   bool

> @@ -5768,6 +5805,7 @@ dwarf2_initialize_objfile (struct objfile *objfile, dw_index_kind *index_kind)

>         dwarf2_per_objfile->quick_file_names_table

>   	= create_quick_file_names_table

>   	    (dwarf2_per_objfile->all_comp_units.size ());

> +      dwarf2_resize_unshareable (dwarf2_per_objfile);

>   

>         for (int i = 0; i < (dwarf2_per_objfile->all_comp_units.size ()

>   			   + dwarf2_per_objfile->all_type_units.size ()); ++i)

> @@ -5788,6 +5826,7 @@ dwarf2_initialize_objfile (struct objfile *objfile, dw_index_kind *index_kind)

>     if (dwarf2_read_debug_names (dwarf2_per_objfile))

>       {

>         *index_kind = dw_index_kind::DEBUG_NAMES;

> +      dwarf2_resize_unshareable (dwarf2_per_objfile);

>         return true;

>       }

>   

> @@ -5796,6 +5835,7 @@ dwarf2_initialize_objfile (struct objfile *objfile, dw_index_kind *index_kind)

>   			     get_gdb_index_contents_from_section<dwz_file>))

>       {

>         *index_kind = dw_index_kind::GDB_INDEX;

> +      dwarf2_resize_unshareable (dwarf2_per_objfile);

>         return true;

>       }

>   

> @@ -5806,6 +5846,7 @@ dwarf2_initialize_objfile (struct objfile *objfile, dw_index_kind *index_kind)

>       {

>         global_index_cache.hit ();

>         *index_kind = dw_index_kind::GDB_INDEX;

> +      dwarf2_resize_unshareable (dwarf2_per_objfile);

>         return true;

>       }

>   

> @@ -5834,6 +5875,8 @@ dwarf2_build_psymtabs (struct objfile *objfile)

>         dwarf2_build_psymtabs_hard (dwarf2_per_objfile);

>         psymtabs.keep ();

>   

> +      dwarf2_resize_unshareable (dwarf2_per_objfile);

> +

>         /* (maybe) store an index in the cache.  */

>         global_index_cache.store (dwarf2_per_objfile);

>       }

> @@ -6259,7 +6302,7 @@ fill_in_sig_entry_from_dwo_entry (struct dwarf2_per_objfile *dwarf2_per_objfile,

>     if (dwarf2_per_objfile->using_index)

>       {

>         gdb_assert (sig_entry->per_cu.v.quick != NULL);

> -      gdb_assert (sig_entry->per_cu.v.quick->compunit_symtab == NULL);

> +      gdb_assert (!dwarf2_per_objfile->unshareable->symtabs[sig_entry->per_cu.index].has_value ());

>       }

>     else

>         gdb_assert (sig_entry->per_cu.v.psymtab == NULL);

> @@ -8700,7 +8743,10 @@ dwarf2_psymtab::read_symtab (struct objfile *objfile)

>     struct dwarf2_per_objfile *dwarf2_per_objfile

>       = get_dwarf2_per_objfile (objfile);

>   

> -  gdb_assert (!readin);

> +  gdb::optional<compunit_symtab *> &symtab

> +    = dwarf2_per_objfile->unshareable->symtabs[per_cu_data->index];

> +  gdb_assert (!symtab.has_value ());

> +

>     /* If this psymtab is constructed from a debug-only objfile, the

>        has_section_at_zero flag will not necessarily be correct.  We

>        can get the correct value for this flag by looking at the data

> @@ -8796,9 +8842,9 @@ process_queue (struct dwarf2_per_objfile *dwarf2_per_objfile)

>       {

>         dwarf2_queue_item &item = dwarf2_per_objfile->queue.front ();

>   

> -      if ((dwarf2_per_objfile->using_index

> -	   ? !item.per_cu->v.quick->compunit_symtab

> -	   : (item.per_cu->v.psymtab && !item.per_cu->v.psymtab->readin))

> +      gdb::optional<compunit_symtab *> &symtab

> +	= dwarf2_per_objfile->unshareable->symtabs[item.per_cu->index];

> +      if (!symtab.has_value ()

>   	  /* Skip dummy CUs.  */

>   	  && item.per_cu->cu != NULL)

>   	{

> @@ -8853,24 +8899,57 @@ process_queue (struct dwarf2_per_objfile *dwarf2_per_objfile)

>   void

>   dwarf2_psymtab::expand_psymtab (struct objfile *objfile)

>   {

> -  struct dwarf2_per_cu_data *per_cu;

> -

> -  if (readin)

> -    return;

> -

> -  read_dependencies (objfile);

> -

> -  per_cu = per_cu_data;

> +  struct dwarf2_per_objfile *dwarf2_per_objfile

> +    = get_dwarf2_per_objfile (objfile);

>   

> -  if (per_cu == NULL)

> +  if (per_cu_data == NULL)

>       {

>         /* It's an include file, no symbols to read for it.

>            Everything is in the parent symtab.  */

> -      readin = true;

>         return;

>       }

>   

> -  dw2_do_instantiate_symtab (per_cu, false);

> +  gdb::optional<compunit_symtab *> &symtab

> +    = dwarf2_per_objfile->unshareable->symtabs[per_cu_data->index];

> +

> +  if (symtab.has_value ())

> +    return;

> +

> +  read_dependencies (objfile);

> +

> +  dw2_do_instantiate_symtab (per_cu_data, false);

> +}

> +

> +/* See psympriv.h.  */

> +

> +bool

> +dwarf2_psymtab::readin_p (struct objfile *objfile) const

> +{

> +  if (per_cu_data == nullptr)

> +    return true;

> +

> +  dwarf2_per_objfile *dwarf2_per_objfile

> +    = get_dwarf2_per_objfile (objfile);

> +  gdb::optional<compunit_symtab *> &symtab

> +    = dwarf2_per_objfile->unshareable->symtabs[per_cu_data->index];

> +  return symtab.has_value ();

> +}

> +

> +/* See psympriv.h.  */

> +

> +compunit_symtab *

> +dwarf2_psymtab::get_compunit_symtab (struct objfile *objfile) const

> +{

> +  if (per_cu_data == nullptr)

> +    return nullptr;

> +

> +  dwarf2_per_objfile *dwarf2_per_objfile

> +    = get_dwarf2_per_objfile (objfile);

> +  gdb::optional<compunit_symtab *> &symtab

> +    = dwarf2_per_objfile->unshareable->symtabs[per_cu_data->index];

> +  if (!symtab.has_value ())

> +    return nullptr;

> +  return *symtab;

>   }

>   

>   /* Trivial hash function for die_info: the hash value of a DIE

> @@ -9413,9 +9492,12 @@ rust_union_quirks (struct dwarf2_cu *cu)

>   static struct compunit_symtab *

>   get_compunit_symtab (struct dwarf2_per_cu_data *per_cu)

>   {

> -  return (per_cu->dwarf2_per_objfile->using_index

> -	  ? per_cu->v.quick->compunit_symtab

> -	  : per_cu->v.psymtab->compunit_symtab);

> +  struct dwarf2_per_objfile *dwarf2_per_objfile

> +    = per_cu->dwarf2_per_objfile;

> +  gdb::optional<compunit_symtab *> &symtab

> +    = dwarf2_per_objfile->unshareable->symtabs[per_cu->index];

> +  gdb_assert (symtab.has_value ());

> +  return *symtab;

>   }

>   

>   /* A helper function for computing the list of all symbol tables

> @@ -9621,14 +9703,9 @@ process_full_comp_unit (struct dwarf2_per_cu_data *per_cu,

>         cust->call_site_htab = cu->call_site_htab;

>       }

>   

> -  if (dwarf2_per_objfile->using_index)

> -    per_cu->v.quick->compunit_symtab = cust;

> -  else

> -    {

> -      dwarf2_psymtab *pst = per_cu->v.psymtab;

> -      pst->compunit_symtab = cust;

> -      pst->readin = true;

> -    }

> +  gdb::optional<compunit_symtab *> &symtab

> +    = dwarf2_per_objfile->unshareable->symtabs[per_cu->index];

> +  symtab = cust;

>   

>     /* Push it for inclusion processing later.  */

>     dwarf2_per_objfile->just_read_cus.push_back (per_cu);

> @@ -9701,14 +9778,9 @@ process_full_type_unit (struct dwarf2_per_cu_data *per_cu,

>         cust = sig_type->type_unit_group->compunit_symtab;

>       }

>   

> -  if (dwarf2_per_objfile->using_index)

> -    per_cu->v.quick->compunit_symtab = cust;

> -  else

> -    {

> -      dwarf2_psymtab *pst = per_cu->v.psymtab;

> -      pst->compunit_symtab = cust;

> -      pst->readin = true;

> -    }

> +  gdb::optional<compunit_symtab *> &symtab

> +    = dwarf2_per_objfile->unshareable->symtabs[per_cu->index];

> +  symtab = cust;

>   

>     /* Not needed any more.  */

>     cu->reset_builder ();

> diff --git a/gdb/dwarf2/read.h b/gdb/dwarf2/read.h

> index 5fc7f7f72e5..98d58fb6880 100644

> --- a/gdb/dwarf2/read.h

> +++ b/gdb/dwarf2/read.h

> @@ -82,6 +82,10 @@ struct dwarf2_unshareable

>        This is NULL if not allocated yet.

>        The mapping is done via (CU/TU + DIE offset) -> type.  */

>     htab_up die_type_hash;

> +

> +  /* Hold the corresponding compunit_symtab for each CU or TU.  This

> +     is indexed by dwarf2_per_cu_data::index.  */

> +  std::vector<gdb::optional<compunit_symtab *>> symtabs;

>   };

>   

>   /* Collection of data recorded per objfile.

> @@ -281,22 +285,26 @@ public:

>   dwarf2_per_objfile *get_dwarf2_per_objfile (struct objfile *objfile);

>   

>   /* A partial symtab specialized for DWARF.  */

> -struct dwarf2_psymtab : public standard_psymtab

> +struct dwarf2_psymtab : public partial_symtab

>   {

>     dwarf2_psymtab (const char *filename, struct objfile *objfile)

> -    : standard_psymtab (filename, objfile)

> +    : partial_symtab (filename, objfile)

>     {

>     }

>   

>     dwarf2_psymtab (const char *filename, struct objfile *objfile,

>   		  CORE_ADDR addr)

> -    : standard_psymtab (filename, objfile, addr)

> +    : partial_symtab (filename, objfile, addr)

>     {

>     }

>   

>     void read_symtab (struct objfile *) override;

>     void expand_psymtab (struct objfile *) override;

>   

> +  bool readin_p (struct objfile *) const override;

> +  struct compunit_symtab *get_compunit_symtab (struct objfile *) const

> +    override;

> +

>     struct dwarf2_per_cu_data *per_cu_data;

>   };

>   

>
Simon Marchi Feb. 19, 2020, 4:47 a.m. | #2
>> @@ -2332,9 +2328,9 @@ dw2_do_instantiate_symtab (struct dwarf2_per_cu_data *per_cu, bool skip_partial)

>>        with the dwarf queue empty.  */

>>     dwarf2_queue_guard q_guard (dwarf2_per_objfile);

>>   

>> -  if (dwarf2_per_objfile->using_index

>> -      ? per_cu->v.quick->compunit_symtab == NULL

>> -      : (per_cu->v.psymtab == NULL || !per_cu->v.psymtab->readin))

>> +  gdb::optional<compunit_symtab *> &symtab

>> +    = dwarf2_per_objfile->unshareable->symtabs[per_cu->index];

>> +  if (!symtab.has_value ())

> 

> I noticed the above sequence gets repeated a lot throughout the code. 

> Can we turn it into a function/method and reduce the duplication?


I was going to say the same thing, a getter on dwarf2_unshareable would be nice.  Since this
is a new data type, we might as well design it right from the start.

>> @@ -82,6 +82,10 @@ struct dwarf2_unshareable

>>        This is NULL if not allocated yet.

>>        The mapping is done via (CU/TU + DIE offset) -> type.  */

>>     htab_up die_type_hash;

>> +

>> +  /* Hold the corresponding compunit_symtab for each CU or TU.  This

>> +     is indexed by dwarf2_per_cu_data::index.  */

>> +  std::vector<gdb::optional<compunit_symtab *>> symtabs;


Having pointers in an optional gives us three states:

1- not instantiated
2- instantiated but NULL
3- instantiated and not NULL

Do we actually need the distinction between 1 and 2 here?  If not, I think the optional
doesn't bring much and just makes the code more complicated.

Simon
Tom Tromey Feb. 22, 2020, 12:36 a.m. | #3
>>>>> "Luis" == Luis Machado <luis.machado@linaro.org> writes:


Luis> I noticed the above sequence gets repeated a lot throughout the
Luis> code. Can we turn it into a function/method and reduce the
Luis> duplication?

I did this.

Tom
Tom Tromey Feb. 22, 2020, 12:38 a.m. | #4
>>>>> "Simon" == Simon Marchi <simark@simark.ca> writes:


Simon> I was going to say the same thing, a getter on dwarf2_unshareable
Simon> would be nice.  Since this is a new data type, we might as well
Simon> design it right from the start.

I ended up with a method on dwarf2_per_objfile.

>>> +  std::vector<gdb::optional<compunit_symtab *>> symtabs;


Simon> Having pointers in an optional gives us three states:

Simon> 1- not instantiated
Simon> 2- instantiated but NULL
Simon> 3- instantiated and not NULL

Simon> Do we actually need the distinction between 1 and 2 here?  If not, I think the optional
Simon> doesn't bring much and just makes the code more complicated.

Yes, it's weird; but I did this to preserve the status quo.
It's possible that this is not needed but figuring that out seemed like
a separate effort.

It's possible that this can only happen for include psymtabs.
I plan to make a separate subclass for these, which would clarify this
somewhat.  But I'd rather get this series in first.

Tom

Patch

diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
index 281d39ad271..44fdb070e49 100644
--- a/gdb/dwarf2/read.c
+++ b/gdb/dwarf2/read.c
@@ -2205,10 +2205,6 @@  struct dwarf2_per_cu_quick_data
      NOTE: This points into dwarf2_per_objfile->quick_file_names_table.  */
   struct quick_file_names *file_names;
 
-  /* The corresponding symbol table.  This is NULL if symbols for this
-     CU have not yet been read.  */
-  struct compunit_symtab *compunit_symtab;
-
   /* A temporary mark bit used when iterating over all CUs in
      expand_symtabs_matching.  */
   unsigned int mark : 1;
@@ -2332,9 +2328,9 @@  dw2_do_instantiate_symtab (struct dwarf2_per_cu_data *per_cu, bool skip_partial)
      with the dwarf queue empty.  */
   dwarf2_queue_guard q_guard (dwarf2_per_objfile);
 
-  if (dwarf2_per_objfile->using_index
-      ? per_cu->v.quick->compunit_symtab == NULL
-      : (per_cu->v.psymtab == NULL || !per_cu->v.psymtab->readin))
+  gdb::optional<compunit_symtab *> &symtab
+    = dwarf2_per_objfile->unshareable->symtabs[per_cu->index];
+  if (!symtab.has_value ())
     {
       queue_comp_unit (per_cu, language_minimal);
       load_cu (per_cu, skip_partial);
@@ -2369,7 +2365,10 @@  dw2_instantiate_symtab (struct dwarf2_per_cu_data *per_cu, bool skip_partial)
   struct dwarf2_per_objfile *dwarf2_per_objfile = per_cu->dwarf2_per_objfile;
 
   gdb_assert (dwarf2_per_objfile->using_index);
-  if (!per_cu->v.quick->compunit_symtab)
+  gdb::optional<compunit_symtab *> &symtab
+    = dwarf2_per_objfile->unshareable->symtabs[per_cu->index];
+
+  if (!symtab.has_value ())
     {
       free_cached_comp_units freer (dwarf2_per_objfile);
       scoped_restore decrementer = increment_reading_symtab ();
@@ -2377,7 +2376,7 @@  dw2_instantiate_symtab (struct dwarf2_per_cu_data *per_cu, bool skip_partial)
       process_cu_includes (dwarf2_per_objfile);
     }
 
-  return per_cu->v.quick->compunit_symtab;
+  return *symtab;
 }
 
 /* See declaration.  */
@@ -3289,7 +3288,11 @@  dw2_map_expand_apply (struct objfile *objfile,
   struct compunit_symtab *last_made = objfile->compunit_symtabs;
 
   /* Don't visit already-expanded CUs.  */
-  if (per_cu->v.quick->compunit_symtab)
+  struct dwarf2_per_objfile *dwarf2_per_objfile
+    = get_dwarf2_per_objfile (objfile);
+  gdb::optional<compunit_symtab *> &symtab
+    = dwarf2_per_objfile->unshareable->symtabs[per_cu->index];
+  if (symtab.has_value ())
     return 0;
 
   /* This may expand more than one symtab, and we want to iterate over
@@ -3317,7 +3320,9 @@  dw2_map_symtabs_matching_filename
   for (dwarf2_per_cu_data *per_cu : dwarf2_per_objfile->all_comp_units)
     {
       /* We only need to look at symtabs not already expanded.  */
-      if (per_cu->v.quick->compunit_symtab)
+      gdb::optional<compunit_symtab *> &symtab
+	= dwarf2_per_objfile->unshareable->symtabs[per_cu->index];
+      if (symtab.has_value ())
 	continue;
 
       quick_file_names *file_data = dw2_get_file_names (per_cu);
@@ -3458,7 +3463,9 @@  dw2_symtab_iter_next (struct dw2_symtab_iterator *iter)
       dwarf2_per_cu_data *per_cu = dwarf2_per_objfile->get_cutu (cu_index);
 
       /* Skip if already read in.  */
-      if (per_cu->v.quick->compunit_symtab)
+      gdb::optional<compunit_symtab *> &symtab
+	= dwarf2_per_objfile->unshareable->symtabs[per_cu->index];
+      if (symtab.has_value ())
 	continue;
 
       /* Check static vs global.  */
@@ -3573,7 +3580,9 @@  dw2_print_stats (struct objfile *objfile)
     {
       dwarf2_per_cu_data *per_cu = dwarf2_per_objfile->get_cutu (i);
 
-      if (!per_cu->v.quick->compunit_symtab)
+      gdb::optional<compunit_symtab *> &symtab
+	= dwarf2_per_objfile->unshareable->symtabs[per_cu->index];
+      if (!symtab.has_value ())
 	++count;
     }
   printf_filtered (_("  Number of read CUs: %d\n"), total - count);
@@ -3656,7 +3665,9 @@  dw2_expand_symtabs_with_fullname (struct objfile *objfile,
   for (dwarf2_per_cu_data *per_cu : dwarf2_per_objfile->all_comp_units)
     {
       /* We only need to look at symtabs not already expanded.  */
-      if (per_cu->v.quick->compunit_symtab)
+      gdb::optional<compunit_symtab *> &symtab
+	= dwarf2_per_objfile->unshareable->symtabs[per_cu->index];
+      if (symtab.has_value ())
 	continue;
 
       quick_file_names *file_data = dw2_get_file_names (per_cu);
@@ -4455,15 +4466,19 @@  dw2_expand_symtabs_matching_one
 {
   if (file_matcher == NULL || per_cu->v.quick->mark)
     {
-      bool symtab_was_null
-	= (per_cu->v.quick->compunit_symtab == NULL);
+      struct dwarf2_per_objfile *dwarf2_per_objfile
+	= per_cu->dwarf2_per_objfile;
+      gdb::optional<compunit_symtab *> &symtab
+	= dwarf2_per_objfile->unshareable->symtabs[per_cu->index];
+      bool symtab_was_null = !symtab.has_value () || *symtab == nullptr;
 
       dw2_instantiate_symtab (per_cu, false);
 
       if (expansion_notify != NULL
 	  && symtab_was_null
-	  && per_cu->v.quick->compunit_symtab != NULL)
-	expansion_notify (per_cu->v.quick->compunit_symtab);
+	  && symtab.has_value ()
+	  && *symtab != nullptr)
+	expansion_notify (*symtab);
     }
 }
 
@@ -4583,7 +4598,9 @@  dw_expand_symtabs_matching_file_matcher
       per_cu->v.quick->mark = 0;
 
       /* We only need to look at symtabs not already expanded.  */
-      if (per_cu->v.quick->compunit_symtab)
+      gdb::optional<compunit_symtab *> &symtab
+	= dwarf2_per_objfile->unshareable->symtabs[per_cu->index];
+      if (symtab.has_value ())
 	continue;
 
       quick_file_names *file_data = dw2_get_file_names (per_cu);
@@ -4708,7 +4725,11 @@  dw2_find_pc_sect_compunit_symtab (struct objfile *objfile,
   if (!data)
     return NULL;
 
-  if (warn_if_readin && data->v.quick->compunit_symtab)
+  struct dwarf2_per_objfile *dwarf2_per_objfile
+    = get_dwarf2_per_objfile (objfile);
+  gdb::optional<compunit_symtab *> &symtab
+    = dwarf2_per_objfile->unshareable->symtabs[data->index];
+  if (warn_if_readin && symtab.has_value ())
     warning (_("(Internal error: pc %s in read in CU, but not in symtab.)"),
 	     paddress (get_objfile_arch (objfile), pc));
 
@@ -4741,7 +4762,9 @@  dw2_map_symbol_filenames (struct objfile *objfile, symbol_filename_ftype *fun,
 
       for (dwarf2_per_cu_data *per_cu : dwarf2_per_objfile->all_comp_units)
 	{
-	  if (per_cu->v.quick->compunit_symtab)
+	  gdb::optional<compunit_symtab *> &symtab
+	    = dwarf2_per_objfile->unshareable->symtabs[per_cu->index];
+	  if (symtab.has_value ())
 	    {
 	      void **slot = htab_find_slot (visited.get (),
 					    per_cu->v.quick->file_names,
@@ -4754,7 +4777,9 @@  dw2_map_symbol_filenames (struct objfile *objfile, symbol_filename_ftype *fun,
       for (dwarf2_per_cu_data *per_cu : dwarf2_per_objfile->all_comp_units)
 	{
 	  /* We only need to look at symtabs not already expanded.  */
-	  if (per_cu->v.quick->compunit_symtab)
+	  gdb::optional<compunit_symtab *> &symtab
+	    = dwarf2_per_objfile->unshareable->symtabs[per_cu->index];
+	  if (symtab.has_value ())
 	    continue;
 
 	  quick_file_names *file_data = dw2_get_file_names (per_cu);
@@ -5386,7 +5411,9 @@  dw2_debug_names_iterator::next ()
     }
 
   /* Skip if already read in.  */
-  if (per_cu->v.quick->compunit_symtab)
+  gdb::optional<compunit_symtab *> &symtab
+    = dwarf2_per_objfile->unshareable->symtabs[per_cu->index];
+  if (symtab.has_value ())
     goto again;
 
   /* Check static vs global.  */
@@ -5627,11 +5654,12 @@  dw2_debug_names_map_matching_symbols
      the psymtab code does.  */
   for (dwarf2_per_cu_data *per_cu : dwarf2_per_objfile->all_comp_units)
     {
-      struct compunit_symtab *cust = per_cu->v.quick->compunit_symtab;
-      if (cust != nullptr)
+      gdb::optional<compunit_symtab *> &symtab
+	= dwarf2_per_objfile->unshareable->symtabs[per_cu->index];
+      if (symtab.has_value () && *symtab != nullptr)
 	{
 	  const struct block *block
-	    = BLOCKVECTOR_BLOCK (COMPUNIT_BLOCKVECTOR (cust), block_kind);
+	    = BLOCKVECTOR_BLOCK (COMPUNIT_BLOCKVECTOR (*symtab), block_kind);
 	  if (!iterate_over_symbols_terminated (block, name,
 						domain, callback))
 	    break;
@@ -5748,6 +5776,15 @@  get_gdb_index_contents_from_cache_dwz (objfile *obj, dwz_file *dwz)
   return global_index_cache.lookup_gdb_index (build_id, &dwz->index_cache_res);
 }
 
+/* Make sure we have space for the compunit_symtabs we may need.  */
+
+static void
+dwarf2_resize_unshareable (dwarf2_per_objfile *dwarf2_per_objfile)
+{
+  dwarf2_per_objfile->unshareable->symtabs.resize
+    (dwarf2_per_objfile->num_psymtabs);
+}
+
 /* See symfile.h.  */
 
 bool
@@ -5768,6 +5805,7 @@  dwarf2_initialize_objfile (struct objfile *objfile, dw_index_kind *index_kind)
       dwarf2_per_objfile->quick_file_names_table
 	= create_quick_file_names_table
 	    (dwarf2_per_objfile->all_comp_units.size ());
+      dwarf2_resize_unshareable (dwarf2_per_objfile);
 
       for (int i = 0; i < (dwarf2_per_objfile->all_comp_units.size ()
 			   + dwarf2_per_objfile->all_type_units.size ()); ++i)
@@ -5788,6 +5826,7 @@  dwarf2_initialize_objfile (struct objfile *objfile, dw_index_kind *index_kind)
   if (dwarf2_read_debug_names (dwarf2_per_objfile))
     {
       *index_kind = dw_index_kind::DEBUG_NAMES;
+      dwarf2_resize_unshareable (dwarf2_per_objfile);
       return true;
     }
 
@@ -5796,6 +5835,7 @@  dwarf2_initialize_objfile (struct objfile *objfile, dw_index_kind *index_kind)
 			     get_gdb_index_contents_from_section<dwz_file>))
     {
       *index_kind = dw_index_kind::GDB_INDEX;
+      dwarf2_resize_unshareable (dwarf2_per_objfile);
       return true;
     }
 
@@ -5806,6 +5846,7 @@  dwarf2_initialize_objfile (struct objfile *objfile, dw_index_kind *index_kind)
     {
       global_index_cache.hit ();
       *index_kind = dw_index_kind::GDB_INDEX;
+      dwarf2_resize_unshareable (dwarf2_per_objfile);
       return true;
     }
 
@@ -5834,6 +5875,8 @@  dwarf2_build_psymtabs (struct objfile *objfile)
       dwarf2_build_psymtabs_hard (dwarf2_per_objfile);
       psymtabs.keep ();
 
+      dwarf2_resize_unshareable (dwarf2_per_objfile);
+
       /* (maybe) store an index in the cache.  */
       global_index_cache.store (dwarf2_per_objfile);
     }
@@ -6259,7 +6302,7 @@  fill_in_sig_entry_from_dwo_entry (struct dwarf2_per_objfile *dwarf2_per_objfile,
   if (dwarf2_per_objfile->using_index)
     {
       gdb_assert (sig_entry->per_cu.v.quick != NULL);
-      gdb_assert (sig_entry->per_cu.v.quick->compunit_symtab == NULL);
+      gdb_assert (!dwarf2_per_objfile->unshareable->symtabs[sig_entry->per_cu.index].has_value ());
     }
   else
       gdb_assert (sig_entry->per_cu.v.psymtab == NULL);
@@ -8700,7 +8743,10 @@  dwarf2_psymtab::read_symtab (struct objfile *objfile)
   struct dwarf2_per_objfile *dwarf2_per_objfile
     = get_dwarf2_per_objfile (objfile);
 
-  gdb_assert (!readin);
+  gdb::optional<compunit_symtab *> &symtab
+    = dwarf2_per_objfile->unshareable->symtabs[per_cu_data->index];
+  gdb_assert (!symtab.has_value ());
+
   /* If this psymtab is constructed from a debug-only objfile, the
      has_section_at_zero flag will not necessarily be correct.  We
      can get the correct value for this flag by looking at the data
@@ -8796,9 +8842,9 @@  process_queue (struct dwarf2_per_objfile *dwarf2_per_objfile)
     {
       dwarf2_queue_item &item = dwarf2_per_objfile->queue.front ();
 
-      if ((dwarf2_per_objfile->using_index
-	   ? !item.per_cu->v.quick->compunit_symtab
-	   : (item.per_cu->v.psymtab && !item.per_cu->v.psymtab->readin))
+      gdb::optional<compunit_symtab *> &symtab
+	= dwarf2_per_objfile->unshareable->symtabs[item.per_cu->index];
+      if (!symtab.has_value ()
 	  /* Skip dummy CUs.  */
 	  && item.per_cu->cu != NULL)
 	{
@@ -8853,24 +8899,57 @@  process_queue (struct dwarf2_per_objfile *dwarf2_per_objfile)
 void
 dwarf2_psymtab::expand_psymtab (struct objfile *objfile)
 {
-  struct dwarf2_per_cu_data *per_cu;
-
-  if (readin)
-    return;
-
-  read_dependencies (objfile);
-
-  per_cu = per_cu_data;
+  struct dwarf2_per_objfile *dwarf2_per_objfile
+    = get_dwarf2_per_objfile (objfile);
 
-  if (per_cu == NULL)
+  if (per_cu_data == NULL)
     {
       /* It's an include file, no symbols to read for it.
          Everything is in the parent symtab.  */
-      readin = true;
       return;
     }
 
-  dw2_do_instantiate_symtab (per_cu, false);
+  gdb::optional<compunit_symtab *> &symtab
+    = dwarf2_per_objfile->unshareable->symtabs[per_cu_data->index];
+
+  if (symtab.has_value ())
+    return;
+
+  read_dependencies (objfile);
+
+  dw2_do_instantiate_symtab (per_cu_data, false);
+}
+
+/* See psympriv.h.  */
+
+bool
+dwarf2_psymtab::readin_p (struct objfile *objfile) const
+{
+  if (per_cu_data == nullptr)
+    return true;
+
+  dwarf2_per_objfile *dwarf2_per_objfile
+    = get_dwarf2_per_objfile (objfile);
+  gdb::optional<compunit_symtab *> &symtab
+    = dwarf2_per_objfile->unshareable->symtabs[per_cu_data->index];
+  return symtab.has_value ();
+}
+
+/* See psympriv.h.  */
+
+compunit_symtab *
+dwarf2_psymtab::get_compunit_symtab (struct objfile *objfile) const
+{
+  if (per_cu_data == nullptr)
+    return nullptr;
+
+  dwarf2_per_objfile *dwarf2_per_objfile
+    = get_dwarf2_per_objfile (objfile);
+  gdb::optional<compunit_symtab *> &symtab
+    = dwarf2_per_objfile->unshareable->symtabs[per_cu_data->index];
+  if (!symtab.has_value ())
+    return nullptr;
+  return *symtab;
 }
 
 /* Trivial hash function for die_info: the hash value of a DIE
@@ -9413,9 +9492,12 @@  rust_union_quirks (struct dwarf2_cu *cu)
 static struct compunit_symtab *
 get_compunit_symtab (struct dwarf2_per_cu_data *per_cu)
 {
-  return (per_cu->dwarf2_per_objfile->using_index
-	  ? per_cu->v.quick->compunit_symtab
-	  : per_cu->v.psymtab->compunit_symtab);
+  struct dwarf2_per_objfile *dwarf2_per_objfile
+    = per_cu->dwarf2_per_objfile;
+  gdb::optional<compunit_symtab *> &symtab
+    = dwarf2_per_objfile->unshareable->symtabs[per_cu->index];
+  gdb_assert (symtab.has_value ());
+  return *symtab;
 }
 
 /* A helper function for computing the list of all symbol tables
@@ -9621,14 +9703,9 @@  process_full_comp_unit (struct dwarf2_per_cu_data *per_cu,
       cust->call_site_htab = cu->call_site_htab;
     }
 
-  if (dwarf2_per_objfile->using_index)
-    per_cu->v.quick->compunit_symtab = cust;
-  else
-    {
-      dwarf2_psymtab *pst = per_cu->v.psymtab;
-      pst->compunit_symtab = cust;
-      pst->readin = true;
-    }
+  gdb::optional<compunit_symtab *> &symtab
+    = dwarf2_per_objfile->unshareable->symtabs[per_cu->index];
+  symtab = cust;
 
   /* Push it for inclusion processing later.  */
   dwarf2_per_objfile->just_read_cus.push_back (per_cu);
@@ -9701,14 +9778,9 @@  process_full_type_unit (struct dwarf2_per_cu_data *per_cu,
       cust = sig_type->type_unit_group->compunit_symtab;
     }
 
-  if (dwarf2_per_objfile->using_index)
-    per_cu->v.quick->compunit_symtab = cust;
-  else
-    {
-      dwarf2_psymtab *pst = per_cu->v.psymtab;
-      pst->compunit_symtab = cust;
-      pst->readin = true;
-    }
+  gdb::optional<compunit_symtab *> &symtab
+    = dwarf2_per_objfile->unshareable->symtabs[per_cu->index];
+  symtab = cust;
 
   /* Not needed any more.  */
   cu->reset_builder ();
diff --git a/gdb/dwarf2/read.h b/gdb/dwarf2/read.h
index 5fc7f7f72e5..98d58fb6880 100644
--- a/gdb/dwarf2/read.h
+++ b/gdb/dwarf2/read.h
@@ -82,6 +82,10 @@  struct dwarf2_unshareable
      This is NULL if not allocated yet.
      The mapping is done via (CU/TU + DIE offset) -> type.  */
   htab_up die_type_hash;
+
+  /* Hold the corresponding compunit_symtab for each CU or TU.  This
+     is indexed by dwarf2_per_cu_data::index.  */
+  std::vector<gdb::optional<compunit_symtab *>> symtabs;
 };
 
 /* Collection of data recorded per objfile.
@@ -281,22 +285,26 @@  public:
 dwarf2_per_objfile *get_dwarf2_per_objfile (struct objfile *objfile);
 
 /* A partial symtab specialized for DWARF.  */
-struct dwarf2_psymtab : public standard_psymtab
+struct dwarf2_psymtab : public partial_symtab
 {
   dwarf2_psymtab (const char *filename, struct objfile *objfile)
-    : standard_psymtab (filename, objfile)
+    : partial_symtab (filename, objfile)
   {
   }
 
   dwarf2_psymtab (const char *filename, struct objfile *objfile,
 		  CORE_ADDR addr)
-    : standard_psymtab (filename, objfile, addr)
+    : partial_symtab (filename, objfile, addr)
   {
   }
 
   void read_symtab (struct objfile *) override;
   void expand_psymtab (struct objfile *) override;
 
+  bool readin_p (struct objfile *) const override;
+  struct compunit_symtab *get_compunit_symtab (struct objfile *) const
+    override;
+
   struct dwarf2_per_cu_data *per_cu_data;
 };