diff options
author | Pedro Alves <palves@redhat.com> | 2018-01-05 16:01:57 +0000 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2018-01-05 16:01:57 +0000 |
commit | f98fc17b3ac4750842ec0fe28a18b51691ddfbda (patch) | |
tree | 43a66fd2b741ee6aef63d2a2e2f51f029eed138e | |
parent | 342f82403949c74517a6353baec73b94d18549ad (diff) | |
download | fsf-binutils-gdb-f98fc17b3ac4750842ec0fe28a18b51691ddfbda.zip fsf-binutils-gdb-f98fc17b3ac4750842ec0fe28a18b51691ddfbda.tar.gz fsf-binutils-gdb-f98fc17b3ac4750842ec0fe28a18b51691ddfbda.tar.bz2 |
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 <palves@redhat.com>
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 <palves@redhat.com>
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.
-rw-r--r-- | gdb/ChangeLog | 9 | ||||
-rw-r--r-- | gdb/ada-lang.c | 43 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | 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 <palves@redhat.com> + + 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 <brobecker@adacore.com> * 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 <palves@redhat.com> + + 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 <brobecker@adacore.com> * 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\\." +} |