Add 'domain' parameter to expand_symtabs_matching
[deliverable/binutils-gdb.git] / gdb / symtab.c
index 20d73bb28f57e0a0d1b705bdcf99b3728fafff34..274ddfd1dae26763050d048c9ecbebb6d8046b09 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"
@@ -554,11 +555,8 @@ iterate_over_symtabs (const char *name,
 
   for (objfile *objfile : current_program_space->objfiles ())
     {
-      if (objfile->sf
-         && objfile->sf->qf->map_symtabs_matching_filename (objfile,
-                                                            name,
-                                                            real_path.get (),
-                                                            callback))
+      if (objfile->map_symtabs_matching_filename (name, real_path.get (),
+                                                 callback))
        return;
     }
 }
@@ -637,7 +635,7 @@ gdb_mangle_name (struct type *type, int method_id, int signature_id)
   else if (physname[0] == 't' || physname[0] == 'Q')
     {
       /* The physname for template and qualified methods already includes
-         the class name.  */
+        the class name.  */
       xsnprintf (buf, sizeof (buf), "__%s%s", const_prefix, volatile_prefix);
       newname = NULL;
       len = 0;
@@ -807,7 +805,7 @@ symbol_find_demangled_name (struct general_symbol_info *gsymbol,
     {
       const struct language_defn *lang = language_def (gsymbol->language ());
 
-      language_sniff_from_mangled_name (lang, mangled, &demangled);
+      lang->sniff_from_mangled_name (mangled, &demangled);
       return demangled;
     }
 
@@ -816,7 +814,7 @@ symbol_find_demangled_name (struct general_symbol_info *gsymbol,
       enum language l = (enum language) i;
       const struct language_defn *lang = language_def (l);
 
-      if (language_sniff_from_mangled_name (lang, mangled, &demangled))
+      if (lang->sniff_from_mangled_name (mangled, &demangled))
        {
          gsymbol->m_language = l;
          return demangled;
@@ -848,7 +846,7 @@ general_symbol_info::compute_and_set_names (gdb::string_view linkage_name,
   if (language () == language_ada)
     {
       /* In Ada, we do the symbol lookups using the mangled name, so
-         we can save some space by not storing the demangled name.  */
+        we can save some space by not storing the demangled name.  */
       if (!copy_name)
        m_name = linkage_name.data ();
       else
@@ -867,7 +865,7 @@ general_symbol_info::compute_and_set_names (gdb::string_view linkage_name,
   if (!hash.has_value ())
     hash = hash_demangled_name_entry (&entry);
   slot = ((struct demangled_name_entry **)
-          htab_find_slot_with_hash (per_bfd->demangled_names_hash.get (),
+         htab_find_slot_with_hash (per_bfd->demangled_names_hash.get (),
                                    &entry, *hash, INSERT));
 
   /* The const_cast is safe because the only reason it is already
@@ -887,8 +885,8 @@ general_symbol_info::compute_and_set_names (gdb::string_view linkage_name,
       || (language () == language_go && (*slot)->demangled == nullptr))
     {
       /* A 0-terminated copy of the linkage name.  Callers must set COPY_NAME
-         to true if the string might not be nullterminated.  We have to make
-         this copy because demangling needs a nullterminated string.  */
+        to true if the string might not be nullterminated.  We have to make
+        this copy because demangling needs a nullterminated string.  */
       gdb::string_view linkage_name_copy;
       if (copy_name)
        {
@@ -1011,12 +1009,22 @@ general_symbol_info::search_name () const
 
 /* See symtab.h.  */
 
+struct obj_section *
+general_symbol_info::obj_section (const struct objfile *objfile) const
+{
+  if (section_index () >= 0)
+    return &objfile->sections[section_index ()];
+  return nullptr;
+}
+
+/* See symtab.h.  */
+
 bool
 symbol_matches_search_name (const struct general_symbol_info *gsymbol,
                            const lookup_name_info &name)
 {
   symbol_name_matcher_ftype *name_match
-    = get_symbol_name_matcher (language_def (gsymbol->language ()), name);
+    = language_def (gsymbol->language ())->get_symbol_name_matcher (name);
   return name_match (gsymbol->search_name (), name, NULL);
 }
 
@@ -1103,11 +1111,8 @@ expand_symtab_containing_pc (CORE_ADDR pc, struct obj_section *section)
 
   for (objfile *objfile : current_program_space->objfiles ())
     {
-      struct compunit_symtab *cust = NULL;
-
-      if (objfile->sf)
-       cust = objfile->sf->qf->find_pc_sect_compunit_symtab (objfile, msymbol,
-                                                             pc, section, 0);
+      struct compunit_symtab *cust
+       = objfile->find_pc_sect_compunit_symtab (msymbol, pc, section, 0);
       if (cust)
        return;
     }
@@ -1644,7 +1649,7 @@ fixup_section (struct general_symbol_info *ginfo,
   msym = lookup_minimal_symbol_by_pc_name (addr, ginfo->linkage_name (),
                                           objfile);
   if (msym)
-    ginfo->section = MSYMBOL_SECTION (msym);
+    ginfo->set_section_index (msym->section_index ());
   else
     {
       /* Static, function-local variables do appear in the linker
@@ -1696,7 +1701,7 @@ fixup_section (struct general_symbol_info *ginfo,
          if (obj_section_addr (s) - offset <= addr
              && addr < obj_section_endaddr (s) - offset)
            {
-             ginfo->section = idx;
+             ginfo->set_section_index (idx);
              return;
            }
        }
@@ -1705,9 +1710,9 @@ fixup_section (struct general_symbol_info *ginfo,
         section.  If there is no allocated section, then it hardly
         matters what we pick, so just pick zero.  */
       if (fallback == -1)
-       ginfo->section = 0;
+       ginfo->set_section_index (0);
       else
-       ginfo->section = fallback;
+       ginfo->set_section_index (fallback);
     }
 }
 
@@ -1729,7 +1734,7 @@ fixup_symbol_section (struct symbol *sym, struct objfile *objfile)
   if (objfile == NULL)
     objfile = symbol_objfile (sym);
 
-  if (SYMBOL_OBJ_SECTION (objfile, sym))
+  if (sym->obj_section (objfile) != nullptr)
     return sym;
 
   /* We should have an objfile by now.  */
@@ -1842,7 +1847,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);
     }
@@ -1855,7 +1861,7 @@ demangle_for_lookup (const char *name, enum language lang,
 unsigned int
 search_name_hash (enum language language, const char *search_name)
 {
-  return language_def (language)->la_search_name_hash (search_name);
+  return language_def (language)->search_name_hash (search_name);
 }
 
 /* See symtab.h.
@@ -1912,7 +1918,7 @@ struct block_symbol
 lookup_language_this (const struct language_defn *lang,
                      const struct block *block)
 {
-  if (lang->la_name_of_this == NULL || block == NULL)
+  if (lang->name_of_this () == NULL || block == NULL)
     return {};
 
   if (symbol_lookup_debug > 1)
@@ -1921,7 +1927,7 @@ lookup_language_this (const struct language_defn *lang,
 
       fprintf_unfiltered (gdb_stdlog,
                          "lookup_language_this (%s, %s (objfile %s))",
-                         lang->la_name, host_address_to_string (block),
+                         lang->name (), host_address_to_string (block),
                          objfile_debug_name (objfile));
     }
 
@@ -1929,7 +1935,7 @@ lookup_language_this (const struct language_defn *lang,
     {
       struct symbol *sym;
 
-      sym = block_lookup_symbol (block, lang->la_name_of_this,
+      sym = block_lookup_symbol (block, lang->name_of_this (),
                                 symbol_name_match_type::SEARCH_NAME,
                                 VAR_DOMAIN);
       if (sym != NULL)
@@ -1966,14 +1972,14 @@ check_field (struct type *type, const char *name,
   /* The type may be a stub.  */
   type = check_typedef (type);
 
-  for (i = TYPE_NFIELDS (type) - 1; i >= TYPE_N_BASECLASSES (type); i--)
+  for (i = type->num_fields () - 1; i >= TYPE_N_BASECLASSES (type); i--)
     {
       const char *t_field_name = TYPE_FIELD_NAME (type, i);
 
       if (t_field_name && (strcmp_iw (t_field_name, name) == 0))
        {
          is_a_field_of_this->type = type;
-         is_a_field_of_this->field = &TYPE_FIELD (type, i);
+         is_a_field_of_this->field = &type->field (i);
          return 1;
        }
     }
@@ -2069,7 +2075,7 @@ lookup_symbol_aux (const char *name, symbol_name_match_type match_type,
          if (t->code () != TYPE_CODE_STRUCT
              && t->code () != TYPE_CODE_UNION)
            error (_("Internal error: `%s' is not an aggregate"),
-                  langdef->la_name_of_this);
+                  langdef->name_of_this ());
 
          if (check_field (t, name, is_a_field_of_this))
            {
@@ -2086,7 +2092,7 @@ lookup_symbol_aux (const char *name, symbol_name_match_type match_type,
   /* Now do whatever is appropriate for LANGUAGE to look
      up static and global variables.  */
 
-  result = langdef->la_lookup_symbol_nonlocal (langdef, name, block, domain);
+  result = langdef->lookup_symbol_nonlocal (name, block, domain);
   if (result.symbol != NULL)
     {
       if (symbol_lookup_debug)
@@ -2137,14 +2143,14 @@ lookup_local_symbol (const char *name,
        return (struct block_symbol) {sym, block};
 
       if (language == language_cplus || language == language_fortran)
-        {
-          struct block_symbol blocksym
+       {
+         struct block_symbol blocksym
            = cp_lookup_symbol_imports_or_template (scope, name, block,
                                                    domain);
 
-          if (blocksym.symbol != NULL)
-            return blocksym;
-        }
+         if (blocksym.symbol != NULL)
+           return blocksym;
+       }
 
       if (BLOCK_FUNCTION (block) != NULL && block_inlined_p (block))
        break;
@@ -2206,7 +2212,7 @@ lookup_global_symbol_from_objfile (struct objfile *main_objfile,
   for (objfile *objfile : main_objfile->separate_debug_objfiles ())
     {
       struct block_symbol result
-        = lookup_symbol_in_objfile (objfile, block_index, name, domain);
+       = lookup_symbol_in_objfile (objfile, block_index, name, domain);
 
       if (result.symbol != nullptr)
        return result;
@@ -2357,9 +2363,6 @@ lookup_symbol_via_quick_fns (struct objfile *objfile,
   const struct block *block;
   struct block_symbol result;
 
-  if (!objfile->sf)
-    return {};
-
   if (symbol_lookup_debug > 1)
     {
       fprintf_unfiltered (gdb_stdlog,
@@ -2370,7 +2373,7 @@ lookup_symbol_via_quick_fns (struct objfile *objfile,
                          name, domain_name (domain));
     }
 
-  cust = objfile->sf->qf->lookup_symbol (objfile, block_index, name, domain);
+  cust = objfile->lookup_symbol (block_index, name, domain);
   if (cust == NULL)
     {
       if (symbol_lookup_debug > 1)
@@ -2401,13 +2404,12 @@ lookup_symbol_via_quick_fns (struct objfile *objfile,
   return result;
 }
 
-/* See symtab.h.  */
+/* See language.h.  */
 
 struct block_symbol
-basic_lookup_symbol_nonlocal (const struct language_defn *langdef,
-                             const char *name,
-                             const struct block *block,
-                             const domain_enum domain)
+language_defn::lookup_symbol_nonlocal (const char *name,
+                                      const struct block *block,
+                                      const domain_enum domain) const
 {
   struct block_symbol result;
 
@@ -2433,7 +2435,7 @@ basic_lookup_symbol_nonlocal (const struct language_defn *langdef,
        gdbarch = target_gdbarch ();
       else
        gdbarch = block_gdbarch (block);
-      result.symbol = language_lookup_primitive_type_as_symbol (langdef,
+      result.symbol = language_lookup_primitive_type_as_symbol (this,
                                                                gdbarch, name);
       result.block = NULL;
       if (result.symbol != NULL)
@@ -2538,23 +2540,13 @@ lookup_symbol_in_objfile (struct objfile *objfile, enum block_enum block_index,
 static enum language
 find_quick_global_symbol_language (const char *name, const domain_enum domain)
 {
-  for (objfile *objfile : current_program_space->objfiles ())
-    {
-      if (objfile->sf && objfile->sf->qf
-         && objfile->sf->qf->lookup_global_symbol_language)
-       continue;
-      return language_unknown;
-    }
-
   for (objfile *objfile : current_program_space->objfiles ())
     {
       bool symbol_found_p;
       enum language lang
-       = objfile->sf->qf->lookup_global_symbol_language (objfile, name, domain,
-                                                         &symbol_found_p);
-      if (!symbol_found_p)
-       continue;
-      return lang;
+       = objfile->lookup_global_symbol_language (name, domain, &symbol_found_p);
+      if (symbol_found_p)
+       return lang;
     }
 
   return language_unknown;
@@ -2722,7 +2714,7 @@ symbol_matches_domain (enum language symbol_language,
 struct type *
 lookup_transparent_type (const char *name)
 {
-  return current_language->la_lookup_transparent_type (name);
+  return current_language->lookup_transparent_type (name);
 }
 
 /* A helper for basic_lookup_transparent_type that interfaces with the
@@ -2738,10 +2730,7 @@ basic_lookup_transparent_type_quick (struct objfile *objfile,
   const struct block *block;
   struct symbol *sym;
 
-  if (!objfile->sf)
-    return NULL;
-  cust = objfile->sf->qf->lookup_symbol (objfile, block_index, name,
-                                        STRUCT_DOMAIN);
+  cust = objfile->lookup_symbol (block_index, name, STRUCT_DOMAIN);
   if (cust == NULL)
     return NULL;
 
@@ -2884,7 +2873,7 @@ struct compunit_symtab *
 find_pc_sect_compunit_symtab (CORE_ADDR pc, struct obj_section *section)
 {
   struct compunit_symtab *best_cust = NULL;
-  CORE_ADDR distance = 0;
+  CORE_ADDR best_cust_range = 0;
   struct bound_minimal_symbol msymbol;
 
   /* If we know that this is not a text address, return failure.  This is
@@ -2915,56 +2904,74 @@ find_pc_sect_compunit_symtab (CORE_ADDR pc, struct obj_section *section)
     {
       for (compunit_symtab *cust : obj_file->compunits ())
        {
-         const struct block *b;
-         const struct blockvector *bv;
+         const struct blockvector *bv = COMPUNIT_BLOCKVECTOR (cust);
+         const struct block *global_block
+           = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
+         CORE_ADDR start = BLOCK_START (global_block);
+         CORE_ADDR end = BLOCK_END (global_block);
+         bool in_range_p = start <= pc && pc < end;
+         if (!in_range_p)
+           continue;
+
+         if (BLOCKVECTOR_MAP (bv))
+           {
+             if (addrmap_find (BLOCKVECTOR_MAP (bv), pc) == nullptr)
+               continue;
+
+             return cust;
+           }
 
-         bv = COMPUNIT_BLOCKVECTOR (cust);
-         b = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
+         CORE_ADDR range = end - start;
+         if (best_cust != nullptr
+             && range >= best_cust_range)
+           /* Cust doesn't have a smaller range than best_cust, skip it.  */
+           continue;
+       
+         /* For an objfile that has its functions reordered,
+            find_pc_psymtab will find the proper partial symbol table
+            and we simply return its corresponding symtab.  */
+         /* In order to better support objfiles that contain both
+            stabs and coff debugging info, we continue on if a psymtab
+            can't be found.  */
+         if ((obj_file->flags & OBJF_REORDERED) != 0)
+           {
+             struct compunit_symtab *result;
+
+             result
+               = obj_file->find_pc_sect_compunit_symtab (msymbol,
+                                                         pc,
+                                                         section,
+                                                         0);
+             if (result != NULL)
+               return result;
+           }
 
-         if (BLOCK_START (b) <= pc
-             && BLOCK_END (b) > pc
-             && (distance == 0
-                 || BLOCK_END (b) - BLOCK_START (b) < distance))
+         if (section != 0)
            {
-             /* For an objfile that has its functions reordered,
-                find_pc_psymtab will find the proper partial symbol table
-                and we simply return its corresponding symtab.  */
-             /* In order to better support objfiles that contain both
-                stabs and coff debugging info, we continue on if a psymtab
-                can't be found.  */
-             if ((obj_file->flags & OBJF_REORDERED) && obj_file->sf)
-               {
-                 struct compunit_symtab *result;
-
-                 result
-                   = obj_file->sf->qf->find_pc_sect_compunit_symtab (obj_file,
-                                                                     msymbol,
-                                                                     pc,
-                                                                     section,
-                                                                     0);
-                 if (result != NULL)
-                   return result;
-               }
-             if (section != 0)
-               {
-                 struct block_iterator iter;
-                 struct symbol *sym = NULL;
+             struct symbol *sym = NULL;
+             struct block_iterator iter;
 
+             for (int b_index = GLOBAL_BLOCK;
+                  b_index <= STATIC_BLOCK && sym == NULL;
+                  ++b_index)
+               {
+                 const struct block *b = BLOCKVECTOR_BLOCK (bv, b_index);
                  ALL_BLOCK_SYMBOLS (b, iter, sym)
                    {
                      fixup_symbol_section (sym, obj_file);
-                     if (matching_obj_sections (SYMBOL_OBJ_SECTION (obj_file,
-                                                                    sym),
+                     if (matching_obj_sections (sym->obj_section (obj_file),
                                                 section))
                        break;
                    }
-                 if (sym == NULL)
-                   continue;           /* No symbol in this symtab matches
-                                          section.  */
                }
-             distance = BLOCK_END (b) - BLOCK_START (b);
-             best_cust = cust;
+             if (sym == NULL)
+               continue;               /* No symbol in this symtab matches
+                                          section.  */
            }
+
+         /* Cust is best found sofar, save it.  */
+         best_cust = cust;
+         best_cust_range = range;
        }
     }
 
@@ -2975,14 +2982,8 @@ find_pc_sect_compunit_symtab (CORE_ADDR pc, struct obj_section *section)
 
   for (objfile *objf : current_program_space->objfiles ())
     {
-      struct compunit_symtab *result;
-
-      if (!objf->sf)
-       continue;
-      result = objf->sf->qf->find_pc_sect_compunit_symtab (objf,
-                                                          msymbol,
-                                                          pc, section,
-                                                          1);
+      struct compunit_symtab *result
+       = objf->find_pc_sect_compunit_symtab (msymbol, pc, section, 1);
       if (result != NULL)
        return result;
     }
@@ -3005,30 +3006,50 @@ 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 was read with -readnow, then we need to
+        search the symtabs directly.  */
+      if ((objfile->flags & OBJF_READNOW) != 0)
+       {
+         for (compunit_symtab *symtab : objfile->compunits ())
+           {
+             struct symbol *sym = search_symtab (symtab, address);
+             if (sym != nullptr)
+               return sym;
+           }
+       }
+      else
+       {
+         struct compunit_symtab *symtab
+           = objfile->find_compunit_symtab_by_address (address);
+         if (symtab != NULL)
+           {
+             struct symbol *sym = search_symtab (symtab, address);
+             if (sym != nullptr)
+               return sym;
            }
        }
     }
@@ -3177,7 +3198,7 @@ find_pc_sect_line (CORE_ADDR pc, struct obj_section *section, int notcurrent)
               fatally.  */
            if (BMSYMBOL_VALUE_ADDRESS (mfunsym) == pc)
              internal_error (__FILE__, __LINE__,
-               _("Infinite recursion detected in find_pc_sect_line;"
+               _("Infinite recursion detected in find_pc_sect_line;"
                  "please file a bug report"));
 
            return find_pc_line (BMSYMBOL_VALUE_ADDRESS (mfunsym), 0);
@@ -3223,7 +3244,7 @@ find_pc_sect_line (CORE_ADDR pc, struct obj_section *section, int notcurrent)
       item = l->item;          /* Get first line info.  */
 
       /* Is this file's first line closer than the first lines of other files?
-         If so, record this file, and its first line, as best alternate.  */
+        If so, record this file, and its first line, as best alternate.  */
       if (item->pc > pc && (!alt || item->pc < alt->pc))
        alt = item;
 
@@ -3237,22 +3258,17 @@ find_pc_sect_line (CORE_ADDR pc, struct obj_section *section, int notcurrent)
       struct linetable_entry *last = item + len;
       item = std::upper_bound (first, last, pc, pc_compare);
       if (item != first)
-       {
-         /* Found a matching item.  Skip backwards over any end of
-            sequence markers.  */
-         for (prev = item - 1; prev->line == 0 && prev != first; prev--)
-           /* Nothing.  */;
-       }
+       prev = item - 1;                /* Found a matching item.  */
 
       /* At this point, prev points at the line whose start addr is <= pc, and
-         item points at the next line.  If we ran off the end of the linetable
-         (pc >= start of the last line), then prev == item.  If pc < start of
-         the first line, prev will not be set.  */
+        item points at the next line.  If we ran off the end of the linetable
+        (pc >= start of the last line), then prev == item.  If pc < start of
+        the first line, prev will not be set.  */
 
       /* Is this file's best line closer than the best in the other files?
-         If so, record this file, and its best line, as best so far.  Don't
-         save prev if it represents the end of a function (i.e. line number
-         0) instead of a real line.  */
+        If so, record this file, and its best line, as best so far.  Don't
+        save prev if it represents the end of a function (i.e. line number
+        0) instead of a real line.  */
 
       if (prev && prev->line && (!best || prev->pc > best->pc))
        {
@@ -3329,9 +3345,18 @@ find_pc_line (CORE_ADDR pc, int notcurrent)
   struct obj_section *section;
 
   section = find_pc_overlay (pc);
-  if (pc_in_unmapped_range (pc, section))
-    pc = overlay_mapped_address (pc, section);
-  return find_pc_sect_line (pc, section, notcurrent);
+  if (!pc_in_unmapped_range (pc, section))
+    return find_pc_sect_line (pc, section, notcurrent);
+
+  /* If the original PC was an unmapped address then we translate this to a
+     mapped address in order to lookup the sal.  However, as the user
+     passed us an unmapped address it makes more sense to return a result
+     that has the pc and end fields translated to unmapped addresses.  */
+  pc = overlay_mapped_address (pc, section);
+  symtab_and_line sal = find_pc_sect_line (pc, section, notcurrent);
+  sal.pc = overlay_unmapped_address (sal.pc, section);
+  sal.end = overlay_unmapped_address (sal.end, section);
+  return sal;
 }
 
 /* See symtab.h.  */
@@ -3377,15 +3402,15 @@ find_line_symtab (struct symtab *sym_tab, int line,
   if (best_index < 0 || !exact)
     {
       /* Didn't find an exact match.  So we better keep looking for
-         another symtab with the same name.  In the case of xcoff,
-         multiple csects for one source file (produced by IBM's FORTRAN
-         compiler) produce multiple symtabs (this is unavoidable
-         assuming csects can be at arbitrary places in memory and that
-         the GLOBAL_BLOCK of a symtab has a begin and end address).  */
+        another symtab with the same name.  In the case of xcoff,
+        multiple csects for one source file (produced by IBM's FORTRAN
+        compiler) produce multiple symtabs (this is unavoidable
+        assuming csects can be at arbitrary places in memory and that
+        the GLOBAL_BLOCK of a symtab has a begin and end address).  */
 
       /* BEST is the smallest linenumber > LINE so far seen,
-         or 0 if none has been seen so far.
-         BEST_INDEX and BEST_LINETABLE identify the item for it.  */
+        or 0 if none has been seen so far.
+        BEST_INDEX and BEST_LINETABLE identify the item for it.  */
       int best;
 
       if (best_index >= 0)
@@ -3394,11 +3419,7 @@ find_line_symtab (struct symtab *sym_tab, int line,
        best = 0;
 
       for (objfile *objfile : current_program_space->objfiles ())
-       {
-         if (objfile->sf)
-           objfile->sf->qf->expand_symtabs_with_fullname
-             (objfile, symtab_to_fullname (sym_tab));
-       }
+       objfile->expand_symtabs_with_fullname (symtab_to_fullname (sym_tab));
 
       for (objfile *objfile : current_program_space->objfiles ())
        {
@@ -3684,7 +3705,7 @@ find_function_start_sal (symbol *sym, bool funfirstline)
   fixup_symbol_section (sym, NULL);
   symtab_and_line sal
     = find_function_start_sal_1 (BLOCK_ENTRY_PC (SYMBOL_BLOCK_VALUE (sym)),
-                                SYMBOL_OBJ_SECTION (symbol_objfile (sym), sym),
+                                sym->obj_section (symbol_objfile (sym)),
                                 funfirstline);
   sal.symbol = sym;
   return sal;
@@ -3775,20 +3796,20 @@ skip_prologue_sal (struct symtab_and_line *sal)
 
       objfile = symbol_objfile (sym);
       pc = BLOCK_ENTRY_PC (SYMBOL_BLOCK_VALUE (sym));
-      section = SYMBOL_OBJ_SECTION (objfile, sym);
+      section = sym->obj_section (objfile);
       name = sym->linkage_name ();
     }
   else
     {
       struct bound_minimal_symbol msymbol
-        = lookup_minimal_symbol_by_pc_section (sal->pc, sal->section);
+       = lookup_minimal_symbol_by_pc_section (sal->pc, sal->section);
 
       if (msymbol.minsym == NULL)
        return;
 
       objfile = msymbol.objfile;
       pc = BMSYMBOL_VALUE_ADDRESS (msymbol);
-      section = MSYMBOL_OBJ_SECTION (objfile, msymbol.minsym);
+      section = msymbol.minsym->obj_section (objfile);
       name = msymbol.minsym->linkage_name ();
     }
 
@@ -3822,7 +3843,7 @@ skip_prologue_sal (struct symtab_and_line *sal)
       /* Skip "first line" of function (which is actually its prologue).  */
       pc += gdbarch_deprecated_function_start_offset (gdbarch);
       if (gdbarch_skip_entrypoint_p (gdbarch))
-        pc = gdbarch_skip_entrypoint (gdbarch, pc);
+       pc = gdbarch_skip_entrypoint (gdbarch, pc);
       if (skip)
        pc = gdbarch_skip_prologue_noexcept (gdbarch, pc);
 
@@ -4206,15 +4227,21 @@ struct output_source_filename_data
 
   /* Flag of whether we're printing the first one.  */
   int first;
-};
 
-/* Slave routine for sources_info.  Force line breaks at ,'s.
-   NAME is the name to print.
-   DATA contains the state for printing and watching for duplicates.  */
+  /* Worker for sources_info.  Force line breaks at ,'s.
+     NAME is the name to print.  */
+  void output (const char *name);
 
-static void
-output_source_filename (const char *name,
-                       struct output_source_filename_data *data)
+  /* An overload suitable for use as a callback to
+     quick_symbol_functions::map_symbol_filenames.  */
+  void operator() (const char *filename, const char *fullname)
+  {
+    output (fullname != nullptr ? fullname : filename);
+  }
+};
+
+void
+output_source_filename_data::output (const char *name)
 {
   /* Since a single source file can result in several partial symbol
      tables, we need to avoid printing it more than once.  Note: if
@@ -4226,51 +4253,41 @@ output_source_filename (const char *name,
      symtabs; it doesn't hurt to check.  */
 
   /* Was NAME already seen?  */
-  if (data->filename_seen_cache->seen (name))
+  if (filename_seen_cache->seen (name))
     {
       /* Yes; don't print it again.  */
       return;
     }
 
-  /* Does it match data->regexp?  */
-  if (data->c_regexp.has_value ())
+  /* Does it match regexp?  */
+  if (c_regexp.has_value ())
     {
       const char *to_match;
       std::string dirname;
 
-      if (data->partial_match.dirname)
+      if (partial_match.dirname)
        {
          dirname = ldirname (name);
          to_match = dirname.c_str ();
        }
-      else if (data->partial_match.basename)
+      else if (partial_match.basename)
        to_match = lbasename (name);
       else
        to_match = name;
 
-      if (data->c_regexp->exec (to_match, 0, NULL, 0) != 0)
+      if (c_regexp->exec (to_match, 0, NULL, 0) != 0)
        return;
     }
 
   /* Print it and reset *FIRST.  */
-  if (! data->first)
+  if (! first)
     printf_filtered (", ");
-  data->first = 0;
+  first = 0;
 
   wrap_here ("");
   fputs_styled (name, file_name_style.style (), gdb_stdout);
 }
 
-/* A callback for map_partial_symbol_filenames.  */
-
-static void
-output_partial_symbol_filename (const char *filename, const char *fullname,
-                               void *data)
-{
-  output_source_filename (fullname ? fullname : filename,
-                         (struct output_source_filename_data *) data);
-}
-
 using isrc_flag_option_def
   = gdb::option::flag_option_def<filename_partial_match_opts>;
 
@@ -4389,7 +4406,7 @@ info_sources_command (const char *args, int from_tty)
            {
              const char *fullname = symtab_to_fullname (s);
 
-             output_source_filename (fullname, &data);
+             data.output (fullname);
            }
        }
     }
@@ -4400,8 +4417,7 @@ info_sources_command (const char *args, int from_tty)
 
   filenames_seen.clear ();
   data.first = 1;
-  map_symbol_filenames (output_partial_symbol_filename, &data,
-                       1 /*need_fullname*/);
+  map_symbol_filenames (data, true /*need_fullname*/);
   printf_filtered ("\n");
 }
 
@@ -4519,21 +4535,21 @@ global_symbol_searcher::expand_symtabs
   enum search_domain kind = m_kind;
   bool found_msymbol = false;
 
-  if (objfile->sf)
-    objfile->sf->qf->expand_symtabs_matching
-      (objfile,
-       [&] (const char *filename, bool basenames)
-       {
-        return file_matches (filename, filenames, basenames);
-       },
-       &lookup_name_info::match_any (),
-       [&] (const char *symname)
-       {
-        return (!preg.has_value ()
-                || preg->exec (symname, 0, NULL, 0) == 0);
-       },
-       NULL,
-       kind);
+  objfile->expand_symtabs_matching
+    ([&] (const char *filename, bool basenames)
+     {
+       return file_matches (filename, filenames, basenames);
+     },
+     &lookup_name_info::match_any (),
+     [&] (const char *symname)
+     {
+       return (!preg.has_value ()
+              || preg->exec (symname, 0, NULL, 0) == 0);
+     },
+     NULL,
+     SEARCH_GLOBAL_BLOCK | SEARCH_STATIC_BLOCK,
+     UNDEF_DOMAIN,
+     kind);
 
   /* Here, we search through the minimal symbol tables for functions and
      variables that match, and force their symbols to be read.  This is in
@@ -4731,16 +4747,16 @@ global_symbol_searcher::search () const
       const char *symbol_name_regexp = m_symbol_name_regexp;
 
       /* Make sure spacing is right for C++ operators.
-         This is just a courtesy to make the matching less sensitive
-         to how many spaces the user leaves between 'operator'
-         and <TYPENAME> or <OPERATOR>.  */
+        This is just a courtesy to make the matching less sensitive
+        to how many spaces the user leaves between 'operator'
+        and <TYPENAME> or <OPERATOR>.  */
       const char *opend;
       const char *opname = operator_chars (symbol_name_regexp, &opend);
 
       if (*opname)
        {
          int fix = -1;         /* -1 means ok; otherwise number of
-                                    spaces needed.  */
+                                   spaces needed.  */
 
          if (isalpha (*opname) || *opname == '_' || *opname == '$')
            {
@@ -5196,6 +5212,11 @@ rbreak_command (const char *regexp, int from_tty)
     {
       const char *colon = strchr (regexp, ':');
 
+      /* Ignore the colon if it is part of a Windows drive.  */
+      if (HAS_DRIVE_SPEC (regexp)
+         && (regexp[2] == '/' || regexp[2] == '\\'))
+       colon = strchr (STRIP_DRIVE_SPEC (regexp), ':');
+
       if (colon && *(colon + 1) != ':')
        {
          int colon_index;
@@ -5253,14 +5274,14 @@ compare_symbol_name (const char *symbol_name, language symbol_language,
   const language_defn *lang = language_def (symbol_language);
 
   symbol_name_matcher_ftype *name_match
-    = get_symbol_name_matcher (lang, lookup_name);
+    = lang->get_symbol_name_matcher (lookup_name);
 
   return name_match (symbol_name, lookup_name, &match_res);
 }
 
 /*  See symtab.h.  */
 
-void
+bool
 completion_list_add_name (completion_tracker &tracker,
                          language symbol_language,
                          const char *symname,
@@ -5272,7 +5293,7 @@ completion_list_add_name (completion_tracker &tracker,
 
   /* Clip symbols that cannot match.  */
   if (!compare_symbol_name (symname, symbol_language, lookup_name, match_res))
-    return;
+    return false;
 
   /* Refresh SYMNAME from the match string.  It's potentially
      different depending on language.  (E.g., on Ada, the match may be
@@ -5296,6 +5317,8 @@ completion_list_add_name (completion_tracker &tracker,
     tracker.add_completion (std::move (completion),
                            &match_res.match_for_lcd, text, word);
   }
+
+  return true;
 }
 
 /* completion_list_add_name wrapper for struct symbol.  */
@@ -5306,9 +5329,10 @@ completion_list_add_symbol (completion_tracker &tracker,
                            const lookup_name_info &lookup_name,
                            const char *text, const char *word)
 {
-  completion_list_add_name (tracker, sym->language (),
-                           sym->natural_name (),
-                           lookup_name, text, word);
+  if (!completion_list_add_name (tracker, sym->language (),
+                                sym->natural_name (),
+                                lookup_name, text, word))
+    return;
 
   /* C++ function symbols include the parameters within both the msymbol
      name and the symbol name.  The problem is that the msymbol name will
@@ -5472,7 +5496,7 @@ completion_list_add_fields (completion_tracker &tracker,
       int j;
 
       if (c == TYPE_CODE_UNION || c == TYPE_CODE_STRUCT)
-       for (j = TYPE_N_BASECLASSES (t); j < TYPE_NFIELDS (t); j++)
+       for (j = TYPE_N_BASECLASSES (t); j < t->num_fields (); j++)
          if (TYPE_FIELD_NAME (t, j))
            completion_list_add_name (tracker, sym->language (),
                                      TYPE_FIELD_NAME (t, j),
@@ -5537,10 +5561,8 @@ find_gnu_ifunc (const symbol *sym)
          if (MSYMBOL_TYPE (minsym) == mst_data_gnu_ifunc)
            {
              struct gdbarch *gdbarch = objfile->arch ();
-             msym_addr
-               = gdbarch_convert_from_func_ptr_addr (gdbarch,
-                                                     msym_addr,
-                                                     current_top_target ());
+             msym_addr = gdbarch_convert_from_func_ptr_addr
+               (gdbarch, msym_addr, current_inferior ()->top_target ());
            }
          if (msym_addr == address)
            {
@@ -5631,7 +5653,7 @@ default_collect_symbol_completion_matches_break_on
              quote_found = '\0';
            else if (*p == '\\' && p[1] == quote_found)
              /* A backslash followed by the quote character
-                doesn't end the string.  */
+                doesn't end the string.  */
              ++p;
          }
        else if (*p == '\'' || *p == '"')
@@ -5645,7 +5667,7 @@ default_collect_symbol_completion_matches_break_on
       sym_text = quote_pos + 1;
     else if (quote_found == '"')
       /* A double-quoted string is never a symbol, nor does it make sense
-         to complete it any other way.  */
+        to complete it any other way.  */
       {
        return;
       }
@@ -5710,7 +5732,9 @@ default_collect_symbol_completion_matches_break_on
                               add_symtab_completions (symtab,
                                                       tracker, mode, lookup_name,
                                                       sym_text, word, code);
+                              return true;
                             },
+                          SEARCH_GLOBAL_BLOCK | SEARCH_STATIC_BLOCK,
                           ALL_DOMAIN);
 
   /* Search upwards from currently selected frame (so that we can
@@ -5766,7 +5790,7 @@ default_collect_symbol_completion_matches_break_on
 
   /* Skip macros if we are completing a struct tag -- arguable but
      usually what is expected.  */
-  if (current_language->la_macro_expansion == macro_expansion_c
+  if (current_language->macro_expansion () == macro_expansion_c
       && code == TYPE_CODE_UNDEF)
     {
       gdb::unique_xmalloc_ptr<struct macro_scope> scope;
@@ -5798,19 +5822,6 @@ default_collect_symbol_completion_matches_break_on
     }
 }
 
-void
-default_collect_symbol_completion_matches (completion_tracker &tracker,
-                                          complete_symbol_mode mode,
-                                          symbol_name_match_type name_match_type,
-                                          const char *text, const char *word,
-                                          enum type_code code)
-{
-  return default_collect_symbol_completion_matches_break_on (tracker, mode,
-                                                            name_match_type,
-                                                            text, word, "",
-                                                            code);
-}
-
 /* Collect all symbols (regardless of class) which begin by matching
    TEXT.  */
 
@@ -5820,10 +5831,10 @@ collect_symbol_completion_matches (completion_tracker &tracker,
                                   symbol_name_match_type name_match_type,
                                   const char *text, const char *word)
 {
-  current_language->la_collect_symbol_completion_matches (tracker, mode,
-                                                         name_match_type,
-                                                         text, word,
-                                                         TYPE_CODE_UNDEF);
+  current_language->collect_symbol_completion_matches (tracker, mode,
+                                                      name_match_type,
+                                                      text, word,
+                                                      TYPE_CODE_UNDEF);
 }
 
 /* Like collect_symbol_completion_matches, but only collect
@@ -5840,9 +5851,9 @@ collect_symbol_completion_matches_type (completion_tracker &tracker,
   gdb_assert (code == TYPE_CODE_UNION
              || code == TYPE_CODE_STRUCT
              || code == TYPE_CODE_ENUM);
-  current_language->la_collect_symbol_completion_matches (tracker, mode,
-                                                         name_match_type,
-                                                         text, word, code);
+  current_language->collect_symbol_completion_matches (tracker, mode,
+                                                      name_match_type,
+                                                      text, word, code);
 }
 
 /* Like collect_symbol_completion_matches, but collects a list of
@@ -5879,7 +5890,7 @@ collect_file_symbol_completion_matches (completion_tracker &tracker,
              quote_found = '\0';
            else if (*p == '\\' && p[1] == quote_found)
              /* A backslash followed by the quote character
-                doesn't end the string.  */
+                doesn't end the string.  */
              ++p;
          }
        else if (*p == '\'' || *p == '"')
@@ -5893,7 +5904,7 @@ collect_file_symbol_completion_matches (completion_tracker &tracker,
       sym_text = quote_pos + 1;
     else if (quote_found == '"')
       /* A double-quoted string is never a symbol, nor does it make sense
-         to complete it any other way.  */
+        to complete it any other way.  */
       {
        return;
       }
@@ -5945,7 +5956,7 @@ not_interesting_fname (const char *fname)
   return 0;
 }
 
-/* An object of this type is passed as the user_data argument to
+/* An object of this type is passed as the callback argument to
    map_partial_symbol_filenames.  */
 struct add_partial_filename_data
 {
@@ -5954,34 +5965,33 @@ struct add_partial_filename_data
   const char *word;
   int text_len;
   completion_list *list;
+
+  void operator() (const char *filename, const char *fullname);
 };
 
 /* A callback for map_partial_symbol_filenames.  */
 
-static void
-maybe_add_partial_symtab_filename (const char *filename, const char *fullname,
-                                  void *user_data)
+void
+add_partial_filename_data::operator() (const char *filename,
+                                      const char *fullname)
 {
-  struct add_partial_filename_data *data
-    = (struct add_partial_filename_data *) user_data;
-
   if (not_interesting_fname (filename))
     return;
-  if (!data->filename_seen_cache->seen (filename)
-      && filename_ncmp (filename, data->text, data->text_len) == 0)
+  if (!filename_seen_cache->seen (filename)
+      && filename_ncmp (filename, text, text_len) == 0)
     {
       /* This file matches for a completion; add it to the
         current list of matches.  */
-      add_filename_to_list (filename, data->text, data->word, data->list);
+      add_filename_to_list (filename, text, word, list);
     }
   else
     {
       const char *base_name = lbasename (filename);
 
       if (base_name != filename
-         && !data->filename_seen_cache->seen (base_name)
-         && filename_ncmp (base_name, data->text, data->text_len) == 0)
-       add_filename_to_list (base_name, data->text, data->word, data->list);
+         && !filename_seen_cache->seen (base_name)
+         && filename_ncmp (base_name, text, text_len) == 0)
+       add_filename_to_list (base_name, text, word, list);
     }
 }
 
@@ -6038,8 +6048,7 @@ make_source_files_completion_list (const char *text, const char *word)
   datum.word = word;
   datum.text_len = text_len;
   datum.list = &list;
-  map_symbol_filenames (maybe_add_partial_symtab_filename, &datum,
-                       0 /*need_fullname*/);
+  map_symbol_filenames (datum, false /*need_fullname*/);
 
   return list;
 }
@@ -6420,7 +6429,8 @@ get_msymbol_address (struct objfile *objf, const struct minimal_symbol *minsym)
            return BMSYMBOL_VALUE_ADDRESS (found);
        }
     }
-  return minsym->value.address + objf->section_offsets[minsym->section];
+  return (minsym->value.address
+         + objf->section_offsets[minsym->section_index ()]);
 }
 
 \f
@@ -6830,12 +6840,12 @@ The -q flag suppresses printing some header information."),
           _("Set a breakpoint for all functions matching REGEXP."));
 
   add_setshow_enum_cmd ("multiple-symbols", no_class,
-                        multiple_symbols_modes, &multiple_symbols_mode,
-                        _("\
+                       multiple_symbols_modes, &multiple_symbols_mode,
+                       _("\
 Set how the debugger handles ambiguities in expressions."), _("\
 Show how the debugger handles ambiguities in expressions."), _("\
 Valid values are \"ask\", \"all\", \"cancel\", and the default is \"all\"."),
-                        NULL, NULL, &setlist, &showlist);
+                       NULL, NULL, &setlist, &showlist);
 
   add_setshow_boolean_cmd ("basenames-may-differ", class_obscure,
                           &basenames_may_differ, _("\
@@ -6888,10 +6898,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);
This page took 0.042318 seconds and 4 git commands to generate.