aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog46
-rw-r--r--gdb/dwarf2/index-write.c28
-rw-r--r--gdb/dwarf2/read.c342
-rw-r--r--gdb/dwarf2/read.h57
4 files changed, 265 insertions, 208 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 16c0ef7..e51ef3d 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,49 @@
+2021-04-30 Tom Tromey <tom@tromey.com>
+
+ * dwarf2/read.h (struct dwarf2_per_bfd) <allocate_per_cu,
+ allocate_signatured_type>: Change return type.
+ <all_comp_units, all_type_units>: Hold unique pointers.
+ (struct dwarf2_per_cu_data): Add constructor and initializers.
+ (struct signatured_type): Derive from dwarf2_per_cu_data.
+ * dwarf2/read.c (type_unit_group): Derive from
+ dwarf2_per_cu_data.
+ (dwarf2_per_bfd::get_cutu, dwarf2_per_bfd::get_cu)
+ (dwarf2_per_bfd::get_tu)
+ (dwarf2_per_bfd::allocate_signatured_type)
+ (dwarf2_per_bfd::allocate_signatured_type)
+ (create_cu_from_index_list, create_cus_from_index_list)
+ (create_signatured_type_table_from_index)
+ (create_signatured_type_table_from_debug_names)
+ (create_addrmap_from_aranges)
+ (dwarf2_base_index_functions::find_last_source_symtab)
+ (dw_expand_symtabs_matching_file_matcher)
+ (dwarf2_gdb_index::expand_symtabs_matching)
+ (dwarf2_base_index_functions::map_symbol_filenames)
+ (create_cus_from_debug_names_list)
+ (dw2_debug_names_iterator::next)
+ (dwarf2_debug_names_index::expand_symtabs_matching)
+ (create_debug_type_hash_table, add_type_unit)
+ (fill_in_sig_entry_from_dwo_entry, lookup_dwo_signatured_type):
+ Update.
+ (allocate_type_unit_groups_table): Use delete.
+ (create_type_unit_group): Change return type. Use new.
+ (get_type_unit_group, build_type_psymtabs_1)
+ (build_type_psymtab_dependencies)
+ (process_skeletonless_type_unit, set_partial_user)
+ (dwarf2_build_psymtabs_hard, read_comp_units_from_section)
+ (create_cus_hash_table, queue_and_load_dwo_tu, follow_die_sig_1)
+ (read_signatured_type): Update.
+ (dwarf2_find_containing_comp_unit): Change type of
+ 'all_comp_units'.
+ (run_test): Update.
+ (dwarf2_per_bfd::allocate_per_cu)
+ (dwarf2_per_bfd::allocate_signatured_type): Change return type.
+ Use new.
+ (add_signatured_type_cu_to_table): Update.
+ * dwarf2/index-write.c (write_one_signatured_type)
+ (check_dwarf64_offsets, psyms_seen_size, write_gdbindex)
+ (write_debug_names): Update.
+
2021-04-30 Tom Tromey <tromey@adacore.com>
* nat/windows-nat.h (get_image_name): Don't declare.
diff --git a/gdb/dwarf2/index-write.c b/gdb/dwarf2/index-write.c
index e27e1e8..b000cd5 100644
--- a/gdb/dwarf2/index-write.c
+++ b/gdb/dwarf2/index-write.c
@@ -615,7 +615,7 @@ write_one_signatured_type (void **slot, void *d)
struct signatured_type_index_data *info
= (struct signatured_type_index_data *) d;
struct signatured_type *entry = (struct signatured_type *) *slot;
- partial_symtab *psymtab = entry->per_cu.v.psymtab;
+ partial_symtab *psymtab = entry->v.psymtab;
if (psymtab == nullptr)
{
@@ -633,7 +633,7 @@ write_one_signatured_type (void **slot, void *d)
1);
info->types_list.append_uint (8, BFD_ENDIAN_LITTLE,
- to_underlying (entry->per_cu.sect_off));
+ to_underlying (entry->sect_off));
info->types_list.append_uint (8, BFD_ENDIAN_LITTLE,
to_underlying (entry->type_offset_in_tu));
info->types_list.append_uint (8, BFD_ENDIAN_LITTLE, entry->signature);
@@ -1259,7 +1259,7 @@ private:
write_one_signatured_type (struct signatured_type *entry,
struct signatured_type_index_data *info)
{
- partial_symtab *psymtab = entry->per_cu.v.psymtab;
+ partial_symtab *psymtab = entry->v.psymtab;
write_psymbols (info->psyms_seen, psymtab->global_psymbols,
info->cu_index, false, unit_kind::tu);
@@ -1267,7 +1267,7 @@ private:
info->cu_index, true, unit_kind::tu);
info->types_list.append_uint (dwarf5_offset_size (), m_dwarf5_byte_order,
- to_underlying (entry->per_cu.sect_off));
+ to_underlying (entry->sect_off));
++info->cu_index;
}
@@ -1312,16 +1312,16 @@ private:
static bool
check_dwarf64_offsets (dwarf2_per_objfile *per_objfile)
{
- for (dwarf2_per_cu_data *per_cu : per_objfile->per_bfd->all_comp_units)
+ for (const auto &per_cu : per_objfile->per_bfd->all_comp_units)
{
- if (to_underlying (per_cu->sect_off) >= (static_cast<uint64_t> (1) << 32))
+ if (to_underlying (per_cu->sect_off)
+ >= (static_cast<uint64_t> (1) << 32))
return true;
}
- for (const signatured_type *sigtype : per_objfile->per_bfd->all_type_units)
+ for (const auto &sigtype : per_objfile->per_bfd->all_type_units)
{
- const dwarf2_per_cu_data &per_cu = sigtype->per_cu;
-
- if (to_underlying (per_cu.sect_off) >= (static_cast<uint64_t> (1) << 32))
+ if (to_underlying (sigtype->sect_off)
+ >= (static_cast<uint64_t> (1) << 32))
return true;
}
return false;
@@ -1337,7 +1337,7 @@ static size_t
psyms_seen_size (dwarf2_per_objfile *per_objfile)
{
size_t psyms_count = 0;
- for (dwarf2_per_cu_data *per_cu : per_objfile->per_bfd->all_comp_units)
+ for (const auto &per_cu : per_objfile->per_bfd->all_comp_units)
{
partial_symtab *psymtab = per_cu->v.psymtab;
@@ -1440,7 +1440,8 @@ write_gdbindex (dwarf2_per_objfile *per_objfile, FILE *out_file,
(psyms_seen_size (per_objfile));
for (int i = 0; i < per_objfile->per_bfd->all_comp_units.size (); ++i)
{
- dwarf2_per_cu_data *per_cu = per_objfile->per_bfd->all_comp_units[i];
+ dwarf2_per_cu_data *per_cu
+ = per_objfile->per_bfd->all_comp_units[i].get ();
partial_symtab *psymtab = per_cu->v.psymtab;
if (psymtab != NULL)
@@ -1521,7 +1522,8 @@ write_debug_names (dwarf2_per_objfile *per_objfile,
psyms_seen (psyms_seen_size (per_objfile));
for (int i = 0; i < per_objfile->per_bfd->all_comp_units.size (); ++i)
{
- const dwarf2_per_cu_data *per_cu = per_objfile->per_bfd->all_comp_units[i];
+ const dwarf2_per_cu_data *per_cu
+ = per_objfile->per_bfd->all_comp_units[i].get ();
partial_symtab *psymtab = per_cu->v.psymtab;
/* CU of a shared file from 'dwz -m' may be unused by this main
diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
index 306971e..6eb6caf 100644
--- a/gdb/dwarf2/read.c
+++ b/gdb/dwarf2/read.c
@@ -720,21 +720,15 @@ struct stmt_list_hash
that can be shared across objfiles. The non-shareable parts are in
type_unit_group_unshareable. */
-struct type_unit_group
+struct type_unit_group : public dwarf2_per_cu_data
{
- /* dwarf2read.c's main "handle" on a TU symtab.
- To simplify things we create an artificial CU that "includes" all the
- type units using this stmt_list so that the rest of the code still has
- a "per_cu" handle on the symtab. */
- struct dwarf2_per_cu_data per_cu;
-
/* The TUs that share this DW_AT_stmt_list entry.
This is added to while parsing type units to build partial symtabs,
and is deleted afterwards and not used again. */
- std::vector<signatured_type *> *tus;
+ std::vector<signatured_type *> *tus = nullptr;
/* The data used to construct the hash key. */
- struct stmt_list_hash hash;
+ struct stmt_list_hash hash {};
};
/* These sections are what may appear in a (real or virtual) DWO file. */
@@ -1903,11 +1897,11 @@ dwarf2_per_bfd::dwarf2_per_bfd (bfd *obfd, const dwarf2_debug_sections *names,
dwarf2_per_bfd::~dwarf2_per_bfd ()
{
- for (dwarf2_per_cu_data *per_cu : all_comp_units)
+ for (auto &per_cu : all_comp_units)
per_cu->imported_symtabs_free ();
- for (signatured_type *sig_type : all_type_units)
- sig_type->per_cu.imported_symtabs_free ();
+ for (auto &sig_type : all_type_units)
+ sig_type->imported_symtabs_free ();
/* Everything else should be on this->obstack. */
}
@@ -2540,10 +2534,10 @@ dwarf2_per_bfd::get_cutu (int index)
{
index -= this->all_comp_units.size ();
gdb_assert (index < this->all_type_units.size ());
- return &this->all_type_units[index]->per_cu;
+ return this->all_type_units[index].get ();
}
- return this->all_comp_units[index];
+ return this->all_comp_units[index].get ();
}
/* See declaration. */
@@ -2553,7 +2547,7 @@ dwarf2_per_bfd::get_cu (int index)
{
gdb_assert (index >= 0 && index < this->all_comp_units.size ());
- return this->all_comp_units[index];
+ return this->all_comp_units[index].get ();
}
/* See declaration. */
@@ -2563,15 +2557,15 @@ dwarf2_per_bfd::get_tu (int index)
{
gdb_assert (index >= 0 && index < this->all_type_units.size ());
- return this->all_type_units[index];
+ return this->all_type_units[index].get ();
}
/* See read.h. */
-dwarf2_per_cu_data *
+std::unique_ptr<dwarf2_per_cu_data>
dwarf2_per_bfd::allocate_per_cu ()
{
- dwarf2_per_cu_data *result = OBSTACK_ZALLOC (&obstack, dwarf2_per_cu_data);
+ std::unique_ptr<dwarf2_per_cu_data> result (new dwarf2_per_cu_data);
result->per_bfd = this;
result->index = m_num_psymtabs++;
return result;
@@ -2579,25 +2573,25 @@ dwarf2_per_bfd::allocate_per_cu ()
/* See read.h. */
-signatured_type *
+std::unique_ptr<signatured_type>
dwarf2_per_bfd::allocate_signatured_type ()
{
- signatured_type *result = OBSTACK_ZALLOC (&obstack, signatured_type);
- result->per_cu.per_bfd = this;
- result->per_cu.index = m_num_psymtabs++;
+ std::unique_ptr<signatured_type> result (new signatured_type);
+ result->per_bfd = this;
+ result->index = m_num_psymtabs++;
return result;
}
/* Return a new dwarf2_per_cu_data allocated on the per-bfd
obstack, and constructed with the specified field values. */
-static dwarf2_per_cu_data *
+static std::unique_ptr<dwarf2_per_cu_data>
create_cu_from_index_list (dwarf2_per_bfd *per_bfd,
struct dwarf2_section_info *section,
int is_dwz,
sect_offset sect_off, ULONGEST length)
{
- dwarf2_per_cu_data *the_cu = per_bfd->allocate_per_cu ();
+ std::unique_ptr<dwarf2_per_cu_data> the_cu = per_bfd->allocate_per_cu ();
the_cu->sect_off = sect_off;
the_cu->length = length;
the_cu->section = section;
@@ -2625,10 +2619,10 @@ create_cus_from_index_list (dwarf2_per_bfd *per_bfd,
ULONGEST length = extract_unsigned_integer (cu_list + 8, 8, BFD_ENDIAN_LITTLE);
cu_list += 2 * 8;
- dwarf2_per_cu_data *per_cu
+ std::unique_ptr<dwarf2_per_cu_data> per_cu
= create_cu_from_index_list (per_bfd, section, is_dwz, sect_off,
length);
- per_bfd->all_comp_units.push_back (per_cu);
+ per_bfd->all_comp_units.push_back (std::move (per_cu));
}
}
@@ -2668,7 +2662,7 @@ create_signatured_type_table_from_index
for (offset_type i = 0; i < elements; i += 3)
{
- struct signatured_type *sig_type;
+ std::unique_ptr<signatured_type> sig_type;
ULONGEST signature;
void **slot;
cu_offset type_offset_in_tu;
@@ -2685,17 +2679,17 @@ create_signatured_type_table_from_index
sig_type = per_bfd->allocate_signatured_type ();
sig_type->signature = signature;
sig_type->type_offset_in_tu = type_offset_in_tu;
- sig_type->per_cu.is_debug_types = 1;
- sig_type->per_cu.section = section;
- sig_type->per_cu.sect_off = sect_off;
- sig_type->per_cu.v.quick
+ sig_type->is_debug_types = 1;
+ sig_type->section = section;
+ sig_type->sect_off = sect_off;
+ sig_type->v.quick
= OBSTACK_ZALLOC (&per_bfd->obstack,
struct dwarf2_per_cu_quick_data);
- slot = htab_find_slot (sig_types_hash.get (), sig_type, INSERT);
- *slot = sig_type;
+ slot = htab_find_slot (sig_types_hash.get (), sig_type.get (), INSERT);
+ *slot = sig_type.get ();
- per_bfd->all_type_units.push_back (sig_type);
+ per_bfd->all_type_units.push_back (std::move (sig_type));
}
per_bfd->signatured_types = std::move (sig_types_hash);
@@ -2722,7 +2716,7 @@ create_signatured_type_table_from_debug_names
for (uint32_t i = 0; i < map.tu_count; ++i)
{
- struct signatured_type *sig_type;
+ std::unique_ptr<signatured_type> sig_type;
void **slot;
sect_offset sect_off
@@ -2740,17 +2734,17 @@ create_signatured_type_table_from_debug_names
sig_type = per_objfile->per_bfd->allocate_signatured_type ();
sig_type->signature = cu_header.signature;
sig_type->type_offset_in_tu = cu_header.type_cu_offset_in_tu;
- sig_type->per_cu.is_debug_types = 1;
- sig_type->per_cu.section = section;
- sig_type->per_cu.sect_off = sect_off;
- sig_type->per_cu.v.quick
+ sig_type->is_debug_types = 1;
+ sig_type->section = section;
+ sig_type->sect_off = sect_off;
+ sig_type->v.quick
= OBSTACK_ZALLOC (&per_objfile->per_bfd->obstack,
struct dwarf2_per_cu_quick_data);
- slot = htab_find_slot (sig_types_hash.get (), sig_type, INSERT);
- *slot = sig_type;
+ slot = htab_find_slot (sig_types_hash.get (), sig_type.get (), INSERT);
+ *slot = sig_type.get ();
- per_objfile->per_bfd->all_type_units.push_back (sig_type);
+ per_objfile->per_bfd->all_type_units.push_back (std::move (sig_type));
}
per_objfile->per_bfd->signatured_types = std::move (sig_types_hash);
@@ -2833,10 +2827,11 @@ create_addrmap_from_aranges (dwarf2_per_objfile *per_objfile,
dwarf2_per_cu_data *,
gdb::hash_enum<sect_offset>>
debug_info_offset_to_per_cu;
- for (dwarf2_per_cu_data *per_cu : per_bfd->all_comp_units)
+ for (const auto &per_cu : per_bfd->all_comp_units)
{
const auto insertpair
- = debug_info_offset_to_per_cu.emplace (per_cu->sect_off, per_cu);
+ = debug_info_offset_to_per_cu.emplace (per_cu->sect_off,
+ per_cu.get ());
if (!insertpair.second)
{
warning (_("Section .debug_aranges in %s has duplicate "
@@ -3310,7 +3305,8 @@ struct symtab *
dwarf2_base_index_functions::find_last_source_symtab (struct objfile *objfile)
{
dwarf2_per_objfile *per_objfile = get_dwarf2_per_objfile (objfile);
- dwarf2_per_cu_data *dwarf_cu = per_objfile->per_bfd->all_comp_units.back ();
+ dwarf2_per_cu_data *dwarf_cu
+ = per_objfile->per_bfd->all_comp_units.back ().get ();
compunit_symtab *cust = dw2_instantiate_symtab (dwarf_cu, per_objfile, false);
if (cust == NULL)
@@ -4541,17 +4537,18 @@ dw_expand_symtabs_matching_file_matcher
/* The rule is CUs specify all the files, including those used by
any TU, so there's no need to scan TUs here. */
- for (dwarf2_per_cu_data *per_cu : per_objfile->per_bfd->all_comp_units)
+ for (const auto &per_cu : per_objfile->per_bfd->all_comp_units)
{
QUIT;
per_cu->v.quick->mark = 0;
/* We only need to look at symtabs not already expanded. */
- if (per_objfile->symtab_set_p (per_cu))
+ if (per_objfile->symtab_set_p (per_cu.get ()))
continue;
- quick_file_names *file_data = dw2_get_file_names (per_cu, per_objfile);
+ quick_file_names *file_data = dw2_get_file_names (per_cu.get (),
+ per_objfile);
if (file_data == NULL)
continue;
@@ -4617,11 +4614,11 @@ dwarf2_gdb_index::expand_symtabs_matching
if (symbol_matcher == NULL && lookup_name == NULL)
{
- for (dwarf2_per_cu_data *per_cu : per_objfile->per_bfd->all_comp_units)
+ for (const auto &per_cu : per_objfile->per_bfd->all_comp_units)
{
QUIT;
- if (!dw2_expand_symtabs_matching_one (per_cu, per_objfile,
+ if (!dw2_expand_symtabs_matching_one (per_cu.get (), per_objfile,
file_matcher,
expansion_notify))
return false;
@@ -4724,22 +4721,23 @@ dwarf2_base_index_functions::map_symbol_filenames
reuse the file names data from a currently unexpanded CU, in this
case we don't want to report the files from the unexpanded CU. */
- for (dwarf2_per_cu_data *per_cu : per_objfile->per_bfd->all_comp_units)
+ for (const auto &per_cu : per_objfile->per_bfd->all_comp_units)
{
- if (per_objfile->symtab_set_p (per_cu))
+ if (per_objfile->symtab_set_p (per_cu.get ()))
{
if (per_cu->v.quick->file_names != nullptr)
qfn_cache.insert (per_cu->v.quick->file_names);
}
}
- for (dwarf2_per_cu_data *per_cu : per_objfile->per_bfd->all_comp_units)
+ for (const auto &per_cu : per_objfile->per_bfd->all_comp_units)
{
/* We only need to look at symtabs not already expanded. */
- if (per_objfile->symtab_set_p (per_cu))
+ if (per_objfile->symtab_set_p (per_cu.get ()))
continue;
- quick_file_names *file_data = dw2_get_file_names (per_cu, per_objfile);
+ quick_file_names *file_data = dw2_get_file_names (per_cu.get (),
+ per_objfile);
if (file_data == nullptr
|| qfn_cache.find (file_data) != qfn_cache.end ())
continue;
@@ -4979,10 +4977,10 @@ create_cus_from_debug_names_list (dwarf2_per_bfd *per_bfd,
of the next CU as end of this CU. We create the CUs here with
length 0, and in cutu_reader::cutu_reader we'll fill in the
actual length. */
- dwarf2_per_cu_data *per_cu
+ std::unique_ptr<dwarf2_per_cu_data> per_cu
= create_cu_from_index_list (per_bfd, &section, is_dwz,
sect_off, 0);
- per_bfd->all_comp_units.push_back (per_cu);
+ per_bfd->all_comp_units.push_back (std::move (per_cu));
}
return;
}
@@ -5004,10 +5002,10 @@ create_cus_from_debug_names_list (dwarf2_per_bfd *per_bfd,
if (i >= 1)
{
const ULONGEST length = sect_off_next - sect_off_prev;
- dwarf2_per_cu_data *per_cu
+ std::unique_ptr<dwarf2_per_cu_data> per_cu
= create_cu_from_index_list (per_bfd, &section, is_dwz,
sect_off_prev, length);
- per_bfd->all_comp_units.push_back (per_cu);
+ per_bfd->all_comp_units.push_back (std::move (per_cu));
}
sect_off_prev = sect_off_next;
}
@@ -5367,7 +5365,7 @@ dw2_debug_names_iterator::next ()
objfile_name (objfile));
continue;
}
- per_cu = &per_bfd->get_tu (ull)->per_cu;
+ per_cu = per_bfd->get_tu (ull);
break;
case DW_IDX_die_offset:
/* In a per-CU index (as opposed to a per-module index), index
@@ -5584,11 +5582,11 @@ dwarf2_debug_names_index::expand_symtabs_matching
if (symbol_matcher == NULL && lookup_name == NULL)
{
- for (dwarf2_per_cu_data *per_cu : per_objfile->per_bfd->all_comp_units)
+ for (const auto &per_cu : per_objfile->per_bfd->all_comp_units)
{
QUIT;
- if (!dw2_expand_symtabs_matching_one (per_cu, per_objfile,
+ if (!dw2_expand_symtabs_matching_one (per_cu.get (), per_objfile,
file_matcher,
expansion_notify))
return false;
@@ -6056,10 +6054,10 @@ static int
add_signatured_type_cu_to_table (void **slot, void *datum)
{
struct signatured_type *sigt = (struct signatured_type *) *slot;
- std::vector<signatured_type *> *all_type_units
- = (std::vector<signatured_type *> *) datum;
+ std::vector<std::unique_ptr<signatured_type>> *all_type_units
+ = (std::vector<std::unique_ptr<signatured_type>> *) datum;
- all_type_units->push_back (sigt);
+ all_type_units->emplace_back (sigt);
return 1;
}
@@ -6103,7 +6101,7 @@ create_debug_type_hash_table (dwarf2_per_objfile *per_objfile,
end_ptr = info_ptr + section->size;
while (info_ptr < end_ptr)
{
- struct signatured_type *sig_type;
+ std::unique_ptr<signatured_type> sig_type;
struct dwo_unit *dwo_tu;
void **slot;
const gdb_byte *ptr = info_ptr;
@@ -6144,7 +6142,6 @@ create_debug_type_hash_table (dwarf2_per_objfile *per_objfile,
if (dwo_file)
{
- sig_type = NULL;
dwo_tu = OBSTACK_ZALLOC (&per_objfile->per_bfd->obstack, dwo_unit);
dwo_tu->dwo_file = dwo_file;
dwo_tu->signature = header.signature;
@@ -6161,14 +6158,16 @@ create_debug_type_hash_table (dwarf2_per_objfile *per_objfile,
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->per_cu.is_debug_types = 1;
- sig_type->per_cu.section = section;
- sig_type->per_cu.sect_off = sect_off;
- sig_type->per_cu.length = length;
+ 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,
+ (dwo_file
+ ? (void *) dwo_tu
+ : (void *) sig_type.get ()),
INSERT);
gdb_assert (slot != NULL);
if (*slot != NULL)
@@ -6187,7 +6186,7 @@ create_debug_type_hash_table (dwarf2_per_objfile *per_objfile,
const struct signatured_type *dup_tu
= (const struct signatured_type *) *slot;
- dup_sect_off = dup_tu->per_cu.sect_off;
+ dup_sect_off = dup_tu->sect_off;
}
complaint (_("debug type entry at offset %s is duplicate to"
@@ -6195,7 +6194,7 @@ create_debug_type_hash_table (dwarf2_per_objfile *per_objfile,
sect_offset_str (sect_off), sect_offset_str (dup_sect_off),
hex_string (header.signature));
}
- *slot = dwo_file ? (void *) dwo_tu : (void *) sig_type;
+ *slot = dwo_file ? (void *) dwo_tu : (void *) sig_type.release ();
dwarf_read_debug_printf_v (" offset %s, signature %s",
sect_offset_str (sect_off),
@@ -6269,16 +6268,18 @@ add_type_unit (dwarf2_per_objfile *per_objfile, ULONGEST sig, void **slot)
== per_objfile->per_bfd->all_type_units.capacity ())
++per_objfile->per_bfd->tu_stats.nr_all_type_units_reallocs;
- signatured_type *sig_type = per_objfile->per_bfd->allocate_signatured_type ();
+ std::unique_ptr<signatured_type> sig_type_holder
+ = per_objfile->per_bfd->allocate_signatured_type ();
+ signatured_type *sig_type = sig_type_holder.get ();
per_objfile->resize_symtabs ();
- per_objfile->per_bfd->all_type_units.push_back (sig_type);
+ per_objfile->per_bfd->all_type_units.push_back (std::move (sig_type_holder));
sig_type->signature = sig;
- sig_type->per_cu.is_debug_types = 1;
+ sig_type->is_debug_types = 1;
if (per_objfile->per_bfd->using_index)
{
- sig_type->per_cu.v.quick =
+ sig_type->v.quick =
OBSTACK_ZALLOC (&per_objfile->per_bfd->obstack,
struct dwarf2_per_cu_quick_data);
}
@@ -6305,25 +6306,25 @@ fill_in_sig_entry_from_dwo_entry (dwarf2_per_objfile *per_objfile,
dwarf2_per_bfd *per_bfd = per_objfile->per_bfd;
/* Make sure we're not clobbering something we don't expect to. */
- gdb_assert (! sig_entry->per_cu.queued);
- gdb_assert (per_objfile->get_cu (&sig_entry->per_cu) == NULL);
+ gdb_assert (! sig_entry->queued);
+ gdb_assert (per_objfile->get_cu (sig_entry) == NULL);
if (per_bfd->using_index)
{
- gdb_assert (sig_entry->per_cu.v.quick != NULL);
- gdb_assert (!per_objfile->symtab_set_p (&sig_entry->per_cu));
+ gdb_assert (sig_entry->v.quick != NULL);
+ gdb_assert (!per_objfile->symtab_set_p (sig_entry));
}
else
- gdb_assert (sig_entry->per_cu.v.psymtab == NULL);
+ gdb_assert (sig_entry->v.psymtab == NULL);
gdb_assert (sig_entry->signature == dwo_entry->signature);
gdb_assert (to_underlying (sig_entry->type_offset_in_section) == 0);
gdb_assert (sig_entry->type_unit_group == NULL);
gdb_assert (sig_entry->dwo_unit == NULL);
- sig_entry->per_cu.section = dwo_entry->section;
- sig_entry->per_cu.sect_off = dwo_entry->sect_off;
- sig_entry->per_cu.length = dwo_entry->length;
- sig_entry->per_cu.reading_dwo_directly = 1;
- sig_entry->per_cu.per_bfd = per_bfd;
+ sig_entry->section = dwo_entry->section;
+ sig_entry->sect_off = dwo_entry->sect_off;
+ sig_entry->length = dwo_entry->length;
+ sig_entry->reading_dwo_directly = 1;
+ sig_entry->per_bfd = per_bfd;
sig_entry->type_offset_in_tu = dwo_entry->type_offset_in_tu;
sig_entry->dwo_unit = dwo_entry;
}
@@ -6376,7 +6377,7 @@ lookup_dwo_signatured_type (struct dwarf2_cu *cu, ULONGEST sig)
/* Have we already tried to read this TU?
Note: sig_entry can be NULL if the skeleton TU was removed (thus it
needn't exist in the global table yet). */
- if (sig_entry != NULL && sig_entry->per_cu.tu_read)
+ if (sig_entry != NULL && sig_entry->tu_read)
return sig_entry;
/* Note: cu->dwo_unit is the dwo_unit that references this TU, not the
@@ -6397,7 +6398,7 @@ lookup_dwo_signatured_type (struct dwarf2_cu *cu, ULONGEST sig)
sig_entry = add_type_unit (per_objfile, sig, slot);
fill_in_sig_entry_from_dwo_entry (per_objfile, sig_entry, dwo_entry);
- sig_entry->per_cu.tu_read = 1;
+ sig_entry->tu_read = 1;
return sig_entry;
}
@@ -7116,7 +7117,13 @@ allocate_type_unit_groups_table ()
return htab_up (htab_create_alloc (3,
hash_type_unit_group,
eq_type_unit_group,
- NULL, xcalloc, xfree));
+ [] (void *arg)
+ {
+ type_unit_group *grp
+ = (type_unit_group *) arg;
+ delete grp;
+ },
+ xcalloc, xfree));
}
/* Type units that don't have DW_AT_stmt_list are grouped into their own
@@ -7128,22 +7135,19 @@ allocate_type_unit_groups_table ()
/* Helper routine for get_type_unit_group.
Create the type_unit_group object used to hold one or more TUs. */
-static struct type_unit_group *
+static std::unique_ptr<type_unit_group>
create_type_unit_group (struct dwarf2_cu *cu, sect_offset line_offset_struct)
{
dwarf2_per_objfile *per_objfile = cu->per_objfile;
dwarf2_per_bfd *per_bfd = per_objfile->per_bfd;
- struct dwarf2_per_cu_data *per_cu;
- struct type_unit_group *tu_group;
- tu_group = OBSTACK_ZALLOC (&per_bfd->obstack, type_unit_group);
- per_cu = &tu_group->per_cu;
- per_cu->per_bfd = per_bfd;
+ std::unique_ptr<type_unit_group> tu_group (new type_unit_group);
+ tu_group->per_bfd = per_bfd;
if (per_bfd->using_index)
{
- per_cu->v.quick = OBSTACK_ZALLOC (&per_bfd->obstack,
- struct dwarf2_per_cu_quick_data);
+ tu_group->v.quick = OBSTACK_ZALLOC (&per_bfd->obstack,
+ struct dwarf2_per_cu_quick_data);
}
else
{
@@ -7158,7 +7162,8 @@ create_type_unit_group (struct dwarf2_cu *cu, sect_offset line_offset_struct)
else
name = string_printf ("<type_units_at_0x%x>", line_offset);
- pst = create_partial_symtab (per_cu, per_objfile, name.c_str ());
+ pst = create_partial_symtab (tu_group.get (), per_objfile,
+ name.c_str ());
pst->anonymous = true;
}
@@ -7208,19 +7213,17 @@ get_type_unit_group (struct dwarf2_cu *cu, const struct attribute *stmt_list)
type_unit_group_for_lookup.hash.line_sect_off = (sect_offset) line_offset;
slot = htab_find_slot (per_objfile->per_bfd->type_unit_groups.get (),
&type_unit_group_for_lookup, INSERT);
- if (*slot != NULL)
- {
- tu_group = (struct type_unit_group *) *slot;
- gdb_assert (tu_group != NULL);
- }
- else
+ if (*slot == nullptr)
{
sect_offset line_offset_struct = (sect_offset) line_offset;
- tu_group = create_type_unit_group (cu, line_offset_struct);
- *slot = tu_group;
+ std::unique_ptr<type_unit_group> grp
+ = create_type_unit_group (cu, line_offset_struct);
+ *slot = grp.release ();
++tu_stats->nr_symtabs;
}
+ tu_group = (struct type_unit_group *) *slot;
+ gdb_assert (tu_group != nullptr);
return tu_group;
}
@@ -7560,10 +7563,10 @@ build_type_psymtabs_1 (dwarf2_per_objfile *per_objfile)
std::vector<tu_abbrev_offset> sorted_by_abbrev;
sorted_by_abbrev.reserve (per_objfile->per_bfd->all_type_units.size ());
- for (signatured_type *sig_type : per_objfile->per_bfd->all_type_units)
+ for (const auto &sig_type : per_objfile->per_bfd->all_type_units)
sorted_by_abbrev.emplace_back
- (sig_type, read_abbrev_offset (per_objfile, sig_type->per_cu.section,
- sig_type->per_cu.sect_off));
+ (sig_type.get (), read_abbrev_offset (per_objfile, sig_type->section,
+ sig_type->sect_off));
std::sort (sorted_by_abbrev.begin (), sorted_by_abbrev.end (),
sort_tu_by_abbrev_offset);
@@ -7583,7 +7586,7 @@ build_type_psymtabs_1 (dwarf2_per_objfile *per_objfile)
++tu_stats->nr_uniq_abbrev_tables;
}
- cutu_reader reader (&tu.sig_type->per_cu, per_objfile,
+ cutu_reader reader (tu.sig_type, per_objfile,
abbrev_table.get (), nullptr, false);
if (!reader.dummy_p)
build_type_psymtabs_reader (&reader, reader.info_ptr,
@@ -7621,21 +7624,20 @@ build_type_psymtab_dependencies (void **slot, void *info)
dwarf2_per_objfile *per_objfile = (dwarf2_per_objfile *) info;
dwarf2_per_bfd *per_bfd = per_objfile->per_bfd;
struct type_unit_group *tu_group = (struct type_unit_group *) *slot;
- struct dwarf2_per_cu_data *per_cu = &tu_group->per_cu;
- dwarf2_psymtab *pst = per_cu->v.psymtab;
+ dwarf2_psymtab *pst = tu_group->v.psymtab;
int len = (tu_group->tus == nullptr) ? 0 : tu_group->tus->size ();
int i;
gdb_assert (len > 0);
- gdb_assert (per_cu->type_unit_group_p ());
+ gdb_assert (tu_group->type_unit_group_p ());
pst->number_of_dependencies = len;
pst->dependencies = per_bfd->partial_symtabs->allocate_dependencies (len);
for (i = 0; i < len; ++i)
{
struct signatured_type *iter = tu_group->tus->at (i);
- gdb_assert (iter->per_cu.is_debug_types);
- pst->dependencies[i] = iter->per_cu.v.psymtab;
+ gdb_assert (iter->is_debug_types);
+ pst->dependencies[i] = iter->v.psymtab;
iter->type_unit_group = tu_group;
}
@@ -7687,7 +7689,7 @@ process_skeletonless_type_unit (void **slot, void *info)
*slot = entry;
/* This does the job that build_type_psymtabs_1 would have done. */
- cutu_reader reader (&entry->per_cu, per_objfile, nullptr, nullptr, false);
+ cutu_reader reader (entry, per_objfile, nullptr, nullptr, false);
if (!reader.dummy_p)
build_type_psymtabs_reader (&reader, reader.info_ptr,
reader.comp_unit_die);
@@ -7731,7 +7733,7 @@ process_skeletonless_type_units (dwarf2_per_objfile *per_objfile)
static void
set_partial_user (dwarf2_per_objfile *per_objfile)
{
- for (dwarf2_per_cu_data *per_cu : per_objfile->per_bfd->all_comp_units)
+ for (const auto &per_cu : per_objfile->per_bfd->all_comp_units)
{
dwarf2_psymtab *pst = per_cu->v.psymtab;
@@ -7780,12 +7782,12 @@ dwarf2_build_psymtabs_hard (dwarf2_per_objfile *per_objfile)
= make_scoped_restore (&per_bfd->partial_symtabs->psymtabs_addrmap,
addrmap_create_mutable (&temp_obstack));
- for (dwarf2_per_cu_data *per_cu : per_bfd->all_comp_units)
+ for (const auto &per_cu : per_bfd->all_comp_units)
{
if (per_cu->v.psymtab != NULL)
/* In case a forward DW_TAG_imported_unit has read the CU already. */
continue;
- process_psymtab_comp_unit (per_cu, per_objfile, false,
+ process_psymtab_comp_unit (per_cu.get (), per_objfile, false,
language_minimal);
}
@@ -7858,7 +7860,7 @@ read_comp_units_from_section (dwarf2_per_objfile *per_objfile,
while (info_ptr < section->buffer + section->size)
{
- struct dwarf2_per_cu_data *this_cu;
+ std::unique_ptr<dwarf2_per_cu_data> this_cu;
sect_offset sect_off = (sect_offset) (info_ptr - section->buffer);
@@ -7875,7 +7877,7 @@ read_comp_units_from_section (dwarf2_per_objfile *per_objfile,
auto sig_type = per_objfile->per_bfd->allocate_signatured_type ();
sig_type->signature = cu_header.signature;
sig_type->type_offset_in_tu = cu_header.type_cu_offset_in_tu;
- this_cu = &sig_type->per_cu;
+ this_cu = std::move (sig_type);
}
this_cu->is_debug_types = (cu_header.unit_type == DW_UT_type);
this_cu->sect_off = sect_off;
@@ -7883,9 +7885,8 @@ read_comp_units_from_section (dwarf2_per_objfile *per_objfile,
this_cu->is_dwz = is_dwz;
this_cu->section = section;
- per_objfile->per_bfd->all_comp_units.push_back (this_cu);
-
info_ptr = info_ptr + this_cu->length;
+ per_objfile->per_bfd->all_comp_units.push_back (std::move (this_cu));
}
}
@@ -11262,7 +11263,6 @@ create_cus_hash_table (dwarf2_per_objfile *per_objfile,
void **slot;
sect_offset sect_off = (sect_offset) (info_ptr - section.buffer);
- memset (&per_cu, 0, sizeof (per_cu));
per_cu.per_bfd = per_bfd;
per_cu.is_debug_types = 0;
per_cu.sect_off = sect_offset (info_ptr - section.buffer);
@@ -13090,14 +13090,13 @@ queue_and_load_dwo_tu (void **slot, void *info)
if (sig_type != NULL)
{
- struct dwarf2_per_cu_data *sig_cu = &sig_type->per_cu;
-
/* We pass NULL for DEPENDENT_CU because we don't yet know if there's
a real dependency of PER_CU on SIG_TYPE. That is detected later
while processing PER_CU. */
- if (maybe_queue_comp_unit (NULL, sig_cu, cu->per_objfile, cu->language))
- load_full_type_unit (sig_cu, cu->per_objfile);
- cu->per_cu->imported_symtabs_push (sig_cu);
+ if (maybe_queue_comp_unit (NULL, sig_type, cu->per_objfile,
+ cu->language))
+ load_full_type_unit (sig_type, cu->per_objfile);
+ cu->per_cu->imported_symtabs_push (sig_type);
}
return 1;
@@ -23882,12 +23881,12 @@ follow_die_sig_1 (struct die_info *src_die, struct signatured_type *sig_type,
Even if maybe_queue_comp_unit doesn't require us to load the CU's DIEs,
it doesn't mean they are currently loaded. Since we require them
to be loaded, we must check for ourselves. */
- if (maybe_queue_comp_unit (*ref_cu, &sig_type->per_cu, per_objfile,
+ if (maybe_queue_comp_unit (*ref_cu, sig_type, per_objfile,
language_minimal)
- || per_objfile->get_cu (&sig_type->per_cu) == nullptr)
+ || per_objfile->get_cu (sig_type) == nullptr)
read_signatured_type (sig_type, per_objfile);
- sig_cu = per_objfile->get_cu (&sig_type->per_cu);
+ sig_cu = per_objfile->get_cu (sig_type);
gdb_assert (sig_cu != NULL);
gdb_assert (to_underlying (sig_type->type_offset_in_section) != 0);
temp_die.sect_off = sig_type->type_offset_in_section;
@@ -24076,12 +24075,10 @@ static void
read_signatured_type (signatured_type *sig_type,
dwarf2_per_objfile *per_objfile)
{
- struct dwarf2_per_cu_data *per_cu = &sig_type->per_cu;
-
- gdb_assert (per_cu->is_debug_types);
- gdb_assert (per_objfile->get_cu (per_cu) == nullptr);
+ gdb_assert (sig_type->is_debug_types);
+ gdb_assert (per_objfile->get_cu (sig_type) == nullptr);
- cutu_reader reader (per_cu, per_objfile, nullptr, nullptr, false);
+ cutu_reader reader (sig_type, per_objfile, nullptr, nullptr, false);
if (!reader.dummy_p)
{
@@ -24116,7 +24113,7 @@ read_signatured_type (signatured_type *sig_type,
reader.keep ();
}
- sig_type->per_cu.tu_read = 1;
+ sig_type->tu_read = 1;
}
/* Decode simple location descriptions.
@@ -24710,7 +24707,7 @@ static int
dwarf2_find_containing_comp_unit
(sect_offset sect_off,
unsigned int offset_in_dwz,
- const std::vector<dwarf2_per_cu_data *> &all_comp_units)
+ const std::vector<std::unique_ptr<dwarf2_per_cu_data>> &all_comp_units)
{
int low, high;
@@ -24721,7 +24718,7 @@ dwarf2_find_containing_comp_unit
struct dwarf2_per_cu_data *mid_cu;
int mid = low + (high - low) / 2;
- mid_cu = all_comp_units[mid];
+ mid_cu = all_comp_units[mid].get ();
if (mid_cu->is_dwz > offset_in_dwz
|| (mid_cu->is_dwz == offset_in_dwz
&& mid_cu->sect_off + mid_cu->length > sect_off))
@@ -24743,7 +24740,8 @@ dwarf2_find_containing_comp_unit (sect_offset sect_off,
{
int low = dwarf2_find_containing_comp_unit
(sect_off, offset_in_dwz, per_objfile->per_bfd->all_comp_units);
- dwarf2_per_cu_data *this_cu = per_objfile->per_bfd->all_comp_units[low];
+ dwarf2_per_cu_data *this_cu
+ = per_objfile->per_bfd->all_comp_units[low].get ();
if (this_cu->is_dwz != offset_in_dwz || this_cu->sect_off > sect_off)
{
@@ -24755,7 +24753,7 @@ dwarf2_find_containing_comp_unit (sect_offset sect_off,
gdb_assert (per_objfile->per_bfd->all_comp_units[low-1]->sect_off
<= sect_off);
- return per_objfile->per_bfd->all_comp_units[low-1];
+ return per_objfile->per_bfd->all_comp_units[low - 1].get ();
}
else
{
@@ -24775,42 +24773,46 @@ namespace find_containing_comp_unit {
static void
run_test ()
{
- struct dwarf2_per_cu_data one {};
- struct dwarf2_per_cu_data two {};
- struct dwarf2_per_cu_data three {};
- struct dwarf2_per_cu_data four {};
-
- one.length = 5;
- two.sect_off = sect_offset (one.length);
- two.length = 7;
-
- three.length = 5;
- three.is_dwz = 1;
- four.sect_off = sect_offset (three.length);
- four.length = 7;
- four.is_dwz = 1;
-
- std::vector<dwarf2_per_cu_data *> units;
- units.push_back (&one);
- units.push_back (&two);
- units.push_back (&three);
- units.push_back (&four);
+ std::unique_ptr<dwarf2_per_cu_data> one (new dwarf2_per_cu_data);
+ dwarf2_per_cu_data *one_ptr = one.get ();
+ std::unique_ptr<dwarf2_per_cu_data> two (new dwarf2_per_cu_data);
+ dwarf2_per_cu_data *two_ptr = two.get ();
+ std::unique_ptr<dwarf2_per_cu_data> three (new dwarf2_per_cu_data);
+ dwarf2_per_cu_data *three_ptr = three.get ();
+ std::unique_ptr<dwarf2_per_cu_data> four (new dwarf2_per_cu_data);
+ dwarf2_per_cu_data *four_ptr = four.get ();
+
+ one->length = 5;
+ two->sect_off = sect_offset (one->length);
+ two->length = 7;
+
+ three->length = 5;
+ three->is_dwz = 1;
+ four->sect_off = sect_offset (three->length);
+ four->length = 7;
+ four->is_dwz = 1;
+
+ std::vector<std::unique_ptr<dwarf2_per_cu_data>> units;
+ units.push_back (std::move (one));
+ units.push_back (std::move (two));
+ units.push_back (std::move (three));
+ units.push_back (std::move (four));
int result;
result = dwarf2_find_containing_comp_unit (sect_offset (0), 0, units);
- SELF_CHECK (units[result] == &one);
+ SELF_CHECK (units[result].get () == one_ptr);
result = dwarf2_find_containing_comp_unit (sect_offset (3), 0, units);
- SELF_CHECK (units[result] == &one);
+ SELF_CHECK (units[result].get () == one_ptr);
result = dwarf2_find_containing_comp_unit (sect_offset (5), 0, units);
- SELF_CHECK (units[result] == &two);
+ SELF_CHECK (units[result].get () == two_ptr);
result = dwarf2_find_containing_comp_unit (sect_offset (0), 1, units);
- SELF_CHECK (units[result] == &three);
+ SELF_CHECK (units[result].get () == three_ptr);
result = dwarf2_find_containing_comp_unit (sect_offset (3), 1, units);
- SELF_CHECK (units[result] == &three);
+ SELF_CHECK (units[result].get () == three_ptr);
result = dwarf2_find_containing_comp_unit (sect_offset (5), 1, units);
- SELF_CHECK (units[result] == &four);
+ SELF_CHECK (units[result].get () == four_ptr);
}
}
diff --git a/gdb/dwarf2/read.h b/gdb/dwarf2/read.h
index dc25ff1..98ace89 100644
--- a/gdb/dwarf2/read.h
+++ b/gdb/dwarf2/read.h
@@ -120,12 +120,12 @@ struct dwarf2_per_bfd
/* A convenience function to allocate a dwarf2_per_cu_data. The
returned object has its "index" field set properly. The object
is allocated on the dwarf2_per_bfd obstack. */
- dwarf2_per_cu_data *allocate_per_cu ();
+ std::unique_ptr<dwarf2_per_cu_data> allocate_per_cu ();
/* A convenience function to allocate a signatured_type. The
returned object has its "index" field set properly. The object
is allocated on the dwarf2_per_bfd obstack. */
- signatured_type *allocate_signatured_type ();
+ std::unique_ptr<signatured_type> allocate_signatured_type ();
/* Return the number of partial symtabs allocated with allocate_per_cu
and allocate_signatured_type so far. */
@@ -171,10 +171,10 @@ public:
/* Table of all the compilation units. This is used to locate
the target compilation unit of a particular reference. */
- std::vector<dwarf2_per_cu_data *> all_comp_units;
+ std::vector<std::unique_ptr<dwarf2_per_cu_data>> all_comp_units;
/* The .debug_types-related CUs (TUs). */
- std::vector<signatured_type *> all_type_units;
+ std::vector<std::unique_ptr<signatured_type>> all_type_units;
/* Table of struct type_unit_group objects.
The hash key is the DW_AT_stmt_list value. */
@@ -425,16 +425,29 @@ struct dwarf2_psymtab : public partial_symtab
struct dwarf2_per_cu_data
{
+ dwarf2_per_cu_data ()
+ : queued (false),
+ load_all_dies (false),
+ is_debug_types (false),
+ is_dwz (false),
+ reading_dwo_directly (false),
+ tu_read (false),
+ m_header_read_in (false),
+ unit_type {},
+ lang (language_unknown)
+ {
+ }
+
/* The start offset and length of this compilation unit.
NOTE: Unlike comp_unit_head.length, this length includes
initial_length_size.
If the DIE refers to a DWO file, this is always of the original die,
not the DWO file. */
- sect_offset sect_off;
- unsigned int length;
+ sect_offset sect_off {};
+ unsigned int length = 0;
/* DWARF standard version this data has been read from (such as 4 or 5). */
- unsigned char dwarf_version;
+ unsigned char dwarf_version = 0;
/* Flag indicating this compilation unit will be read in before
any of the current compilation units are processed. */
@@ -483,15 +496,15 @@ struct dwarf2_per_cu_data
ENUM_BITFIELD (language) lang : LANGUAGE_BITS;
/* Our index in the unshared "symtabs" vector. */
- unsigned index;
+ unsigned index = 0;
/* The section this CU/TU lives in.
If the DIE refers to a DWO file, this is always the original die,
not the DWO file. */
- struct dwarf2_section_info *section;
+ struct dwarf2_section_info *section = nullptr;
/* Backlink to the owner of this. */
- dwarf2_per_bfd *per_bfd;
+ dwarf2_per_bfd *per_bfd = nullptr;
/* DWARF header of this CU. Note that dwarf2_cu reads its own version of the
header, which may differ from this one, since it may pass rcuh_kind::TYPE
@@ -500,7 +513,7 @@ struct dwarf2_per_cu_data
Don't access this field directly, use the get_header method instead. It
should be private, but we can't make it private at the moment. */
- mutable comp_unit_head m_header;
+ mutable comp_unit_head m_header {};
/* When dwarf2_per_bfd::using_index is true, the 'quick' field
is active. Otherwise, the 'psymtab' field is active. */
@@ -512,7 +525,7 @@ struct dwarf2_per_cu_data
/* Data needed by the "quick" functions. */
struct dwarf2_per_cu_quick_data *quick;
- } v;
+ } v {};
/* The CUs we import using DW_TAG_imported_unit. This is filled in
while reading psymtabs, used to compute the psymtab dependencies,
@@ -538,7 +551,7 @@ struct dwarf2_per_cu_data
could be refactored to make this private. Until then please try to
avoid direct access to this member, and instead use the helper
functions above. */
- std::vector <dwarf2_per_cu_data *> *imported_symtabs;
+ std::vector <dwarf2_per_cu_data *> *imported_symtabs = nullptr;
/* Return true of IMPORTED_SYMTABS is empty or not yet allocated. */
bool imported_symtabs_empty () const
@@ -602,36 +615,30 @@ struct dwarf2_per_cu_data
/* Entry in the signatured_types hash table. */
-struct signatured_type
+struct signatured_type : public dwarf2_per_cu_data
{
- /* The "per_cu" object of this type.
- This struct is used iff per_cu.is_debug_types.
- N.B.: This is the first member so that it's easy to convert pointers
- between them. */
- struct dwarf2_per_cu_data per_cu;
-
/* The type's signature. */
- ULONGEST signature;
+ ULONGEST signature = 0;
/* Offset in the TU of the type's DIE, as read from the TU header.
If this TU is a DWO stub and the definition lives in a DWO file
(specified by DW_AT_GNU_dwo_name), this value is unusable. */
- cu_offset type_offset_in_tu;
+ cu_offset type_offset_in_tu {};
/* Offset in the section of the type's DIE.
If the definition lives in a DWO file, this is the offset in the
.debug_types.dwo section.
The value is zero until the actual value is known.
Zero is otherwise not a valid section offset. */
- sect_offset type_offset_in_section;
+ sect_offset type_offset_in_section {};
/* Type units are grouped by their DW_AT_stmt_list entry so that they
can share them. This points to the containing symtab. */
- struct type_unit_group *type_unit_group;
+ struct type_unit_group *type_unit_group = nullptr;
/* Containing DWO unit.
This field is valid iff per_cu.reading_dwo_directly. */
- struct dwo_unit *dwo_unit;
+ struct dwo_unit *dwo_unit = nullptr;
};
/* Return the type of the DIE at DIE_OFFSET in the CU named by