aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2023-12-02 15:42:42 -0700
committerTom Tromey <tom@tromey.com>2024-01-18 08:20:16 -0700
commit5902fa8a555c43780dedfde1ed1a8be933b395f9 (patch)
tree7ab1bced2ed6fb73f5446b61048b86eb1c43f74a
parent374807b60751a5f890005d16dd8b466b22185a3f (diff)
downloadgdb-5902fa8a555c43780dedfde1ed1a8be933b395f9.zip
gdb-5902fa8a555c43780dedfde1ed1a8be933b395f9.tar.gz
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.
-rw-r--r--gdb/dwarf2/cooked-index.c22
-rw-r--r--gdb/dwarf2/cooked-index.h14
-rw-r--r--gdb/dwarf2/index-write.c4
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