Remove quick_symbol_functions::expand_symtabs_with_fullname
[deliverable/binutils-gdb.git] / gdb / symfile-debug.c
index 3daede88292164515ec5ffaa7f9c420781ea0847..dd5a70b4356bbd361dd6aedfaf91269f938875b4 100644 (file)
@@ -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
@@ -145,13 +147,51 @@ objfile::map_symtabs_matching_filename
                      real_path ? real_path : NULL,
                      host_address_to_string (&callback));
 
-  bool retval = false;
+  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)
     {
-      retval = (iter->map_symtabs_matching_filename
-               (this, name, real_path, callback));
-      if (retval)
-       break;
+      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;
+       }
     }
 
   if (debug_symfile)
@@ -159,7 +199,9 @@ objfile::map_symtabs_matching_filename
                      "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;
 }
 
 struct compunit_symtab *
@@ -173,10 +215,49 @@ objfile::lookup_symbol (block_enum kind, const char *name, domain_enum domain)
                      objfile_debug_name (this), kind, name,
                      domain_name (domain));
 
+  lookup_name_info lookup_name (name, symbol_name_match_type::FULL);
+
+  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);
+
+    sym = block_find_symbol (block, name, domain,
+                            block_find_non_opaque_type_preferred,
+                            &with_opaque);
+
+    /* Some caution must be observed with overloaded functions
+       and methods, since the index will not contain any overload
+       information (but NAME might contain it).  */
+
+    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;
+
+    /* Keep looking through other psymtabs.  */
+    return true;
+  };
+
   for (const auto &iter : qf)
     {
-      retval = iter->lookup_symbol (this, kind, name, domain);
-      if (retval != nullptr)
+      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;
     }
 
@@ -219,8 +300,19 @@ objfile::expand_symtabs_for_function (const char *func_name)
                      "qf->expand_symtabs_for_function (%s, \"%s\")\n",
                      objfile_debug_name (this), func_name);
 
+  lookup_name_info base_lookup (func_name, symbol_name_match_type::FULL);
+  lookup_name_info lookup_name = base_lookup.make_ignore_params ();
+
   for (const auto &iter : qf)
-    iter->expand_symtabs_for_function (this, func_name);
+    iter->expand_symtabs_matching (this,
+                                  nullptr,
+                                  &lookup_name,
+                                  nullptr,
+                                  nullptr,
+                                  (SEARCH_GLOBAL_BLOCK
+                                   | SEARCH_STATIC_BLOCK),
+                                  VAR_DOMAIN,
+                                  ALL_DOMAIN);
 }
 
 void
@@ -242,8 +334,22 @@ objfile::expand_symtabs_with_fullname (const char *fullname)
                      "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_with_fullname (this, fullname);
+    iter->expand_symtabs_matching (this,
+                                  file_matcher,
+                                  nullptr,
+                                  nullptr,
+                                  nullptr,
+                                  (SEARCH_GLOBAL_BLOCK
+                                   | SEARCH_STATIC_BLOCK),
+                                  UNDEF_DOMAIN,
+                                  ALL_DOMAIN);
 }
 
 void
@@ -265,12 +371,14 @@ objfile::map_matching_symbols
                                callback, ordered_compare);
 }
 
-void
+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)
 {
   if (debug_symfile)
@@ -283,8 +391,11 @@ objfile::expand_symtabs_matching
                      search_domain_name (kind));
 
   for (const auto &iter : qf)
-    iter->expand_symtabs_matching (this, file_matcher, lookup_name,
-                                  symbol_matcher, expansion_notify, kind);
+    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 *
@@ -323,19 +434,17 @@ objfile::find_pc_sect_compunit_symtab (struct bound_minimal_symbol msymbol,
 }
 
 void
-objfile::map_symbol_filenames (symbol_filename_ftype *fun, void *data,
-                              int need_fullname)
+objfile::map_symbol_filenames (gdb::function_view<symbol_filename_ftype> fun,
+                              bool need_fullname)
 {
   if (debug_symfile)
     fprintf_filtered (gdb_stdlog,
-                     "qf->map_symbol_filenames (%s, %s, %s, %d)\n",
+                     "qf->map_symbol_filenames (%s, ..., %d)\n",
                      objfile_debug_name (this),
-                     host_address_to_string (fun),
-                     host_address_to_string (data),
                      need_fullname);
 
   for (const auto &iter : qf)
-    iter->map_symbol_filenames (this, fun, data, need_fullname);
+    iter->map_symbol_filenames (this, fun, need_fullname);
 }
 
 struct compunit_symtab *
This page took 0.036507 seconds and 4 git commands to generate.