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.
>
next prev parent 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).