Remove quick_symbol_functions::expand_symtabs_with_fullname
[deliverable/binutils-gdb.git] / gdb / symfile-debug.c
index b71fa8b0010a3b70ba98852cf7ae17e35967d1f4..dd5a70b4356bbd361dd6aedfaf91269f938875b4 100644 (file)
@@ -1,6 +1,6 @@
 /* Debug logging for the symbol file functions for the GNU debugger, GDB.
 
-   Copyright (C) 2013-2019 Free Software Foundation, Inc.
+   Copyright (C) 2013-2021 Free Software Foundation, Inc.
 
    Contributed by Cygnus Support, using pieces from other GDB modules.
 
@@ -32,6 +32,8 @@
 #include "source.h"
 #include "symtab.h"
 #include "symfile.h"
+#include "block.h"
+#include "filenames.h"
 
 /* We need to save a pointer to the real symbol functions.
    Plus, the debug versions are malloc'd because we have to NULL out the
 
 struct debug_sym_fns_data
 {
-  const struct sym_fns *real_sf;
-  struct sym_fns debug_sf;
+  const struct sym_fns *real_sf = nullptr;
+  struct sym_fns debug_sf {};
 };
 
 /* We need to record a pointer to the real set of functions for each
    objfile.  */
-static const struct objfile_data *symfile_debug_objfile_data_key;
+static const struct objfile_key<debug_sym_fns_data>
+  symfile_debug_objfile_data_key;
 
-/* If non-zero all calls to the symfile functions are logged.  */
-static int debug_symfile = 0;
+/* If true all calls to the symfile functions are logged.  */
+static bool debug_symfile = false;
 
 /* Return non-zero if symfile debug logging is installed.  */
 
@@ -56,7 +59,7 @@ static int
 symfile_debug_installed (struct objfile *objfile)
 {
   return (objfile->sf != NULL
-         && objfile_data (objfile, symfile_debug_objfile_data_key) != NULL);
+         && symfile_debug_objfile_data_key.get (objfile) != NULL);
 }
 
 /* Utility return the name to print for SYMTAB.  */
@@ -67,343 +70,466 @@ debug_symtab_name (struct symtab *symtab)
   return symtab_to_filename_for_display (symtab);
 }
 \f
-/* Debugging version of struct quick_symbol_functions.  */
 
-static int
-debug_qf_has_symbols (struct objfile *objfile)
+/* See objfiles.h.  */
+
+bool
+objfile::has_partial_symbols ()
 {
-  const struct debug_sym_fns_data *debug_data
-    = ((const struct debug_sym_fns_data *)
-       objfile_data (objfile, symfile_debug_objfile_data_key));
-  int retval;
+  bool retval = false;
 
-  retval = debug_data->real_sf->qf->has_symbols (objfile);
+  /* If we have not read psymbols, but we have a function capable of reading
+     them, then that is an indication that they are in fact available.  Without
+     this function the symbols may have been already read in but they also may
+     not be present in this objfile.  */
+  for (const auto &iter : qf)
+    {
+      if ((flags & OBJF_PSYMTABS_READ) == 0
+         && iter->can_lazily_read_symbols ())
+       retval = true;
+      else
+       retval = iter->has_symbols (this);
+      if (retval)
+       break;
+    }
 
-  fprintf_filtered (gdb_stdlog, "qf->has_symbols (%s) = %d\n",
-                   objfile_debug_name (objfile), retval);
+  if (debug_symfile)
+    fprintf_filtered (gdb_stdlog, "qf->has_symbols (%s) = %d\n",
+                     objfile_debug_name (this), retval);
 
   return retval;
 }
 
-static struct symtab *
-debug_qf_find_last_source_symtab (struct objfile *objfile)
+struct symtab *
+objfile::find_last_source_symtab ()
 {
-  const struct debug_sym_fns_data *debug_data
-    = ((const struct debug_sym_fns_data *)
-       objfile_data (objfile, symfile_debug_objfile_data_key));
-  struct symtab *retval;
+  struct symtab *retval = nullptr;
 
-  fprintf_filtered (gdb_stdlog, "qf->find_last_source_symtab (%s)\n",
-                   objfile_debug_name (objfile));
+  if (debug_symfile)
+    fprintf_filtered (gdb_stdlog, "qf->find_last_source_symtab (%s)\n",
+                     objfile_debug_name (this));
 
-  retval = debug_data->real_sf->qf->find_last_source_symtab (objfile);
+  for (const auto &iter : qf)
+    {
+      retval = iter->find_last_source_symtab (this);
+      if (retval != nullptr)
+       break;
+    }
 
-  fprintf_filtered (gdb_stdlog, "qf->find_last_source_symtab (...) = %s\n",
-                   retval ? debug_symtab_name (retval) : "NULL");
+  if (debug_symfile)
+    fprintf_filtered (gdb_stdlog, "qf->find_last_source_symtab (...) = %s\n",
+                     retval ? debug_symtab_name (retval) : "NULL");
 
   return retval;
 }
 
-static void
-debug_qf_forget_cached_source_info (struct objfile *objfile)
+void
+objfile::forget_cached_source_info ()
 {
-  const struct debug_sym_fns_data *debug_data
-    = ((const struct debug_sym_fns_data *)
-       objfile_data (objfile, symfile_debug_objfile_data_key));
-
-  fprintf_filtered (gdb_stdlog, "qf->forget_cached_source_info (%s)\n",
-                   objfile_debug_name (objfile));
+  if (debug_symfile)
+    fprintf_filtered (gdb_stdlog, "qf->forget_cached_source_info (%s)\n",
+                     objfile_debug_name (this));
 
-  debug_data->real_sf->qf->forget_cached_source_info (objfile);
+  for (const auto &iter : qf)
+    iter->forget_cached_source_info (this);
 }
 
-static bool
-debug_qf_map_symtabs_matching_filename
-  (struct objfile *objfile, const char *name, const char *real_path,
+bool
+objfile::map_symtabs_matching_filename
+  (const char *name, const char *real_path,
    gdb::function_view<bool (symtab *)> callback)
 {
-  const struct debug_sym_fns_data *debug_data
-    = ((const struct debug_sym_fns_data *)
-       objfile_data (objfile, symfile_debug_objfile_data_key));
-
-  fprintf_filtered (gdb_stdlog,
-                   "qf->map_symtabs_matching_filename (%s, \"%s\", \"%s\", %s)\n",
-                   objfile_debug_name (objfile), name,
-                   real_path ? real_path : NULL,
-                   host_address_to_string (&callback));
-
-  bool retval = (debug_data->real_sf->qf->map_symtabs_matching_filename
-                (objfile, name, real_path, callback));
+  if (debug_symfile)
+    fprintf_filtered (gdb_stdlog,
+                     "qf->map_symtabs_matching_filename (%s, \"%s\", "
+                     "\"%s\", %s)\n",
+                     objfile_debug_name (this), name,
+                     real_path ? real_path : NULL,
+                     host_address_to_string (&callback));
+
+  bool retval = true;
+  const char *name_basename = lbasename (name);
+
+  auto match_one_filename = [&] (const char *filename, bool basenames)
+  {
+    if (compare_filenames_for_search (filename, name))
+      return true;
+    if (basenames && FILENAME_CMP (name_basename, filename) == 0)
+      return true;
+    if (real_path != nullptr && IS_ABSOLUTE_PATH (filename)
+       && IS_ABSOLUTE_PATH (real_path))
+      return filename_cmp (filename, real_path) == 0;
+    return false;
+  };
+
+  compunit_symtab *last_made = this->compunit_symtabs;
+
+  auto on_expansion = [&] (compunit_symtab *symtab)
+  {
+    /* The callback to iterate_over_some_symtabs returns false to keep
+       going and true to continue, so we have to invert the result
+       here, for expand_symtabs_matching.  */
+    bool result = !iterate_over_some_symtabs (name, real_path,
+                                             this->compunit_symtabs,
+                                             last_made,
+                                             callback);
+    last_made = this->compunit_symtabs;
+    return result;
+  };
+
+  for (const auto &iter : qf)
+    {
+      if (!iter->expand_symtabs_matching (this,
+                                         match_one_filename,
+                                         nullptr,
+                                         nullptr,
+                                         on_expansion,
+                                         (SEARCH_GLOBAL_BLOCK
+                                          | SEARCH_STATIC_BLOCK),
+                                         UNDEF_DOMAIN,
+                                         ALL_DOMAIN))
+       {
+         retval = false;
+         break;
+       }
+    }
 
-  fprintf_filtered (gdb_stdlog,
-                   "qf->map_symtabs_matching_filename (...) = %d\n",
-                   retval);
+  if (debug_symfile)
+    fprintf_filtered (gdb_stdlog,
+                     "qf->map_symtabs_matching_filename (...) = %d\n",
+                     retval);
 
-  return retval;
+  /* We must re-invert the return value here to match the caller's
+     expectations.  */
+  return !retval;
 }
 
-static struct compunit_symtab *
-debug_qf_lookup_symbol (struct objfile *objfile, int kind, const char *name,
-                       domain_enum domain)
+struct compunit_symtab *
+objfile::lookup_symbol (block_enum kind, const char *name, domain_enum domain)
 {
-  const struct debug_sym_fns_data *debug_data
-    = ((const struct debug_sym_fns_data *)
-       objfile_data (objfile, symfile_debug_objfile_data_key));
-  struct compunit_symtab *retval;
+  struct compunit_symtab *retval = nullptr;
 
-  fprintf_filtered (gdb_stdlog,
-                   "qf->lookup_symbol (%s, %d, \"%s\", %s)\n",
-                   objfile_debug_name (objfile), kind, name,
-                   domain_name (domain));
+  if (debug_symfile)
+    fprintf_filtered (gdb_stdlog,
+                     "qf->lookup_symbol (%s, %d, \"%s\", %s)\n",
+                     objfile_debug_name (this), kind, name,
+                     domain_name (domain));
 
-  retval = debug_data->real_sf->qf->lookup_symbol (objfile, kind, name,
-                                                  domain);
+  lookup_name_info lookup_name (name, symbol_name_match_type::FULL);
 
-  fprintf_filtered (gdb_stdlog, "qf->lookup_symbol (...) = %s\n",
-                   retval
-                   ? debug_symtab_name (compunit_primary_filetab (retval))
-                   : "NULL");
+  auto search_one_symtab = [&] (compunit_symtab *stab)
+  {
+    struct symbol *sym, *with_opaque = NULL;
+    const struct blockvector *bv = COMPUNIT_BLOCKVECTOR (stab);
+    const struct block *block = BLOCKVECTOR_BLOCK (bv, kind);
 
-  return retval;
-}
+    sym = block_find_symbol (block, name, domain,
+                            block_find_non_opaque_type_preferred,
+                            &with_opaque);
 
-static void
-debug_qf_print_stats (struct objfile *objfile)
-{
-  const struct debug_sym_fns_data *debug_data
-    = ((const struct debug_sym_fns_data *)
-       objfile_data (objfile, symfile_debug_objfile_data_key));
+    /* Some caution must be observed with overloaded functions
+       and methods, since the index will not contain any overload
+       information (but NAME might contain it).  */
 
-  fprintf_filtered (gdb_stdlog, "qf->print_stats (%s)\n",
-                   objfile_debug_name (objfile));
+    if (sym != NULL
+       && SYMBOL_MATCHES_SEARCH_NAME (sym, lookup_name))
+      {
+       retval = stab;
+       /* Found it.  */
+       return false;
+      }
+    if (with_opaque != NULL
+       && SYMBOL_MATCHES_SEARCH_NAME (with_opaque, lookup_name))
+      retval = stab;
 
-  debug_data->real_sf->qf->print_stats (objfile);
-}
+    /* Keep looking through other psymtabs.  */
+    return true;
+  };
 
-static void
-debug_qf_dump (struct objfile *objfile)
-{
-  const struct debug_sym_fns_data *debug_data
-    = ((const struct debug_sym_fns_data *)
-       objfile_data (objfile, symfile_debug_objfile_data_key));
+  for (const auto &iter : qf)
+    {
+      if (!iter->expand_symtabs_matching (this,
+                                         nullptr,
+                                         &lookup_name,
+                                         nullptr,
+                                         search_one_symtab,
+                                         kind == GLOBAL_BLOCK
+                                         ? SEARCH_GLOBAL_BLOCK
+                                         : SEARCH_STATIC_BLOCK,
+                                         domain,
+                                         ALL_DOMAIN))
+       break;
+    }
 
-  fprintf_filtered (gdb_stdlog, "qf->dump (%s)\n",
-                   objfile_debug_name (objfile));
+  if (debug_symfile)
+    fprintf_filtered (gdb_stdlog, "qf->lookup_symbol (...) = %s\n",
+                     retval
+                     ? debug_symtab_name (compunit_primary_filetab (retval))
+                     : "NULL");
 
-  debug_data->real_sf->qf->dump (objfile);
+  return retval;
 }
 
-static void
-debug_qf_expand_symtabs_for_function (struct objfile *objfile,
-                                     const char *func_name)
+void
+objfile::print_stats (bool print_bcache)
 {
-  const struct debug_sym_fns_data *debug_data
-    = ((const struct debug_sym_fns_data *)
-       objfile_data (objfile, symfile_debug_objfile_data_key));
+  if (debug_symfile)
+    fprintf_filtered (gdb_stdlog, "qf->print_stats (%s, %d)\n",
+                     objfile_debug_name (this), print_bcache);
 
-  fprintf_filtered (gdb_stdlog,
-                   "qf->expand_symtabs_for_function (%s, \"%s\")\n",
-                   objfile_debug_name (objfile), func_name);
+  for (const auto &iter : qf)
+    iter->print_stats (this, print_bcache);
+}
 
-  debug_data->real_sf->qf->expand_symtabs_for_function (objfile, func_name);
+void
+objfile::dump ()
+{
+  if (debug_symfile)
+    fprintf_filtered (gdb_stdlog, "qf->dump (%s)\n",
+                     objfile_debug_name (this));
+
+  for (const auto &iter : qf)
+    iter->dump (this);
 }
 
-static void
-debug_qf_expand_all_symtabs (struct objfile *objfile)
+void
+objfile::expand_symtabs_for_function (const char *func_name)
 {
-  const struct debug_sym_fns_data *debug_data
-    = ((const struct debug_sym_fns_data *)
-       objfile_data (objfile, symfile_debug_objfile_data_key));
+  if (debug_symfile)
+    fprintf_filtered (gdb_stdlog,
+                     "qf->expand_symtabs_for_function (%s, \"%s\")\n",
+                     objfile_debug_name (this), func_name);
 
-  fprintf_filtered (gdb_stdlog, "qf->expand_all_symtabs (%s)\n",
-                   objfile_debug_name (objfile));
+  lookup_name_info base_lookup (func_name, symbol_name_match_type::FULL);
+  lookup_name_info lookup_name = base_lookup.make_ignore_params ();
 
-  debug_data->real_sf->qf->expand_all_symtabs (objfile);
+  for (const auto &iter : qf)
+    iter->expand_symtabs_matching (this,
+                                  nullptr,
+                                  &lookup_name,
+                                  nullptr,
+                                  nullptr,
+                                  (SEARCH_GLOBAL_BLOCK
+                                   | SEARCH_STATIC_BLOCK),
+                                  VAR_DOMAIN,
+                                  ALL_DOMAIN);
 }
 
-static void
-debug_qf_expand_symtabs_with_fullname (struct objfile *objfile,
-                                      const char *fullname)
+void
+objfile::expand_all_symtabs ()
 {
-  const struct debug_sym_fns_data *debug_data
-    = ((const struct debug_sym_fns_data *)
-       objfile_data (objfile, symfile_debug_objfile_data_key));
-
-  fprintf_filtered (gdb_stdlog,
-                   "qf->expand_symtabs_with_fullname (%s, \"%s\")\n",
-                   objfile_debug_name (objfile), fullname);
+  if (debug_symfile)
+    fprintf_filtered (gdb_stdlog, "qf->expand_all_symtabs (%s)\n",
+                     objfile_debug_name (this));
 
-  debug_data->real_sf->qf->expand_symtabs_with_fullname (objfile, fullname);
+  for (const auto &iter : qf)
+    iter->expand_all_symtabs (this);
 }
 
-static void
-debug_qf_map_matching_symbols (struct objfile *objfile,
-                              const char *name, domain_enum domain,
-                              int global,
-                              int (*callback) (struct block *,
-                                               struct symbol *, void *),
-                              void *data,
-                              symbol_name_match_type match,
-                              symbol_compare_ftype *ordered_compare)
+void
+objfile::expand_symtabs_with_fullname (const char *fullname)
 {
-  const struct debug_sym_fns_data *debug_data
-    = ((const struct debug_sym_fns_data *)
-       objfile_data (objfile, symfile_debug_objfile_data_key));
+  if (debug_symfile)
+    fprintf_filtered (gdb_stdlog,
+                     "qf->expand_symtabs_with_fullname (%s, \"%s\")\n",
+                     objfile_debug_name (this), fullname);
+
+  const char *basename = lbasename (fullname);
+  auto file_matcher = [&] (const char *filename, bool basenames)
+  {
+    return filename_cmp (basenames ? basename : fullname, filename) == 0;
+  };
+
+  for (const auto &iter : qf)
+    iter->expand_symtabs_matching (this,
+                                  file_matcher,
+                                  nullptr,
+                                  nullptr,
+                                  nullptr,
+                                  (SEARCH_GLOBAL_BLOCK
+                                   | SEARCH_STATIC_BLOCK),
+                                  UNDEF_DOMAIN,
+                                  ALL_DOMAIN);
+}
 
-  fprintf_filtered (gdb_stdlog,
-                   "qf->map_matching_symbols (%s, \"%s\", %s, %d, %s, %s, %s, %s)\n",
-                   objfile_debug_name (objfile), name,
-                   domain_name (domain), global,
-                   host_address_to_string (callback),
-                   host_address_to_string (data),
-                   plongest ((LONGEST) match),
-                   host_address_to_string (ordered_compare));
+void
+objfile::map_matching_symbols
+  (const lookup_name_info &name, domain_enum domain,
+   int global,
+   gdb::function_view<symbol_found_callback_ftype> callback,
+   symbol_compare_ftype *ordered_compare)
+{
+  if (debug_symfile)
+    fprintf_filtered (gdb_stdlog,
+                     "qf->map_matching_symbols (%s, %s, %d, %s)\n",
+                     objfile_debug_name (this),
+                     domain_name (domain), global,
+                     host_address_to_string (ordered_compare));
 
-  debug_data->real_sf->qf->map_matching_symbols (objfile, name,
-                                                domain, global,
-                                                callback, data,
-                                                match,
-                                                ordered_compare);
+  for (const auto &iter : qf)
+    iter->map_matching_symbols (this, name, domain, global,
+                               callback, ordered_compare);
 }
 
-static void
-debug_qf_expand_symtabs_matching
-  (struct objfile *objfile,
-   gdb::function_view<expand_symtabs_file_matcher_ftype> file_matcher,
-   const lookup_name_info &lookup_name,
+bool
+objfile::expand_symtabs_matching
+  (gdb::function_view<expand_symtabs_file_matcher_ftype> file_matcher,
+   const lookup_name_info *lookup_name,
    gdb::function_view<expand_symtabs_symbol_matcher_ftype> symbol_matcher,
    gdb::function_view<expand_symtabs_exp_notify_ftype> expansion_notify,
+   block_search_flags search_flags,
+   domain_enum domain,
    enum search_domain kind)
 {
-  const struct debug_sym_fns_data *debug_data
-    = ((const struct debug_sym_fns_data *)
-       objfile_data (objfile, symfile_debug_objfile_data_key));
-
-  fprintf_filtered (gdb_stdlog,
-                   "qf->expand_symtabs_matching (%s, %s, %s, %s, %s)\n",
-                   objfile_debug_name (objfile),
-                   host_address_to_string (&file_matcher),
-                   host_address_to_string (&symbol_matcher),
-                   host_address_to_string (&expansion_notify),
-                   search_domain_name (kind));
-
-  debug_data->real_sf->qf->expand_symtabs_matching (objfile,
-                                                   file_matcher,
-                                                   lookup_name,
-                                                   symbol_matcher,
-                                                   expansion_notify,
-                                                   kind);
-}
-
-static struct compunit_symtab *
-debug_qf_find_pc_sect_compunit_symtab (struct objfile *objfile,
-                                      struct bound_minimal_symbol msymbol,
+  if (debug_symfile)
+    fprintf_filtered (gdb_stdlog,
+                     "qf->expand_symtabs_matching (%s, %s, %s, %s, %s)\n",
+                     objfile_debug_name (this),
+                     host_address_to_string (&file_matcher),
+                     host_address_to_string (&symbol_matcher),
+                     host_address_to_string (&expansion_notify),
+                     search_domain_name (kind));
+
+  for (const auto &iter : qf)
+    if (!iter->expand_symtabs_matching (this, file_matcher, lookup_name,
+                                       symbol_matcher, expansion_notify,
+                                       search_flags, domain, kind))
+      return false;
+  return true;
+}
+
+struct compunit_symtab *
+objfile::find_pc_sect_compunit_symtab (struct bound_minimal_symbol msymbol,
                                       CORE_ADDR pc,
                                       struct obj_section *section,
                                       int warn_if_readin)
 {
-  const struct debug_sym_fns_data *debug_data
-    = ((const struct debug_sym_fns_data *)
-       objfile_data (objfile, symfile_debug_objfile_data_key));
-  struct compunit_symtab *retval;
+  struct compunit_symtab *retval = nullptr;
 
-  fprintf_filtered (gdb_stdlog,
-                   "qf->find_pc_sect_compunit_symtab (%s, %s, %s, %s, %d)\n",
-                   objfile_debug_name (objfile),
-                   host_address_to_string (msymbol.minsym),
-                   hex_string (pc),
-                   host_address_to_string (section),
-                   warn_if_readin);
-
-  retval
-    = debug_data->real_sf->qf->find_pc_sect_compunit_symtab (objfile, msymbol,
-                                                            pc, section,
-                                                            warn_if_readin);
+  if (debug_symfile)
+    fprintf_filtered (gdb_stdlog,
+                     "qf->find_pc_sect_compunit_symtab (%s, %s, %s, %s, %d)\n",
+                     objfile_debug_name (this),
+                     host_address_to_string (msymbol.minsym),
+                     hex_string (pc),
+                     host_address_to_string (section),
+                     warn_if_readin);
+
+  for (const auto &iter : qf)
+    {
+      retval = iter->find_pc_sect_compunit_symtab (this, msymbol, pc, section,
+                                                  warn_if_readin);
+      if (retval != nullptr)
+       break;
+    }
 
-  fprintf_filtered (gdb_stdlog,
-                   "qf->find_pc_sect_compunit_symtab (...) = %s\n",
-                   retval
-                   ? debug_symtab_name (compunit_primary_filetab (retval))
-                   : "NULL");
+  if (debug_symfile)
+    fprintf_filtered (gdb_stdlog,
+                     "qf->find_pc_sect_compunit_symtab (...) = %s\n",
+                     retval
+                     ? debug_symtab_name (compunit_primary_filetab (retval))
+                     : "NULL");
 
   return retval;
 }
 
-static void
-debug_qf_map_symbol_filenames (struct objfile *objfile,
-                              symbol_filename_ftype *fun, void *data,
-                              int need_fullname)
+void
+objfile::map_symbol_filenames (gdb::function_view<symbol_filename_ftype> fun,
+                              bool need_fullname)
 {
-  const struct debug_sym_fns_data *debug_data
-    = ((const struct debug_sym_fns_data *)
-       objfile_data (objfile, symfile_debug_objfile_data_key));
-  fprintf_filtered (gdb_stdlog,
-                   "qf->map_symbol_filenames (%s, %s, %s, %d)\n",
-                   objfile_debug_name (objfile),
-                   host_address_to_string (fun),
-                   host_address_to_string (data),
-                   need_fullname);
+  if (debug_symfile)
+    fprintf_filtered (gdb_stdlog,
+                     "qf->map_symbol_filenames (%s, ..., %d)\n",
+                     objfile_debug_name (this),
+                     need_fullname);
 
-  debug_data->real_sf->qf->map_symbol_filenames (objfile, fun, data,
-                                                need_fullname);
+  for (const auto &iter : qf)
+    iter->map_symbol_filenames (this, fun, need_fullname);
 }
 
-static struct compunit_symtab *
-debug_qf_find_compunit_symtab_by_address (struct objfile *objfile,
-                                         CORE_ADDR address)
+struct compunit_symtab *
+objfile::find_compunit_symtab_by_address (CORE_ADDR address)
 {
-  const struct debug_sym_fns_data *debug_data
-    = ((const struct debug_sym_fns_data *)
-       objfile_data (objfile, symfile_debug_objfile_data_key));
-  fprintf_filtered (gdb_stdlog,
-                   "qf->find_compunit_symtab_by_address (%s, %s)\n",
-                   objfile_debug_name (objfile),
-                   hex_string (address));
+  if (debug_symfile)
+    fprintf_filtered (gdb_stdlog,
+                     "qf->find_compunit_symtab_by_address (%s, %s)\n",
+                     objfile_debug_name (this),
+                     hex_string (address));
 
   struct compunit_symtab *result = NULL;
-  if (debug_data->real_sf->qf->map_symbol_filenames != NULL)
-    result
-      = debug_data->real_sf->qf->find_compunit_symtab_by_address (objfile,
-                                                                 address);
+  for (const auto &iter : qf)
+    {
+      result = iter->find_compunit_symtab_by_address (this, address);
+      if (result != nullptr)
+       break;
+    }
 
-  fprintf_filtered (gdb_stdlog,
-                   "qf->find_compunit_symtab_by_address (...) = %s\n",
-                   result
-                   ? debug_symtab_name (compunit_primary_filetab (result))
-                   : "NULL");
+  if (debug_symfile)
+    fprintf_filtered (gdb_stdlog,
+                     "qf->find_compunit_symtab_by_address (...) = %s\n",
+                     result
+                     ? debug_symtab_name (compunit_primary_filetab (result))
+                     : "NULL");
 
   return result;
 }
 
-static const struct quick_symbol_functions debug_sym_quick_functions =
-{
-  debug_qf_has_symbols,
-  debug_qf_find_last_source_symtab,
-  debug_qf_forget_cached_source_info,
-  debug_qf_map_symtabs_matching_filename,
-  debug_qf_lookup_symbol,
-  debug_qf_print_stats,
-  debug_qf_dump,
-  debug_qf_expand_symtabs_for_function,
-  debug_qf_expand_all_symtabs,
-  debug_qf_expand_symtabs_with_fullname,
-  debug_qf_map_matching_symbols,
-  debug_qf_expand_symtabs_matching,
-  debug_qf_find_pc_sect_compunit_symtab,
-  debug_qf_find_compunit_symtab_by_address,
-  debug_qf_map_symbol_filenames
-};
+enum language
+objfile::lookup_global_symbol_language (const char *name,
+                                       domain_enum domain,
+                                       bool *symbol_found_p)
+{
+  enum language result = language_unknown;
+  *symbol_found_p = false;
+
+  for (const auto &iter : qf)
+    {
+      result = iter->lookup_global_symbol_language (this, name, domain,
+                                                   symbol_found_p);
+      if (*symbol_found_p)
+       break;
+    }
+
+  return result;
+}
+
+void
+objfile::require_partial_symbols (bool verbose)
+{
+  if ((flags & OBJF_PSYMTABS_READ) == 0)
+    {
+      flags |= OBJF_PSYMTABS_READ;
+
+      bool printed = false;
+      for (const auto &iter : qf)
+       {
+         if (iter->can_lazily_read_symbols ())
+           {
+             if (verbose && !printed)
+               {
+                 printf_filtered (_("Reading symbols from %s...\n"),
+                                  objfile_name (this));
+                 printed = true;
+               }
+             iter->read_partial_symbols (this);
+           }
+       }
+      if (printed && !objfile_has_symbols (this))
+       printf_filtered (_("(No debugging symbols found in %s)\n"),
+                        objfile_name (this));
+    }
+}
+
 \f
 /* Debugging version of struct sym_probe_fns.  */
 
-static const std::vector<probe *> &
+static const std::vector<std::unique_ptr<probe>> &
 debug_sym_get_probes (struct objfile *objfile)
 {
   const struct debug_sym_fns_data *debug_data
-    = ((const struct debug_sym_fns_data *)
-       objfile_data (objfile, symfile_debug_objfile_data_key));
+    = symfile_debug_objfile_data_key.get (objfile);
 
-  const std::vector<probe *> &retval
+  const std::vector<std::unique_ptr<probe>> &retval
     = debug_data->real_sf->sym_probe_fns->sym_get_probes (objfile);
 
   fprintf_filtered (gdb_stdlog,
@@ -425,8 +551,7 @@ static void
 debug_sym_new_init (struct objfile *objfile)
 {
   const struct debug_sym_fns_data *debug_data
-    = ((const struct debug_sym_fns_data *)
-       objfile_data (objfile, symfile_debug_objfile_data_key));
+    = symfile_debug_objfile_data_key.get (objfile);
 
   fprintf_filtered (gdb_stdlog, "sf->sym_new_init (%s)\n",
                    objfile_debug_name (objfile));
@@ -438,8 +563,7 @@ static void
 debug_sym_init (struct objfile *objfile)
 {
   const struct debug_sym_fns_data *debug_data
-    = ((const struct debug_sym_fns_data *)
-       objfile_data (objfile, symfile_debug_objfile_data_key));
+    = symfile_debug_objfile_data_key.get (objfile);
 
   fprintf_filtered (gdb_stdlog, "sf->sym_init (%s)\n",
                    objfile_debug_name (objfile));
@@ -451,8 +575,7 @@ static void
 debug_sym_read (struct objfile *objfile, symfile_add_flags symfile_flags)
 {
   const struct debug_sym_fns_data *debug_data
-    = ((const struct debug_sym_fns_data *)
-       objfile_data (objfile, symfile_debug_objfile_data_key));
+    = symfile_debug_objfile_data_key.get (objfile);
 
   fprintf_filtered (gdb_stdlog, "sf->sym_read (%s, 0x%x)\n",
                    objfile_debug_name (objfile), (unsigned) symfile_flags);
@@ -460,25 +583,11 @@ debug_sym_read (struct objfile *objfile, symfile_add_flags symfile_flags)
   debug_data->real_sf->sym_read (objfile, symfile_flags);
 }
 
-static void
-debug_sym_read_psymbols (struct objfile *objfile)
-{
-  const struct debug_sym_fns_data *debug_data
-    = ((const struct debug_sym_fns_data *)
-       objfile_data (objfile, symfile_debug_objfile_data_key));
-
-  fprintf_filtered (gdb_stdlog, "sf->sym_read_psymbols (%s)\n",
-                   objfile_debug_name (objfile));
-
-  debug_data->real_sf->sym_read_psymbols (objfile);
-}
-
 static void
 debug_sym_finish (struct objfile *objfile)
 {
   const struct debug_sym_fns_data *debug_data
-    = ((const struct debug_sym_fns_data *)
-       objfile_data (objfile, symfile_debug_objfile_data_key));
+    = symfile_debug_objfile_data_key.get (objfile);
 
   fprintf_filtered (gdb_stdlog, "sf->sym_finish (%s)\n",
                    objfile_debug_name (objfile));
@@ -491,8 +600,7 @@ debug_sym_offsets (struct objfile *objfile,
                   const section_addr_info &info)
 {
   const struct debug_sym_fns_data *debug_data
-    = ((const struct debug_sym_fns_data *)
-       objfile_data (objfile, symfile_debug_objfile_data_key));
+    = symfile_debug_objfile_data_key.get (objfile);
 
   fprintf_filtered (gdb_stdlog, "sf->sym_offsets (%s, %s)\n",
                    objfile_debug_name (objfile),
@@ -501,7 +609,7 @@ debug_sym_offsets (struct objfile *objfile,
   debug_data->real_sf->sym_offsets (objfile, info);
 }
 
-static struct symfile_segment_data *
+static symfile_segment_data_up
 debug_sym_segments (bfd *abfd)
 {
   /* This API function is annoying, it doesn't take a "this" pointer.
@@ -514,8 +622,7 @@ static void
 debug_sym_read_linetable (struct objfile *objfile)
 {
   const struct debug_sym_fns_data *debug_data
-    = ((const struct debug_sym_fns_data *)
-       objfile_data (objfile, symfile_debug_objfile_data_key));
+    = symfile_debug_objfile_data_key.get (objfile);
 
   fprintf_filtered (gdb_stdlog, "sf->sym_read_linetable (%s)\n",
                    objfile_debug_name (objfile));
@@ -527,8 +634,7 @@ static bfd_byte *
 debug_sym_relocate (struct objfile *objfile, asection *sectp, bfd_byte *buf)
 {
   const struct debug_sym_fns_data *debug_data
-    = ((const struct debug_sym_fns_data *)
-       objfile_data (objfile, symfile_debug_objfile_data_key));
+    = symfile_debug_objfile_data_key.get (objfile);
   bfd_byte *retval;
 
   retval = debug_data->real_sf->sym_relocate (objfile, sectp, buf);
@@ -553,24 +659,14 @@ static const struct sym_fns debug_sym_fns =
   debug_sym_new_init,
   debug_sym_init,
   debug_sym_read,
-  debug_sym_read_psymbols,
   debug_sym_finish,
   debug_sym_offsets,
   debug_sym_segments,
   debug_sym_read_linetable,
   debug_sym_relocate,
   &debug_sym_probe_fns,
-  &debug_sym_quick_functions
 };
 \f
-/* Free the copy of sym_fns recorded in the registry.  */
-
-static void
-symfile_debug_free_objfile (struct objfile *objfile, void *datum)
-{
-  xfree (datum);
-}
-
 /* Install the debugging versions of the symfile functions for OBJFILE.
    Do not call this if the debug versions are already installed.  */
 
@@ -586,7 +682,7 @@ install_symfile_debug_logging (struct objfile *objfile)
   real_sf = objfile->sf;
 
   /* Alas we have to preserve NULL entries in REAL_SF.  */
-  debug_data = XCNEW (struct debug_sym_fns_data);
+  debug_data = new struct debug_sym_fns_data;
 
 #define COPY_SF_PTR(from, to, name, func)      \
   do {                                         \
@@ -597,8 +693,6 @@ install_symfile_debug_logging (struct objfile *objfile)
   COPY_SF_PTR (real_sf, debug_data, sym_new_init, debug_sym_new_init);
   COPY_SF_PTR (real_sf, debug_data, sym_init, debug_sym_init);
   COPY_SF_PTR (real_sf, debug_data, sym_read, debug_sym_read);
-  COPY_SF_PTR (real_sf, debug_data, sym_read_psymbols,
-              debug_sym_read_psymbols);
   COPY_SF_PTR (real_sf, debug_data, sym_finish, debug_sym_finish);
   COPY_SF_PTR (real_sf, debug_data, sym_offsets, debug_sym_offsets);
   COPY_SF_PTR (real_sf, debug_data, sym_segments, debug_sym_segments);
@@ -607,12 +701,11 @@ install_symfile_debug_logging (struct objfile *objfile)
   COPY_SF_PTR (real_sf, debug_data, sym_relocate, debug_sym_relocate);
   if (real_sf->sym_probe_fns)
     debug_data->debug_sf.sym_probe_fns = &debug_sym_probe_fns;
-  debug_data->debug_sf.qf = &debug_sym_quick_functions;
 
 #undef COPY_SF_PTR
 
   debug_data->real_sf = real_sf;
-  set_objfile_data (objfile, symfile_debug_objfile_data_key, debug_data);
+  symfile_debug_objfile_data_key.set (objfile, debug_data);
   objfile->sf = &debug_data->debug_sf;
 }
 
@@ -627,12 +720,10 @@ uninstall_symfile_debug_logging (struct objfile *objfile)
   /* The debug versions should be currently installed.  */
   gdb_assert (symfile_debug_installed (objfile));
 
-  debug_data = ((struct debug_sym_fns_data *)
-               objfile_data (objfile, symfile_debug_objfile_data_key));
+  debug_data = symfile_debug_objfile_data_key.get (objfile);
 
   objfile->sf = debug_data->real_sf;
-  xfree (debug_data);
-  set_objfile_data (objfile, symfile_debug_objfile_data_key, NULL);
+  symfile_debug_objfile_data_key.clear (objfile);
 }
 
 /* Call this function to set OBJFILE->SF.
@@ -659,10 +750,8 @@ objfile_set_sym_fns (struct objfile *objfile, const struct sym_fns *sf)
 static void
 set_debug_symfile (const char *args, int from_tty, struct cmd_list_element *c)
 {
-  struct program_space *pspace;
-
-  ALL_PSPACES (pspace)
-    for (objfile *objfile : all_objfiles (pspace))
+  for (struct program_space *pspace : program_spaces)
+    for (objfile *objfile : pspace->objfiles ())
       {
        if (debug_symfile)
          {
@@ -684,12 +773,10 @@ show_debug_symfile (struct ui_file *file, int from_tty,
   fprintf_filtered (file, _("Symfile debugging is %s.\n"), value);
 }
 
+void _initialize_symfile_debug ();
 void
-_initialize_symfile_debug (void)
+_initialize_symfile_debug ()
 {
-  symfile_debug_objfile_data_key
-    = register_objfile_data_with_cleanup (NULL, symfile_debug_free_objfile);
-
   add_setshow_boolean_cmd ("symfile", no_class, &debug_symfile, _("\
 Set debugging of the symfile functions."), _("\
 Show debugging of the symfile functions."), _("\
This page took 0.033787 seconds and 4 git commands to generate.