Improve Ada support in .gdb_index

The cooked index work changed how .gdb_index is constructed, and in
the process broke .gdb_index support.  This is PR symtab/29179.

This patch partially fixes the problem.  It arranges for Ada names to
be encoded in the form expected by the index code.  In particular,
linkage names for Ada are emitted, including the "main" name; names
are Ada-encoded; and names are no longer case-folded, something that
prevented operator names from round-tripping correctly.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=29179
This commit is contained in:
Tom Tromey 2022-09-22 08:43:47 -06:00
parent acd121de32
commit 5fea979432
3 changed files with 41 additions and 13 deletions

View file

@ -1146,12 +1146,14 @@ ada_fold_name (gdb::string_view name, bool throw_on_error = false)
return fold_storage.c_str ();
}
/* The "encoded" form of DECODED, according to GNAT conventions. */
/* The "encoded" form of DECODED, according to GNAT conventions. If
FOLD is true (the default), case-fold any ordinary symbol. Symbols
with <...> quoting are not folded in any case. */
std::string
ada_encode (const char *decoded)
ada_encode (const char *decoded, bool fold)
{
if (decoded[0] != '<')
if (fold && decoded[0] != '<')
decoded = ada_fold_name (decoded);
return ada_encode_1 (decoded, true);
}

View file

@ -316,7 +316,7 @@ extern struct type *ada_get_base_type (struct type *);
extern struct type *ada_check_typedef (struct type *);
extern std::string ada_encode (const char *);
extern std::string ada_encode (const char *, bool fold = true);
extern const char *ada_enum_name (const char *);

View file

@ -1109,22 +1109,48 @@ write_cooked_index (cooked_index_vector *table,
htab_up var_names (htab_create_alloc (10, htab_hash_string, htab_eq_string,
nullptr, xcalloc, xfree));
const char *main_for_ada = main_name ();
for (const cooked_index_entry *entry : table->all_entries ())
{
/* GDB never put C++ linkage names into .gdb_index. The theory
here is that a linkage name will normally be in the minimal
symbols anyway, so including it in the index is usually
redundant -- and the cases where it would not be redundant
are rare and not worth supporting. */
if (entry->per_cu->lang () == language_cplus
&& (entry->flags & IS_LINKAGE) != 0)
continue;
const auto it = cu_index_htab.find (entry->per_cu);
gdb_assert (it != cu_index_htab.cend ());
const char *name = entry->full_name (&symtab->m_string_obstack);
if (entry->per_cu->lang () == language_ada)
{
/* We want to ensure that the Ada main function's name
appears verbatim in the index. However, this name will
be of the form "_ada_mumble", and will be rewritten by
ada_decode. So, recognize it specially here and add it
to the index by hand. */
if (entry->tag == DW_TAG_subprogram
&& strcmp (main_for_ada, name) == 0)
{
/* Leave it alone. */
}
else
{
/* In order for the index to work when read back into
gdb, it has to use the encoded name, with any
suffixes stripped. */
std::string encoded = ada_encode (name, false);
name = obstack_strdup (&symtab->m_string_obstack,
encoded.c_str ());
}
}
else if (entry->per_cu->lang () == language_cplus
&& (entry->flags & IS_LINKAGE) != 0)
{
/* GDB never put C++ linkage names into .gdb_index. The
theory here is that a linkage name will normally be in
the minimal symbols anyway, so including it in the index
is usually redundant -- and the cases where it would not
be redundant are rare and not worth supporting. */
continue;
}
gdb_index_symbol_kind kind;
if (entry->tag == DW_TAG_subprogram)
kind = GDB_INDEX_SYMBOL_KIND_FUNCTION;