summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom de Vries <tdevries@suse.de>2020-06-10 14:46:53 +0200
committerTom de Vries <tdevries@suse.de>2020-06-10 14:46:53 +0200
commit7ab967941150b2f79fc089893bf51e6bb53d245b (patch)
treeb3bb8366a5e5844465c99d99b2b1b0b6daa88b7d
parente5f3ece2ab3b14677c87d9694d822c9ee01b36fe (diff)
downloadbinutils-gdb-7ab967941150b2f79fc089893bf51e6bb53d245b.tar.gz
[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.
-rw-r--r--gdb/ChangeLog8
-rw-r--r--gdb/dwarf2/index-write.c40
-rw-r--r--gdb/dwarf2/read.c3
-rw-r--r--gdb/testsuite/ChangeLog4
-rw-r--r--gdb/testsuite/gdb.ada/ptype_union.exp5
5 files changed, 48 insertions, 12 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 40ce7bb546c..91315fafb44 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,13 @@
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.
+
+2020-06-10 Tom de Vries <tdevries@suse.de>
+
* dwarf2/read.c (dw2_symtab_iter_init_common): Factor out of ...
(dw2_symtab_iter_init): ... here. Add variant with "offset_type
namei" instead of "const char *name" argument.
diff --git a/gdb/dwarf2/index-write.c b/gdb/dwarf2/index-write.c
index eabb67fd88d..97b2310656c 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 c33f0a1e682..e3073fe43ce 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 ();
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index dd003656d14..e8306bd87fc 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2020-06-10 Tom de Vries <tdevries@suse.de>
+
+ * gdb.ada/ptype_union.exp: Remove PR24713 workaround.
+
2020-06-09 Simon Marchi <simon.marchi@polymtl.ca>
* gdb.base/index-cache.exp (test_cache_disabled): Add test_prefix
diff --git a/gdb/testsuite/gdb.ada/ptype_union.exp b/gdb/testsuite/gdb.ada/ptype_union.exp
index 470f9b550c6..c85e5f4b4b6 100644
--- a/gdb/testsuite/gdb.ada/ptype_union.exp
+++ b/gdb/testsuite/gdb.ada/ptype_union.exp
@@ -19,11 +19,6 @@ if {[prepare_for_testing "failed to prepare" ${testfile} ${srcfile}]} {
return -1
}
-if {[exec_has_index_section $binfile]} {
- unsupported "Ada is not currently supported by the index (PR 24713)"
- return -1
-}
-
# The test case is written in C, because it was easy to make the
# required type there; but the bug itself only happens in Ada.
gdb_test "set lang ada" ""