Adapt .debug_names writer to new DWARF scanner

This updates the .debug_names writer to work with the new DWARF
scanner.
This commit is contained in:
Tom Tromey
2021-05-29 15:12:44 -06:00
parent 6dd7aa909b
commit 600f5f7027

View File

@@ -664,15 +664,10 @@ public:
enum class unit_kind { cu, tu }; enum class unit_kind { cu, tu };
/* Insert one symbol. */ /* Insert one symbol. */
void insert (const partial_symbol *psym, int cu_index, bool is_static, void insert (int dwarf_tag, const char *name, int cu_index, bool is_static,
unit_kind kind) unit_kind kind, enum language lang)
{ {
const int dwarf_tag = psymbol_tag (psym); if (lang == language_ada)
if (dwarf_tag == 0)
return;
const char *name = psym->ginfo.search_name ();
if (psym->ginfo.language () == language_ada)
{ {
/* We want to ensure that the Ada main function's name appears /* We want to ensure that the Ada main function's name appears
verbatim in the index. However, this name will be of the verbatim in the index. However, this name will be of the
@@ -715,6 +710,28 @@ public:
value_set.emplace (symbol_value (dwarf_tag, cu_index, is_static, kind)); value_set.emplace (symbol_value (dwarf_tag, cu_index, is_static, kind));
} }
void insert (const partial_symbol *psym, int cu_index, bool is_static,
unit_kind kind)
{
const int dwarf_tag = psymbol_tag (psym);
if (dwarf_tag == 0)
return;
const char *name = psym->ginfo.search_name ();
insert (dwarf_tag, name, cu_index, is_static, kind,
psym->ginfo.language ());
}
void insert (const cooked_index_entry *entry)
{
const auto it = m_cu_index_htab.find (entry->per_cu);
gdb_assert (it != m_cu_index_htab.cend ());
const char *name = entry->full_name (&m_string_obstack);
insert (entry->tag, name, it->second, (entry->flags & IS_STATIC) != 0,
entry->per_cu->is_debug_types ? unit_kind::tu : unit_kind::cu,
entry->per_cu->lang);
}
/* Build all the tables. All symbols must be already inserted. /* Build all the tables. All symbols must be already inserted.
This function does not call file_write, caller has to do it This function does not call file_write, caller has to do it
afterwards. */ afterwards. */
@@ -897,6 +914,11 @@ public:
m_debugstrlookup.file_write (file_str); m_debugstrlookup.file_write (file_str);
} }
void add_cu (dwarf2_per_cu_data *per_cu, offset_type index)
{
m_cu_index_htab.emplace (per_cu, index);
}
private: private:
/* Storage for symbol names mapping them to their .debug_str section /* Storage for symbol names mapping them to their .debug_str section
@@ -1211,6 +1233,8 @@ private:
/* Temporary storage for Ada names. */ /* Temporary storage for Ada names. */
auto_obstack m_string_obstack; auto_obstack m_string_obstack;
cu_index_map m_cu_index_htab;
}; };
/* Return iff any of the needed offsets does not fit into 32-bit /* Return iff any of the needed offsets does not fit into 32-bit
@@ -1491,17 +1515,20 @@ write_debug_names (dwarf2_per_objfile *per_objfile,
int types_counter = 0; int types_counter = 0;
for (int i = 0; i < per_objfile->per_bfd->all_comp_units.size (); ++i) for (int i = 0; i < per_objfile->per_bfd->all_comp_units.size (); ++i)
{ {
const dwarf2_per_cu_data *per_cu dwarf2_per_cu_data *per_cu
= per_objfile->per_bfd->all_comp_units[i].get (); = per_objfile->per_bfd->all_comp_units[i].get ();
partial_symtab *psymtab = per_cu->v.psymtab;
int &this_counter = per_cu->is_debug_types ? types_counter : counter; int &this_counter = per_cu->is_debug_types ? types_counter : counter;
data_buf &this_list = per_cu->is_debug_types ? types_cu_list : cu_list; data_buf &this_list = per_cu->is_debug_types ? types_cu_list : cu_list;
partial_symtab *psymtab = (per_objfile->per_bfd->using_index
? nullptr
: per_cu->v.psymtab);
if (psymtab != nullptr && psymtab->user == nullptr) if (psymtab != nullptr && psymtab->user == nullptr)
nametable.recursively_write_psymbols (objfile, psymtab, psyms_seen, nametable.recursively_write_psymbols (objfile, psymtab, psyms_seen,
this_counter); this_counter);
nametable.add_cu (per_cu, this_counter);
this_list.append_uint (nametable.dwarf5_offset_size (), this_list.append_uint (nametable.dwarf5_offset_size (),
dwarf5_byte_order, dwarf5_byte_order,
to_underlying (per_cu->sect_off)); to_underlying (per_cu->sect_off));
@@ -1513,6 +1540,11 @@ write_debug_names (dwarf2_per_objfile *per_objfile,
- per_objfile->per_bfd->tu_stats.nr_tus)); - per_objfile->per_bfd->tu_stats.nr_tus));
gdb_assert (types_counter == per_objfile->per_bfd->tu_stats.nr_tus); gdb_assert (types_counter == per_objfile->per_bfd->tu_stats.nr_tus);
if (per_objfile->per_bfd->using_index)
for (const cooked_index_entry *entry
: per_objfile->per_bfd->cooked_index_table->all_entries ())
nametable.insert (entry);
nametable.build (); nametable.build ();
/* No addr_vec - DWARF-5 uses .debug_aranges generated by GCC. */ /* No addr_vec - DWARF-5 uses .debug_aranges generated by GCC. */