]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Add language to cooked_index_entry
authorTom Tromey <tom@tromey.com>
Sat, 2 Dec 2023 22:42:42 +0000 (15:42 -0700)
committerTom Tromey <tom@tromey.com>
Thu, 18 Jan 2024 15:20:16 +0000 (08:20 -0700)
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
gdb/dwarf2/cooked-index.h
gdb/dwarf2/index-write.c

index f15ae9c28dfa22613938647f81b42041d3a8a3e7..54c622977b16eaf1becf21be8278a4abc891e3f1 100644 (file)
@@ -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;
index 691a027704ae55c35f1363bd7775a1fb873f2ba2..6caa8132f537f5da934b027da3096873354679d5 100644 (file)
@@ -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,
index 081046d42379649fab000b81b4d5e47675b0b93b..2decee62a4c9752a2e65f011c4542bf4e9dc026a 100644 (file)
@@ -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