From: Tom Tromey Date: Sat, 2 Dec 2023 22:42:42 +0000 (-0700) Subject: Add language to cooked_index_entry X-Git-Tag: gdb-15-branchpoint~1228 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5902fa8a555c43780dedfde1ed1a8be933b395f9;p=thirdparty%2Fbinutils-gdb.git Add language to cooked_index_entry This adds a new 'lang' member to cooked_index_entry. This holds the language of the symbol. This is primarily useful for the new .debug_names reader, which will not scan the CUs for languages up front. This also changes cooked_index_shard::add to return a non-const pointer. This doesn't impact the current code, but is needed for the new reader. --- diff --git a/gdb/dwarf2/cooked-index.c b/gdb/dwarf2/cooked-index.c index f15ae9c28df..54c622977b1 100644 --- a/gdb/dwarf2/cooked-index.c +++ b/gdb/dwarf2/cooked-index.c @@ -207,7 +207,7 @@ cooked_index_entry::full_name (struct obstack *storage, bool for_main) const return local_name; const char *sep = nullptr; - switch (per_cu->lang ()) + switch (lang) { case language_cplus: case language_rust: @@ -247,11 +247,12 @@ cooked_index_entry::write_scope (struct obstack *storage, cooked_index_entry * cooked_index_shard::add (sect_offset die_offset, enum dwarf_tag tag, - cooked_index_flag flags, const char *name, + cooked_index_flag flags, enum language lang, + const char *name, cooked_index_entry_ref parent_entry, dwarf2_per_cu_data *per_cu) { - cooked_index_entry *result = create (die_offset, tag, flags, name, + cooked_index_entry *result = create (die_offset, tag, flags, lang, name, parent_entry, per_cu); m_entries.push_back (result); @@ -262,7 +263,7 @@ cooked_index_shard::add (sect_offset die_offset, enum dwarf_tag tag, else if ((flags & IS_PARENT_DEFERRED) == 0 && parent_entry.resolved == nullptr && m_main == nullptr - && language_may_use_plain_main (per_cu->lang ()) + && language_may_use_plain_main (lang) && strcmp (name, "main") == 0) m_main = result; @@ -301,7 +302,7 @@ cooked_index_shard::handle_gnat_encoded_entry (cooked_index_entry *entry, gdb::unique_xmalloc_ptr new_name = make_unique_xstrndup (name.data (), name.length ()); last = create (entry->die_offset, DW_TAG_namespace, - 0, new_name.get (), parent, + 0, language_ada, new_name.get (), parent, entry->per_cu); last->canonical = last->name; m_names.push_back (std::move (new_name)); @@ -364,7 +365,7 @@ cooked_index_shard::finalize () gdb_assert (entry->canonical == nullptr); if ((entry->flags & IS_LINKAGE) != 0) entry->canonical = entry->name; - else if (entry->per_cu->lang () == language_ada) + else if (entry->lang == language_ada) { gdb::unique_xmalloc_ptr canon_name = handle_gnat_encoded_entry (entry, gnat_entries.get ()); @@ -376,15 +377,14 @@ cooked_index_shard::finalize () m_names.push_back (std::move (canon_name)); } } - else if (entry->per_cu->lang () == language_cplus - || entry->per_cu->lang () == language_c) + else if (entry->lang == language_cplus || entry->lang == language_c) { void **slot = htab_find_slot (seen_names.get (), entry, INSERT); if (*slot == nullptr) { gdb::unique_xmalloc_ptr canon_name - = (entry->per_cu->lang () == language_cplus + = (entry->lang == language_cplus ? cp_canonicalize_string (entry->name) : c_canonicalize_name (entry->name)); if (canon_name == nullptr) @@ -572,7 +572,7 @@ cooked_index::get_main_name (struct obstack *obstack, enum language *lang) if (entry == nullptr) return nullptr; - *lang = entry->per_cu->lang (); + *lang = entry->lang; return entry->full_name (obstack, true); } @@ -595,7 +595,7 @@ cooked_index::get_main () const { if ((entry->flags & IS_MAIN) != 0) { - if (!language_requires_canonicalization (entry->per_cu->lang ())) + if (!language_requires_canonicalization (entry->lang)) { /* There won't be one better than this. */ return entry; diff --git a/gdb/dwarf2/cooked-index.h b/gdb/dwarf2/cooked-index.h index 691a027704a..6caa8132f53 100644 --- a/gdb/dwarf2/cooked-index.h +++ b/gdb/dwarf2/cooked-index.h @@ -107,12 +107,14 @@ extern bool language_requires_canonicalization (enum language lang); struct cooked_index_entry : public allocate_on_obstack { cooked_index_entry (sect_offset die_offset_, enum dwarf_tag tag_, - cooked_index_flag flags_, const char *name_, + cooked_index_flag flags_, + enum language lang_, const char *name_, cooked_index_entry_ref parent_entry_, dwarf2_per_cu_data *per_cu_) : name (name_), tag (tag_), flags (flags_), + lang (lang_), die_offset (die_offset_), per_cu (per_cu_), m_parent_entry (parent_entry_) @@ -281,6 +283,8 @@ struct cooked_index_entry : public allocate_on_obstack enum dwarf_tag tag; /* Any flags attached to this entry. */ cooked_index_flag flags; + /* The language of this symbol. */ + ENUM_BITFIELD (language) lang : LANGUAGE_BITS; /* The offset of this DIE. */ sect_offset die_offset; /* The CU from which this entry originates. */ @@ -318,7 +322,7 @@ public: /* Create a new cooked_index_entry and register it with this object. Entries are owned by this object. The new item is returned. */ cooked_index_entry *add (sect_offset die_offset, enum dwarf_tag tag, - cooked_index_flag flags, + cooked_index_flag flags, enum language lang, const char *name, cooked_index_entry_ref parent_entry, dwarf2_per_cu_data *per_cu); @@ -370,12 +374,13 @@ private: cooked_index_entry *create (sect_offset die_offset, enum dwarf_tag tag, cooked_index_flag flags, + enum language lang, const char *name, cooked_index_entry_ref parent_entry, dwarf2_per_cu_data *per_cu) { return new (&m_storage) cooked_index_entry (die_offset, tag, flags, - name, parent_entry, + lang, name, parent_entry, per_cu); } @@ -439,7 +444,8 @@ public: cooked_index_entry_ref parent_entry, dwarf2_per_cu_data *per_cu) { - return m_index->add (die_offset, tag, flags, name, parent_entry, per_cu); + return m_index->add (die_offset, tag, flags, per_cu->lang (), + name, parent_entry, per_cu); } /* Install the current addrmap into the shard being constructed, diff --git a/gdb/dwarf2/index-write.c b/gdb/dwarf2/index-write.c index 081046d4237..2decee62a4c 100644 --- a/gdb/dwarf2/index-write.c +++ b/gdb/dwarf2/index-write.c @@ -1282,7 +1282,7 @@ write_cooked_index (cooked_index *table, const char *name = entry->full_name (symtab->obstack ()); - if (entry->per_cu->lang () == language_ada) + if (entry->lang == language_ada) { /* In order for the index to work when read back into gdb, it has to use the encoded name, with any @@ -1290,7 +1290,7 @@ write_cooked_index (cooked_index *table, std::string encoded = ada_encode (name, false); name = obstack_strdup (symtab->obstack (), encoded.c_str ()); } - else if (entry->per_cu->lang () == language_cplus + else if (entry->lang == language_cplus && (entry->flags & IS_LINKAGE) != 0) { /* GDB never put C++ linkage names into .gdb_index. The