aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2021-04-30 14:07:58 -0600
committerTom Tromey <tom@tromey.com>2021-04-30 14:07:58 -0600
commitb8efb248a88cb9c6760b44b5f7cfa4cb1b8dc004 (patch)
tree5523ba72c09a75c49eaec59bf92c2e87405db93f
parent91eea9cc48a17763dae5a4f10eaa111c512ee2d0 (diff)
downloadgdb-b8efb248a88cb9c6760b44b5f7cfa4cb1b8dc004.zip
gdb-b8efb248a88cb9c6760b44b5f7cfa4cb1b8dc004.tar.gz
gdb-b8efb248a88cb9c6760b44b5f7cfa4cb1b8dc004.tar.bz2
Do not separately read type units
Currently, the DWARF reader has a separate pass to read type units -- create_all_type_units. While working on other patches, I discovered that this caused DWARF 5 type units to be read twice, once by create_all_comp_units and once by create_all_type_units. There's no need any more (if there ever was) to treat type units differently from CUs. So, this patch removes create_all_type_units and unifies the code paths. Note that the DWO code still has a second pass. I haven't looked into this code yet; perhaps it can also be simplified. Regression tested using the debug-types board file on x86-64 Fedora 32. gdb/ChangeLog 2021-04-30 Tom Tromey <tom@tromey.com> * dwarf2/read.c (dwarf2_initialize_objfile): Update. (add_signatured_type_cu_to_table): Remove. (create_debug_type_hash_table): Assume dwo_file is non-null. (create_debug_types_hash_table): Update comment. (create_all_type_units): Remove. (sort_tu_by_abbrev_offset): Update comment. (build_type_psymtabs): Rename from build_type_psymtabs_1. (build_type_psymtabs): Remove. (process_skeletonless_type_unit, dwarf2_build_psymtabs_hard): Update. (read_comp_units_from_section): Add types_htab, section_kind parameters. (create_all_comp_units): Read type units.
-rw-r--r--gdb/ChangeLog16
-rw-r--r--gdb/dwarf2/read.c186
2 files changed, 69 insertions, 133 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index fb82dbe..6ec6a70 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,21 @@
2021-04-30 Tom Tromey <tom@tromey.com>
+ * dwarf2/read.c (dwarf2_initialize_objfile): Update.
+ (add_signatured_type_cu_to_table): Remove.
+ (create_debug_type_hash_table): Assume dwo_file is non-null.
+ (create_debug_types_hash_table): Update comment.
+ (create_all_type_units): Remove.
+ (sort_tu_by_abbrev_offset): Update comment.
+ (build_type_psymtabs): Rename from build_type_psymtabs_1.
+ (build_type_psymtabs): Remove.
+ (process_skeletonless_type_unit, dwarf2_build_psymtabs_hard):
+ Update.
+ (read_comp_units_from_section): Add types_htab, section_kind
+ parameters.
+ (create_all_comp_units): Read type units.
+
+2021-04-30 Tom Tromey <tom@tromey.com>
+
* dwarf2/read.h (struct tu_stats) <nr_tus>: New member.
(struct dwarf2_per_bfd) <get_cutu, get_tu>: Remove
<get_cu>: Now inline.
diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
index f3c413a..5796cf1 100644
--- a/gdb/dwarf2/read.c
+++ b/gdb/dwarf2/read.c
@@ -1689,8 +1689,6 @@ static struct type *set_die_type (struct die_info *, struct type *,
static void create_all_comp_units (dwarf2_per_objfile *per_objfile);
-static int create_all_type_units (dwarf2_per_objfile *per_objfile);
-
static void load_full_comp_unit (dwarf2_per_cu_data *per_cu,
dwarf2_per_objfile *per_objfile,
dwarf2_cu *existing_cu,
@@ -5656,7 +5654,6 @@ dwarf2_initialize_objfile (struct objfile *objfile)
per_bfd->using_index = 1;
create_all_comp_units (per_objfile);
- create_all_type_units (per_objfile);
per_bfd->quick_file_names_table
= create_quick_file_names_table (per_bfd->all_comp_units.size ());
per_objfile->resize_symtabs ();
@@ -6002,20 +5999,6 @@ allocate_signatured_type_table ()
NULL, xcalloc, xfree));
}
-/* A helper function to add a signatured type CU to a table. */
-
-static int
-add_signatured_type_cu_to_table (void **slot, void *datum)
-{
- struct signatured_type *sigt = (struct signatured_type *) *slot;
- std::vector<std::unique_ptr<dwarf2_per_cu_data>> *all_comp_units
- = (std::vector<std::unique_ptr<dwarf2_per_cu_data>> *) datum;
-
- all_comp_units->emplace_back (sigt);
-
- return 1;
-}
-
/* A helper for create_debug_types_hash_table. Read types from SECTION
and fill them into TYPES_HTAB. It will process only type units,
therefore DW_UT_type. */
@@ -6031,9 +6014,7 @@ create_debug_type_hash_table (dwarf2_per_objfile *per_objfile,
bfd *abfd;
const gdb_byte *info_ptr, *end_ptr;
- abbrev_section = (dwo_file != NULL
- ? &dwo_file->sections.abbrev
- : &per_objfile->per_bfd->abbrev);
+ abbrev_section = &dwo_file->sections.abbrev;
dwarf_read_debug_printf ("Reading %s for %s",
section->get_name (),
@@ -6087,68 +6068,25 @@ create_debug_type_hash_table (dwarf2_per_objfile *per_objfile,
}
if (types_htab == NULL)
- {
- if (dwo_file)
- types_htab = allocate_dwo_unit_table ();
- else
- types_htab = allocate_signatured_type_table ();
- }
+ types_htab = allocate_dwo_unit_table ();
- if (dwo_file)
- {
- dwo_tu = OBSTACK_ZALLOC (&per_objfile->per_bfd->obstack, dwo_unit);
- dwo_tu->dwo_file = dwo_file;
- dwo_tu->signature = header.signature;
- dwo_tu->type_offset_in_tu = header.type_cu_offset_in_tu;
- dwo_tu->section = section;
- dwo_tu->sect_off = sect_off;
- dwo_tu->length = length;
- }
- else
- {
- /* N.B.: type_offset is not usable if this type uses a DWO file.
- The real type_offset is in the DWO file. */
- dwo_tu = NULL;
- sig_type = per_objfile->per_bfd->allocate_signatured_type ();
- sig_type->signature = header.signature;
- sig_type->type_offset_in_tu = header.type_cu_offset_in_tu;
- sig_type->is_debug_types = 1;
- sig_type->section = section;
- sig_type->sect_off = sect_off;
- sig_type->length = length;
- }
-
- slot = htab_find_slot (types_htab.get (),
- (dwo_file
- ? (void *) dwo_tu
- : (void *) sig_type.get ()),
- INSERT);
+ dwo_tu = OBSTACK_ZALLOC (&per_objfile->per_bfd->obstack, dwo_unit);
+ dwo_tu->dwo_file = dwo_file;
+ dwo_tu->signature = header.signature;
+ dwo_tu->type_offset_in_tu = header.type_cu_offset_in_tu;
+ dwo_tu->section = section;
+ dwo_tu->sect_off = sect_off;
+ dwo_tu->length = length;
+
+ slot = htab_find_slot (types_htab.get (), dwo_tu, INSERT);
gdb_assert (slot != NULL);
if (*slot != NULL)
- {
- sect_offset dup_sect_off;
-
- if (dwo_file)
- {
- const struct dwo_unit *dup_tu
- = (const struct dwo_unit *) *slot;
-
- dup_sect_off = dup_tu->sect_off;
- }
- else
- {
- const struct signatured_type *dup_tu
- = (const struct signatured_type *) *slot;
-
- dup_sect_off = dup_tu->sect_off;
- }
-
- complaint (_("debug type entry at offset %s is duplicate to"
- " the entry at offset %s, signature %s"),
- sect_offset_str (sect_off), sect_offset_str (dup_sect_off),
- hex_string (header.signature));
- }
- *slot = dwo_file ? (void *) dwo_tu : (void *) sig_type.release ();
+ complaint (_("debug type entry at offset %s is duplicate to"
+ " the entry at offset %s, signature %s"),
+ sect_offset_str (sect_off),
+ sect_offset_str (dwo_tu->sect_off),
+ hex_string (header.signature));
+ *slot = dwo_tu;
dwarf_read_debug_printf_v (" offset %s, signature %s",
sect_offset_str (sect_off),
@@ -6160,8 +6098,7 @@ create_debug_type_hash_table (dwarf2_per_objfile *per_objfile,
/* Create the hash table of all entries in the .debug_types
(or .debug_types.dwo) section(s).
- If reading a DWO file, then DWO_FILE is a pointer to the DWO file object,
- otherwise it is NULL.
+ DWO_FILE is a pointer to the DWO file object.
The result is a pointer to the hash table or NULL if there are no types.
@@ -6178,35 +6115,6 @@ create_debug_types_hash_table (dwarf2_per_objfile *per_objfile,
rcuh_kind::TYPE);
}
-/* Create the hash table of all entries in the .debug_types section,
- and update all_comp_units.
- The result is zero if there is an error (e.g. missing .debug_types section),
- otherwise non-zero. */
-
-static int
-create_all_type_units (dwarf2_per_objfile *per_objfile)
-{
- htab_up types_htab;
-
- create_debug_type_hash_table (per_objfile, NULL, &per_objfile->per_bfd->info,
- types_htab, rcuh_kind::COMPILE);
- create_debug_types_hash_table (per_objfile, NULL, per_objfile->per_bfd->types,
- types_htab);
- if (types_htab == NULL)
- {
- per_objfile->per_bfd->signatured_types = NULL;
- return 0;
- }
-
- per_objfile->per_bfd->signatured_types = std::move (types_htab);
-
- htab_traverse_noresize (per_objfile->per_bfd->signatured_types.get (),
- add_signatured_type_cu_to_table,
- &per_objfile->per_bfd->all_comp_units);
-
- return 1;
-}
-
/* Add an entry for signature SIG to dwarf2_per_objfile->per_bfd->signatured_types.
If SLOT is non-NULL, it is the entry to use in the hash table.
Otherwise we find one. */
@@ -7447,7 +7355,7 @@ struct tu_abbrev_offset
sect_offset abbrev_offset;
};
-/* Helper routine for build_type_psymtabs_1, passed to std::sort. */
+/* Helper routine for build_type_psymtabs, passed to std::sort. */
static bool
sort_tu_by_abbrev_offset (const struct tu_abbrev_offset &a,
@@ -7457,7 +7365,6 @@ sort_tu_by_abbrev_offset (const struct tu_abbrev_offset &a,
}
/* Efficiently read all the type units.
- This does the bulk of the work for build_type_psymtabs.
The efficiency is because we sort TUs by the abbrev table they use and
only read each abbrev table once. In one program there are 200K TUs
@@ -7475,7 +7382,7 @@ sort_tu_by_abbrev_offset (const struct tu_abbrev_offset &a,
dwarf2_per_objfile->per_bfd->type_unit_groups. */
static void
-build_type_psymtabs_1 (dwarf2_per_objfile *per_objfile)
+build_type_psymtabs (dwarf2_per_objfile *per_objfile)
{
struct tu_stats *tu_stats = &per_objfile->per_bfd->tu_stats;
abbrev_table_up abbrev_table;
@@ -7602,18 +7509,6 @@ build_type_psymtab_dependencies (void **slot, void *info)
return 1;
}
-/* Subroutine of dwarf2_build_psymtabs_hard to simplify it.
- Build partial symbol tables for the .debug_types comp-units. */
-
-static void
-build_type_psymtabs (dwarf2_per_objfile *per_objfile)
-{
- if (! create_all_type_units (per_objfile))
- return;
-
- build_type_psymtabs_1 (per_objfile);
-}
-
/* Traversal function for process_skeletonless_type_unit.
Read a TU in a DWO file and build partial symbols for it. */
@@ -7637,13 +7532,13 @@ process_skeletonless_type_unit (void **slot, void *info)
if (*slot != NULL)
return 1;
- /* This does the job that create_all_type_units would have done for
+ /* This does the job that create_all_comp_units would have done for
this TU. */
entry = add_type_unit (per_objfile, dwo_unit->signature, slot);
fill_in_sig_entry_from_dwo_entry (per_objfile, entry, dwo_unit);
*slot = entry;
- /* This does the job that build_type_psymtabs_1 would have done. */
+ /* This does the job that build_type_psymtabs would have done. */
cutu_reader reader (entry, per_objfile, nullptr, nullptr, false);
if (!reader.dummy_p)
build_type_psymtabs_reader (&reader, reader.info_ptr,
@@ -7725,9 +7620,8 @@ dwarf2_build_psymtabs_hard (dwarf2_per_objfile *per_objfile)
read_in_chain. Make sure to free them when we're done. */
free_cached_comp_units freer (per_objfile);
- build_type_psymtabs (per_objfile);
-
create_all_comp_units (per_objfile);
+ build_type_psymtabs (per_objfile);
/* Create a temporary address map on a temporary obstack. We later
copy this to the final obstack. */
@@ -7800,7 +7694,9 @@ static void
read_comp_units_from_section (dwarf2_per_objfile *per_objfile,
struct dwarf2_section_info *section,
struct dwarf2_section_info *abbrev_section,
- unsigned int is_dwz)
+ unsigned int is_dwz,
+ htab_up &types_htab,
+ rcuh_kind section_kind)
{
const gdb_byte *info_ptr;
struct objfile *objfile = per_objfile->objfile;
@@ -7822,17 +7718,31 @@ read_comp_units_from_section (dwarf2_per_objfile *per_objfile,
comp_unit_head cu_header;
read_and_check_comp_unit_head (per_objfile, &cu_header, section,
abbrev_section, info_ptr,
- rcuh_kind::COMPILE);
+ section_kind);
/* Save the compilation unit for later lookup. */
if (cu_header.unit_type != DW_UT_type)
this_cu = per_objfile->per_bfd->allocate_per_cu ();
else
{
+ if (types_htab == nullptr)
+ types_htab = allocate_signatured_type_table ();
+
auto sig_type = per_objfile->per_bfd->allocate_signatured_type ();
+ signatured_type *sig_ptr = sig_type.get ();
sig_type->signature = cu_header.signature;
sig_type->type_offset_in_tu = cu_header.type_cu_offset_in_tu;
this_cu = std::move (sig_type);
+
+ void **slot = htab_find_slot (types_htab.get (), sig_ptr, INSERT);
+ gdb_assert (slot != nullptr);
+ if (*slot != nullptr)
+ complaint (_("debug type entry at offset %s is duplicate to"
+ " the entry at offset %s, signature %s"),
+ sect_offset_str (sect_off),
+ sect_offset_str (sig_ptr->sect_off),
+ hex_string (sig_ptr->signature));
+ *slot = sig_ptr;
}
this_cu->is_debug_types = (cu_header.unit_type == DW_UT_type);
this_cu->sect_off = sect_off;
@@ -7851,12 +7761,22 @@ read_comp_units_from_section (dwarf2_per_objfile *per_objfile,
static void
create_all_comp_units (dwarf2_per_objfile *per_objfile)
{
+ htab_up types_htab;
+
read_comp_units_from_section (per_objfile, &per_objfile->per_bfd->info,
- &per_objfile->per_bfd->abbrev, 0);
+ &per_objfile->per_bfd->abbrev, 0,
+ types_htab, rcuh_kind::COMPILE);
+ for (dwarf2_section_info &section : per_objfile->per_bfd->types)
+ read_comp_units_from_section (per_objfile, &section,
+ &per_objfile->per_bfd->abbrev, 0,
+ types_htab, rcuh_kind::TYPE);
dwz_file *dwz = dwarf2_get_dwz_file (per_objfile->per_bfd);
if (dwz != NULL)
- read_comp_units_from_section (per_objfile, &dwz->info, &dwz->abbrev, 1);
+ read_comp_units_from_section (per_objfile, &dwz->info, &dwz->abbrev, 1,
+ types_htab, rcuh_kind::COMPILE);
+
+ per_objfile->per_bfd->signatured_types = std::move (types_htab);
}
/* Process all loaded DIEs for compilation unit CU, starting at