From: Tom Tromey Date: Wed, 27 May 2020 15:13:49 +0000 (-0400) Subject: Add dwarf2_per_cu_data::index X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=d3473f0c4b8e8d791ed87b1919a666bc368497dc;p=binutils-gdb.git Add dwarf2_per_cu_data::index Currently, a dwarf2_per_cu_data can hold a link to the corresponding expanded compunit_symtab. However, the dwarf2_per_cu_data objects are shared across objfiles, a simple pointer won't work: each objfile sharing the dwarf2_per_cu_data instance will have a corresponding compunit_symtab. Instead, this link will be stored in the dwarf2_per_objfile object (which will contain the objfile-specific data). To enable this, we add an index to each dwarf2_per_cu_data and signatured_type. The data structure in the dwarf2_per_objfile will use this new index to map a dwarf2_per_cu_data to its corresponding compunit_symtab, for this objfile. gdb/ChangeLog: * dwarf2/read.h (struct dwarf2_per_objfile) : Declare new methods. : New member. (struct dwarf2_per_cu_data) : New member. * dwarf2/read.c (dwarf2_per_objfile::allocate_per_cu) (dwarf2_per_objfile::allocate_signatured_type): New methods. (create_cu_from_index_list): Use allocate_per_cu. (create_signatured_type_table_from_index) (create_signatured_type_table_from_debug_names) (create_debug_type_hash_table, add_type_unit) (read_comp_units_from_section): Use allocate_signatured_type. Change-Id: I7733479a38ce82a5015cb184c8acce5f8bbf2e69 --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 2bf42407ced..4f49e3992c8 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,17 @@ +2020-05-27 Tom Tromey + + * dwarf2/read.h (struct dwarf2_per_objfile) : Declare new methods. + : New member. + (struct dwarf2_per_cu_data) : New member. + * dwarf2/read.c (dwarf2_per_objfile::allocate_per_cu) + (dwarf2_per_objfile::allocate_signatured_type): New methods. + (create_cu_from_index_list): Use allocate_per_cu. + (create_signatured_type_table_from_index) + (create_signatured_type_table_from_debug_names) + (create_debug_type_hash_table, add_type_unit) + (read_comp_units_from_section): Use allocate_signatured_type. + 2020-05-27 Tom Tromey * psymtab.c (partial_map_expand_apply) diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index 59f3a08f6e0..8b4f3858565 100644 --- a/gdb/dwarf2/read.c +++ b/gdb/dwarf2/read.c @@ -2408,6 +2408,26 @@ dwarf2_per_objfile::get_tu (int index) return this->all_type_units[index]; } +/* See read.h. */ + +dwarf2_per_cu_data * +dwarf2_per_objfile::allocate_per_cu () +{ + dwarf2_per_cu_data *result = OBSTACK_ZALLOC (&obstack, dwarf2_per_cu_data); + result->index = m_num_psymtabs++; + return result; +} + +/* See read.h. */ + +signatured_type * +dwarf2_per_objfile::allocate_signatured_type () +{ + signatured_type *result = OBSTACK_ZALLOC (&obstack, signatured_type); + result->per_cu.index = m_num_psymtabs++; + return result; +} + /* Return a new dwarf2_per_cu_data allocated on the dwarf2_per_objfile obstack, and constructed with the specified field values. */ @@ -2417,9 +2437,7 @@ create_cu_from_index_list (struct dwarf2_per_objfile *dwarf2_per_objfile, int is_dwz, sect_offset sect_off, ULONGEST length) { - dwarf2_per_cu_data *the_cu - = OBSTACK_ZALLOC (&dwarf2_per_objfile->obstack, - struct dwarf2_per_cu_data); + dwarf2_per_cu_data *the_cu = dwarf2_per_objfile->allocate_per_cu (); the_cu->sect_off = sect_off; the_cu->length = length; the_cu->dwarf2_per_objfile = dwarf2_per_objfile; @@ -2508,8 +2526,7 @@ create_signatured_type_table_from_index signature = extract_unsigned_integer (bytes + 16, 8, BFD_ENDIAN_LITTLE); bytes += 3 * 8; - sig_type = OBSTACK_ZALLOC (&dwarf2_per_objfile->obstack, - struct signatured_type); + sig_type = dwarf2_per_objfile->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; @@ -2565,8 +2582,7 @@ create_signatured_type_table_from_debug_names section->buffer + to_underlying (sect_off), rcuh_kind::TYPE); - sig_type = OBSTACK_ZALLOC (&dwarf2_per_objfile->obstack, - struct signatured_type); + sig_type = dwarf2_per_objfile->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; @@ -6242,8 +6258,7 @@ create_debug_type_hash_table (struct dwarf2_per_objfile *dwarf2_per_objfile, /* 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 = OBSTACK_ZALLOC (&dwarf2_per_objfile->obstack, - struct signatured_type); + sig_type = dwarf2_per_objfile->allocate_signatured_type (); sig_type->signature = header.signature; sig_type->type_offset_in_tu = header.type_cu_offset_in_tu; sig_type->per_cu.dwarf2_per_objfile = dwarf2_per_objfile; @@ -6358,8 +6373,7 @@ add_type_unit (struct dwarf2_per_objfile *dwarf2_per_objfile, ULONGEST sig, == dwarf2_per_objfile->all_type_units.capacity ()) ++dwarf2_per_objfile->tu_stats.nr_all_type_units_reallocs; - signatured_type *sig_type = OBSTACK_ZALLOC (&dwarf2_per_objfile->obstack, - struct signatured_type); + signatured_type *sig_type = dwarf2_per_objfile->allocate_signatured_type (); dwarf2_per_objfile->all_type_units.push_back (sig_type); sig_type->signature = sig; @@ -7964,16 +7978,10 @@ read_comp_units_from_section (struct dwarf2_per_objfile *dwarf2_per_objfile, /* Save the compilation unit for later lookup. */ if (cu_header.unit_type != DW_UT_type) - { - this_cu = XOBNEW (&dwarf2_per_objfile->obstack, - struct dwarf2_per_cu_data); - memset (this_cu, 0, sizeof (*this_cu)); - } + this_cu = dwarf2_per_objfile->allocate_per_cu (); else { - auto sig_type = XOBNEW (&dwarf2_per_objfile->obstack, - struct signatured_type); - memset (sig_type, 0, sizeof (*sig_type)); + auto sig_type = dwarf2_per_objfile->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; diff --git a/gdb/dwarf2/read.h b/gdb/dwarf2/read.h index 8dbda90aa59..bbc4f96b7cf 100644 --- a/gdb/dwarf2/read.h +++ b/gdb/dwarf2/read.h @@ -111,6 +111,16 @@ struct dwarf2_per_objfile /* Free all cached compilation units. */ void free_cached_comp_units (); + /* 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_objfile obstack. */ + 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_objfile obstack. */ + signatured_type *allocate_signatured_type (); + /* Return pointer to string at .debug_line_str offset as read from BUF. BUF is assumed to be in a compilation unit described by CU_HEADER. Return *BYTES_READ_PTR count of bytes read from BUF. */ @@ -249,6 +259,12 @@ public: /* CUs that are queued to be read. */ std::queue queue; + +private: + + /* The total number of per_cu and signatured_type objects that have + been created so far for this reader. */ + size_t m_num_psymtabs = 0; }; /* Get the dwarf2_per_objfile associated to OBJFILE. */ @@ -322,6 +338,9 @@ struct dwarf2_per_cu_data This flag is only valid if is_debug_types is true. */ unsigned int tu_read : 1; + /* Our index in the unshared "symtabs" vector. */ + unsigned index; + /* 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. */