[gdb/testsuite] Accept new complex print style in mixed-lang-stack.exp
[deliverable/binutils-gdb.git] / gdb / psymtab.c
index 5f428679fb20cfb55eb5986678555449f15a998d..d3569ff013087f68c98f635d5a6d490b7ec2b45b 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);
@@ -75,15 +76,11 @@ psymtab_storage::~psymtab_storage ()
 
 /* See psymtab.h.  */
 
-struct partial_symtab *
-psymtab_storage::allocate_psymtab ()
+void
+psymtab_storage::install_psymtab (partial_symtab *pst)
 {
-  struct partial_symtab *psymtab = new struct partial_symtab;
-
-  psymtab->next = psymtabs;
-  psymtabs = psymtab;
-
-  return psymtab;
+  pst->next = psymtabs;
+  psymtabs = pst;
 }
 
 \f
@@ -135,7 +132,7 @@ partial_map_expand_apply (struct objfile *objfile,
   gdb_assert (pst->user == NULL);
 
   /* Don't visit already-expanded psymtabs.  */
-  if (pst->readin)
+  if (pst->readin_p ())
     return 0;
 
   /* This may expand more than one symtab, and we want to iterate over
@@ -389,7 +386,7 @@ psym_find_pc_sect_compunit_symtab (struct objfile *objfile,
                                                    msymbol);
   if (ps != NULL)
     {
-      if (warn_if_readin && ps->readin)
+      if (warn_if_readin && ps->readin_p ())
        /* Might want to error() here (in case symtab is corrupt and
           will cause a core dump), but maybe we can successfully
           continue, so let's not.  */
@@ -397,7 +394,7 @@ psym_find_pc_sect_compunit_symtab (struct objfile *objfile,
 (Internal error: pc %s in read in psymtab, but not in symtab.)\n"),
                 paddress (get_objfile_arch (objfile), pc));
       psymtab_to_symtab (objfile, ps);
-      return ps->compunit_symtab;
+      return ps->get_compunit_symtab ();
     }
   return NULL;
 }
@@ -486,10 +483,13 @@ 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 && lookup_partial_symbol (objfile, ps, name,
-                                               psymtab_index, domain))
+      if (!ps->readin_p () && lookup_partial_symbol (objfile, ps,
+                                                    psym_lookup_name,
+                                                    psymtab_index, domain))
        {
          struct symbol *sym, *with_opaque = NULL;
          struct compunit_symtab *stab = psymtab_to_symtab (objfile, ps);
@@ -578,8 +578,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)
@@ -616,42 +615,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;
@@ -662,10 +633,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]);
@@ -690,7 +657,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;
            }
@@ -754,18 +721,25 @@ psymtab_to_symtab (struct objfile *objfile, struct partial_symtab *pst)
     pst = pst->user;
 
   /* If it's been looked up before, return it.  */
-  if (pst->compunit_symtab)
-    return pst->compunit_symtab;
+  if (pst->get_compunit_symtab ())
+    return pst->get_compunit_symtab ();
 
   /* If it has not yet been read in, read it.  */
-  if (!pst->readin)
+  if (!pst->readin_p ())
     {
       scoped_restore decrementer = increment_reading_symtab ();
 
-      (*pst->read_symtab) (pst, objfile);
+      if (info_verbose)
+       {
+         printf_filtered (_("Reading in symbols for %s...\n"),
+                          pst->filename);
+         gdb_flush (gdb_stdout);
+       }
+
+      pst->read_symtab (objfile);
     }
 
-  return pst->compunit_symtab;
+  return pst->get_compunit_symtab ();
 }
 
 /* Psymtab version of find_last_source_symtab.  See its definition in
@@ -788,7 +762,7 @@ psym_find_last_source_symtab (struct objfile *ofp)
 
   if (cs_pst)
     {
-      if (cs_pst->readin)
+      if (cs_pst->readin_p ())
        {
          internal_error (__FILE__, __LINE__,
                          _("select_source_symtab: "
@@ -945,13 +919,11 @@ dump_psymtab (struct objfile *objfile, struct partial_symtab *psymtab,
   gdb_print_host_address (objfile, outfile);
   fprintf_filtered (outfile, ")\n");
 
-  if (psymtab->readin)
+  if (psymtab->readin_p ())
     {
       fprintf_filtered (outfile,
                        "  Full symtab was read (at ");
-      gdb_print_host_address (psymtab->compunit_symtab, outfile);
-      fprintf_filtered (outfile, " by function at ");
-      gdb_print_host_address (psymtab->read_symtab, outfile);
+      gdb_print_host_address (psymtab->get_compunit_symtab (), outfile);
       fprintf_filtered (outfile, ")\n");
     }
 
@@ -1005,7 +977,7 @@ psym_print_stats (struct objfile *objfile)
   i = 0;
   for (partial_symtab *ps : require_partial_symbols (objfile, true))
     {
-      if (ps->readin == 0)
+      if (!ps->readin_p ())
        i++;
     }
   printf_filtered (_("  Number of psym tables (not yet expanded): %d\n"), i);
@@ -1043,14 +1015,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)
+      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);
     }
@@ -1100,7 +1075,7 @@ psym_map_symbol_filenames (struct objfile *objfile,
     {
       const char *fullname;
 
-      if (ps->readin)
+      if (ps->readin_p ())
        continue;
 
       /* We can skip shared psymtabs here, because any file name will be
@@ -1180,7 +1155,7 @@ psym_map_matching_symbols
   for (partial_symtab *ps : require_partial_symbols (objfile, true))
     {
       QUIT;
-      if (ps->readin
+      if (ps->readin_p ()
          || match_partial_symbol (objfile, ps, global, name, domain,
                                   ordered_compare))
        {
@@ -1315,7 +1290,7 @@ psym_expand_symtabs_matching
     {
       QUIT;
 
-      if (ps->readin)
+      if (ps->readin_p ())
        continue;
 
       /* We skip shared psymtabs because file-matching doesn't apply
@@ -1479,24 +1454,30 @@ sort_pst_symbols (struct objfile *objfile, struct partial_symtab *pst)
     });
 }
 
-/* Allocate and partially fill a partial symtab.  It will be
-   completely filled at the end of the symbol list.
+/* Partially fill a partial symtab.  It will be completely filled at
+   the end of the symbol list.  */
 
-   FILENAME is the name of the symbol-file we are reading from.  */
-
-struct partial_symtab *
-start_psymtab_common (struct objfile *objfile,
-                     const char *filename,
-                     CORE_ADDR textlow)
+partial_symtab::partial_symtab (const char *filename,
+                               struct objfile *objfile,
+                               CORE_ADDR textlow)
+  : partial_symtab (filename, objfile)
 {
-  struct partial_symtab *psymtab;
+  set_text_low (textlow);
+  set_text_high (raw_text_low ()); /* default */
+
+  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.  */
 
-  psymtab = allocate_psymtab (filename, objfile);
-  psymtab->set_text_low (textlow);
-  psymtab->set_text_high (psymtab->raw_text_low ()); /* default */
-  psymtab->globals_offset = objfile->partial_symtabs->global_psymbols.size ();
-  psymtab->statics_offset = objfile->partial_symtabs->static_psymbols.size ();
-  return psymtab;
+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.  */
@@ -1504,10 +1485,26 @@ start_psymtab_common (struct objfile *objfile,
 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);
 }
@@ -1626,8 +1623,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);
 }
 
@@ -1650,16 +1647,14 @@ init_psymbol_list (struct objfile *objfile, int total_symbols)
 
 /* See psympriv.h.  */
 
-struct partial_symtab *
-allocate_psymtab (const char *filename, struct objfile *objfile)
+partial_symtab::partial_symtab (const char *filename_, struct objfile *objfile)
+  : searched_flag (PST_NOT_SEARCHED),
+    text_low_valid (0),
+    text_high_valid (0)
 {
-  struct partial_symtab *psymtab
-    = objfile->partial_symtabs->allocate_psymtab ();
+  objfile->partial_symtabs->install_psymtab (this);
 
-  psymtab->filename
-    = ((const char *) objfile->per_bfd->filename_cache.insert
-       (filename, strlen (filename) + 1));
-  psymtab->compunit_symtab = NULL;
+  filename = objfile->intern (filename_);
 
   if (symtab_create_debug)
     {
@@ -1678,12 +1673,37 @@ allocate_psymtab (const char *filename, struct objfile *objfile)
        }
       fprintf_filtered (gdb_stdlog,
                        "Created psymtab %s for module %s.\n",
-                       host_address_to_string (psymtab), filename);
+                       host_address_to_string (this), filename);
     }
+}
 
-  return psymtab;
+/* See psympriv.h.  */
+
+void
+partial_symtab::expand_dependencies (struct objfile *objfile)
+{
+  for (int i = 0; i < number_of_dependencies; ++i)
+    {
+      if (!dependencies[i]->readin_p ()
+         && dependencies[i]->user == NULL)
+       {
+         /* Inform about additional files to be read in.  */
+         if (info_verbose)
+           {
+             fputs_filtered (" ", gdb_stdout);
+             wrap_here ("");
+             fputs_filtered ("and ", gdb_stdout);
+             wrap_here ("");
+             printf_filtered ("%s...", dependencies[i]->filename);
+             wrap_here ("");   /* Flush output */
+             gdb_flush (gdb_stdout);
+           }
+         dependencies[i]->expand_psymtab (objfile);
+       }
+    }
 }
 
+
 void
 psymtab_storage::discard_psymtab (struct partial_symtab *pst)
 {
@@ -1977,7 +1997,7 @@ maintenance_info_psymtabs (const char *regexp, int from_tty)
                                 host_address_to_string (psymtab));
 
                printf_filtered ("    readin %s\n",
-                                psymtab->readin ? "yes" : "no");
+                                psymtab->readin_p () ? "yes" : "no");
                printf_filtered ("    fullname %s\n",
                                 psymtab->fullname
                                 ? psymtab->fullname : "(null)");
@@ -2019,6 +2039,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)
                  {
@@ -2068,7 +2093,7 @@ maintenance_check_psymtabs (const char *ignore, int from_tty)
        /* We don't call psymtab_to_symtab here because that may cause symtab
           expansion.  When debugging a problem it helps if checkers leave
           things unchanged.  */
-       cust = ps->compunit_symtab;
+       cust = ps->get_compunit_symtab ();
 
        /* First do some checks that don't require the associated symtab.  */
        if (ps->text_high (objfile) < ps->text_low (objfile))
This page took 0.029989 seconds and 4 git commands to generate.