Browse Source

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.
users/ARM/gcs-binutils-gdb-master
Tom Tromey 2 years ago
parent
commit
5902fa8a55
  1. 22
      gdb/dwarf2/cooked-index.c
  2. 14
      gdb/dwarf2/cooked-index.h
  3. 4
      gdb/dwarf2/index-write.c

22
gdb/dwarf2/cooked-index.c

@ -207,7 +207,7 @@ cooked_index_entry::full_name (struct obstack *storage, bool for_main) const
return local_name; return local_name;
const char *sep = nullptr; const char *sep = nullptr;
switch (per_cu->lang ()) switch (lang)
{ {
case language_cplus: case language_cplus:
case language_rust: case language_rust:
@ -247,11 +247,12 @@ cooked_index_entry::write_scope (struct obstack *storage,
cooked_index_entry * cooked_index_entry *
cooked_index_shard::add (sect_offset die_offset, enum dwarf_tag tag, 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, cooked_index_entry_ref parent_entry,
dwarf2_per_cu_data *per_cu) 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); parent_entry, per_cu);
m_entries.push_back (result); 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 else if ((flags & IS_PARENT_DEFERRED) == 0
&& parent_entry.resolved == nullptr && parent_entry.resolved == nullptr
&& m_main == nullptr && m_main == nullptr
&& language_may_use_plain_main (per_cu->lang ()) && language_may_use_plain_main (lang)
&& strcmp (name, "main") == 0) && strcmp (name, "main") == 0)
m_main = result; 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 gdb::unique_xmalloc_ptr<char> new_name
= make_unique_xstrndup (name.data (), name.length ()); = make_unique_xstrndup (name.data (), name.length ());
last = create (entry->die_offset, DW_TAG_namespace, last = create (entry->die_offset, DW_TAG_namespace,
0, new_name.get (), parent, 0, language_ada, new_name.get (), parent,
entry->per_cu); entry->per_cu);
last->canonical = last->name; last->canonical = last->name;
m_names.push_back (std::move (new_name)); m_names.push_back (std::move (new_name));
@ -364,7 +365,7 @@ cooked_index_shard::finalize ()
gdb_assert (entry->canonical == nullptr); gdb_assert (entry->canonical == nullptr);
if ((entry->flags & IS_LINKAGE) != 0) if ((entry->flags & IS_LINKAGE) != 0)
entry->canonical = entry->name; 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 gdb::unique_xmalloc_ptr<char> canon_name
= handle_gnat_encoded_entry (entry, gnat_entries.get ()); = handle_gnat_encoded_entry (entry, gnat_entries.get ());
@ -376,15 +377,14 @@ cooked_index_shard::finalize ()
m_names.push_back (std::move (canon_name)); m_names.push_back (std::move (canon_name));
} }
} }
else if (entry->per_cu->lang () == language_cplus else if (entry->lang == language_cplus || entry->lang == language_c)
|| entry->per_cu->lang () == language_c)
{ {
void **slot = htab_find_slot (seen_names.get (), entry, void **slot = htab_find_slot (seen_names.get (), entry,
INSERT); INSERT);
if (*slot == nullptr) if (*slot == nullptr)
{ {
gdb::unique_xmalloc_ptr<char> canon_name gdb::unique_xmalloc_ptr<char> canon_name
= (entry->per_cu->lang () == language_cplus = (entry->lang == language_cplus
? cp_canonicalize_string (entry->name) ? cp_canonicalize_string (entry->name)
: c_canonicalize_name (entry->name)); : c_canonicalize_name (entry->name));
if (canon_name == nullptr) if (canon_name == nullptr)
@ -572,7 +572,7 @@ cooked_index::get_main_name (struct obstack *obstack, enum language *lang)
if (entry == nullptr) if (entry == nullptr)
return nullptr; return nullptr;
*lang = entry->per_cu->lang (); *lang = entry->lang;
return entry->full_name (obstack, true); return entry->full_name (obstack, true);
} }
@ -595,7 +595,7 @@ cooked_index::get_main () const
{ {
if ((entry->flags & IS_MAIN) != 0) 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. */ /* There won't be one better than this. */
return entry; return entry;

14
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 struct cooked_index_entry : public allocate_on_obstack
{ {
cooked_index_entry (sect_offset die_offset_, enum dwarf_tag tag_, 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_, cooked_index_entry_ref parent_entry_,
dwarf2_per_cu_data *per_cu_) dwarf2_per_cu_data *per_cu_)
: name (name_), : name (name_),
tag (tag_), tag (tag_),
flags (flags_), flags (flags_),
lang (lang_),
die_offset (die_offset_), die_offset (die_offset_),
per_cu (per_cu_), per_cu (per_cu_),
m_parent_entry (parent_entry_) m_parent_entry (parent_entry_)
@ -281,6 +283,8 @@ struct cooked_index_entry : public allocate_on_obstack
enum dwarf_tag tag; enum dwarf_tag tag;
/* Any flags attached to this entry. */ /* Any flags attached to this entry. */
cooked_index_flag flags; cooked_index_flag flags;
/* The language of this symbol. */
ENUM_BITFIELD (language) lang : LANGUAGE_BITS;
/* The offset of this DIE. */ /* The offset of this DIE. */
sect_offset die_offset; sect_offset die_offset;
/* The CU from which this entry originates. */ /* The CU from which this entry originates. */
@ -318,7 +322,7 @@ public:
/* Create a new cooked_index_entry and register it with this object. /* Create a new cooked_index_entry and register it with this object.
Entries are owned by this object. The new item is returned. */ 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_entry *add (sect_offset die_offset, enum dwarf_tag tag,
cooked_index_flag flags, cooked_index_flag flags, enum language lang,
const char *name, const char *name,
cooked_index_entry_ref parent_entry, cooked_index_entry_ref parent_entry,
dwarf2_per_cu_data *per_cu); dwarf2_per_cu_data *per_cu);
@ -370,12 +374,13 @@ private:
cooked_index_entry *create (sect_offset die_offset, cooked_index_entry *create (sect_offset die_offset,
enum dwarf_tag tag, enum dwarf_tag tag,
cooked_index_flag flags, cooked_index_flag flags,
enum language lang,
const char *name, const char *name,
cooked_index_entry_ref parent_entry, cooked_index_entry_ref parent_entry,
dwarf2_per_cu_data *per_cu) dwarf2_per_cu_data *per_cu)
{ {
return new (&m_storage) cooked_index_entry (die_offset, tag, flags, return new (&m_storage) cooked_index_entry (die_offset, tag, flags,
name, parent_entry, lang, name, parent_entry,
per_cu); per_cu);
} }
@ -439,7 +444,8 @@ public:
cooked_index_entry_ref parent_entry, cooked_index_entry_ref parent_entry,
dwarf2_per_cu_data *per_cu) 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, /* Install the current addrmap into the shard being constructed,

4
gdb/dwarf2/index-write.c

@ -1282,7 +1282,7 @@ write_cooked_index (cooked_index *table,
const char *name = entry->full_name (symtab->obstack ()); 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 /* In order for the index to work when read back into
gdb, it has to use the encoded name, with any 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); std::string encoded = ada_encode (name, false);
name = obstack_strdup (symtab->obstack (), encoded.c_str ()); 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) && (entry->flags & IS_LINKAGE) != 0)
{ {
/* GDB never put C++ linkage names into .gdb_index. The /* GDB never put C++ linkage names into .gdb_index. The

Loading…
Cancel
Save