diff options
author | Tom Tromey <tom@tromey.com> | 2023-12-02 15:42:42 -0700 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2024-01-18 08:20:16 -0700 |
commit | 5902fa8a555c43780dedfde1ed1a8be933b395f9 (patch) | |
tree | 7ab1bced2ed6fb73f5446b61048b86eb1c43f74a /gdb/dwarf2 | |
parent | 374807b60751a5f890005d16dd8b466b22185a3f (diff) | |
download | fsf-binutils-gdb-5902fa8a555c43780dedfde1ed1a8be933b395f9.zip fsf-binutils-gdb-5902fa8a555c43780dedfde1ed1a8be933b395f9.tar.gz fsf-binutils-gdb-5902fa8a555c43780dedfde1ed1a8be933b395f9.tar.bz2 |
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.
Diffstat (limited to 'gdb/dwarf2')
-rw-r--r-- | gdb/dwarf2/cooked-index.c | 22 | ||||
-rw-r--r-- | gdb/dwarf2/cooked-index.h | 14 | ||||
-rw-r--r-- | gdb/dwarf2/index-write.c | 4 |
3 files changed, 23 insertions, 17 deletions
diff --git a/gdb/dwarf2/cooked-index.c b/gdb/dwarf2/cooked-index.c index f15ae9c..54c6229 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<char> 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<char> 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<char> 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 691a027..6caa813 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 081046d..2decee6 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 |