gdb/testsuite: Add compiler options parameter to function_range helper
[deliverable/binutils-gdb.git] / gdb / psymtab.c
index fd7fc8feff2a436b19e7ea4a62f7ffc4f62bbc51..26c55e9bd334a4a5f5bfeca228858d1efb5d1412 100644 (file)
@@ -39,7 +39,8 @@
 
 static struct partial_symbol *lookup_partial_symbol (struct objfile *,
                                                     struct partial_symtab *,
-                                                    const char *, int,
+                                                    const lookup_name_info &,
+                                                    int,
                                                     domain_enum);
 
 static const char *psymtab_to_fullname (struct partial_symtab *ps);
@@ -482,9 +483,12 @@ psym_lookup_symbol (struct objfile *objfile,
 
   lookup_name_info lookup_name (name, symbol_name_match_type::FULL);
 
+  lookup_name_info psym_lookup_name = lookup_name.make_ignore_params ();
+
   for (partial_symtab *ps : require_partial_symbols (objfile, true))
     {
-      if (!ps->readin_p () && lookup_partial_symbol (objfile, ps, name,
+      if (!ps->readin_p () && lookup_partial_symbol (objfile, ps,
+                                                    psym_lookup_name,
                                                     psymtab_index, domain))
        {
          struct symbol *sym, *with_opaque = NULL;
@@ -517,6 +521,36 @@ psym_lookup_symbol (struct objfile *objfile,
   return stab_best;
 }
 
+/* Psymtab version of lookup_global_symbol_language.  See its definition in
+   the definition of quick_symbol_functions in symfile.h.  */
+
+static enum language
+psym_lookup_global_symbol_language (struct objfile *objfile, const char *name,
+                                   domain_enum domain, bool *symbol_found_p)
+{
+  *symbol_found_p = false;
+  if (objfile->sf == NULL)
+    return language_unknown;
+
+  lookup_name_info lookup_name (name, symbol_name_match_type::FULL);
+
+  for (partial_symtab *ps : require_partial_symbols (objfile, true))
+    {
+      struct partial_symbol *psym;
+      if (ps->readin_p ())
+       continue;
+
+      psym = lookup_partial_symbol (objfile, ps, lookup_name, 1, domain);
+      if (psym)
+       {
+         *symbol_found_p = true;
+         return psym->ginfo.language ();
+       }
+    }
+
+  return language_unknown;
+}
+
 /* Returns true if PSYM matches LOOKUP_NAME.  */
 
 static bool
@@ -574,8 +608,7 @@ match_partial_symbol (struct objfile *objfile,
          gdb_assert (center < top);
 
          enum language lang = (*center)->ginfo.language ();
-         const char *lang_ln
-           = name.language_lookup_name (lang).c_str ();
+         const char *lang_ln = name.language_lookup_name (lang);
 
          if (ordered_compare ((*center)->ginfo.search_name (),
                               lang_ln) >= 0)
@@ -612,42 +645,14 @@ match_partial_symbol (struct objfile *objfile,
   return NULL;
 }
 
-/* Returns the name used to search psymtabs.  Unlike symtabs, psymtabs do
-   not contain any method/function instance information (since this would
-   force reading type information while reading psymtabs).  Therefore,
-   if NAME contains overload information, it must be stripped before searching
-   psymtabs.  */
-
-static gdb::unique_xmalloc_ptr<char>
-psymtab_search_name (const char *name)
-{
-  switch (current_language->la_language)
-    {
-    case language_cplus:
-      {
-       if (strchr (name, '('))
-         {
-           gdb::unique_xmalloc_ptr<char> ret = cp_remove_params (name);
-
-           if (ret)
-             return ret;
-         }
-      }
-      break;
-
-    default:
-      break;
-    }
-
-  return make_unique_xstrdup (name);
-}
-
-/* Look, in partial_symtab PST, for symbol whose natural name is NAME.
-   Check the global symbols if GLOBAL, the static symbols if not.  */
+/* Look, in partial_symtab PST, for symbol whose natural name is
+   LOOKUP_NAME.  Check the global symbols if GLOBAL, the static
+   symbols if not.  */
 
 static struct partial_symbol *
 lookup_partial_symbol (struct objfile *objfile,
-                      struct partial_symtab *pst, const char *name,
+                      struct partial_symtab *pst,
+                      const lookup_name_info &lookup_name,
                       int global, domain_enum domain)
 {
   struct partial_symbol **start, **psym;
@@ -658,10 +663,6 @@ lookup_partial_symbol (struct objfile *objfile,
   if (length == 0)
     return NULL;
 
-  gdb::unique_xmalloc_ptr<char> search_name = psymtab_search_name (name);
-
-  lookup_name_info lookup_name (search_name.get (), symbol_name_match_type::FULL);
-
   start = (global ?
           &objfile->partial_symtabs->global_psymbols[pst->globals_offset] :
           &objfile->partial_symtabs->static_psymbols[pst->statics_offset]);
@@ -686,7 +687,7 @@ lookup_partial_symbol (struct objfile *objfile,
            internal_error (__FILE__, __LINE__,
                            _("failed internal consistency check"));
          if (strcmp_iw_ordered ((*center)->ginfo.search_name (),
-                                search_name.get ()) >= 0)
+                                lookup_name.c_str ()) >= 0)
            {
              top = center;
            }
@@ -760,16 +761,12 @@ psymtab_to_symtab (struct objfile *objfile, struct partial_symtab *pst)
 
       if (info_verbose)
        {
-         printf_filtered (_("Reading in symbols for %s..."),
+         printf_filtered (_("Reading in symbols for %s...\n"),
                           pst->filename);
          gdb_flush (gdb_stdout);
        }
 
       pst->read_symtab (objfile);
-
-      /* Finish up the debug error message.  */
-      if (info_verbose)
-       printf_filtered (_("done.\n"));
     }
 
   return pst->get_compunit_symtab ();
@@ -1048,14 +1045,17 @@ static void
 psym_expand_symtabs_for_function (struct objfile *objfile,
                                  const char *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 (partial_symtab *ps : require_partial_symbols (objfile, true))
     {
       if (ps->readin_p ())
        continue;
 
-      if ((lookup_partial_symbol (objfile, ps, func_name, 1, VAR_DOMAIN)
+      if ((lookup_partial_symbol (objfile, ps, lookup_name, 1, VAR_DOMAIN)
           != NULL)
-         || (lookup_partial_symbol (objfile, ps, func_name, 0, VAR_DOMAIN)
+         || (lookup_partial_symbol (objfile, ps, lookup_name, 0, VAR_DOMAIN)
              != NULL))
        psymtab_to_symtab (objfile, ps);
     }
@@ -1452,6 +1452,7 @@ const struct quick_symbol_functions psym_functions =
   psym_forget_cached_source_info,
   psym_map_symtabs_matching_filename,
   psym_lookup_symbol,
+  psym_lookup_global_symbol_language,
   psym_print_stats,
   psym_dump,
   psym_expand_symtabs_for_function,
@@ -1494,8 +1495,20 @@ partial_symtab::partial_symtab (const char *filename,
 {
   set_text_low (textlow);
   set_text_high (raw_text_low ()); /* default */
-  globals_offset = objfile->partial_symtabs->global_psymbols.size ();
-  statics_offset = objfile->partial_symtabs->static_psymbols.size ();
+
+  auto *v1 = new std::vector<partial_symbol *>;
+  objfile->partial_symtabs->current_global_psymbols.push_back (v1);
+  auto *v2 = new std::vector<partial_symbol *>;
+  objfile->partial_symtabs->current_static_psymbols.push_back (v2);
+}
+
+/* Concat vectors V1 and V2.  */
+
+static void
+concat (std::vector<partial_symbol *> *v1, std::vector<partial_symbol *> *v2)
+{
+  v1->insert (v1->end (), v2->begin (), v2->end ());
+  v2->clear ();
 }
 
 /* Perform "finishing up" operations of a partial symtab.  */
@@ -1503,10 +1516,26 @@ partial_symtab::partial_symtab (const char *filename,
 void
 end_psymtab_common (struct objfile *objfile, struct partial_symtab *pst)
 {
-  pst->n_global_syms = (objfile->partial_symtabs->global_psymbols.size ()
-                       - pst->globals_offset);
-  pst->n_static_syms = (objfile->partial_symtabs->static_psymbols.size ()
-                       - pst->statics_offset);
+  pst->globals_offset = objfile->partial_symtabs->global_psymbols.size ();
+  pst->statics_offset = objfile->partial_symtabs->static_psymbols.size ();
+
+  auto *current_global_psymbols
+    = objfile->partial_symtabs->current_global_psymbols.back ();
+  auto *current_static_psymbols
+    = objfile->partial_symtabs->current_static_psymbols.back ();
+  objfile->partial_symtabs->current_global_psymbols.pop_back ();
+  objfile->partial_symtabs->current_static_psymbols.pop_back ();
+
+  pst->n_global_syms
+    = current_global_psymbols->size ();
+  pst->n_static_syms
+    = current_static_psymbols->size ();
+
+  concat (&objfile->partial_symtabs->global_psymbols, current_global_psymbols);
+  concat (&objfile->partial_symtabs->static_psymbols, current_static_psymbols);
+
+  delete current_global_psymbols;
+  delete current_static_psymbols;
 
   sort_pst_symbols (objfile, pst);
 }
@@ -1625,8 +1654,8 @@ add_psymbol_to_list (gdb::string_view name, bool copy_name,
   /* Save pointer to partial symbol in psymtab, growing symtab if needed.  */
   std::vector<partial_symbol *> *list
     = (where == psymbol_placement::STATIC
-       ? &objfile->partial_symtabs->static_psymbols
-       : &objfile->partial_symtabs->global_psymbols);
+       ? objfile->partial_symtabs->current_static_psymbols.back ()
+       : objfile->partial_symtabs->current_global_psymbols.back ());
   append_psymbol_to_list (list, psym, objfile);
 }
 
@@ -1656,9 +1685,7 @@ partial_symtab::partial_symtab (const char *filename_, struct objfile *objfile)
 {
   objfile->partial_symtabs->install_psymtab (this);
 
-  filename
-    = ((const char *) objfile->per_bfd->filename_cache.insert
-       (filename_, strlen (filename_) + 1));
+  filename = objfile->intern (filename_);
 
   if (symtab_create_debug)
     {
@@ -1684,7 +1711,7 @@ partial_symtab::partial_symtab (const char *filename_, struct objfile *objfile)
 /* See psympriv.h.  */
 
 void
-partial_symtab::read_dependencies (struct objfile *objfile)
+partial_symtab::expand_dependencies (struct objfile *objfile)
 {
   for (int i = 0; i < number_of_dependencies; ++i)
     {
@@ -2043,6 +2070,11 @@ maintenance_info_psymtabs (const char *regexp, int from_tty)
                  }
                else
                  printf_filtered ("(none)\n");
+               if (psymtab->user)
+                 printf_filtered ("    user %s "
+                                  "((struct partial_symtab *) %s)\n",
+                                  psymtab->user->filename,
+                                  host_address_to_string (psymtab->user));
                printf_filtered ("    dependencies ");
                if (psymtab->number_of_dependencies)
                  {
This page took 0.032338 seconds and 4 git commands to generate.