gdb/dwarf: change a bunch of functions to be methods of cooked_index_worker_debug_info

Move a few functions exclusively used to process units to become methods
of cooked_index_worker_debug_info.  Rename them to a more consistent
name scheme, which gets rid of outdated naming.  The comments were also
quite outdated.

Change-Id: I2e7dcc2e4ff372007dcb4f6c3d34187c9cc2da05
Approved-By: Tom Tromey <tom@tromey.com>
This commit is contained in:
Simon Marchi
2025-04-29 15:57:49 -04:00
parent 0bd12b5c06
commit 2c00fd5c6c

View File

@@ -734,9 +734,6 @@ show_dwarf_synchronous (struct ui_file *file, int from_tty,
/* local function prototypes */ /* local function prototypes */
static void build_type_psymtabs_reader (cutu_reader *reader,
cooked_index_worker_result *storage);
static void var_decode_location (struct attribute *attr, static void var_decode_location (struct attribute *attr,
struct symbol *sym, struct symbol *sym,
struct dwarf2_cu *cu); struct dwarf2_cu *cu);
@@ -3250,7 +3247,32 @@ private:
/* Process a batch of CUs. This may be called multiple times in /* Process a batch of CUs. This may be called multiple times in
separate threads. TASK_NUMBER indicates which task this is -- separate threads. TASK_NUMBER indicates which task this is --
the result is stored in that slot of M_RESULTS. */ the result is stored in that slot of M_RESULTS. */
void process_cus (size_t task_number, unit_iterator first, unit_iterator end); void process_units (size_t task_number, unit_iterator first,
unit_iterator end);
/* Process unit THIS_CU. */
void process_unit (dwarf2_per_cu *this_cu, dwarf2_per_objfile *per_objfile,
cooked_index_worker_result *storage);
/* Process all type units existing in PER_OBJFILE::PER_BFD::ALL_UNITS. */
void process_type_units (dwarf2_per_objfile *per_objfile,
cooked_index_worker_result *storage);
/* Process the type unit wrapped in READER. */
void process_type_unit (cutu_reader *reader,
cooked_index_worker_result *storage);
/* Process all type units of all DWO files.
This is needed in case a TU was emitted without its skeleton.
Note: This can't be done until we know what all the DWO files are. */
void process_skeletonless_type_units (dwarf2_per_objfile *per_objfile,
cooked_index_worker_result *storage);
/* Process the type unit represented by DWO_UNIT. */
void process_skeletonless_type_unit (dwo_unit *dwo_unit,
dwarf2_per_objfile *per_objfile,
cooked_index_worker_result *storage);
/* A storage object for "leftovers" -- see the 'start' method, but /* A storage object for "leftovers" -- see the 'start' method, but
essentially things not parsed during the normal CU parsing essentially things not parsed during the normal CU parsing
@@ -3258,12 +3280,9 @@ private:
cooked_index_worker_result m_index_storage; cooked_index_worker_result m_index_storage;
}; };
/* Subroutine of dwarf2_build_psymtabs_hard to simplify it. void
Process compilation unit THIS_CU for a psymtab. */ cooked_index_worker_debug_info::process_unit
(dwarf2_per_cu *this_cu, dwarf2_per_objfile *per_objfile,
static void
process_psymtab_comp_unit (dwarf2_per_cu *this_cu,
dwarf2_per_objfile *per_objfile,
cooked_index_worker_result *storage) cooked_index_worker_result *storage)
{ {
cutu_reader *reader = storage->get_reader (this_cu); cutu_reader *reader = storage->get_reader (this_cu);
@@ -3286,7 +3305,7 @@ process_psymtab_comp_unit (dwarf2_per_cu *this_cu,
return; return;
if (this_cu->is_debug_types) if (this_cu->is_debug_types)
build_type_psymtabs_reader (reader, storage); process_type_unit (reader, storage);
else if (reader->top_level_die ()->tag != DW_TAG_partial_unit) else if (reader->top_level_die ()->tag != DW_TAG_partial_unit)
{ {
bool nope = false; bool nope = false;
@@ -3299,11 +3318,9 @@ process_psymtab_comp_unit (dwarf2_per_cu *this_cu,
} }
} }
/* Reader function for build_type_psymtabs. */ void
cooked_index_worker_debug_info::process_type_unit
static void (cutu_reader *reader, cooked_index_worker_result *storage)
build_type_psymtabs_reader (cutu_reader *reader,
cooked_index_worker_result *storage)
{ {
struct dwarf2_cu *cu = reader->cu (); struct dwarf2_cu *cu = reader->cu ();
dwarf2_per_cu *per_cu = cu->per_cu; dwarf2_per_cu *per_cu = cu->per_cu;
@@ -3337,26 +3354,9 @@ struct tu_abbrev_offset
sect_offset abbrev_offset; sect_offset abbrev_offset;
}; };
/* Efficiently read all the type units. void
cooked_index_worker_debug_info::process_type_units
The efficiency is because we sort TUs by the abbrev table they use and (dwarf2_per_objfile *per_objfile, cooked_index_worker_result *storage)
only read each abbrev table once. In one program there are 200K TUs
sharing 8K abbrev tables.
The main purpose of this function is to support building the
dwarf2_per_objfile->per_bfd->type_unit_groups table.
TUs typically share the DW_AT_stmt_list of the CU they came from, so we
can collapse the search space by grouping them by stmt_list.
The savings can be significant, in the same program from above the 200K TUs
share 8K stmt_list tables.
FUNC is expected to call get_type_unit_group, which will create the
struct type_unit_group if necessary and add it to
dwarf2_per_objfile->per_bfd->type_unit_groups. */
static void
build_type_psymtabs (dwarf2_per_objfile *per_objfile,
cooked_index_worker_result *storage)
{ {
struct tu_stats *tu_stats = &per_objfile->per_bfd->tu_stats; struct tu_stats *tu_stats = &per_objfile->per_bfd->tu_stats;
abbrev_table_up abbrev_table; abbrev_table_up abbrev_table;
@@ -3422,16 +3422,13 @@ build_type_psymtabs (dwarf2_per_objfile *per_objfile,
abbrev_table.get (), nullptr, false, abbrev_table.get (), nullptr, false,
language_minimal); language_minimal);
if (!reader.is_dummy ()) if (!reader.is_dummy ())
build_type_psymtabs_reader (&reader, storage); process_type_unit (&reader, storage);
} }
} }
/* Traversal function for process_skeletonless_type_units. void
Read a TU in a DWO file and build partial symbols for it. */ cooked_index_worker_debug_info::process_skeletonless_type_unit
(dwo_unit *dwo_unit, dwarf2_per_objfile *per_objfile,
static void
process_skeletonless_type_unit (dwo_unit *dwo_unit,
dwarf2_per_objfile *per_objfile,
cooked_index_worker_result *storage) cooked_index_worker_result *storage)
{ {
dwarf2_per_bfd *per_bfd = per_objfile->per_bfd; dwarf2_per_bfd *per_bfd = per_objfile->per_bfd;
@@ -3454,16 +3451,12 @@ process_skeletonless_type_unit (dwo_unit *dwo_unit,
cutu_reader reader (**sig_type_it, *per_objfile, nullptr, nullptr, false, cutu_reader reader (**sig_type_it, *per_objfile, nullptr, nullptr, false,
language_minimal); language_minimal);
if (!reader.is_dummy ()) if (!reader.is_dummy ())
build_type_psymtabs_reader (&reader, storage); process_type_unit (&reader, storage);
} }
/* Scan all TUs of DWO files, verifying we've processed them. void
This is needed in case a TU was emitted without its skeleton. cooked_index_worker_debug_info::process_skeletonless_type_units
Note: This can't be done until we know what all the DWO files are. */ (dwarf2_per_objfile *per_objfile, cooked_index_worker_result *storage)
static void
process_skeletonless_type_units (dwarf2_per_objfile *per_objfile,
cooked_index_worker_result *storage)
{ {
scoped_time_it time_it ("DWARF skeletonless type units"); scoped_time_it time_it ("DWARF skeletonless type units");
@@ -3475,7 +3468,7 @@ process_skeletonless_type_units (dwarf2_per_objfile *per_objfile,
} }
void void
cooked_index_worker_debug_info::process_cus (size_t task_number, cooked_index_worker_debug_info::process_units (size_t task_number,
unit_iterator first, unit_iterator first,
unit_iterator end) unit_iterator end)
{ {
@@ -3492,7 +3485,7 @@ cooked_index_worker_debug_info::process_cus (size_t task_number,
try try
{ {
process_psymtab_comp_unit (per_cu, m_per_objfile, &thread_storage); process_unit (per_cu, m_per_objfile, &thread_storage);
} }
catch (gdb_exception &except) catch (gdb_exception &except)
{ {
@@ -3522,7 +3515,7 @@ cooked_index_worker_debug_info::do_reading ()
dwarf2_per_bfd *per_bfd = m_per_objfile->per_bfd; dwarf2_per_bfd *per_bfd = m_per_objfile->per_bfd;
create_all_units (m_per_objfile); create_all_units (m_per_objfile);
build_type_psymtabs (m_per_objfile, &m_index_storage); process_type_units (m_per_objfile, &m_index_storage);
if (!per_bfd->debug_aranges.empty ()) if (!per_bfd->debug_aranges.empty ())
read_addrmap_from_aranges (m_per_objfile, &per_bfd->debug_aranges, read_addrmap_from_aranges (m_per_objfile, &per_bfd->debug_aranges,
@@ -3576,7 +3569,7 @@ cooked_index_worker_debug_info::do_reading ()
workers.add_task ([this, task_count, iter, last] () workers.add_task ([this, task_count, iter, last] ()
{ {
scoped_time_it time_it ("DWARF indexing worker"); scoped_time_it time_it ("DWARF indexing worker");
process_cus (task_count, iter, last); process_units (task_count, iter, last);
}); });
++task_count; ++task_count;