diff options
author | Tom Tromey <tom@tromey.com> | 2020-02-21 17:47:36 -0700 |
---|---|---|
committer | Simon Marchi <simon.marchi@efficios.com> | 2020-05-12 15:24:49 -0400 |
commit | 1b9f401923a87167a2c92ea7d4d94f3fb1c853d6 (patch) | |
tree | f5d7d164584a5260447af7e0c7e0071619178943 | |
parent | db8d868ffa9f7bcb95b8734da0fafd3d7e12919a (diff) | |
download | gdb-1b9f401923a87167a2c92ea7d4d94f3fb1c853d6.zip gdb-1b9f401923a87167a2c92ea7d4d94f3fb1c853d6.tar.gz gdb-1b9f401923a87167a2c92ea7d4d94f3fb1c853d6.tar.bz2 |
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.
2020-02-21 Tom Tromey <tom@tromey.com>
* dwarf2/read.h (struct dwarf2_per_objfile) <allocate_per_cu,
allocate_signatured_type>: Declare new methods.
<m_num_psymtabs>: New member.
(struct dwarf2_per_cu_data) <index>: 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.
-rw-r--r-- | gdb/dwarf2/read.c | 46 | ||||
-rw-r--r-- | gdb/dwarf2/read.h | 19 |
2 files changed, 46 insertions, 19 deletions
diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index 664520f..9217f78 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; @@ -6206,8 +6222,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; @@ -6322,8 +6337,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; @@ -7928,16 +7942,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 8dbda90..bbc4f96 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<dwarf2_queue_item> 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. */ |