From f98fc17b3ac4750842ec0fe28a18b51691ddfbda Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Fri, 5 Jan 2018 16:01:57 +0000 Subject: [PATCH] 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/ChangeLog | 9 ++++++ gdb/ada-lang.c | 43 ++++++++++++-------------- gdb/testsuite/ChangeLog | 7 +++++ gdb/testsuite/gdb.ada/info_addr_mixed_case.exp | 15 +++++---- 4 files changed, 42 insertions(+), 32 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 97854e8..badced8 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +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. + 2018-01-05 Joel Brobecker * ada-exp.y (write_object_renaming): When subscripting an array 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; } diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 2684397..9448631 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,10 @@ +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. + 2018-01-05 Joel Brobecker * gdb.ada/rename_subscript_param: New testcase. diff --git a/gdb/testsuite/gdb.ada/info_addr_mixed_case.exp b/gdb/testsuite/gdb.ada/info_addr_mixed_case.exp index e9fce0d..7840a43 100644 --- a/gdb/testsuite/gdb.ada/info_addr_mixed_case.exp +++ b/gdb/testsuite/gdb.ada/info_addr_mixed_case.exp @@ -31,12 +31,11 @@ if ![runto "foo.adb:$bp_location" ] then { # The following test exercises the situation when uppercase letters # are used in the name of the symbol passed to the "info address" -# command. This should not make a difference, as the language is -# Ada, and Ada is case-insensitive. +# command. This should not make a difference, as the language is Ada, +# and Ada is case-insensitive. Also, exercise both fully-qualified +# name matching and wild matching. -# commit b5ec771e60c1a0863e51eb491c85c674097e9e13 (Introduce -# lookup_name_info and generalize Ada's FULL/WILD name matching) -# caused the following test to fail. KFAIL it while investigating... -setup_kfail gdb/22670 "*-*-*" -gdb_test "info address My_Table" \ - "Symbol \"pck\\.my_table\" is static storage at address $hex\\." +foreach sym {"my_table" "My_Table" "pck.my_table" "Pck.My_Table"} { + gdb_test "info address $sym" \ + "Symbol \"pck\\.my_table\" is static storage at address $hex\\." +} -- 2.7.4