From f98fc17b3ac4750842ec0fe28a18b51691ddfbda Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Fri, 5 Jan 2018 16:01:57 +0000 Subject: Fix gdb.ada/info_addr_mixed_case.exp (PR gdb/22670) The comments about mixed case in the testcase are actually a red herring. The problem here is that we'd get to ada_lookup_encoded_symbol with "my_table", which wraps the looked up name in "<>"s to force a verbatim match, and that in turn disables wild matching. Fix this by swapping around the internals of ada_lookup_encoded_symbol and ada_lookup_symbol, thus avoiding the encoding and verbatim-wrapping in the ada_lookup_symbol case, the case that starts with a user-provided lookup name. Ada encoding is still done of course, in the ada_lookup_name_info ctor. This could be also seen as avoiding the double-encoding problem in a different way. gdb/ChangeLog: 2018-01-05 Pedro Alves PR gdb/22670 * ada-lang.c (ada_lookup_encoded_symbol): Reimplement in terms of ada_lookup_symbol. (ada_lookup_symbol): Reimplement in terms of ada_lookup_symbol_list, bits factored out from ada_lookup_encoded_symbol. gdb/testsuite/ChangeLog: 2018-01-05 Pedro Alves PR gdb/22670 * gdb.ada/info_addr_mixed_case.exp: Remove kfail. Extend test to exercise lower case too, and to exercise both full matching and wild matching. --- gdb/ada-lang.c | 43 +++++++++++++++++++------------------------ 1 file changed, 19 insertions(+), 24 deletions(-) (limited to 'gdb/ada-lang.c') diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index 846cf8c..e7c2197 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -5911,10 +5911,6 @@ ada_lookup_encoded_symbol (const char *name, const struct block *block, domain_enum domain, struct block_symbol *info) { - struct block_symbol *candidates; - int n_candidates; - struct cleanup *old_chain; - /* Since we already have an encoded name, wrap it in '<>' to force a verbatim match. Otherwise, if the name happens to not look like an encoded name (because it doesn't include a "__"), @@ -5924,22 +5920,7 @@ ada_lookup_encoded_symbol (const char *name, const struct block *block, std::string verbatim = std::string ("<") + name + '>'; gdb_assert (info != NULL); - memset (info, 0, sizeof (struct block_symbol)); - - n_candidates = ada_lookup_symbol_list (verbatim.c_str (), block, - domain, &candidates); - old_chain = make_cleanup (xfree, candidates); - - if (n_candidates == 0) - { - do_cleanups (old_chain); - return; - } - - *info = candidates[0]; - info->symbol = fixup_symbol_section (info->symbol, NULL); - - do_cleanups (old_chain); + *info = ada_lookup_symbol (verbatim.c_str (), block, domain, NULL); } /* Return a symbol in DOMAIN matching NAME, in BLOCK0 and enclosing @@ -5952,13 +5933,27 @@ struct block_symbol ada_lookup_symbol (const char *name, const struct block *block0, domain_enum domain, int *is_a_field_of_this) { - struct block_symbol info; - if (is_a_field_of_this != NULL) *is_a_field_of_this = 0; - ada_lookup_encoded_symbol (ada_encode (ada_fold_name (name)), - block0, domain, &info); + struct block_symbol *candidates; + int n_candidates; + struct cleanup *old_chain; + + n_candidates = ada_lookup_symbol_list (name, block0, domain, &candidates); + old_chain = make_cleanup (xfree, candidates); + + if (n_candidates == 0) + { + do_cleanups (old_chain); + return {}; + } + + block_symbol info = candidates[0]; + info.symbol = fixup_symbol_section (info.symbol, NULL); + + do_cleanups (old_chain); + return info; } -- cgit v1.1