Refactor struct trad_frame_saved_regs
[binutils-gdb.git] / gdb / symtab.c
index 5cc875fbb3a1126d8bef9d33945835088ec17e15..7ffb52a94358f9f17d618cff1d1e1eceb214f943 100644 (file)
@@ -1,6 +1,6 @@
 /* Symbol table lookup for the GNU debugger, GDB.
 
-   Copyright (C) 1986-2020 Free Software Foundation, Inc.
+   Copyright (C) 1986-2021 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -42,6 +42,7 @@
 #include "addrmap.h"
 #include "cli/cli-utils.h"
 #include "cli/cli-style.h"
+#include "cli/cli-cmds.h"
 #include "fnmatch.h"
 #include "hashtab.h"
 #include "typeprint.h"
@@ -1842,7 +1843,8 @@ demangle_for_lookup (const char *name, enum language lang,
     }
   else if (lang == language_go)
     {
-      char *demangled_name = go_demangle (name, 0);
+      char *demangled_name
+       = language_def (language_go)->demangle_symbol (name, 0);
       if (demangled_name != NULL)
        return storage.set_malloc_ptr (demangled_name);
     }
@@ -3024,30 +3026,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;
            }
        }
     }
@@ -6906,10 +6931,13 @@ If zero then the symbol cache is disabled."),
           _("Print symbol cache statistics for each program space."),
           &maintenanceprintlist);
 
-  add_cmd ("flush-symbol-cache", class_maintenance,
+  add_cmd ("symbol-cache", class_maintenance,
           maintenance_flush_symbol_cache,
           _("Flush the symbol cache for each program space."),
-          &maintenancelist);
+          &maintenanceflushlist);
+  c = add_alias_cmd ("flush-symbol-cache", "flush symbol-cache",
+                    class_maintenance, 0, &maintenancelist);
+  deprecate_cmd (c, "maintenancelist flush symbol-cache");
 
   gdb::observers::executable_changed.attach (symtab_observer_executable_changed);
   gdb::observers::new_objfile.attach (symtab_new_objfile_observer);