forked from Imagelibrary/binutils-gdb
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.
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user