diff options
author | Tom de Vries <tdevries@suse.de> | 2020-06-10 14:46:53 +0200 |
---|---|---|
committer | Tom de Vries <tdevries@suse.de> | 2020-06-10 14:46:53 +0200 |
commit | 7ab967941150b2f79fc089893bf51e6bb53d245b (patch) | |
tree | b3bb8366a5e5844465c99d99b2b1b0b6daa88b7d /gdb/dwarf2 | |
parent | e5f3ece2ab3b14677c87d9694d822c9ee01b36fe (diff) | |
download | gdb-7ab967941150b2f79fc089893bf51e6bb53d245b.zip gdb-7ab967941150b2f79fc089893bf51e6bb53d245b.tar.gz gdb-7ab967941150b2f79fc089893bf51e6bb53d245b.tar.bz2 |
[gdb/symtab] Enable ada .gdb_index
Currently the .gdb_index is not enabled for ada executables (PR24713).
Fix this by adding the required support in write_psymbols, similar to how that
is done for .debug_names in debug_names::insert.
Tested on x86_64-linux, with native and target board cc-with-gdb-index.
gdb/ChangeLog:
2020-06-10 Tom de Vries <tdevries@suse.de>
PR ada/24713
* dwarf2/index-write.c (struct mapped_symtab): Add m_string_obstack.
(write_psymbols): Enable .gdb_index for ada.
* dwarf2/read.c: Remove comment stating .gdb_index is unsupported for
ada.
gdb/testsuite/ChangeLog:
2020-06-10 Tom de Vries <tdevries@suse.de>
* gdb.ada/ptype_union.exp: Remove PR24713 workaround.
Diffstat (limited to 'gdb/dwarf2')
-rw-r--r-- | gdb/dwarf2/index-write.c | 40 | ||||
-rw-r--r-- | gdb/dwarf2/read.c | 3 |
2 files changed, 36 insertions, 7 deletions
diff --git a/gdb/dwarf2/index-write.c b/gdb/dwarf2/index-write.c index eabb67f..97b2310 100644 --- a/gdb/dwarf2/index-write.c +++ b/gdb/dwarf2/index-write.c @@ -184,6 +184,9 @@ struct mapped_symtab offset_type n_elements = 0; std::vector<symtab_index_entry> data; + + /* Temporary storage for Ada names. */ + auto_obstack m_string_obstack; }; /* Find a slot in SYMTAB for the symbol NAME. Returns a reference to @@ -543,18 +546,47 @@ write_psymbols (struct mapped_symtab *symtab, for (; count-- > 0; ++psymp) { struct partial_symbol *psym = *psymp; + const char *name = psym->ginfo.search_name (); if (psym->ginfo.language () == language_ada) - error (_("Ada is not currently supported by the index; " - "use the DWARF 5 index instead")); + { + /* 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 (strcmp (main_name (), name) == 0) + { + gdb_index_symbol_kind kind = symbol_kind (psym); + + add_index_entry (symtab, name, is_static, kind, cu_index); + } + + /* In order for the index to work when read back into gdb, it + has to supply a funny form of the name: it should be the + encoded name, with any suffixes stripped. Using the + ordinary encoded name will not work properly with the + searching logic in find_name_components_bounds; nor will + using the decoded name. Furthermore, an Ada "verbatim" + name (of the form "<MumBle>") must be entered without the + angle brackets. Note that the current index is unusual, + see PR symtab/24820 for details. */ + std::string decoded = ada_decode (name); + if (decoded[0] == '<') + name = (char *) obstack_copy0 (&symtab->m_string_obstack, + decoded.c_str () + 1, + decoded.length () - 2); + else + name = obstack_strdup (&symtab->m_string_obstack, + ada_encode (decoded.c_str ())); + } /* Only add a given psymbol once. */ if (psyms_seen.insert (psym).second) { gdb_index_symbol_kind kind = symbol_kind (psym); - add_index_entry (symtab, psym->ginfo.search_name (), - is_static, kind, cu_index); + add_index_entry (symtab, name, is_static, kind, cu_index); } } } diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index c33f0a1..e3073fe 100644 --- a/gdb/dwarf2/read.c +++ b/gdb/dwarf2/read.c @@ -3778,9 +3778,6 @@ dw2_map_matching_symbols if (per_objfile->per_bfd->index_table != nullptr) { - /* Ada currently doesn't support .gdb_index (see PR24713). We can get - here though if the current language is Ada for a non-Ada objfile - using GNU index. */ mapped_index &index = *per_objfile->per_bfd->index_table; const char *match_name = name.ada ().lookup_name ().c_str (); |