Fix Rust regression with -readnow
authorTom Tromey <tom@tromey.com>
Thu, 12 Nov 2020 15:47:09 +0000 (08:47 -0700)
committerTom Tromey <tom@tromey.com>
Thu, 12 Nov 2020 15:47:09 +0000 (08:47 -0700)
PR rust/26799 points out that a certain test case fails with -readnow.
This happens because, with -readnow, there are no partial symtabs; but
find_symbol_at_address requires these.

This patch fixes this problem by searching all of an objfile's
compunit symtabs if it does not have partial symbols.

Note that this test will still fail with .gdb_index.  I don't think
that is readily fixable.

gdb/ChangeLog
2020-11-12  Tom Tromey  <tom@tromey.com>

PR rust/26799:
* symtab.c (find_symbol_at_address): Search symtabs if no psymtabs
exist.

gdb/testsuite/ChangeLog
2020-11-12  Tom Tromey  <tom@tromey.com>

PR rust/26799:
* gdb.rust/traits.exp: Remove kfails.

gdb/ChangeLog
gdb/symtab.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.rust/traits.exp

index b24fdb5ea7e2e0880f96ca323d3142d873597654..038d45f4ec4caaeada770792e60bec530180cf85 100644 (file)
@@ -1,3 +1,9 @@
+2020-11-12  Tom Tromey  <tom@tromey.com>
+
+       PR rust/26799:
+       * symtab.c (find_symbol_at_address): Search symtabs if no psymtabs
+       exist.
+
 2020-11-12  Andrew Burgess  <andrew.burgess@embecosm.com>
 
        * features/Makefile (XMLTOC): Add rx.xml.
index 5cc875fbb3a1126d8bef9d33945835088ec17e15..dccc3d1e2379af30dfb286658bb45a69735bb020 100644 (file)
@@ -3024,30 +3024,53 @@ find_pc_compunit_symtab (CORE_ADDR pc)
 struct symbol *
 find_symbol_at_address (CORE_ADDR address)
 {
-  for (objfile *objfile : current_program_space->objfiles ())
+  /* A helper function to search a given symtab for a symbol matching
+     ADDR.  */
+  auto search_symtab = [] (compunit_symtab *symtab, CORE_ADDR addr) -> symbol *
     {
-      if (objfile->sf == NULL
-         || objfile->sf->qf->find_compunit_symtab_by_address == NULL)
-       continue;
+      const struct blockvector *bv = COMPUNIT_BLOCKVECTOR (symtab);
 
-      struct compunit_symtab *symtab
-       = objfile->sf->qf->find_compunit_symtab_by_address (objfile, address);
-      if (symtab != NULL)
+      for (int i = GLOBAL_BLOCK; i <= STATIC_BLOCK; ++i)
        {
-         const struct blockvector *bv = COMPUNIT_BLOCKVECTOR (symtab);
+         const struct block *b = BLOCKVECTOR_BLOCK (bv, i);
+         struct block_iterator iter;
+         struct symbol *sym;
 
-         for (int i = GLOBAL_BLOCK; i <= STATIC_BLOCK; ++i)
+         ALL_BLOCK_SYMBOLS (b, iter, sym)
            {
-             const struct block *b = BLOCKVECTOR_BLOCK (bv, i);
-             struct block_iterator iter;
-             struct symbol *sym;
+             if (SYMBOL_CLASS (sym) == LOC_STATIC
+                 && SYMBOL_VALUE_ADDRESS (sym) == addr)
+               return sym;
+           }
+       }
+      return nullptr;
+    };
 
-             ALL_BLOCK_SYMBOLS (b, iter, sym)
-               {
-                 if (SYMBOL_CLASS (sym) == LOC_STATIC
-                     && SYMBOL_VALUE_ADDRESS (sym) == address)
-                   return sym;
-               }
+  for (objfile *objfile : current_program_space->objfiles ())
+    {
+      /* If this objfile doesn't have "quick" functions, then it may
+        have been read with -readnow, in which case we need to search
+        the symtabs directly.  */
+      if (objfile->sf == NULL
+         || objfile->sf->qf->find_compunit_symtab_by_address == NULL)
+       {
+         for (compunit_symtab *symtab : objfile->compunits ())
+           {
+             struct symbol *sym = search_symtab (symtab, address);
+             if (sym != nullptr)
+               return sym;
+           }
+       }
+      else
+       {
+         struct compunit_symtab *symtab
+           = objfile->sf->qf->find_compunit_symtab_by_address (objfile,
+                                                               address);
+         if (symtab != NULL)
+           {
+             struct symbol *sym = search_symtab (symtab, address);
+             if (sym != nullptr)
+               return sym;
            }
        }
     }
index ecac8bbe052b13c920cfe16e7590913668eeff11..f23721eee86cbfe670300b3f11334910823e763f 100644 (file)
@@ -1,3 +1,8 @@
+2020-11-12  Tom Tromey  <tom@tromey.com>
+
+       PR rust/26799:
+       * gdb.rust/traits.exp: Remove kfails.
+
 2020-11-12  Gary Benson <gbenson@redhat.com>
 
        * gdb.threads/tls-so_extern_main.c (tls_ptr): Add missing return
index d237b928720a64bbf2187e40d0928846ee1fc034..73a75b08e5479cfc11510083ffde97e1ec391d08 100644 (file)
@@ -45,11 +45,5 @@ if {![runto ${srcfile}:$line]} {
 
 set readnow_p [readnow $binfile]
 
-if { $readnow_p } {
-    setup_kfail "gdb/26799" *-*-*
-}
 gdb_test "print *td" " = 23.5"
-if { $readnow_p } {
-    setup_kfail "gdb/26799" *-*-*
-}
 gdb_test "print *tu" " = 23"