[PATCH 06/17] Add language to cooked_index_entry
Tom Tromey
tom@tromey.com
Sun Dec 10 16:44:55 GMT 2023
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.
---
gdb/dwarf2/cooked-index.c | 24 ++++++++++++------------
gdb/dwarf2/cooked-index.h | 32 +++++++++++++++++++-------------
gdb/dwarf2/index-write.c | 4 ++--
3 files changed, 33 insertions(+), 27 deletions(-)
diff --git a/gdb/dwarf2/cooked-index.c b/gdb/dwarf2/cooked-index.c
index e59835ea11f..d32fb360a4b 100644
--- a/gdb/dwarf2/cooked-index.c
+++ b/gdb/dwarf2/cooked-index.c
@@ -206,7 +206,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:
@@ -244,13 +244,14 @@ cooked_index_entry::write_scope (struct obstack *storage,
/* See cooked-index.h. */
-const cooked_index_entry *
+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,
const cooked_index_entry *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);
@@ -260,7 +261,7 @@ cooked_index_shard::add (sect_offset die_offset, enum dwarf_tag tag,
m_main = result;
else if (parent_entry == 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;
@@ -299,7 +300,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));
@@ -362,7 +363,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 ());
@@ -374,15 +375,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)
@@ -570,7 +570,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);
}
@@ -593,7 +593,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 323c335677b..4e7882204a9 100644
--- a/gdb/dwarf2/cooked-index.h
+++ b/gdb/dwarf2/cooked-index.h
@@ -85,12 +85,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_,
const cooked_index_entry *parent_entry_,
dwarf2_per_cu_data *per_cu_)
: name (name_),
tag (tag_),
flags (flags_),
+ lang (lang_),
die_offset (die_offset_),
parent_entry (parent_entry_),
per_cu (per_cu_)
@@ -229,6 +231,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 parent entry. This is NULL for top-level entries.
@@ -264,11 +268,11 @@ class cooked_index_shard
/* Create a new cooked_index_entry and register it with this object.
Entries are owned by this object. The new item is returned. */
- const cooked_index_entry *add (sect_offset die_offset, enum dwarf_tag tag,
- cooked_index_flag flags,
- const char *name,
- const cooked_index_entry *parent_entry,
- dwarf2_per_cu_data *per_cu);
+ cooked_index_entry *add (sect_offset die_offset, enum dwarf_tag tag,
+ cooked_index_flag flags, enum language lang,
+ const char *name,
+ const cooked_index_entry *parent_entry,
+ dwarf2_per_cu_data *per_cu);
/* Install a new fixed addrmap from the given mutable addrmap. */
void install_addrmap (addrmap_mutable *map)
@@ -316,12 +320,13 @@ class cooked_index_shard
cooked_index_entry *create (sect_offset die_offset,
enum dwarf_tag tag,
cooked_index_flag flags,
+ enum language lang,
const char *name,
const cooked_index_entry *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);
}
@@ -379,13 +384,14 @@ class cooked_index_storage
/* Add an entry to the index. The arguments describe the entry; see
cooked-index.h. The new entry is returned. */
- const cooked_index_entry *add (sect_offset die_offset, enum dwarf_tag tag,
- cooked_index_flag flags,
- const char *name,
- const cooked_index_entry *parent_entry,
- dwarf2_per_cu_data *per_cu)
+ cooked_index_entry *add (sect_offset die_offset, enum dwarf_tag tag,
+ cooked_index_flag flags,
+ const char *name,
+ const cooked_index_entry *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 b4a0117330e..44728e4216d 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
--
2.43.0
More information about the Gdb-patches
mailing list