public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
From: Luis Machado <luis.machado@linaro.org>
To: Tom Tromey <tom@tromey.com>, gdb-patches@sourceware.org
Subject: Re: [PATCH 11/14] Split type_unit_group
Date: Tue, 18 Feb 2020 12:08:00 -0000	[thread overview]
Message-ID: <9bdecaec-1c1f-5633-f04d-f2189908f8ca@linaro.org> (raw)
In-Reply-To: <20200215165444.32653-12-tom@tromey.com>


On 2/15/20 1:54 PM, Tom Tromey wrote:
> type_unit_group has links to the compunit_symtab and other symtabs.
> However, once this object is shared across objfiles, this will no
> longer be ok.
> 
> This patch introduces a new type_unit_unshareable and arranges to
> store a map from type unit groups to type_unit_unshareable objects on
> the DWARF unshareable object.
> 
> 2020-02-15  Tom Tromey  <tom@tromey.com>
> 
> 	* dwarf2/read.h (struct type_unit_unshareable): New.
> 	(struct dwarf2_unshareable) <type_units>: New member.
> 	* dwarf2/read.c (struct type_unit_group) <compunit_symtab,
> 	num_symtabs, symtabs>: Remove; move to type_unit_unshareable.
> 	(get_type_unit_group_unshareable): New function.
> 	(process_full_type_unit, dwarf2_cu::setup_type_unit_groups)
> 	(dwarf2_cu::setup_type_unit_groups): Use type_unit_unshareable.
> ---
>   gdb/ChangeLog     | 10 ++++++++
>   gdb/dwarf2/read.c | 65 +++++++++++++++++++++++++----------------------
>   gdb/dwarf2/read.h | 30 ++++++++++++++++++++++
>   3 files changed, 74 insertions(+), 31 deletions(-)
> 
> diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
> index f86034f2273..d1c5bee1109 100644
> --- a/gdb/dwarf2/read.c
> +++ b/gdb/dwarf2/read.c
> @@ -580,27 +580,8 @@ struct type_unit_group
>        and is deleted afterwards and not used again.  */
>     std::vector<signatured_type *> *tus;
>   
> -  /* The compunit symtab.
> -     Type units in a group needn't all be defined in the same source file,
> -     so we create an essentially anonymous symtab as the compunit symtab.  */
> -  struct compunit_symtab *compunit_symtab;
> -
>     /* The data used to construct the hash key.  */
>     struct stmt_list_hash hash;
> -
> -  /* The number of symtabs from the line header.
> -     The value here must match line_header.num_file_names.  */
> -  unsigned int num_symtabs;
> -
> -  /* The symbol tables for this TU (obtained from the files listed in
> -     DW_AT_stmt_list).
> -     WARNING: The order of entries here must match the order of entries
> -     in the line header.  After the first TU using this type_unit_group, the
> -     line header for the subsequent TUs is recreated from this.  This is done
> -     because we need to use the same symtabs for each TU using the same
> -     DW_AT_stmt_list value.  Also note that symtabs may be repeated here,
> -     there's no guarantee the line header doesn't have duplicate entries.  */
> -  struct symtab **symtabs;
>   };
>   
>   /* These sections are what may appear in a (real or virtual) DWO file.  */
> @@ -9507,6 +9488,22 @@ rust_union_quirks (struct dwarf2_cu *cu)
>     cu->rust_unions.clear ();
>   }
>   
> +/* Get the type_unit_unshareable corresponding to TU_GROUP.  If one
> +   does not exist, create it.  */
> +
> +static type_unit_unshareable *
> +get_type_unit_group_unshareable (dwarf2_per_objfile *dwarf2_per_objfile,
> +				 type_unit_group *tu_group)
> +{
> +  auto iter = dwarf2_per_objfile->unshareable->type_units.find (tu_group);
> +  if (iter != dwarf2_per_objfile->unshareable->type_units.end ())
> +    return iter->second.get ();
> +  std::unique_ptr<type_unit_unshareable> uniq (new type_unit_unshareable);
> +  type_unit_unshareable *result = uniq.get ();
> +  dwarf2_per_objfile->unshareable->type_units[tu_group] = std::move (uniq);
> +  return result;
> +}
> +
>   /* Return the symtab for PER_CU.  This works properly regardless of
>      whether we're using the index or psymtabs.  */
>   
> @@ -9776,11 +9773,14 @@ process_full_type_unit (struct dwarf2_per_cu_data *per_cu,
>        If this is the first TU to use this symtab, complete the construction
>        of it with end_expandable_symtab.  Otherwise, complete the addition of
>        this TU's symbols to the existing symtab.  */
> -  if (sig_type->type_unit_group->compunit_symtab == NULL)
> +  type_unit_unshareable *tu_unshare
> +    = get_type_unit_group_unshareable (dwarf2_per_objfile,
> +				       sig_type->type_unit_group);
> +  if (tu_unshare->compunit_symtab == NULL)
>       {
>         buildsym_compunit *builder = cu->get_builder ();
>         cust = builder->end_expandable_symtab (0, SECT_OFF_TEXT (objfile));
> -      sig_type->type_unit_group->compunit_symtab = cust;
> +      tu_unshare->compunit_symtab = cust;
>   
>         if (cust != NULL)
>   	{
> @@ -9796,7 +9796,7 @@ process_full_type_unit (struct dwarf2_per_cu_data *per_cu,
>     else
>       {
>         cu->get_builder ()->augment_type_symtab ();
> -      cust = sig_type->type_unit_group->compunit_symtab;
> +      cust = tu_unshare->compunit_symtab;
>       }
>   
>     gdb::optional<compunit_symtab *> &symtab
> @@ -10930,7 +10930,10 @@ dwarf2_cu::setup_type_unit_groups (struct die_info *die)
>        do it again, we could fake it and just recreate the part we need
>        (file name,index -> symtab mapping).  If data shows this optimization
>        is useful we can do it then.  */
> -  first_time = tu_group->compunit_symtab == NULL;
> +  struct dwarf2_per_objfile *dwarf2_per_objfile = per_cu->dwarf2_per_objfile;
> +  type_unit_unshareable *tu_unshare
> +    = get_type_unit_group_unshareable (dwarf2_per_objfile, tu_group);
> +  first_time = tu_unshare->compunit_symtab == NULL;
>   
>     /* We have to handle the case of both a missing DW_AT_stmt_list or bad
>        debug info.  */
> @@ -10946,9 +10949,9 @@ dwarf2_cu::setup_type_unit_groups (struct die_info *die)
>   	start_symtab ("", NULL, 0);
>         else
>   	{
> -	  gdb_assert (tu_group->symtabs == NULL);
> +	  gdb_assert (tu_unshare->symtabs == NULL);
>   	  gdb_assert (m_builder == nullptr);
> -	  struct compunit_symtab *cust = tu_group->compunit_symtab;
> +	  struct compunit_symtab *cust = tu_unshare->compunit_symtab;
>   	  m_builder.reset (new struct buildsym_compunit
>   			   (COMPUNIT_OBJFILE (cust), "",
>   			    COMPUNIT_DIRNAME (cust),
> @@ -10970,9 +10973,9 @@ dwarf2_cu::setup_type_unit_groups (struct die_info *die)
>   	 process_full_type_unit still needs to know if this is the first
>   	 time.  */
>   
> -      tu_group->num_symtabs = line_header->file_names_size ();
> -      tu_group->symtabs = XNEWVEC (struct symtab *,
> -				   line_header->file_names_size ());
> +      tu_unshare->num_symtabs = line_header->file_names_size ();
> +      tu_unshare->symtabs = XNEWVEC (struct symtab *,
> +				     line_header->file_names_size ());
>   
>         auto &file_names = line_header->file_names ();
>         for (i = 0; i < file_names.size (); ++i)
> @@ -10993,13 +10996,13 @@ dwarf2_cu::setup_type_unit_groups (struct die_info *die)
>   	    }
>   
>   	  fe.symtab = b->get_current_subfile ()->symtab;
> -	  tu_group->symtabs[i] = fe.symtab;
> +	  tu_unshare->symtabs[i] = fe.symtab;
>   	}
>       }
>     else
>       {
>         gdb_assert (m_builder == nullptr);
> -      struct compunit_symtab *cust = tu_group->compunit_symtab;
> +      struct compunit_symtab *cust = tu_unshare->compunit_symtab;
>         m_builder.reset (new struct buildsym_compunit
>   		       (COMPUNIT_OBJFILE (cust), "",
>   			COMPUNIT_DIRNAME (cust),
> @@ -11010,7 +11013,7 @@ dwarf2_cu::setup_type_unit_groups (struct die_info *die)
>         for (i = 0; i < file_names.size (); ++i)
>   	{
>   	  file_entry &fe = file_names[i];
> -	  fe.symtab = tu_group->symtabs[i];
> +	  fe.symtab = tu_unshare->symtabs[i];
>   	}
>       }
>   
> diff --git a/gdb/dwarf2/read.h b/gdb/dwarf2/read.h
> index bef37e969d3..8b2e8703aa0 100644
> --- a/gdb/dwarf2/read.h
> +++ b/gdb/dwarf2/read.h
> @@ -47,6 +47,7 @@ struct dwarf2_per_cu_data;
>   struct mapped_index;
>   struct mapped_debug_names;
>   struct signatured_type;
> +struct type_unit_group;
>   
>   /* One item on the queue of compilation units to read in full symbols
>      for.  */
> @@ -66,6 +67,30 @@ struct dwarf2_queue_item
>     enum language pretend_language;
>   };
>   
> +/* This is the per-objfile data associated with a type_unit_group.  */
> +
> +struct type_unit_unshareable
> +{
> +  /* The compunit symtab.
> +     Type units in a group needn't all be defined in the same source file,
> +     so we create an essentially anonymous symtab as the compunit symtab.  */
> +  struct compunit_symtab *compunit_symtab = nullptr;
> +
> +  /* The number of symtabs from the line header.
> +     The value here must match line_header.num_file_names.  */
> +  unsigned int num_symtabs = 0;
> +
> +  /* The symbol tables for this TU (obtained from the files listed in
> +     DW_AT_stmt_list).
> +     WARNING: The order of entries here must match the order of entries
> +     in the line header.  After the first TU using this type_unit_group, the
> +     line header for the subsequent TUs is recreated from this.  This is done
> +     because we need to use the same symtabs for each TU using the same
> +     DW_AT_stmt_list value.  Also note that symtabs may be repeated here,
> +     there's no guarantee the line header doesn't have duplicate entries.  */

Does something need to be adjusted in the comments for "struct 
type_unit_unshareable" now that we've split these fields from the bigger 
type_unit_group struct?

> +  struct symtab **symtabs = nullptr;
> +};
> +
>   /* Some DWARF data cannot (currently) be shared across objfiles.  Such
>      data is stored in this object.
>   
> @@ -86,6 +111,11 @@ struct dwarf2_unshareable
>     /* 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;
> +
> +  /* Map from a type unit group to the corresponding unshared
> +     structure.  */
> +  std::unordered_map<type_unit_group *, std::unique_ptr<type_unit_unshareable>>
> +    type_units;
>   };
>   
>   /* Collection of data recorded per objfile.
> 

  reply	other threads:[~2020-02-18 12:08 UTC|newest]

Thread overview: 60+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-02-15 16:54 [PATCH 00/14] Share DWARF partial symtabs between objfiles Tom Tromey
2020-02-15 16:55 ` [PATCH 02/14] Simplify setting of reading_partial_symbols Tom Tromey
2020-02-15 16:55 ` [PATCH 03/14] Introduce dwarf2_per_objfile::obstack Tom Tromey
2020-02-19  4:13   ` Simon Marchi
2020-02-22  0:44     ` Tom Tromey
2020-02-15 16:55 ` [PATCH 10/14] Introduce dwarf2_enter_objfile and use it Tom Tromey
2020-02-18 11:58   ` Luis Machado
2020-02-21 22:54     ` Tom Tromey
2020-02-15 16:55 ` [PATCH 08/14] Remove symtab links from dwarf2_psymtab and dwarf2_per_cu_quick_data Tom Tromey
2020-02-18 11:50   ` Luis Machado
2020-02-19  4:47     ` Simon Marchi
2020-02-22  0:38       ` Tom Tromey
2020-02-22  0:36     ` Tom Tromey
2020-02-15 16:55 ` [PATCH 11/14] Split type_unit_group Tom Tromey
2020-02-18 12:08   ` Luis Machado [this message]
2020-02-22  0:40     ` Tom Tromey
2020-02-15 16:55 ` [PATCH 06/14] Add "objfile" parameter to two partial_symtab methods Tom Tromey
2020-02-18 11:26   ` Luis Machado
2020-02-15 16:55 ` [PATCH 13/14] Move signatured_type::type to unshareable object Tom Tromey
2020-02-15 16:55 ` [PATCH 14/14] Share DWARF partial symtabs Tom Tromey
2020-02-18 12:26   ` Luis Machado
2020-02-21 23:03     ` Tom Tromey
2020-02-15 16:55 ` [PATCH 09/14] Add objfile member to DWARF batons Tom Tromey
2020-02-15 16:55 ` [PATCH 01/14] Fix latent bug in dwarf2_find_containing_comp_unit Tom Tromey
2020-02-19  3:42   ` Simon Marchi
2020-02-19 14:08     ` Tom Tromey
2020-02-20  0:11       ` Tom Tromey
2020-02-20  0:12       ` Tom Tromey
2020-02-20 15:44         ` Simon Marchi
2020-02-20 16:50           ` Tom Tromey
2020-03-07 19:12             ` Christian Biesinger
2020-02-15 16:55 ` [PATCH 04/14] Convert IS_TYPE_UNIT_GROUP to method Tom Tromey
2020-02-15 16:55 ` [PATCH 12/14] Fix a memory leak and remove an unused member Tom Tromey
2020-02-15 16:55 ` [PATCH 05/14] Introduce dwarf2_unshareable and move die_type_hash Tom Tromey
2020-02-18 11:23   ` Luis Machado
2020-02-19  4:20   ` Simon Marchi
2020-02-21 22:43     ` Tom Tromey
2020-02-15 16:55 ` [PATCH 07/14] Add dwarf2_per_cu_data::index Tom Tromey
2020-02-18 11:39   ` Luis Machado
2020-02-21 23:36     ` Tom Tromey
2020-02-19  4:36   ` Simon Marchi
2020-02-19  5:31     ` Simon Marchi
2020-02-21 23:41       ` Tom Tromey
2020-02-21 23:41     ` Tom Tromey
2020-02-17 12:31 ` [PATCH 00/14] Share DWARF partial symtabs between objfiles Luis Machado
2020-02-17 16:59   ` Tom Tromey
2020-02-22 21:50 ` Tom de Vries
2020-02-22 22:01   ` Tom Tromey
2020-02-23  2:37 ` Simon Marchi
2020-02-23 23:58   ` Tom Tromey
2020-02-24  2:52     ` Simon Marchi
2020-02-24  3:07       ` Tom Tromey
2020-02-24  3:22         ` Tom Tromey
2020-02-24 13:42           ` Tom de Vries
2020-02-24 16:00             ` Tom de Vries
2020-02-24 17:29               ` Tom Tromey
2020-02-24 23:15                 ` Tom Tromey
2020-02-24 19:18           ` Simon Marchi
2020-02-24 23:20             ` Tom Tromey
2020-02-24 22:48       ` Tom Tromey

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=9bdecaec-1c1f-5633-f04d-f2189908f8ca@linaro.org \
    --to=luis.machado@linaro.org \
    --cc=gdb-patches@sourceware.org \
    --cc=tom@tromey.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).