Fix gdb.ada/bp_c_mixed_case.exp (PR gdb/22670)
authorPedro Alves <palves@redhat.com>
Wed, 10 Jan 2018 20:38:06 +0000 (20:38 +0000)
committerPedro Alves <palves@redhat.com>
Wed, 10 Jan 2018 20:38:06 +0000 (20:38 +0000)
The problem here is that we are using the user-provided lookup name
literally for name comparisons.  I.e., "<MixedCase>" with the "<>"s
included.

This commit fixes the minsym lookup case.  psymbol/symbol lookup will
be fixed in a follow up.

In the minsym case, we're using using the user-provided lookup name
literally for linkage name comparisons.  That obviously can't work
since the "<>" are not really part of the linkage name.

The original idea was that we'd use the symbol's language to select
the right symbol name matching algorithm, but that doesn't work for
Ada because it's not really possible to unambiguously tell from the
linkage name alone whether we're dealing with Ada symbols, so Ada
minsyms end up with no language set, or sometimes C++ set.

So fix this by treating Ada mode specially when determining the
linkage name to match against.

gdb/ChangeLog:
2018-01-10  Pedro Alves  <palves@redhat.com>

PR gdb/22670
* minsyms.c (linkage_name_str): New function.
(iterate_over_minimal_symbols): Use it.

gdb/testsuite/ChangeLog:
2018-01-10  Pedro Alves  <palves@redhat.com>

PR gdb/22670
* gdb.ada/bp_c_mixed_case.exp: Remove setup_kfail calls.

gdb/ChangeLog
gdb/minsyms.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.ada/bp_c_mixed_case.exp

index adb72ef846bc0376288c35d448cf43f0d4651c3c..f8457054987103cef9724cc15174c100c9988d4a 100644 (file)
@@ -1,3 +1,9 @@
+2018-01-10  Pedro Alves  <palves@redhat.com>
+
+       PR gdb/22670
+       * minsyms.c (linkage_name_str): New function.
+       (iterate_over_minimal_symbols): Use it.
+
 2018-01-09  John Baldwin  <jhb@FreeBSD.org>
 
        * NEWS: Document that 'info proc' now works on FreeBSD.
index 26c91ec8819a8f0a09d7ec5756df4f0c7edb4f3c..fded0d65e93a212f4242cc0175b0d5d3d4382afc 100644 (file)
@@ -447,6 +447,25 @@ find_minimal_symbol_address (const char *name, CORE_ADDR *addr,
   return sym.minsym == NULL;
 }
 
+/* Get the lookup name form best suitable for linkage name
+   matching.  */
+
+static const char *
+linkage_name_str (const lookup_name_info &lookup_name)
+{
+  /* Unlike most languages (including C++), Ada uses the
+     encoded/linkage name as the search name recorded in symbols.  So
+     if debugging in Ada mode, prefer the Ada-encoded name.  This also
+     makes Ada's verbatim match syntax ("<...>") work, because
+     "lookup_name.name()" includes the "<>"s, while
+     "lookup_name.ada().lookup_name()" is the encoded name with "<>"s
+     stripped.  */
+  if (current_language->la_language == language_ada)
+    return lookup_name.ada ().lookup_name ().c_str ();
+
+  return lookup_name.name ().c_str ();
+}
+
 /* See minsyms.h.  */
 
 void
@@ -459,7 +478,7 @@ iterate_over_minimal_symbols (struct objfile *objf,
 
   /* The first pass is over the ordinary hash table.  */
     {
-      const char *name = lookup_name.name ().c_str ();
+      const char *name = linkage_name_str (lookup_name);
       unsigned int hash = msymbol_hash (name) % MINIMAL_SYMBOL_HASH_SIZE;
       auto *mangled_cmp
        = (case_sensitivity == case_sensitive_on
index 71424a96d32139d8ffcf4cbabafd13a32c3cc0e2..ec763fce92e5268b1a276ef8285e37d6c625ac80 100644 (file)
@@ -1,3 +1,8 @@
+2018-01-10  Pedro Alves  <palves@redhat.com>
+
+       PR gdb/22670
+       * gdb.ada/bp_c_mixed_case.exp: Remove setup_kfail calls.
+
 2018-01-08  Simon Marchi  <simon.marchi@ericsson.com>
 
        * gdb.server/unittest.exp: Match the output in non-development
index 54c61e3a8e8091da2b3e68e938f2ebc9025053c6..7787646c67f734ae9e5d09574f1ab7e8bd70b8e9 100644 (file)
@@ -40,13 +40,11 @@ gdb_test "show lang" \
 # Try inserting a breakpoint inside a C function. Because the function's
 # name has some uppercase letters, we need to use the "<...>" notation.
 # The purpose of this testcase is to verify that we can in fact do so
-# and that it inserts the breakpoint at the expected location.
-setup_kfail gdb/22670 "*-*-*"
+# and that it inserts the breakpoint at the expected location.  See gdb/22670.
 gdb_test "break <MixedCaseFunc>" \
          "Breakpoint $decimal at $hex: file .*bar.c, line $decimal\\."
 
 # Resume the program's execution, verifying that it lands at the expected
 # location.
-setup_kfail gdb/22670 "*-*-*"
 gdb_test "continue" \
          "Breakpoint $decimal, MixedCaseFunc \\(\\) at .*bar\\.c:$decimal.*"