public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
* [PATCH] Have partial symbol tables own psymbol vectors
@ 2020-08-28 19:33 Tom Tromey
  2020-08-30 19:18 ` Tom Tromey
  0 siblings, 1 reply; 13+ messages in thread
From: Tom Tromey @ 2020-08-28 19:33 UTC (permalink / raw)
  To: gdb-patches; +Cc: Tom Tromey

Currently pointers to all partial symbols are stored in two vectors;
and then indices into these vectors are stored in each partial_symtab.

This patch changes this so that each partial symtab instead has
vectors of symbols.

My main motivation for doing this is that I am looking into calling
sort_pst_symbols in the background.  However, I haven't actually
implemented this yet.  (Also this may make it more feasible to also
sort the static psymbols, though I haven't tried that either.)

Also, though, this lets us remove the "current_global_psymbols"
vector, because now the callers can simply refer directly to the
psymtab that they are modifying (formerly this was implicit).

The main drawback of this patch is that it increases the size of
partial symtab.

gdb/ChangeLog
2020-08-28  Tom Tromey  <tom@tromey.com>

	* xcoffread.c (xcoff_end_psymtab): Use partial_symtab::empty.
	(scan_xcoff_symtab): Update.
	* psymtab.h (class psymtab_storage) <global_psymbols,
	static_psymbols, current_global_psymbols,
	current_static_psymbols>: Remove.
	* psymtab.c (require_partial_symbols, find_pc_sect_psymbol)
	(match_partial_symbol, lookup_partial_symbol): Update.
	(print_partial_symbols): Change parameters.
	(dump_psymtab, recursively_search_psymtabs)
	(psym_fill_psymbol_map, psym_find_compunit_symtab_by_address)
	(sort_pst_symbols, partial_symtab::partial_symtab): Update.
	(concat): Remove.
	(end_psymtab_common): Simplify.
	(append_psymbol_to_list, add_psymbol_to_list): Change parameters.
	(init_psymbol_list): Simplify.
	(maintenance_info_psymtabs, maintenance_check_psymtabs): Update.
	* psympriv.h (struct partial_symtab) <empty>: New method.
	<globals_offset, n_global_syms, statics_offset, n_static_syms>:
	Remove.
	<global_psymbols, static_psymbols>: New members.
	(add_psymbol_to_list): Add partial_symtab parameter.
	* mdebugread.c (parse_partial_symbols): Update.
	(handle_psymbol_enumerators): Change parameters.
	(mdebug_expand_psymtab): Update.
	* dwarf2/read.c (process_psymtab_comp_unit_reader)
	(add_partial_symbol): Update.
	* dwarf2/index-write.c (write_psymbols): Change parameters.
	(write_one_signatured_type): Update.
	(recursively_count_psymbols): Update.
	(recursively_write_psymbols): Update.
	(class debug_names) <recursively_write_psymbols>: Update.
	<write_psymbols>: Change parameters.
	<write_one_signatured_type>: Update.
	* dbxread.c (read_dbx_symtab): Update.
	(dbx_end_psymtab): Use partial_symtab::empty.
	* ctfread.c (struct ctf_context) <pst>: New member.
	(create_partial_symtab): Set it.
	(ctf_psymtab_type_cb, ctf_psymtab_var_cb): Update.
	(scan_partial_symbols): Use the psymtab's context.  Update.
---
 gdb/ChangeLog            |  42 +++++++
 gdb/ctfread.c            |  23 ++--
 gdb/dbxread.c            |  30 +++--
 gdb/dwarf2/index-write.c |  72 ++++--------
 gdb/dwarf2/read.c        |   5 +-
 gdb/mdebugread.c         |  56 ++++++----
 gdb/psympriv.h           |  29 +++--
 gdb/psymtab.c            | 229 +++++++++++++--------------------------
 gdb/psymtab.h            |  12 --
 gdb/xcoffread.c          |  30 +++--
 10 files changed, 241 insertions(+), 287 deletions(-)

diff --git a/gdb/ctfread.c b/gdb/ctfread.c
index 5b6d731479a..7a95e88062f 100644
--- a/gdb/ctfread.c
+++ b/gdb/ctfread.c
@@ -115,6 +115,7 @@ struct ctf_context
 {
   ctf_file_t *fp;
   struct objfile *of;
+  partial_symtab *pst;
   struct buildsym_compunit *builder;
 };
 
@@ -1319,6 +1320,8 @@ create_partial_symtab (const char *name,
   ccx = XOBNEW (&objfile->objfile_obstack, struct ctf_context);
   ccx->fp = cfp;
   ccx->of = objfile;
+  ccx->pst = pst;
+  ccx->builder = nullptr;
   pst->context = ccx;
 
   return pst;
@@ -1376,10 +1379,10 @@ ctf_psymtab_type_cb (ctf_id_t tid, void *arg)
 	return 0;
     }
 
-    add_psymbol_to_list (name.get (), true,
-			 domain, aclass, section,
-			 psymbol_placement::GLOBAL,
-			 0, language_c, ccp->of);
+  add_psymbol_to_list (ccp->pst, name.get (), true,
+		       domain, aclass, section,
+		       psymbol_placement::GLOBAL,
+		       0, language_c, ccp->of);
 
   return 0;
 }
@@ -1391,7 +1394,7 @@ ctf_psymtab_var_cb (const char *name, ctf_id_t id, void *arg)
 {
   struct ctf_context *ccp = (struct ctf_context *) arg;
 
-  add_psymbol_to_list (name, true,
+  add_psymbol_to_list (ccp->pst, name, true,
 		       VAR_DOMAIN, LOC_STATIC, -1,
 		       psymbol_placement::GLOBAL,
 		       0, language_c, ccp->of);
@@ -1404,19 +1407,17 @@ ctf_psymtab_var_cb (const char *name, ctf_id_t id, void *arg)
 static void
 scan_partial_symbols (ctf_file_t *cfp, struct objfile *of)
 {
-  struct ctf_context ccx;
   bfd *abfd = of->obfd;
   const char *name = bfd_get_filename (abfd);
   ctf_psymtab *pst = create_partial_symtab (name, cfp, of);
 
-  ccx.fp = cfp;
-  ccx.of = of;
+  struct ctf_context *ccx = pst->context;
 
-  if (ctf_type_iter (cfp, ctf_psymtab_type_cb, &ccx) == CTF_ERR)
+  if (ctf_type_iter (cfp, ctf_psymtab_type_cb, ccx) == CTF_ERR)
     complaint (_("ctf_type_iter scan_partial_symbols failed - %s"),
 	       ctf_errmsg (ctf_errno (cfp)));
 
-  if (ctf_variable_iter (cfp, ctf_psymtab_var_cb, &ccx) == CTF_ERR)
+  if (ctf_variable_iter (cfp, ctf_psymtab_var_cb, ccx) == CTF_ERR)
     complaint (_("ctf_variable_iter scan_partial_symbols failed - %s"),
 	       ctf_errmsg (ctf_errno (cfp)));
 
@@ -1456,7 +1457,7 @@ scan_partial_symbols (ctf_file_t *cfp, struct objfile *of)
       else
 	aclass = LOC_TYPEDEF;
 
-      add_psymbol_to_list (tname.get (), true,
+      add_psymbol_to_list (pst, tname.get (), true,
 			   tdomain, aclass, -1,
 			   psymbol_placement::STATIC,
 			   0, language_c, of);
diff --git a/gdb/dbxread.c b/gdb/dbxread.c
index e76bf702b38..8b10d53618c 100644
--- a/gdb/dbxread.c
+++ b/gdb/dbxread.c
@@ -1460,7 +1460,8 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
 	  switch (p[1])
 	    {
 	    case 'S':
-	      add_psymbol_to_list (gdb::string_view (sym_name, sym_len), true,
+	      add_psymbol_to_list (pst,
+				   gdb::string_view (sym_name, sym_len), true,
 				   VAR_DOMAIN, LOC_STATIC,
 				   data_sect_index,
 				   psymbol_placement::STATIC,
@@ -1470,7 +1471,8 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
 	    case 'G':
 	      /* The addresses in these entries are reported to be
 		 wrong.  See the code that reads 'G's for symtabs.  */
-	      add_psymbol_to_list (gdb::string_view (sym_name, sym_len), true,
+	      add_psymbol_to_list (pst,
+				   gdb::string_view (sym_name, sym_len), true,
 				   VAR_DOMAIN, LOC_STATIC,
 				   data_sect_index,
 				   psymbol_placement::GLOBAL,
@@ -1488,14 +1490,16 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
 		  || (p == namestring + 1
 		      && namestring[0] != ' '))
 		{
-		  add_psymbol_to_list (gdb::string_view (sym_name, sym_len),
+		  add_psymbol_to_list (pst,
+				       gdb::string_view (sym_name, sym_len),
 				       true, STRUCT_DOMAIN, LOC_TYPEDEF, -1,
 				       psymbol_placement::STATIC,
 				       0, psymtab_language, objfile);
 		  if (p[2] == 't')
 		    {
 		      /* Also a typedef with the same name.  */
-		      add_psymbol_to_list (gdb::string_view (sym_name, sym_len),
+		      add_psymbol_to_list (pst,
+					   gdb::string_view (sym_name, sym_len),
 					   true, VAR_DOMAIN, LOC_TYPEDEF, -1,
 					   psymbol_placement::STATIC,
 					   0, psymtab_language, objfile);
@@ -1507,7 +1511,8 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
 	    case 't':
 	      if (p != namestring)	/* a name is there, not just :T...  */
 		{
-		  add_psymbol_to_list (gdb::string_view (sym_name, sym_len),
+		  add_psymbol_to_list (pst,
+				       gdb::string_view (sym_name, sym_len),
 				       true, VAR_DOMAIN, LOC_TYPEDEF, -1,
 				       psymbol_placement::STATIC,
 				       0, psymtab_language, objfile);
@@ -1568,7 +1573,8 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
 			;
 		      /* Note that the value doesn't matter for
 			 enum constants in psymtabs, just in symtabs.  */
-		      add_psymbol_to_list (gdb::string_view (p, q - p), true,
+		      add_psymbol_to_list (pst,
+					   gdb::string_view (p, q - p), true,
 					   VAR_DOMAIN, LOC_CONST, -1,
 					   psymbol_placement::STATIC, 0,
 					   psymtab_language, objfile);
@@ -1586,7 +1592,8 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
 
 	    case 'c':
 	      /* Constant, e.g. from "const" in Pascal.  */
-	      add_psymbol_to_list (gdb::string_view (sym_name, sym_len), true,
+	      add_psymbol_to_list (pst,
+				   gdb::string_view (sym_name, sym_len), true,
 				   VAR_DOMAIN, LOC_CONST, -1,
 				   psymbol_placement::STATIC, 0,
 				   psymtab_language, objfile);
@@ -1641,7 +1648,8 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
 		  pst->set_text_low (nlist.n_value);
 		  textlow_not_set = 0;
 		}
-	      add_psymbol_to_list (gdb::string_view (sym_name, sym_len), true,
+	      add_psymbol_to_list (pst,
+				   gdb::string_view (sym_name, sym_len), true,
 				   VAR_DOMAIN, LOC_BLOCK,
 				   SECT_OFF_TEXT (objfile),
 				   psymbol_placement::STATIC,
@@ -1700,7 +1708,8 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
 		  pst->set_text_low (nlist.n_value);
 		  textlow_not_set = 0;
 		}
-	      add_psymbol_to_list (gdb::string_view (sym_name, sym_len), true,
+	      add_psymbol_to_list (pst,
+				   gdb::string_view (sym_name, sym_len), true,
 				   VAR_DOMAIN, LOC_BLOCK,
 				   SECT_OFF_TEXT (objfile),
 				   psymbol_placement::GLOBAL,
@@ -2043,8 +2052,7 @@ dbx_end_psymtab (struct objfile *objfile, legacy_psymtab *pst,
 
   if (num_includes == 0
       && number_dependencies == 0
-      && pst->n_global_syms == 0
-      && pst->n_static_syms == 0
+      && pst->empty ()
       && has_line_numbers == 0)
     {
       /* Throw away this psymtab, it's empty.  */
diff --git a/gdb/dwarf2/index-write.c b/gdb/dwarf2/index-write.c
index aa7a37e4ef2..e6188f79333 100644
--- a/gdb/dwarf2/index-write.c
+++ b/gdb/dwarf2/index-write.c
@@ -539,14 +539,12 @@ symbol_kind (struct partial_symbol *psym)
 static void
 write_psymbols (struct mapped_symtab *symtab,
 		std::unordered_set<partial_symbol *> &psyms_seen,
-		struct partial_symbol **psymp,
-		int count,
+		const std::vector<partial_symbol *> &symbols,
 		offset_type cu_index,
 		int is_static)
 {
-  for (; count-- > 0; ++psymp)
+  for (partial_symbol *psym : symbols)
     {
-      struct partial_symbol *psym = *psymp;
       const char *name = psym->ginfo.search_name ();
 
       if (psym->ginfo.language () == language_ada)
@@ -618,17 +616,11 @@ write_one_signatured_type (void **slot, void *d)
   struct signatured_type *entry = (struct signatured_type *) *slot;
   partial_symtab *psymtab = entry->per_cu.v.psymtab;
 
-  write_psymbols (info->symtab,
-		  info->psyms_seen,
-		  (info->objfile->partial_symtabs->global_psymbols.data ()
-		   + psymtab->globals_offset),
-		  psymtab->n_global_syms, info->cu_index,
+  write_psymbols (info->symtab, info->psyms_seen,
+		  psymtab->global_psymbols, info->cu_index,
 		  0);
-  write_psymbols (info->symtab,
-		  info->psyms_seen,
-		  (info->objfile->partial_symtabs->static_psymbols.data ()
-		   + psymtab->statics_offset),
-		  psymtab->n_static_syms, info->cu_index,
+  write_psymbols (info->symtab, info->psyms_seen,
+		  psymtab->static_psymbols, info->cu_index,
 		  1);
 
   info->types_list.append_uint (8, BFD_ENDIAN_LITTLE,
@@ -654,8 +646,8 @@ recursively_count_psymbols (partial_symtab *psymtab,
       recursively_count_psymbols (psymtab->dependencies[i],
 				  psyms_seen);
 
-  psyms_seen += psymtab->n_global_syms;
-  psyms_seen += psymtab->n_static_syms;
+  psyms_seen += psymtab->global_psymbols.size ();
+  psyms_seen += psymtab->static_psymbols.size ();
 }
 
 /* Recurse into all "included" dependencies and write their symbols as
@@ -676,17 +668,11 @@ recursively_write_psymbols (struct objfile *objfile,
 				  psymtab->dependencies[i],
 				  symtab, psyms_seen, cu_index);
 
-  write_psymbols (symtab,
-		  psyms_seen,
-		  (objfile->partial_symtabs->global_psymbols.data ()
-		   + psymtab->globals_offset),
-		  psymtab->n_global_syms, cu_index,
+  write_psymbols (symtab, psyms_seen,
+		  psymtab->global_psymbols, cu_index,
 		  0);
-  write_psymbols (symtab,
-		  psyms_seen,
-		  (objfile->partial_symtabs->static_psymbols.data ()
-		   + psymtab->statics_offset),
-		  psymtab->n_static_syms, cu_index,
+  write_psymbols (symtab, psyms_seen,
+		  psymtab->static_psymbols, cu_index,
 		  1);
 }
 
@@ -912,14 +898,10 @@ class debug_names
 	recursively_write_psymbols
 	  (objfile, psymtab->dependencies[i], psyms_seen, cu_index);
 
-    write_psymbols (psyms_seen,
-		    (objfile->partial_symtabs->global_psymbols.data ()
-		     + psymtab->globals_offset),
-		    psymtab->n_global_syms, cu_index, false, unit_kind::cu);
-    write_psymbols (psyms_seen,
-		    (objfile->partial_symtabs->static_psymbols.data ()
-		     + psymtab->statics_offset),
-		    psymtab->n_static_syms, cu_index, true, unit_kind::cu);
+    write_psymbols (psyms_seen, psymtab->global_psymbols,
+		    cu_index, false, unit_kind::cu);
+    write_psymbols (psyms_seen, psymtab->static_psymbols,
+		    cu_index, true, unit_kind::cu);
   }
 
   /* Return number of bytes the .debug_names section will have.  This
@@ -1251,13 +1233,11 @@ class debug_names
 
   /* Call insert for all partial symbols and mark them in PSYMS_SEEN.  */
   void write_psymbols (std::unordered_set<partial_symbol *> &psyms_seen,
-		       struct partial_symbol **psymp, int count, int cu_index,
-		       bool is_static, unit_kind kind)
+		       const std::vector<partial_symbol *> &symbols,
+		       int cu_index, bool is_static, unit_kind kind)
   {
-    for (; count-- > 0; ++psymp)
+    for (partial_symbol *psym : symbols)
       {
-	struct partial_symbol *psym = *psymp;
-
 	/* Only add a given psymbol once.  */
 	if (psyms_seen.insert (psym).second)
 	  insert (psym, cu_index, is_static, kind);
@@ -1272,16 +1252,10 @@ class debug_names
   {
     partial_symtab *psymtab = entry->per_cu.v.psymtab;
 
-    write_psymbols (info->psyms_seen,
-		    (info->objfile->partial_symtabs->global_psymbols.data ()
-		     + psymtab->globals_offset),
-		    psymtab->n_global_syms, info->cu_index, false,
-		    unit_kind::tu);
-    write_psymbols (info->psyms_seen,
-		    (info->objfile->partial_symtabs->static_psymbols.data ()
-		     + psymtab->statics_offset),
-		    psymtab->n_static_syms, info->cu_index, true,
-		    unit_kind::tu);
+    write_psymbols (info->psyms_seen, psymtab->global_psymbols,
+		    info->cu_index, false, unit_kind::tu);
+    write_psymbols (info->psyms_seen, psymtab->static_psymbols,
+		    info->cu_index, true, unit_kind::tu);
 
     info->types_list.append_uint (dwarf5_offset_size (), m_dwarf5_byte_order,
 				  to_underlying (entry->per_cu.sect_off));
diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
index 0ac8533263a..a90a6bfa880 100644
--- a/gdb/dwarf2/read.c
+++ b/gdb/dwarf2/read.c
@@ -7670,7 +7670,8 @@ process_psymtab_comp_unit_reader (const struct die_reader_specs *reader,
 			sect_offset_str (per_cu->sect_off),
 			paddress (gdbarch, pst->text_low (objfile)),
 			paddress (gdbarch, pst->text_high (objfile)),
-			pst->n_global_syms, pst->n_static_syms);
+			(int) pst->global_psymbols.size (),
+			(int) pst->static_psymbols.size ());
 }
 
 /* Subroutine of dwarf2_build_psymtabs_hard to simplify it.
@@ -8643,7 +8644,7 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu)
 					    &objfile->objfile_obstack);
 	  psymbol.ginfo.set_linkage_name (pdi->linkage_name);
 	}
-      add_psymbol_to_list (psymbol, *where, objfile);
+      add_psymbol_to_list (cu->per_cu->v.psymtab, psymbol, *where, objfile);
     }
 }
 
diff --git a/gdb/mdebugread.c b/gdb/mdebugread.c
index d38372041d7..9937cf0ee48 100644
--- a/gdb/mdebugread.c
+++ b/gdb/mdebugread.c
@@ -264,8 +264,8 @@ static int add_line (struct linetable *, int, CORE_ADDR, int);
 
 static struct linetable *shrink_linetable (struct linetable *);
 
-static void handle_psymbol_enumerators (struct objfile *, FDR *, int,
-					CORE_ADDR);
+static void handle_psymbol_enumerators (struct objfile *, partial_symtab *,
+					FDR *, int, CORE_ADDR);
 
 static const char *mdebug_next_symbol_text (struct objfile *);
 \f
@@ -3029,7 +3029,8 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 		    switch (p[1])
 		      {
 		      case 'S':
-			add_psymbol_to_list (gdb::string_view (namestring,
+			add_psymbol_to_list (pst,
+					     gdb::string_view (namestring,
 							       p - namestring),
 					     true, VAR_DOMAIN, LOC_STATIC,
 					     SECT_OFF_DATA (objfile),
@@ -3041,7 +3042,8 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 			/* The addresses in these entries are reported
 			   to be wrong.  See the code that reads 'G's
 			   for symtabs.  */
-			add_psymbol_to_list (gdb::string_view (namestring,
+			add_psymbol_to_list (pst,
+					     gdb::string_view (namestring,
 							       p - namestring),
 					     true, VAR_DOMAIN, LOC_STATIC,
 					     SECT_OFF_DATA (objfile),
@@ -3062,7 +3064,8 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 				&& namestring[0] != ' '))
 			  {
 			    add_psymbol_to_list
-			      (gdb::string_view (namestring, p - namestring),
+			      (pst,
+			       gdb::string_view (namestring, p - namestring),
 			       true, STRUCT_DOMAIN, LOC_TYPEDEF, -1,
 			       psymbol_placement::STATIC, 0, psymtab_language,
 			       objfile);
@@ -3070,7 +3073,8 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 			      {
 				/* Also a typedef with the same name.  */
 				add_psymbol_to_list
-				  (gdb::string_view (namestring,
+				  (pst,
+				   gdb::string_view (namestring,
 						     p - namestring),
 				   true, VAR_DOMAIN, LOC_TYPEDEF, -1,
 				   psymbol_placement::STATIC, 0,
@@ -3084,7 +3088,8 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 						   just :T...  */
 			  {
 			    add_psymbol_to_list
-			      (gdb::string_view (namestring,
+			      (pst,
+			       gdb::string_view (namestring,
 						 p - namestring),
 			       true, VAR_DOMAIN, LOC_TYPEDEF, -1,
 			       psymbol_placement::STATIC, 0, psymtab_language,
@@ -3149,7 +3154,8 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 				/* Note that the value doesn't matter for
 				   enum constants in psymtabs, just in
 				   symtabs.  */
-				add_psymbol_to_list (gdb::string_view (p,
+				add_psymbol_to_list (pst,
+						     gdb::string_view (p,
 								       q - p),
 						     true, VAR_DOMAIN,
 						     LOC_CONST, -1,
@@ -3169,7 +3175,8 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 			continue;
 		      case 'c':
 			/* Constant, e.g. from "const" in Pascal.  */
-			add_psymbol_to_list (gdb::string_view (namestring,
+			add_psymbol_to_list (pst,
+					     gdb::string_view (namestring,
 							       p - namestring),
 					     true, VAR_DOMAIN, LOC_CONST, -1,
 					     psymbol_placement::STATIC,
@@ -3183,7 +3190,8 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 			    function_outside_compilation_unit_complaint
 			      (copy.c_str ());
 			  }
-			add_psymbol_to_list (gdb::string_view (namestring,
+			add_psymbol_to_list (pst,
+					     gdb::string_view (namestring,
 							       p - namestring),
 					     true, VAR_DOMAIN, LOC_BLOCK,
 					     SECT_OFF_TEXT (objfile),
@@ -3203,7 +3211,8 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 			    function_outside_compilation_unit_complaint
 			      (copy.c_str ());
 			  }
-			add_psymbol_to_list (gdb::string_view (namestring,
+			add_psymbol_to_list (pst,
+					     gdb::string_view (namestring,
 							       p - namestring),
 					     true, VAR_DOMAIN, LOC_BLOCK,
 					     SECT_OFF_TEXT (objfile),
@@ -3439,13 +3448,13 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 		     symbol table, and the MAIN__ symbol via the minimal
 		     symbol table.  */
 		  if (sh.st == stProc)
-		    add_psymbol_to_list (sym_name, true,
+		    add_psymbol_to_list (pst, sym_name, true,
 					 VAR_DOMAIN, LOC_BLOCK,
 					 section,
 					 psymbol_placement::GLOBAL,
 					 sh.value, psymtab_language, objfile);
 		  else
-		    add_psymbol_to_list (sym_name, true,
+		    add_psymbol_to_list (pst, sym_name, true,
 					 VAR_DOMAIN, LOC_BLOCK,
 					 section,
 					 psymbol_placement::STATIC,
@@ -3512,12 +3521,13 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 		      && sh.iss != 0
 		      && sh.index != cur_sdx + 2)
 		    {
-		      add_psymbol_to_list (sym_name, true,
+		      add_psymbol_to_list (pst, sym_name, true,
 					   STRUCT_DOMAIN, LOC_TYPEDEF, -1,
 					   psymbol_placement::STATIC,
 					   0, psymtab_language, objfile);
 		    }
-		  handle_psymbol_enumerators (objfile, fh, sh.st, sh.value);
+		  handle_psymbol_enumerators (objfile, pst, fh,
+					      sh.st, sh.value);
 
 		  /* Skip over the block.  */
 		  new_sdx = sh.index;
@@ -3552,7 +3562,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 		  continue;
 		}
 	      /* Use this gdb symbol.  */
-	      add_psymbol_to_list (sym_name, true,
+	      add_psymbol_to_list (pst, sym_name, true,
 				   VAR_DOMAIN, theclass, section,
 				   psymbol_placement::STATIC,
 				   sh.value, psymtab_language, objfile);
@@ -3630,7 +3640,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 		  break;
 		}
 	      char *sym_name = debug_info->ssext + psh->iss;
-	      add_psymbol_to_list (sym_name, true,
+	      add_psymbol_to_list (pst, sym_name, true,
 				   VAR_DOMAIN, theclass,
 				   section,
 				   psymbol_placement::GLOBAL,
@@ -3728,8 +3738,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
   partial_symtab *pst_del = objfile->partial_symtabs->psymtabs;
   if (pst_del->next == NULL
       && pst_del->number_of_dependencies == 0
-      && pst_del->n_global_syms == 0
-      && pst_del->n_static_syms == 0)
+      && pst_del->empty ())
     objfile->partial_symtabs->discard_psymtab (pst_del);
 }
 
@@ -3737,8 +3746,8 @@ parse_partial_symbols (minimal_symbol_reader &reader,
    all the enum constants to the partial symbol table.  */
 
 static void
-handle_psymbol_enumerators (struct objfile *objfile, FDR *fh, int stype,
-			    CORE_ADDR svalue)
+handle_psymbol_enumerators (struct objfile *objfile, partial_symtab *pst,
+			    FDR *fh, int stype, CORE_ADDR svalue)
 {
   const bfd_size_type external_sym_size = debug_swap->external_sym_size;
   void (*const swap_sym_in) (bfd *, void *, SYMR *) = debug_swap->swap_sym_in;
@@ -3793,7 +3802,7 @@ handle_psymbol_enumerators (struct objfile *objfile, FDR *fh, int stype,
 
       /* Note that the value doesn't matter for enum constants
          in psymtabs, just in symtabs.  */
-      add_psymbol_to_list (name, true,
+      add_psymbol_to_list (pst, name, true,
 			   VAR_DOMAIN, LOC_CONST, -1,
 			   psymbol_placement::STATIC, 0,
 			   psymtab_language, objfile);
@@ -3853,8 +3862,7 @@ mdebug_expand_psymtab (legacy_psymtab *pst, struct objfile *objfile)
 
   /* Do nothing if this is a dummy psymtab.  */
 
-  if (pst->n_global_syms == 0 && pst->n_static_syms == 0
-      && !pst->text_low_valid && !pst->text_high_valid)
+  if (pst->empty () && !pst->text_low_valid && !pst->text_high_valid)
     return;
 
   /* Now read the symbols for this symtab.  */
diff --git a/gdb/psympriv.h b/gdb/psympriv.h
index 4622be389bd..363dd0b1fd1 100644
--- a/gdb/psympriv.h
+++ b/gdb/psympriv.h
@@ -196,6 +196,13 @@ struct partial_symtab
     text_high_valid = 1;
   }
 
+  /* Return true if this symtab is empty -- meaning that it contains
+     no symbols.  It may still have dependencies.  */
+  bool empty () const
+  {
+    return global_psymbols.empty () && static_psymbols.empty ();
+  }
+
 
   /* Chain of all existing partial symtabs.  */
 
@@ -269,22 +276,18 @@ struct partial_symtab
 
   /* Global symbol list.  This list will be sorted after readin to
      improve access.  Binary search will be the usual method of
-     finding a symbol within it.  globals_offset is an integer offset
-     within global_psymbols[].  */
+     finding a symbol within it.  */
 
-  int globals_offset = 0;
-  int n_global_syms = 0;
+  std::vector<partial_symbol *> global_psymbols;
 
   /* Static symbol list.  This list will *not* be sorted after readin;
      to find a symbol in it, exhaustive search must be used.  This is
      reasonable because searches through this list will eventually
      lead to either the read in of a files symbols for real (assumed
      to take a *lot* of time; check) or an error (and we don't care
-     how long errors take).  This is an offset and size within
-     static_psymbols[].  */
+     how long errors take).  */
 
-  int statics_offset = 0;
-  int n_static_syms = 0;
+  std::vector<partial_symbol *> static_psymbols;
 
   /* True iff objfile->psymtabs_addrmap is properly populated for this
      partial_symtab.  For discontiguous overlapping psymtabs is the only usable
@@ -403,12 +406,14 @@ enum class psymbol_placement
    If COPY_NAME is true, make a copy of NAME, otherwise use the passed
    reference.
 
+   PST is the partial symbol table to add to.
+
    THECLASS is the type of symbol.
 
    SECTION is the index of the section of OBJFILE in which the symbol is found.
 
    WHERE determines whether the symbol goes in the list of static or global
-   partial symbols of OBJFILE.
+   partial symbols.
 
    COREADDR is the address of the symbol.  For partial symbols that don't have
    an address, zero is passed.
@@ -416,7 +421,8 @@ enum class psymbol_placement
    LANGUAGE is the language from which the symbol originates.  This will
    influence, amongst other things, how the symbol name is demangled. */
 
-extern void add_psymbol_to_list (gdb::string_view name,
+extern void add_psymbol_to_list (partial_symtab *pst,
+				 gdb::string_view name,
 				 bool copy_name, domain_enum domain,
 				 enum address_class theclass,
 				 short section,
@@ -429,7 +435,8 @@ extern void add_psymbol_to_list (gdb::string_view name,
    must be fully constructed, and the names must be set and intern'd
    as appropriate.  */
 
-extern void add_psymbol_to_list (const partial_symbol &psym,
+extern void add_psymbol_to_list (partial_symtab *pst,
+				 const partial_symbol &psym,
 				 psymbol_placement where,
 				 struct objfile *objfile);
 
diff --git a/gdb/psymtab.c b/gdb/psymtab.c
index 47e31aab61e..843cb0f600f 100644
--- a/gdb/psymtab.c
+++ b/gdb/psymtab.c
@@ -101,11 +101,6 @@ require_partial_symbols (struct objfile *objfile, bool verbose)
 			     objfile_name (objfile));
 	  (*objfile->sf->sym_read_psymbols) (objfile);
 
-	  /* Partial symbols list are not expected to changed after this
-	     point.  */
-	  objfile->partial_symtabs->global_psymbols.shrink_to_fit ();
-	  objfile->partial_symtabs->static_psymbols.shrink_to_fit ();
-
 	  if (verbose && !objfile_has_symbols (objfile))
 	    printf_filtered (_("(No debugging symbols found in %s)\n"),
 			     objfile_name (objfile));
@@ -417,12 +412,8 @@ find_pc_sect_psymbol (struct objfile *objfile,
   /* Search the global symbols as well as the static symbols, so that
      find_pc_partial_function doesn't use a minimal symbol and thus
      cache a bad endaddr.  */
-  for (int i = 0; i < psymtab->n_global_syms; i++)
+  for (partial_symbol *p : psymtab->global_psymbols)
     {
-      partial_symbol *p
-	= objfile->partial_symtabs->global_psymbols[psymtab->globals_offset
-						    + i];
-
       if (p->domain == VAR_DOMAIN
 	  && p->aclass == LOC_BLOCK
 	  && pc >= p->address (objfile)
@@ -441,12 +432,8 @@ find_pc_sect_psymbol (struct objfile *objfile,
 	}
     }
 
-  for (int i = 0; i < psymtab->n_static_syms; i++)
+  for (partial_symbol *p : psymtab->static_psymbols)
     {
-      partial_symbol *p
-	= objfile->partial_symtabs->static_psymbols[psymtab->statics_offset
-						    + i];
-
       if (p->domain == VAR_DOMAIN
 	  && p->aclass == LOC_BLOCK
 	  && pc >= p->address (objfile)
@@ -577,15 +564,17 @@ match_partial_symbol (struct objfile *objfile,
 {
   struct partial_symbol **start, **psym;
   struct partial_symbol **top, **real_top, **bottom, **center;
-  int length = (global ? pst->n_global_syms : pst->n_static_syms);
+  int length = (global
+		? pst->global_psymbols.size ()
+		: pst->static_psymbols.size ());
   int do_linear_search = 1;
 
   if (length == 0)
     return NULL;
 
   start = (global ?
-	   &objfile->partial_symtabs->global_psymbols[pst->globals_offset] :
-	   &objfile->partial_symtabs->static_psymbols[pst->statics_offset]);
+	   &pst->global_psymbols[0] :
+	   &pst->static_psymbols[0]);
 
   if (global && ordered_compare)  /* Can use a binary search.  */
     {
@@ -655,15 +644,17 @@ lookup_partial_symbol (struct objfile *objfile,
 {
   struct partial_symbol **start, **psym;
   struct partial_symbol **top, **real_top, **bottom, **center;
-  int length = (global ? pst->n_global_syms : pst->n_static_syms);
+  int length = (global
+		? pst->global_psymbols.size ()
+		: pst->static_psymbols.size ());
   int do_linear_search = 1;
 
   if (length == 0)
     return NULL;
 
   start = (global ?
-	   &objfile->partial_symtabs->global_psymbols[pst->globals_offset] :
-	   &objfile->partial_symtabs->static_psymbols[pst->statics_offset]);
+	   &pst->global_psymbols[0] :
+	   &pst->static_psymbols[0]);
 
   if (global)			/* This means we can use a binary search.  */
     {
@@ -825,21 +816,21 @@ psym_forget_cached_source_info (struct objfile *objfile)
 
 static void
 print_partial_symbols (struct gdbarch *gdbarch, struct objfile *objfile,
-		       struct partial_symbol **p, int count, const char *what,
-		       struct ui_file *outfile)
+		       const std::vector<partial_symbol *> &symbols,
+		       const char *what, struct ui_file *outfile)
 {
   fprintf_filtered (outfile, "  %s partial symbols:\n", what);
-  while (count-- > 0)
+  for (partial_symbol *p : symbols)
     {
       QUIT;
-      fprintf_filtered (outfile, "    `%s'", (*p)->ginfo.linkage_name ());
-      if ((*p)->ginfo.demangled_name () != NULL)
+      fprintf_filtered (outfile, "    `%s'", p->ginfo.linkage_name ());
+      if (p->ginfo.demangled_name () != NULL)
 	{
 	  fprintf_filtered (outfile, "  `%s'",
-			    (*p)->ginfo.demangled_name ());
+			    p->ginfo.demangled_name ());
 	}
       fputs_filtered (", ", outfile);
-      switch ((*p)->domain)
+      switch (p->domain)
 	{
 	case UNDEF_DOMAIN:
 	  fputs_filtered ("undefined domain, ", outfile);
@@ -863,7 +854,7 @@ print_partial_symbols (struct gdbarch *gdbarch, struct objfile *objfile,
 	  fputs_filtered ("<invalid domain>, ", outfile);
 	  break;
 	}
-      switch ((*p)->aclass)
+      switch (p->aclass)
 	{
 	case LOC_UNDEF:
 	  fputs_filtered ("undefined", outfile);
@@ -915,9 +906,8 @@ print_partial_symbols (struct gdbarch *gdbarch, struct objfile *objfile,
 	  break;
 	}
       fputs_filtered (", ", outfile);
-      fputs_filtered (paddress (gdbarch, (*p)->unrelocated_address ()), outfile);
+      fputs_filtered (paddress (gdbarch, p->unrelocated_address ()), outfile);
       fprintf_filtered (outfile, "\n");
-      p++;
     }
 }
 
@@ -976,19 +966,17 @@ dump_psymtab (struct objfile *objfile, struct partial_symtab *psymtab,
       gdb_print_host_address (psymtab->user, outfile);
       fprintf_filtered (outfile, "\n");
     }
-  if (psymtab->n_global_syms > 0)
+  if (!psymtab->global_psymbols.empty ())
     {
       print_partial_symbols
-	(gdbarch, objfile,
-	 &objfile->partial_symtabs->global_psymbols[psymtab->globals_offset],
-	 psymtab->n_global_syms, "Global", outfile);
+	(gdbarch, objfile, psymtab->global_psymbols,
+	 "Global", outfile);
     }
-  if (psymtab->n_static_syms > 0)
+  if (!psymtab->static_psymbols.empty ())
     {
       print_partial_symbols
-	(gdbarch, objfile,
-	 &objfile->partial_symtabs->static_psymbols[psymtab->statics_offset],
-	 psymtab->n_static_syms, "Static", outfile);
+	(gdbarch, objfile, psymtab->static_psymbols,
+	 "Static", outfile);
     }
   fprintf_filtered (outfile, "\n");
 }
@@ -1239,26 +1227,22 @@ recursively_search_psymtabs
 	}
     }
 
-  partial_symbol **gbound
-    = (objfile->partial_symtabs->global_psymbols.data ()
-       + ps->globals_offset + ps->n_global_syms);
-  partial_symbol **sbound
-    = (objfile->partial_symtabs->static_psymbols.data ()
-       + ps->statics_offset + ps->n_static_syms);
+  partial_symbol **gbound = (ps->global_psymbols.data ()
+			     + ps->global_psymbols.size ());
+  partial_symbol **sbound = (ps->static_psymbols.data ()
+			     + ps->static_psymbols.size ());
   partial_symbol **bound = gbound;
 
   /* Go through all of the symbols stored in a partial
      symtab in one loop.  */
-  partial_symbol **psym = (objfile->partial_symtabs->global_psymbols.data ()
-			   + ps->globals_offset);
+  partial_symbol **psym = ps->global_psymbols.data ();
   while (keep_going)
     {
       if (psym >= bound)
 	{
-	  if (bound == gbound && ps->n_static_syms != 0)
+	  if (bound == gbound && !ps->static_psymbols.empty ())
 	    {
-	      psym = (objfile->partial_symtabs->static_psymbols.data ()
-		      + ps->statics_offset);
+	      psym = ps->static_psymbols.data ();
 	      bound = sbound;
 	    }
 	  else
@@ -1373,14 +1357,10 @@ static void
 psym_fill_psymbol_map (struct objfile *objfile,
 		       struct partial_symtab *psymtab,
 		       std::set<CORE_ADDR> *seen_addrs,
-		       const std::vector<partial_symbol *> &symbols,
-		       int start,
-		       int length)
+		       const std::vector<partial_symbol *> &symbols)
 {
-  for (int i = 0; i < length; ++i)
+  for (partial_symbol *psym : symbols)
     {
-      struct partial_symbol *psym = symbols[start + i];
-
       if (psym->aclass == LOC_STATIC)
 	{
 	  CORE_ADDR addr = psym->address (objfile);
@@ -1408,14 +1388,10 @@ psym_find_compunit_symtab_by_address (struct objfile *objfile,
 	{
 	  psym_fill_psymbol_map (objfile, pst,
 				 &seen_addrs,
-				 objfile->partial_symtabs->global_psymbols,
-				 pst->globals_offset,
-				 pst->n_global_syms);
+				 pst->global_psymbols);
 	  psym_fill_psymbol_map (objfile, pst,
 				 &seen_addrs,
-				 objfile->partial_symtabs->static_psymbols,
-				 pst->statics_offset,
-				 pst->n_static_syms);
+				 pst->static_psymbols);
 	}
 
       objfile->psymbol_map.shrink_to_fit ();
@@ -1468,14 +1444,9 @@ static void
 sort_pst_symbols (struct objfile *objfile, struct partial_symtab *pst)
 {
   /* Sort the global list; don't sort the static list.  */
-  auto begin = objfile->partial_symtabs->global_psymbols.begin ();
-  std::advance (begin, pst->globals_offset);
-
-  /* The psymbols for this partial_symtab are currently at the end of the
-     vector.  */
-  auto end = objfile->partial_symtabs->global_psymbols.end ();
-
-  std::sort (begin, end, [] (partial_symbol *s1, partial_symbol *s2)
+  std::sort (pst->global_psymbols.begin (),
+	     pst->global_psymbols.end (),
+	     [] (partial_symbol *s1, partial_symbol *s2)
     {
       return strcmp_iw_ordered (s1->ginfo.search_name (),
 				s2->ginfo.search_name ()) < 0;
@@ -1492,20 +1463,6 @@ partial_symtab::partial_symtab (const char *filename,
 {
   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.  */
-
-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.  */
@@ -1513,26 +1470,8 @@ concat (std::vector<partial_symbol *> *v1, std::vector<partial_symbol *> *v2)
 void
 end_psymtab_common (struct objfile *objfile, struct partial_symtab *pst)
 {
-  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;
+  pst->global_psymbols.shrink_to_fit ();
+  pst->static_psymbols.shrink_to_fit ();
 
   sort_pst_symbols (objfile, pst);
 }
@@ -1603,18 +1542,19 @@ add_psymbol_to_bcache (const partial_symbol &psymbol,
 /* Helper function, adds partial symbol to the given partial symbol list.  */
 
 static void
-append_psymbol_to_list (std::vector<partial_symbol *> *list,
+append_psymbol_to_list (std::vector<partial_symbol *> &list,
 			struct partial_symbol *psym,
 			struct objfile *objfile)
 {
-  list->push_back (psym);
+  list.push_back (psym);
   OBJSTAT (objfile, n_psyms++);
 }
 
 /* See psympriv.h.  */
 
 void
-add_psymbol_to_list (const partial_symbol &psymbol,
+add_psymbol_to_list (partial_symtab *pst,
+		     const partial_symbol &psymbol,
 		     psymbol_placement where,
 		     struct objfile *objfile)
 {
@@ -1630,17 +1570,18 @@ add_psymbol_to_list (const partial_symbol &psymbol,
     return;
 
   /* Save pointer to partial symbol in psymtab, growing symtab if needed.  */
-  std::vector<partial_symbol *> *list
+  std::vector<partial_symbol *> &list
     = (where == psymbol_placement::STATIC
-       ? objfile->partial_symtabs->current_static_psymbols.back ()
-       : objfile->partial_symtabs->current_global_psymbols.back ());
+       ? pst->static_psymbols
+       : pst->global_psymbols);
   append_psymbol_to_list (list, psym, objfile);
 }
 
 /* See psympriv.h.  */
 
 void
-add_psymbol_to_list (gdb::string_view name, bool copy_name,
+add_psymbol_to_list (partial_symtab *pst,
+		     gdb::string_view name, bool copy_name,
 		     domain_enum domain,
 		     enum address_class theclass,
 		     short section,
@@ -1658,7 +1599,7 @@ add_psymbol_to_list (gdb::string_view name, bool copy_name,
   psymbol.ginfo.set_language (language, objfile->partial_symtabs->obstack ());
   psymbol.ginfo.compute_and_set_names (name, copy_name, objfile->per_bfd);
 
-  add_psymbol_to_list (psymbol, where, objfile);
+  add_psymbol_to_list (pst, psymbol, where, objfile);
 }
 
 /* See psympriv.h.  */
@@ -1666,16 +1607,6 @@ add_psymbol_to_list (gdb::string_view name, bool copy_name,
 void
 init_psymbol_list (struct objfile *objfile, int total_symbols)
 {
-  if (objfile->partial_symtabs->global_psymbols.capacity () == 0
-      && objfile->partial_symtabs->static_psymbols.capacity () == 0)
-    {
-      /* Current best guess is that approximately a twentieth of the
-	 total symbols (in a debugging file) are global or static
-	 oriented symbols, then multiply that by slop factor of
-	 two.  */
-      objfile->partial_symtabs->global_psymbols.reserve (total_symbols / 10);
-      objfile->partial_symtabs->static_psymbols.reserve (total_symbols / 10);
-    }
 }
 
 /* See psympriv.h.  */
@@ -2045,29 +1976,19 @@ maintenance_info_psymtabs (const char *regexp, int from_tty)
 				 (psymtab->psymtabs_addrmap_supported
 				  ? "yes" : "no"));
 		printf_filtered ("    globals ");
-		if (psymtab->n_global_syms)
-		  {
-		    auto p = &(objfile->partial_symtabs
-			       ->global_psymbols[psymtab->globals_offset]);
-
-		    printf_filtered
-		      ("(* (struct partial_symbol **) %s @ %d)\n",
-		       host_address_to_string (p),
-		       psymtab->n_global_syms);
-		  }
+		if (!psymtab->global_psymbols.empty ())
+		  printf_filtered
+		    ("(* (struct partial_symbol **) %s @ %d)\n",
+		     host_address_to_string (psymtab->global_psymbols.data ()),
+		     (int) psymtab->global_psymbols.size ());
 		else
 		  printf_filtered ("(none)\n");
 		printf_filtered ("    statics ");
-		if (psymtab->n_static_syms)
-		  {
-		    auto p = &(objfile->partial_symtabs
-			       ->static_psymbols[psymtab->statics_offset]);
-
-		    printf_filtered
-		      ("(* (struct partial_symbol **) %s @ %d)\n",
-		       host_address_to_string (p),
-		       psymtab->n_static_syms);
-		  }
+		if (!psymtab->static_psymbols.empty ())
+		  printf_filtered
+		    ("(* (struct partial_symbol **) %s @ %d)\n",
+		     host_address_to_string (psymtab->static_psymbols.data ()),
+		     (int) psymtab->static_psymbols.size ());
 		else
 		  printf_filtered ("(none)\n");
 		if (psymtab->user)
@@ -2114,7 +2035,6 @@ maintenance_check_psymtabs (const char *ignore, int from_tty)
   struct compunit_symtab *cust = NULL;
   const struct blockvector *bv;
   const struct block *b;
-  int i;
 
   for (objfile *objfile : current_program_space->objfiles ())
     for (partial_symtab *ps : require_partial_symbols (objfile, true))
@@ -2146,39 +2066,36 @@ maintenance_check_psymtabs (const char *ignore, int from_tty)
 	  continue;
 	bv = COMPUNIT_BLOCKVECTOR (cust);
 	b = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
-	partial_symbol **psym
-	  = &objfile->partial_symtabs->static_psymbols[ps->statics_offset];
-	for (i = 0; i < ps->n_static_syms; psym++, i++)
+	for (partial_symbol *psym : ps->static_psymbols)
 	  {
 	    /* Skip symbols for inlined functions without address.  These may
 	       or may not have a match in the full symtab.  */
-	    if ((*psym)->aclass == LOC_BLOCK
-		&& (*psym)->ginfo.value.address == 0)
+	    if (psym->aclass == LOC_BLOCK
+		&& psym->ginfo.value.address == 0)
 	      continue;
 
-	    sym = block_lookup_symbol (b, (*psym)->ginfo.search_name (),
+	    sym = block_lookup_symbol (b, psym->ginfo.search_name (),
 				       symbol_name_match_type::SEARCH_NAME,
-				       (*psym)->domain);
+				       psym->domain);
 	    if (!sym)
 	      {
 		printf_filtered ("Static symbol `");
-		puts_filtered ((*psym)->ginfo.linkage_name ());
+		puts_filtered (psym->ginfo.linkage_name ());
 		printf_filtered ("' only found in ");
 		puts_filtered (ps->filename);
 		printf_filtered (" psymtab\n");
 	      }
 	  }
 	b = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
-	psym = &objfile->partial_symtabs->global_psymbols[ps->globals_offset];
-	for (i = 0; i < ps->n_global_syms; psym++, i++)
+	for (partial_symbol *psym : ps->global_psymbols)
 	  {
-	    sym = block_lookup_symbol (b, (*psym)->ginfo.search_name (),
+	    sym = block_lookup_symbol (b, psym->ginfo.search_name (),
 				       symbol_name_match_type::SEARCH_NAME,
-				       (*psym)->domain);
+				       psym->domain);
 	    if (!sym)
 	      {
 		printf_filtered ("Global symbol `");
-		puts_filtered ((*psym)->ginfo.linkage_name ());
+		puts_filtered (psym->ginfo.linkage_name ());
 		printf_filtered ("' only found in ");
 		puts_filtered (ps->filename);
 		printf_filtered (" psymtab\n");
diff --git a/gdb/psymtab.h b/gdb/psymtab.h
index e8bafbe4338..165ee156b6e 100644
--- a/gdb/psymtab.h
+++ b/gdb/psymtab.h
@@ -123,18 +123,6 @@ class psymtab_storage
 
   gdb::bcache psymbol_cache;
 
-  /* Vectors of all partial symbols read in from file.  The actual data
-     is stored in the objfile_obstack.  */
-
-  std::vector<partial_symbol *> global_psymbols;
-  std::vector<partial_symbol *> static_psymbols;
-
-  /* Stack of vectors of partial symbols, using during psymtab
-     initialization.  */
-
-  std::vector<std::vector<partial_symbol *>*> current_global_psymbols;
-  std::vector<std::vector<partial_symbol *>*> current_static_psymbols;
-
 private:
 
   /* The obstack where allocations are made.  This is lazily allocated
diff --git a/gdb/xcoffread.c b/gdb/xcoffread.c
index 389678aa5b7..3b0e5e823de 100644
--- a/gdb/xcoffread.c
+++ b/gdb/xcoffread.c
@@ -2035,8 +2035,7 @@ xcoff_end_psymtab (struct objfile *objfile, legacy_psymtab *pst,
 
   if (num_includes == 0
       && number_dependencies == 0
-      && pst->n_global_syms == 0
-      && pst->n_static_syms == 0)
+      && pst->empty ())
     {
       /* Throw away this psymtab, it's empty.  */
       /* Empty psymtabs happen as a result of header files which don't have
@@ -2575,7 +2574,8 @@ scan_xcoff_symtab (minimal_symbol_reader &reader,
 	    switch (p[1])
 	      {
 	      case 'S':
-		add_psymbol_to_list (gdb::string_view (namestring,
+		add_psymbol_to_list (pst,
+				     gdb::string_view (namestring,
 						       p - namestring),
 				     true, VAR_DOMAIN, LOC_STATIC,
 				     SECT_OFF_DATA (objfile),
@@ -2587,7 +2587,8 @@ scan_xcoff_symtab (minimal_symbol_reader &reader,
 	      case 'G':
 		/* The addresses in these entries are reported to be
 		   wrong.  See the code that reads 'G's for symtabs.  */
-		add_psymbol_to_list (gdb::string_view (namestring,
+		add_psymbol_to_list (pst,
+				     gdb::string_view (namestring,
 						       p - namestring),
 				     true, VAR_DOMAIN, LOC_STATIC,
 				     SECT_OFF_DATA (objfile),
@@ -2607,7 +2608,8 @@ scan_xcoff_symtab (minimal_symbol_reader &reader,
 		    || (p == namestring + 1
 			&& namestring[0] != ' '))
 		  {
-		    add_psymbol_to_list (gdb::string_view (namestring,
+		    add_psymbol_to_list (pst,
+					 gdb::string_view (namestring,
 							   p - namestring),
 					 true, STRUCT_DOMAIN, LOC_TYPEDEF, -1,
 					 psymbol_placement::STATIC,
@@ -2615,7 +2617,8 @@ scan_xcoff_symtab (minimal_symbol_reader &reader,
 		    if (p[2] == 't')
 		      {
 			/* Also a typedef with the same name.  */
-			add_psymbol_to_list (gdb::string_view (namestring,
+			add_psymbol_to_list (pst,
+					     gdb::string_view (namestring,
 							       p - namestring),
 					     true, VAR_DOMAIN, LOC_TYPEDEF, -1,
 					     psymbol_placement::STATIC,
@@ -2628,7 +2631,8 @@ scan_xcoff_symtab (minimal_symbol_reader &reader,
 	      case 't':
 		if (p != namestring)	/* a name is there, not just :T...  */
 		  {
-		    add_psymbol_to_list (gdb::string_view (namestring,
+		    add_psymbol_to_list (pst,
+					 gdb::string_view (namestring,
 							   p - namestring),
 					 true, VAR_DOMAIN, LOC_TYPEDEF, -1,
 					 psymbol_placement::STATIC,
@@ -2691,7 +2695,8 @@ scan_xcoff_symtab (minimal_symbol_reader &reader,
 			  ;
 			/* Note that the value doesn't matter for
 			   enum constants in psymtabs, just in symtabs.  */
-			add_psymbol_to_list (gdb::string_view (p, q - p), true,
+			add_psymbol_to_list (pst,
+					     gdb::string_view (p, q - p), true,
 					     VAR_DOMAIN, LOC_CONST, -1,
 					     psymbol_placement::STATIC,
 					     0, psymtab_language, objfile);
@@ -2709,7 +2714,8 @@ scan_xcoff_symtab (minimal_symbol_reader &reader,
 
 	      case 'c':
 		/* Constant, e.g. from "const" in Pascal.  */
-		add_psymbol_to_list (gdb::string_view (namestring,
+		add_psymbol_to_list (pst,
+				     gdb::string_view (namestring,
 						       p - namestring),
 				     true, VAR_DOMAIN, LOC_CONST, -1,
 				     psymbol_placement::STATIC,
@@ -2727,7 +2733,8 @@ scan_xcoff_symtab (minimal_symbol_reader &reader,
 		    function_outside_compilation_unit_complaint (name);
 		    xfree (name);
 		  }
-		add_psymbol_to_list (gdb::string_view (namestring,
+		add_psymbol_to_list (pst,
+				     gdb::string_view (namestring,
 						       p - namestring),
 				     true, VAR_DOMAIN, LOC_BLOCK,
 				     SECT_OFF_TEXT (objfile),
@@ -2758,7 +2765,8 @@ scan_xcoff_symtab (minimal_symbol_reader &reader,
 		if (startswith (namestring, "@FIX"))
 		  continue;
 
-		add_psymbol_to_list (gdb::string_view (namestring,
+		add_psymbol_to_list (pst,
+				     gdb::string_view (namestring,
 						       p - namestring),
 				     true, VAR_DOMAIN, LOC_BLOCK,
 				     SECT_OFF_TEXT (objfile),
-- 
2.17.2


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] Have partial symbol tables own psymbol vectors
  2020-08-28 19:33 [PATCH] Have partial symbol tables own psymbol vectors Tom Tromey
@ 2020-08-30 19:18 ` Tom Tromey
  2020-08-31 17:09   ` Tom Tromey
  0 siblings, 1 reply; 13+ messages in thread
From: Tom Tromey @ 2020-08-30 19:18 UTC (permalink / raw)
  To: Tom Tromey; +Cc: gdb-patches

>>>>> "Tom" == Tom Tromey <tom@tromey.com> writes:

Tom> Currently pointers to all partial symbols are stored in two vectors;
Tom> and then indices into these vectors are stored in each partial_symtab.

Tom> This patch changes this so that each partial symtab instead has
Tom> vectors of symbols.

It occurred to me today that add_psymbol_to_list could now be a method
on partial_symtab.  I'm going to make that change and then resubmit.

Tom

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] Have partial symbol tables own psymbol vectors
  2020-08-30 19:18 ` Tom Tromey
@ 2020-08-31 17:09   ` Tom Tromey
  2020-08-31 21:39     ` Simon Marchi
                       ` (3 more replies)
  0 siblings, 4 replies; 13+ messages in thread
From: Tom Tromey @ 2020-08-31 17:09 UTC (permalink / raw)
  To: Tom Tromey; +Cc: gdb-patches

Tom> It occurred to me today that add_psymbol_to_list could now be a method
Tom> on partial_symtab.  I'm going to make that change and then resubmit.

Here's the updated patch.

Tom

commit ac9fbb7aa1adcbc81cf8f6b9114e84c9193ae512
Author: Tom Tromey <tom@tromey.com>
Date:   Tue Aug 25 11:12:26 2020 -0600

    Have partial symbol tables own psymbol vectors
    
    Currently pointers to all partial symbols are stored in two vectors;
    and then indices into these vectors are stored in each partial_symtab.
    
    This patch changes this so that each partial symtab instead has
    vectors of symbols.  add_psymbol_to_list can now be changed into a
    method on partial_symtab as well.
    
    My main motivation for doing this is that I am looking into calling
    sort_pst_symbols in the background.  However, I haven't actually
    implemented this yet.  (Also this may make it more feasible to also
    sort the static psymbols, though I haven't tried that either.)
    
    Also, though, this lets us remove the "current_global_psymbols"
    vector, because now the callers can simply refer directly to the
    psymtab that they are modifying (formerly this was implicit).
    
    The main drawback of this patch is that it increases the size of
    partial symtab.
    
    gdb/ChangeLog
    2020-08-31  Tom Tromey  <tom@tromey.com>
    
            * xcoffread.c (xcoff_end_psymtab): Use partial_symtab::empty.
            (scan_xcoff_symtab): Update.
            * psymtab.h (class psymtab_storage) <global_psymbols,
            static_psymbols, current_global_psymbols,
            current_static_psymbols>: Remove.
            * psymtab.c (require_partial_symbols, find_pc_sect_psymbol)
            (match_partial_symbol, lookup_partial_symbol): Update.
            (print_partial_symbols): Change parameters.
            (dump_psymtab, recursively_search_psymtabs)
            (psym_fill_psymbol_map, psym_find_compunit_symtab_by_address)
            (sort_pst_symbols, partial_symtab::partial_symtab): Update.
            (concat): Remove.
            (end_psymtab_common): Simplify.
            (append_psymbol_to_list): Change parameters.
            (partial_symtabs::add_psymbol): Rename from add_psymbol_to_list.
            (init_psymbol_list): Simplify.
            (maintenance_info_psymtabs, maintenance_check_psymtabs): Update.
            * psympriv.h (struct partial_symtab) <empty>: New method.
            <globals_offset, n_global_syms, statics_offset, n_static_syms>:
            Remove.
            <global_psymbols, static_psymbols>: New members.
            <add_psymbol>: New methods.
            (add_psymbol_to_list): Don't declare.
            (psymbol_placement): Move earlier.
            * mdebugread.c (parse_partial_symbols): Update.
            (handle_psymbol_enumerators): Change parameters.
            (mdebug_expand_psymtab): Update.
            * dwarf2/read.c (process_psymtab_comp_unit_reader)
            (add_partial_symbol): Update.
            * dwarf2/index-write.c (write_psymbols): Change parameters.
            (write_one_signatured_type): Update.
            (recursively_count_psymbols): Update.
            (recursively_write_psymbols): Update.
            (class debug_names) <recursively_write_psymbols>: Update.
            <write_psymbols>: Change parameters.
            <write_one_signatured_type>: Update.
            * dbxread.c (read_dbx_symtab): Update.
            (dbx_end_psymtab): Use partial_symtab::empty.
            * ctfread.c (struct ctf_context) <pst>: New member.
            (create_partial_symtab): Set it.
            (ctf_psymtab_type_cb, ctf_psymtab_var_cb): Update.
            (scan_partial_symbols): Use the psymtab's context.  Update.

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 8cb475d367a..764e207df7c 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,48 @@
+2020-08-31  Tom Tromey  <tom@tromey.com>
+
+	* xcoffread.c (xcoff_end_psymtab): Use partial_symtab::empty.
+	(scan_xcoff_symtab): Update.
+	* psymtab.h (class psymtab_storage) <global_psymbols,
+	static_psymbols, current_global_psymbols,
+	current_static_psymbols>: Remove.
+	* psymtab.c (require_partial_symbols, find_pc_sect_psymbol)
+	(match_partial_symbol, lookup_partial_symbol): Update.
+	(print_partial_symbols): Change parameters.
+	(dump_psymtab, recursively_search_psymtabs)
+	(psym_fill_psymbol_map, psym_find_compunit_symtab_by_address)
+	(sort_pst_symbols, partial_symtab::partial_symtab): Update.
+	(concat): Remove.
+	(end_psymtab_common): Simplify.
+	(append_psymbol_to_list): Change parameters.
+	(partial_symtabs::add_psymbol): Rename from add_psymbol_to_list.
+	(init_psymbol_list): Simplify.
+	(maintenance_info_psymtabs, maintenance_check_psymtabs): Update.
+	* psympriv.h (struct partial_symtab) <empty>: New method.
+	<globals_offset, n_global_syms, statics_offset, n_static_syms>:
+	Remove.
+	<global_psymbols, static_psymbols>: New members.
+	<add_psymbol>: New methods.
+	(add_psymbol_to_list): Don't declare.
+	(psymbol_placement): Move earlier.
+	* mdebugread.c (parse_partial_symbols): Update.
+	(handle_psymbol_enumerators): Change parameters.
+	(mdebug_expand_psymtab): Update.
+	* dwarf2/read.c (process_psymtab_comp_unit_reader)
+	(add_partial_symbol): Update.
+	* dwarf2/index-write.c (write_psymbols): Change parameters.
+	(write_one_signatured_type): Update.
+	(recursively_count_psymbols): Update.
+	(recursively_write_psymbols): Update.
+	(class debug_names) <recursively_write_psymbols>: Update.
+	<write_psymbols>: Change parameters.
+	<write_one_signatured_type>: Update.
+	* dbxread.c (read_dbx_symtab): Update.
+	(dbx_end_psymtab): Use partial_symtab::empty.
+	* ctfread.c (struct ctf_context) <pst>: New member.
+	(create_partial_symtab): Set it.
+	(ctf_psymtab_type_cb, ctf_psymtab_var_cb): Update.
+	(scan_partial_symbols): Use the psymtab's context.  Update.
+
 2020-08-31  Simon Marchi  <simon.marchi@efficios.com>
 
 	* gdbtypes.h (NULL_TYPE): Remove, change all uses to nullptr.
diff --git a/gdb/ctfread.c b/gdb/ctfread.c
index 5b6d731479a..66d4a36035b 100644
--- a/gdb/ctfread.c
+++ b/gdb/ctfread.c
@@ -115,6 +115,7 @@ struct ctf_context
 {
   ctf_file_t *fp;
   struct objfile *of;
+  partial_symtab *pst;
   struct buildsym_compunit *builder;
 };
 
@@ -1319,6 +1320,8 @@ create_partial_symtab (const char *name,
   ccx = XOBNEW (&objfile->objfile_obstack, struct ctf_context);
   ccx->fp = cfp;
   ccx->of = objfile;
+  ccx->pst = pst;
+  ccx->builder = nullptr;
   pst->context = ccx;
 
   return pst;
@@ -1376,7 +1379,7 @@ ctf_psymtab_type_cb (ctf_id_t tid, void *arg)
 	return 0;
     }
 
-    add_psymbol_to_list (name.get (), true,
+  ccp->pst->add_psymbol (name.get (), true,
 			 domain, aclass, section,
 			 psymbol_placement::GLOBAL,
 			 0, language_c, ccp->of);
@@ -1391,10 +1394,10 @@ ctf_psymtab_var_cb (const char *name, ctf_id_t id, void *arg)
 {
   struct ctf_context *ccp = (struct ctf_context *) arg;
 
-  add_psymbol_to_list (name, true,
-		       VAR_DOMAIN, LOC_STATIC, -1,
-		       psymbol_placement::GLOBAL,
-		       0, language_c, ccp->of);
+  ccp->pst->add_psymbol (name, true,
+			 VAR_DOMAIN, LOC_STATIC, -1,
+			 psymbol_placement::GLOBAL,
+			 0, language_c, ccp->of);
   return 0;
 }
 
@@ -1404,19 +1407,17 @@ ctf_psymtab_var_cb (const char *name, ctf_id_t id, void *arg)
 static void
 scan_partial_symbols (ctf_file_t *cfp, struct objfile *of)
 {
-  struct ctf_context ccx;
   bfd *abfd = of->obfd;
   const char *name = bfd_get_filename (abfd);
   ctf_psymtab *pst = create_partial_symtab (name, cfp, of);
 
-  ccx.fp = cfp;
-  ccx.of = of;
+  struct ctf_context *ccx = pst->context;
 
-  if (ctf_type_iter (cfp, ctf_psymtab_type_cb, &ccx) == CTF_ERR)
+  if (ctf_type_iter (cfp, ctf_psymtab_type_cb, ccx) == CTF_ERR)
     complaint (_("ctf_type_iter scan_partial_symbols failed - %s"),
 	       ctf_errmsg (ctf_errno (cfp)));
 
-  if (ctf_variable_iter (cfp, ctf_psymtab_var_cb, &ccx) == CTF_ERR)
+  if (ctf_variable_iter (cfp, ctf_psymtab_var_cb, ccx) == CTF_ERR)
     complaint (_("ctf_variable_iter scan_partial_symbols failed - %s"),
 	       ctf_errmsg (ctf_errno (cfp)));
 
@@ -1456,10 +1457,10 @@ scan_partial_symbols (ctf_file_t *cfp, struct objfile *of)
       else
 	aclass = LOC_TYPEDEF;
 
-      add_psymbol_to_list (tname.get (), true,
-			   tdomain, aclass, -1,
-			   psymbol_placement::STATIC,
-			   0, language_c, of);
+      pst->add_psymbol (tname.get (), true,
+			tdomain, aclass, -1,
+			psymbol_placement::STATIC,
+			0, language_c, of);
     }
 
   end_psymtab_common (of, pst);
diff --git a/gdb/dbxread.c b/gdb/dbxread.c
index e76bf702b38..4665cddc5f1 100644
--- a/gdb/dbxread.c
+++ b/gdb/dbxread.c
@@ -1460,21 +1460,21 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
 	  switch (p[1])
 	    {
 	    case 'S':
-	      add_psymbol_to_list (gdb::string_view (sym_name, sym_len), true,
-				   VAR_DOMAIN, LOC_STATIC,
-				   data_sect_index,
-				   psymbol_placement::STATIC,
-				   nlist.n_value, psymtab_language, objfile);
+	      pst->add_psymbol (gdb::string_view (sym_name, sym_len), true,
+				VAR_DOMAIN, LOC_STATIC,
+				data_sect_index,
+				psymbol_placement::STATIC,
+				nlist.n_value, psymtab_language, objfile);
 	      continue;
 
 	    case 'G':
 	      /* The addresses in these entries are reported to be
 		 wrong.  See the code that reads 'G's for symtabs.  */
-	      add_psymbol_to_list (gdb::string_view (sym_name, sym_len), true,
-				   VAR_DOMAIN, LOC_STATIC,
-				   data_sect_index,
-				   psymbol_placement::GLOBAL,
-				   nlist.n_value, psymtab_language, objfile);
+	      pst->add_psymbol (gdb::string_view (sym_name, sym_len), true,
+				VAR_DOMAIN, LOC_STATIC,
+				data_sect_index,
+				psymbol_placement::GLOBAL,
+				nlist.n_value, psymtab_language, objfile);
 	      continue;
 
 	    case 'T':
@@ -1488,17 +1488,17 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
 		  || (p == namestring + 1
 		      && namestring[0] != ' '))
 		{
-		  add_psymbol_to_list (gdb::string_view (sym_name, sym_len),
-				       true, STRUCT_DOMAIN, LOC_TYPEDEF, -1,
-				       psymbol_placement::STATIC,
-				       0, psymtab_language, objfile);
+		  pst->add_psymbol (gdb::string_view (sym_name, sym_len),
+				    true, STRUCT_DOMAIN, LOC_TYPEDEF, -1,
+				    psymbol_placement::STATIC,
+				    0, psymtab_language, objfile);
 		  if (p[2] == 't')
 		    {
 		      /* Also a typedef with the same name.  */
-		      add_psymbol_to_list (gdb::string_view (sym_name, sym_len),
-					   true, VAR_DOMAIN, LOC_TYPEDEF, -1,
-					   psymbol_placement::STATIC,
-					   0, psymtab_language, objfile);
+		      pst->add_psymbol (gdb::string_view (sym_name, sym_len),
+					true, VAR_DOMAIN, LOC_TYPEDEF, -1,
+					psymbol_placement::STATIC,
+					0, psymtab_language, objfile);
 		      p += 1;
 		    }
 		}
@@ -1507,10 +1507,10 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
 	    case 't':
 	      if (p != namestring)	/* a name is there, not just :T...  */
 		{
-		  add_psymbol_to_list (gdb::string_view (sym_name, sym_len),
-				       true, VAR_DOMAIN, LOC_TYPEDEF, -1,
-				       psymbol_placement::STATIC,
-				       0, psymtab_language, objfile);
+		  pst->add_psymbol (gdb::string_view (sym_name, sym_len),
+				    true, VAR_DOMAIN, LOC_TYPEDEF, -1,
+				    psymbol_placement::STATIC,
+				    0, psymtab_language, objfile);
 		}
 	    check_enum:
 	      /* If this is an enumerated type, we need to
@@ -1568,10 +1568,10 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
 			;
 		      /* Note that the value doesn't matter for
 			 enum constants in psymtabs, just in symtabs.  */
-		      add_psymbol_to_list (gdb::string_view (p, q - p), true,
-					   VAR_DOMAIN, LOC_CONST, -1,
-					   psymbol_placement::STATIC, 0,
-					   psymtab_language, objfile);
+		      pst->add_psymbol (gdb::string_view (p, q - p), true,
+					VAR_DOMAIN, LOC_CONST, -1,
+					psymbol_placement::STATIC, 0,
+					psymtab_language, objfile);
 		      /* Point past the name.  */
 		      p = q;
 		      /* Skip over the value.  */
@@ -1586,10 +1586,10 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
 
 	    case 'c':
 	      /* Constant, e.g. from "const" in Pascal.  */
-	      add_psymbol_to_list (gdb::string_view (sym_name, sym_len), true,
-				   VAR_DOMAIN, LOC_CONST, -1,
-				   psymbol_placement::STATIC, 0,
-				   psymtab_language, objfile);
+	      pst->add_psymbol (gdb::string_view (sym_name, sym_len), true,
+				VAR_DOMAIN, LOC_CONST, -1,
+				psymbol_placement::STATIC, 0,
+				psymtab_language, objfile);
 	      continue;
 
 	    case 'f':
@@ -1641,11 +1641,11 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
 		  pst->set_text_low (nlist.n_value);
 		  textlow_not_set = 0;
 		}
-	      add_psymbol_to_list (gdb::string_view (sym_name, sym_len), true,
-				   VAR_DOMAIN, LOC_BLOCK,
-				   SECT_OFF_TEXT (objfile),
-				   psymbol_placement::STATIC,
-				   nlist.n_value, psymtab_language, objfile);
+	      pst->add_psymbol (gdb::string_view (sym_name, sym_len), true,
+				VAR_DOMAIN, LOC_BLOCK,
+				SECT_OFF_TEXT (objfile),
+				psymbol_placement::STATIC,
+				nlist.n_value, psymtab_language, objfile);
 	      continue;
 
 	      /* Global functions were ignored here, but now they
@@ -1700,11 +1700,11 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
 		  pst->set_text_low (nlist.n_value);
 		  textlow_not_set = 0;
 		}
-	      add_psymbol_to_list (gdb::string_view (sym_name, sym_len), true,
-				   VAR_DOMAIN, LOC_BLOCK,
-				   SECT_OFF_TEXT (objfile),
-				   psymbol_placement::GLOBAL,
-				   nlist.n_value, psymtab_language, objfile);
+	      pst->add_psymbol (gdb::string_view (sym_name, sym_len), true,
+				VAR_DOMAIN, LOC_BLOCK,
+				SECT_OFF_TEXT (objfile),
+				psymbol_placement::GLOBAL,
+				nlist.n_value, psymtab_language, objfile);
 	      continue;
 
 	      /* Two things show up here (hopefully); static symbols of
@@ -2043,8 +2043,7 @@ dbx_end_psymtab (struct objfile *objfile, legacy_psymtab *pst,
 
   if (num_includes == 0
       && number_dependencies == 0
-      && pst->n_global_syms == 0
-      && pst->n_static_syms == 0
+      && pst->empty ()
       && has_line_numbers == 0)
     {
       /* Throw away this psymtab, it's empty.  */
diff --git a/gdb/dwarf2/index-write.c b/gdb/dwarf2/index-write.c
index aa7a37e4ef2..e6188f79333 100644
--- a/gdb/dwarf2/index-write.c
+++ b/gdb/dwarf2/index-write.c
@@ -539,14 +539,12 @@ symbol_kind (struct partial_symbol *psym)
 static void
 write_psymbols (struct mapped_symtab *symtab,
 		std::unordered_set<partial_symbol *> &psyms_seen,
-		struct partial_symbol **psymp,
-		int count,
+		const std::vector<partial_symbol *> &symbols,
 		offset_type cu_index,
 		int is_static)
 {
-  for (; count-- > 0; ++psymp)
+  for (partial_symbol *psym : symbols)
     {
-      struct partial_symbol *psym = *psymp;
       const char *name = psym->ginfo.search_name ();
 
       if (psym->ginfo.language () == language_ada)
@@ -618,17 +616,11 @@ write_one_signatured_type (void **slot, void *d)
   struct signatured_type *entry = (struct signatured_type *) *slot;
   partial_symtab *psymtab = entry->per_cu.v.psymtab;
 
-  write_psymbols (info->symtab,
-		  info->psyms_seen,
-		  (info->objfile->partial_symtabs->global_psymbols.data ()
-		   + psymtab->globals_offset),
-		  psymtab->n_global_syms, info->cu_index,
+  write_psymbols (info->symtab, info->psyms_seen,
+		  psymtab->global_psymbols, info->cu_index,
 		  0);
-  write_psymbols (info->symtab,
-		  info->psyms_seen,
-		  (info->objfile->partial_symtabs->static_psymbols.data ()
-		   + psymtab->statics_offset),
-		  psymtab->n_static_syms, info->cu_index,
+  write_psymbols (info->symtab, info->psyms_seen,
+		  psymtab->static_psymbols, info->cu_index,
 		  1);
 
   info->types_list.append_uint (8, BFD_ENDIAN_LITTLE,
@@ -654,8 +646,8 @@ recursively_count_psymbols (partial_symtab *psymtab,
       recursively_count_psymbols (psymtab->dependencies[i],
 				  psyms_seen);
 
-  psyms_seen += psymtab->n_global_syms;
-  psyms_seen += psymtab->n_static_syms;
+  psyms_seen += psymtab->global_psymbols.size ();
+  psyms_seen += psymtab->static_psymbols.size ();
 }
 
 /* Recurse into all "included" dependencies and write their symbols as
@@ -676,17 +668,11 @@ recursively_write_psymbols (struct objfile *objfile,
 				  psymtab->dependencies[i],
 				  symtab, psyms_seen, cu_index);
 
-  write_psymbols (symtab,
-		  psyms_seen,
-		  (objfile->partial_symtabs->global_psymbols.data ()
-		   + psymtab->globals_offset),
-		  psymtab->n_global_syms, cu_index,
+  write_psymbols (symtab, psyms_seen,
+		  psymtab->global_psymbols, cu_index,
 		  0);
-  write_psymbols (symtab,
-		  psyms_seen,
-		  (objfile->partial_symtabs->static_psymbols.data ()
-		   + psymtab->statics_offset),
-		  psymtab->n_static_syms, cu_index,
+  write_psymbols (symtab, psyms_seen,
+		  psymtab->static_psymbols, cu_index,
 		  1);
 }
 
@@ -912,14 +898,10 @@ class debug_names
 	recursively_write_psymbols
 	  (objfile, psymtab->dependencies[i], psyms_seen, cu_index);
 
-    write_psymbols (psyms_seen,
-		    (objfile->partial_symtabs->global_psymbols.data ()
-		     + psymtab->globals_offset),
-		    psymtab->n_global_syms, cu_index, false, unit_kind::cu);
-    write_psymbols (psyms_seen,
-		    (objfile->partial_symtabs->static_psymbols.data ()
-		     + psymtab->statics_offset),
-		    psymtab->n_static_syms, cu_index, true, unit_kind::cu);
+    write_psymbols (psyms_seen, psymtab->global_psymbols,
+		    cu_index, false, unit_kind::cu);
+    write_psymbols (psyms_seen, psymtab->static_psymbols,
+		    cu_index, true, unit_kind::cu);
   }
 
   /* Return number of bytes the .debug_names section will have.  This
@@ -1251,13 +1233,11 @@ class debug_names
 
   /* Call insert for all partial symbols and mark them in PSYMS_SEEN.  */
   void write_psymbols (std::unordered_set<partial_symbol *> &psyms_seen,
-		       struct partial_symbol **psymp, int count, int cu_index,
-		       bool is_static, unit_kind kind)
+		       const std::vector<partial_symbol *> &symbols,
+		       int cu_index, bool is_static, unit_kind kind)
   {
-    for (; count-- > 0; ++psymp)
+    for (partial_symbol *psym : symbols)
       {
-	struct partial_symbol *psym = *psymp;
-
 	/* Only add a given psymbol once.  */
 	if (psyms_seen.insert (psym).second)
 	  insert (psym, cu_index, is_static, kind);
@@ -1272,16 +1252,10 @@ class debug_names
   {
     partial_symtab *psymtab = entry->per_cu.v.psymtab;
 
-    write_psymbols (info->psyms_seen,
-		    (info->objfile->partial_symtabs->global_psymbols.data ()
-		     + psymtab->globals_offset),
-		    psymtab->n_global_syms, info->cu_index, false,
-		    unit_kind::tu);
-    write_psymbols (info->psyms_seen,
-		    (info->objfile->partial_symtabs->static_psymbols.data ()
-		     + psymtab->statics_offset),
-		    psymtab->n_static_syms, info->cu_index, true,
-		    unit_kind::tu);
+    write_psymbols (info->psyms_seen, psymtab->global_psymbols,
+		    info->cu_index, false, unit_kind::tu);
+    write_psymbols (info->psyms_seen, psymtab->static_psymbols,
+		    info->cu_index, true, unit_kind::tu);
 
     info->types_list.append_uint (dwarf5_offset_size (), m_dwarf5_byte_order,
 				  to_underlying (entry->per_cu.sect_off));
diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
index 0ac8533263a..001709c82fb 100644
--- a/gdb/dwarf2/read.c
+++ b/gdb/dwarf2/read.c
@@ -7670,7 +7670,8 @@ process_psymtab_comp_unit_reader (const struct die_reader_specs *reader,
 			sect_offset_str (per_cu->sect_off),
 			paddress (gdbarch, pst->text_low (objfile)),
 			paddress (gdbarch, pst->text_high (objfile)),
-			pst->n_global_syms, pst->n_static_syms);
+			(int) pst->global_psymbols.size (),
+			(int) pst->static_psymbols.size ());
 }
 
 /* Subroutine of dwarf2_build_psymtabs_hard to simplify it.
@@ -8643,7 +8644,7 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu)
 					    &objfile->objfile_obstack);
 	  psymbol.ginfo.set_linkage_name (pdi->linkage_name);
 	}
-      add_psymbol_to_list (psymbol, *where, objfile);
+      cu->per_cu->v.psymtab->add_psymbol (psymbol, *where, objfile);
     }
 }
 
diff --git a/gdb/mdebugread.c b/gdb/mdebugread.c
index d38372041d7..80ebcbfbbc0 100644
--- a/gdb/mdebugread.c
+++ b/gdb/mdebugread.c
@@ -264,8 +264,8 @@ static int add_line (struct linetable *, int, CORE_ADDR, int);
 
 static struct linetable *shrink_linetable (struct linetable *);
 
-static void handle_psymbol_enumerators (struct objfile *, FDR *, int,
-					CORE_ADDR);
+static void handle_psymbol_enumerators (struct objfile *, partial_symtab *,
+					FDR *, int, CORE_ADDR);
 
 static const char *mdebug_next_symbol_text (struct objfile *);
 \f
@@ -3029,25 +3029,25 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 		    switch (p[1])
 		      {
 		      case 'S':
-			add_psymbol_to_list (gdb::string_view (namestring,
-							       p - namestring),
-					     true, VAR_DOMAIN, LOC_STATIC,
-					     SECT_OFF_DATA (objfile),
-					     psymbol_placement::STATIC,
-					     sh.value,
-					     psymtab_language, objfile);
+			pst->add_psymbol (gdb::string_view (namestring,
+							    p - namestring),
+					  true, VAR_DOMAIN, LOC_STATIC,
+					  SECT_OFF_DATA (objfile),
+					  psymbol_placement::STATIC,
+					  sh.value,
+					  psymtab_language, objfile);
 			continue;
 		      case 'G':
 			/* The addresses in these entries are reported
 			   to be wrong.  See the code that reads 'G's
 			   for symtabs.  */
-			add_psymbol_to_list (gdb::string_view (namestring,
-							       p - namestring),
-					     true, VAR_DOMAIN, LOC_STATIC,
-					     SECT_OFF_DATA (objfile),
-					     psymbol_placement::GLOBAL,
-					     sh.value,
-					     psymtab_language, objfile);
+			pst->add_psymbol (gdb::string_view (namestring,
+							    p - namestring),
+					  true, VAR_DOMAIN, LOC_STATIC,
+					  SECT_OFF_DATA (objfile),
+					  psymbol_placement::GLOBAL,
+					  sh.value,
+					  psymtab_language, objfile);
 			continue;
 
 		      case 'T':
@@ -3061,7 +3061,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 			    || (p == namestring + 1
 				&& namestring[0] != ' '))
 			  {
-			    add_psymbol_to_list
+			    pst->add_psymbol
 			      (gdb::string_view (namestring, p - namestring),
 			       true, STRUCT_DOMAIN, LOC_TYPEDEF, -1,
 			       psymbol_placement::STATIC, 0, psymtab_language,
@@ -3069,7 +3069,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 			    if (p[2] == 't')
 			      {
 				/* Also a typedef with the same name.  */
-				add_psymbol_to_list
+				pst->add_psymbol
 				  (gdb::string_view (namestring,
 						     p - namestring),
 				   true, VAR_DOMAIN, LOC_TYPEDEF, -1,
@@ -3083,7 +3083,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 			if (p != namestring)	/* a name is there, not
 						   just :T...  */
 			  {
-			    add_psymbol_to_list
+			    pst->add_psymbol
 			      (gdb::string_view (namestring,
 						 p - namestring),
 			       true, VAR_DOMAIN, LOC_TYPEDEF, -1,
@@ -3149,13 +3149,13 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 				/* Note that the value doesn't matter for
 				   enum constants in psymtabs, just in
 				   symtabs.  */
-				add_psymbol_to_list (gdb::string_view (p,
-								       q - p),
-						     true, VAR_DOMAIN,
-						     LOC_CONST, -1,
-						     psymbol_placement::STATIC,
-						     0, psymtab_language,
-						     objfile);
+				pst->add_psymbol (gdb::string_view (p,
+								    q - p),
+						  true, VAR_DOMAIN,
+						  LOC_CONST, -1,
+						  psymbol_placement::STATIC,
+						  0, psymtab_language,
+						  objfile);
 				/* Point past the name.  */
 				p = q;
 				/* Skip over the value.  */
@@ -3169,11 +3169,11 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 			continue;
 		      case 'c':
 			/* Constant, e.g. from "const" in Pascal.  */
-			add_psymbol_to_list (gdb::string_view (namestring,
-							       p - namestring),
-					     true, VAR_DOMAIN, LOC_CONST, -1,
-					     psymbol_placement::STATIC,
-					     0, psymtab_language, objfile);
+			pst->add_psymbol (gdb::string_view (namestring,
+							    p - namestring),
+					  true, VAR_DOMAIN, LOC_CONST, -1,
+					  psymbol_placement::STATIC,
+					  0, psymtab_language, objfile);
 			continue;
 
 		      case 'f':
@@ -3183,13 +3183,13 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 			    function_outside_compilation_unit_complaint
 			      (copy.c_str ());
 			  }
-			add_psymbol_to_list (gdb::string_view (namestring,
-							       p - namestring),
-					     true, VAR_DOMAIN, LOC_BLOCK,
-					     SECT_OFF_TEXT (objfile),
-					     psymbol_placement::STATIC,
-					     sh.value,
-					     psymtab_language, objfile);
+			pst->add_psymbol (gdb::string_view (namestring,
+							    p - namestring),
+					  true, VAR_DOMAIN, LOC_BLOCK,
+					  SECT_OFF_TEXT (objfile),
+					  psymbol_placement::STATIC,
+					  sh.value,
+					  psymtab_language, objfile);
 			continue;
 
 			/* Global functions were ignored here, but now they
@@ -3203,13 +3203,13 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 			    function_outside_compilation_unit_complaint
 			      (copy.c_str ());
 			  }
-			add_psymbol_to_list (gdb::string_view (namestring,
-							       p - namestring),
-					     true, VAR_DOMAIN, LOC_BLOCK,
-					     SECT_OFF_TEXT (objfile),
-					     psymbol_placement::GLOBAL,
-					     sh.value,
-					     psymtab_language, objfile);
+			pst->add_psymbol (gdb::string_view (namestring,
+							    p - namestring),
+					  true, VAR_DOMAIN, LOC_BLOCK,
+					  SECT_OFF_TEXT (objfile),
+					  psymbol_placement::GLOBAL,
+					  sh.value,
+					  psymtab_language, objfile);
 			continue;
 
 			/* Two things show up here (hopefully); static
@@ -3439,17 +3439,17 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 		     symbol table, and the MAIN__ symbol via the minimal
 		     symbol table.  */
 		  if (sh.st == stProc)
-		    add_psymbol_to_list (sym_name, true,
-					 VAR_DOMAIN, LOC_BLOCK,
-					 section,
-					 psymbol_placement::GLOBAL,
-					 sh.value, psymtab_language, objfile);
+		    pst->add_psymbol (sym_name, true,
+				      VAR_DOMAIN, LOC_BLOCK,
+				      section,
+				      psymbol_placement::GLOBAL,
+				      sh.value, psymtab_language, objfile);
 		  else
-		    add_psymbol_to_list (sym_name, true,
-					 VAR_DOMAIN, LOC_BLOCK,
-					 section,
-					 psymbol_placement::STATIC,
-					 sh.value, psymtab_language, objfile);
+		    pst->add_psymbol (sym_name, true,
+				      VAR_DOMAIN, LOC_BLOCK,
+				      section,
+				      psymbol_placement::STATIC,
+				      sh.value, psymtab_language, objfile);
 
 		  procaddr = sh.value;
 
@@ -3512,12 +3512,13 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 		      && sh.iss != 0
 		      && sh.index != cur_sdx + 2)
 		    {
-		      add_psymbol_to_list (sym_name, true,
-					   STRUCT_DOMAIN, LOC_TYPEDEF, -1,
-					   psymbol_placement::STATIC,
-					   0, psymtab_language, objfile);
+		      pst->add_psymbol (sym_name, true,
+					STRUCT_DOMAIN, LOC_TYPEDEF, -1,
+					psymbol_placement::STATIC,
+					0, psymtab_language, objfile);
 		    }
-		  handle_psymbol_enumerators (objfile, fh, sh.st, sh.value);
+		  handle_psymbol_enumerators (objfile, pst, fh,
+					      sh.st, sh.value);
 
 		  /* Skip over the block.  */
 		  new_sdx = sh.index;
@@ -3552,10 +3553,10 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 		  continue;
 		}
 	      /* Use this gdb symbol.  */
-	      add_psymbol_to_list (sym_name, true,
-				   VAR_DOMAIN, theclass, section,
-				   psymbol_placement::STATIC,
-				   sh.value, psymtab_language, objfile);
+	      pst->add_psymbol (sym_name, true,
+				VAR_DOMAIN, theclass, section,
+				psymbol_placement::STATIC,
+				sh.value, psymtab_language, objfile);
 	    skip:
 	      cur_sdx++;	/* Go to next file symbol.  */
 	    }
@@ -3630,11 +3631,11 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 		  break;
 		}
 	      char *sym_name = debug_info->ssext + psh->iss;
-	      add_psymbol_to_list (sym_name, true,
-				   VAR_DOMAIN, theclass,
-				   section,
-				   psymbol_placement::GLOBAL,
-				   svalue, psymtab_language, objfile);
+	      pst->add_psymbol (sym_name, true,
+				VAR_DOMAIN, theclass,
+				section,
+				psymbol_placement::GLOBAL,
+				svalue, psymtab_language, objfile);
 	    }
 	}
 
@@ -3728,8 +3729,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
   partial_symtab *pst_del = objfile->partial_symtabs->psymtabs;
   if (pst_del->next == NULL
       && pst_del->number_of_dependencies == 0
-      && pst_del->n_global_syms == 0
-      && pst_del->n_static_syms == 0)
+      && pst_del->empty ())
     objfile->partial_symtabs->discard_psymtab (pst_del);
 }
 
@@ -3737,8 +3737,8 @@ parse_partial_symbols (minimal_symbol_reader &reader,
    all the enum constants to the partial symbol table.  */
 
 static void
-handle_psymbol_enumerators (struct objfile *objfile, FDR *fh, int stype,
-			    CORE_ADDR svalue)
+handle_psymbol_enumerators (struct objfile *objfile, partial_symtab *pst,
+			    FDR *fh, int stype, CORE_ADDR svalue)
 {
   const bfd_size_type external_sym_size = debug_swap->external_sym_size;
   void (*const swap_sym_in) (bfd *, void *, SYMR *) = debug_swap->swap_sym_in;
@@ -3793,10 +3793,10 @@ handle_psymbol_enumerators (struct objfile *objfile, FDR *fh, int stype,
 
       /* Note that the value doesn't matter for enum constants
          in psymtabs, just in symtabs.  */
-      add_psymbol_to_list (name, true,
-			   VAR_DOMAIN, LOC_CONST, -1,
-			   psymbol_placement::STATIC, 0,
-			   psymtab_language, objfile);
+      pst->add_psymbol (name, true,
+			VAR_DOMAIN, LOC_CONST, -1,
+			psymbol_placement::STATIC, 0,
+			psymtab_language, objfile);
       ext_sym += external_sym_size;
     }
 }
@@ -3853,8 +3853,7 @@ mdebug_expand_psymtab (legacy_psymtab *pst, struct objfile *objfile)
 
   /* Do nothing if this is a dummy psymtab.  */
 
-  if (pst->n_global_syms == 0 && pst->n_static_syms == 0
-      && !pst->text_low_valid && !pst->text_high_valid)
+  if (pst->empty () && !pst->text_low_valid && !pst->text_high_valid)
     return;
 
   /* Now read the symbols for this symtab.  */
diff --git a/gdb/psympriv.h b/gdb/psympriv.h
index 4622be389bd..97f9b3b596c 100644
--- a/gdb/psympriv.h
+++ b/gdb/psympriv.h
@@ -92,6 +92,15 @@ enum psymtab_search_status
     PST_SEARCHED_AND_NOT_FOUND
   };
 
+/* Specify whether a partial psymbol should be allocated on the global
+   list or the static list.  */
+
+enum class psymbol_placement
+{
+  STATIC,
+  GLOBAL
+};
+
 /* Each source file that has not been fully read in is represented by
    a partial_symtab.  This contains the information on where in the
    executable the debugging symbols for a specific file are, and a
@@ -196,6 +205,48 @@ struct partial_symtab
     text_high_valid = 1;
   }
 
+  /* Return true if this symtab is empty -- meaning that it contains
+     no symbols.  It may still have dependencies.  */
+  bool empty () const
+  {
+    return global_psymbols.empty () && static_psymbols.empty ();
+  }
+
+  /* Add a symbol to this partial symbol table of OBJFILE.
+
+     If COPY_NAME is true, make a copy of NAME, otherwise use the passed
+     reference.
+
+     THECLASS is the type of symbol.
+
+     SECTION is the index of the section of OBJFILE in which the symbol is found.
+
+     WHERE determines whether the symbol goes in the list of static or global
+     partial symbols.
+
+     COREADDR is the address of the symbol.  For partial symbols that don't have
+     an address, zero is passed.
+
+     LANGUAGE is the language from which the symbol originates.  This will
+     influence, amongst other things, how the symbol name is demangled. */
+
+  void add_psymbol (gdb::string_view name,
+		    bool copy_name, domain_enum domain,
+		    enum address_class theclass,
+		    short section,
+		    psymbol_placement where,
+		    CORE_ADDR coreaddr,
+		    enum language language,
+		    struct objfile *objfile);
+
+  /* Add a symbol to this partial symbol table of OBJFILE.  The psymbol
+     must be fully constructed, and the names must be set and intern'd
+     as appropriate.  */
+
+  void add_psymbol (const partial_symbol &psym,
+		    psymbol_placement where,
+		    struct objfile *objfile);
+
 
   /* Chain of all existing partial symtabs.  */
 
@@ -269,22 +320,18 @@ struct partial_symtab
 
   /* Global symbol list.  This list will be sorted after readin to
      improve access.  Binary search will be the usual method of
-     finding a symbol within it.  globals_offset is an integer offset
-     within global_psymbols[].  */
+     finding a symbol within it.  */
 
-  int globals_offset = 0;
-  int n_global_syms = 0;
+  std::vector<partial_symbol *> global_psymbols;
 
   /* Static symbol list.  This list will *not* be sorted after readin;
      to find a symbol in it, exhaustive search must be used.  This is
      reasonable because searches through this list will eventually
      lead to either the read in of a files symbols for real (assumed
      to take a *lot* of time; check) or an error (and we don't care
-     how long errors take).  This is an offset and size within
-     static_psymbols[].  */
+     how long errors take).  */
 
-  int statics_offset = 0;
-  int n_static_syms = 0;
+  std::vector<partial_symbol *> static_psymbols;
 
   /* True iff objfile->psymtabs_addrmap is properly populated for this
      partial_symtab.  For discontiguous overlapping psymtabs is the only usable
@@ -389,50 +436,6 @@ struct legacy_psymtab : public standard_psymtab
   void *read_symtab_private = nullptr;
 };
 
-/* Specify whether a partial psymbol should be allocated on the global
-   list or the static list.  */
-
-enum class psymbol_placement
-{
-  STATIC,
-  GLOBAL
-};
-
-/* Add a symbol to the partial symbol table of OBJFILE.
-
-   If COPY_NAME is true, make a copy of NAME, otherwise use the passed
-   reference.
-
-   THECLASS is the type of symbol.
-
-   SECTION is the index of the section of OBJFILE in which the symbol is found.
-
-   WHERE determines whether the symbol goes in the list of static or global
-   partial symbols of OBJFILE.
-
-   COREADDR is the address of the symbol.  For partial symbols that don't have
-   an address, zero is passed.
-
-   LANGUAGE is the language from which the symbol originates.  This will
-   influence, amongst other things, how the symbol name is demangled. */
-
-extern void add_psymbol_to_list (gdb::string_view name,
-				 bool copy_name, domain_enum domain,
-				 enum address_class theclass,
-				 short section,
-				 psymbol_placement where,
-				 CORE_ADDR coreaddr,
-				 enum language language,
-				 struct objfile *objfile);
-
-/* Add a symbol to the partial symbol table of OBJFILE.  The psymbol
-   must be fully constructed, and the names must be set and intern'd
-   as appropriate.  */
-
-extern void add_psymbol_to_list (const partial_symbol &psym,
-				 psymbol_placement where,
-				 struct objfile *objfile);
-
 /* Initialize storage for partial symbols.  If partial symbol storage
    has already been initialized, this does nothing.  TOTAL_SYMBOLS is
    an estimate of how many symbols there will be.  */
diff --git a/gdb/psymtab.c b/gdb/psymtab.c
index 47e31aab61e..db56005d622 100644
--- a/gdb/psymtab.c
+++ b/gdb/psymtab.c
@@ -101,11 +101,6 @@ require_partial_symbols (struct objfile *objfile, bool verbose)
 			     objfile_name (objfile));
 	  (*objfile->sf->sym_read_psymbols) (objfile);
 
-	  /* Partial symbols list are not expected to changed after this
-	     point.  */
-	  objfile->partial_symtabs->global_psymbols.shrink_to_fit ();
-	  objfile->partial_symtabs->static_psymbols.shrink_to_fit ();
-
 	  if (verbose && !objfile_has_symbols (objfile))
 	    printf_filtered (_("(No debugging symbols found in %s)\n"),
 			     objfile_name (objfile));
@@ -417,12 +412,8 @@ find_pc_sect_psymbol (struct objfile *objfile,
   /* Search the global symbols as well as the static symbols, so that
      find_pc_partial_function doesn't use a minimal symbol and thus
      cache a bad endaddr.  */
-  for (int i = 0; i < psymtab->n_global_syms; i++)
+  for (partial_symbol *p : psymtab->global_psymbols)
     {
-      partial_symbol *p
-	= objfile->partial_symtabs->global_psymbols[psymtab->globals_offset
-						    + i];
-
       if (p->domain == VAR_DOMAIN
 	  && p->aclass == LOC_BLOCK
 	  && pc >= p->address (objfile)
@@ -441,12 +432,8 @@ find_pc_sect_psymbol (struct objfile *objfile,
 	}
     }
 
-  for (int i = 0; i < psymtab->n_static_syms; i++)
+  for (partial_symbol *p : psymtab->static_psymbols)
     {
-      partial_symbol *p
-	= objfile->partial_symtabs->static_psymbols[psymtab->statics_offset
-						    + i];
-
       if (p->domain == VAR_DOMAIN
 	  && p->aclass == LOC_BLOCK
 	  && pc >= p->address (objfile)
@@ -577,15 +564,17 @@ match_partial_symbol (struct objfile *objfile,
 {
   struct partial_symbol **start, **psym;
   struct partial_symbol **top, **real_top, **bottom, **center;
-  int length = (global ? pst->n_global_syms : pst->n_static_syms);
+  int length = (global
+		? pst->global_psymbols.size ()
+		: pst->static_psymbols.size ());
   int do_linear_search = 1;
 
   if (length == 0)
     return NULL;
 
   start = (global ?
-	   &objfile->partial_symtabs->global_psymbols[pst->globals_offset] :
-	   &objfile->partial_symtabs->static_psymbols[pst->statics_offset]);
+	   &pst->global_psymbols[0] :
+	   &pst->static_psymbols[0]);
 
   if (global && ordered_compare)  /* Can use a binary search.  */
     {
@@ -655,15 +644,17 @@ lookup_partial_symbol (struct objfile *objfile,
 {
   struct partial_symbol **start, **psym;
   struct partial_symbol **top, **real_top, **bottom, **center;
-  int length = (global ? pst->n_global_syms : pst->n_static_syms);
+  int length = (global
+		? pst->global_psymbols.size ()
+		: pst->static_psymbols.size ());
   int do_linear_search = 1;
 
   if (length == 0)
     return NULL;
 
   start = (global ?
-	   &objfile->partial_symtabs->global_psymbols[pst->globals_offset] :
-	   &objfile->partial_symtabs->static_psymbols[pst->statics_offset]);
+	   &pst->global_psymbols[0] :
+	   &pst->static_psymbols[0]);
 
   if (global)			/* This means we can use a binary search.  */
     {
@@ -825,21 +816,21 @@ psym_forget_cached_source_info (struct objfile *objfile)
 
 static void
 print_partial_symbols (struct gdbarch *gdbarch, struct objfile *objfile,
-		       struct partial_symbol **p, int count, const char *what,
-		       struct ui_file *outfile)
+		       const std::vector<partial_symbol *> &symbols,
+		       const char *what, struct ui_file *outfile)
 {
   fprintf_filtered (outfile, "  %s partial symbols:\n", what);
-  while (count-- > 0)
+  for (partial_symbol *p : symbols)
     {
       QUIT;
-      fprintf_filtered (outfile, "    `%s'", (*p)->ginfo.linkage_name ());
-      if ((*p)->ginfo.demangled_name () != NULL)
+      fprintf_filtered (outfile, "    `%s'", p->ginfo.linkage_name ());
+      if (p->ginfo.demangled_name () != NULL)
 	{
 	  fprintf_filtered (outfile, "  `%s'",
-			    (*p)->ginfo.demangled_name ());
+			    p->ginfo.demangled_name ());
 	}
       fputs_filtered (", ", outfile);
-      switch ((*p)->domain)
+      switch (p->domain)
 	{
 	case UNDEF_DOMAIN:
 	  fputs_filtered ("undefined domain, ", outfile);
@@ -863,7 +854,7 @@ print_partial_symbols (struct gdbarch *gdbarch, struct objfile *objfile,
 	  fputs_filtered ("<invalid domain>, ", outfile);
 	  break;
 	}
-      switch ((*p)->aclass)
+      switch (p->aclass)
 	{
 	case LOC_UNDEF:
 	  fputs_filtered ("undefined", outfile);
@@ -915,9 +906,8 @@ print_partial_symbols (struct gdbarch *gdbarch, struct objfile *objfile,
 	  break;
 	}
       fputs_filtered (", ", outfile);
-      fputs_filtered (paddress (gdbarch, (*p)->unrelocated_address ()), outfile);
+      fputs_filtered (paddress (gdbarch, p->unrelocated_address ()), outfile);
       fprintf_filtered (outfile, "\n");
-      p++;
     }
 }
 
@@ -976,19 +966,17 @@ dump_psymtab (struct objfile *objfile, struct partial_symtab *psymtab,
       gdb_print_host_address (psymtab->user, outfile);
       fprintf_filtered (outfile, "\n");
     }
-  if (psymtab->n_global_syms > 0)
+  if (!psymtab->global_psymbols.empty ())
     {
       print_partial_symbols
-	(gdbarch, objfile,
-	 &objfile->partial_symtabs->global_psymbols[psymtab->globals_offset],
-	 psymtab->n_global_syms, "Global", outfile);
+	(gdbarch, objfile, psymtab->global_psymbols,
+	 "Global", outfile);
     }
-  if (psymtab->n_static_syms > 0)
+  if (!psymtab->static_psymbols.empty ())
     {
       print_partial_symbols
-	(gdbarch, objfile,
-	 &objfile->partial_symtabs->static_psymbols[psymtab->statics_offset],
-	 psymtab->n_static_syms, "Static", outfile);
+	(gdbarch, objfile, psymtab->static_psymbols,
+	 "Static", outfile);
     }
   fprintf_filtered (outfile, "\n");
 }
@@ -1239,26 +1227,22 @@ recursively_search_psymtabs
 	}
     }
 
-  partial_symbol **gbound
-    = (objfile->partial_symtabs->global_psymbols.data ()
-       + ps->globals_offset + ps->n_global_syms);
-  partial_symbol **sbound
-    = (objfile->partial_symtabs->static_psymbols.data ()
-       + ps->statics_offset + ps->n_static_syms);
+  partial_symbol **gbound = (ps->global_psymbols.data ()
+			     + ps->global_psymbols.size ());
+  partial_symbol **sbound = (ps->static_psymbols.data ()
+			     + ps->static_psymbols.size ());
   partial_symbol **bound = gbound;
 
   /* Go through all of the symbols stored in a partial
      symtab in one loop.  */
-  partial_symbol **psym = (objfile->partial_symtabs->global_psymbols.data ()
-			   + ps->globals_offset);
+  partial_symbol **psym = ps->global_psymbols.data ();
   while (keep_going)
     {
       if (psym >= bound)
 	{
-	  if (bound == gbound && ps->n_static_syms != 0)
+	  if (bound == gbound && !ps->static_psymbols.empty ())
 	    {
-	      psym = (objfile->partial_symtabs->static_psymbols.data ()
-		      + ps->statics_offset);
+	      psym = ps->static_psymbols.data ();
 	      bound = sbound;
 	    }
 	  else
@@ -1373,14 +1357,10 @@ static void
 psym_fill_psymbol_map (struct objfile *objfile,
 		       struct partial_symtab *psymtab,
 		       std::set<CORE_ADDR> *seen_addrs,
-		       const std::vector<partial_symbol *> &symbols,
-		       int start,
-		       int length)
+		       const std::vector<partial_symbol *> &symbols)
 {
-  for (int i = 0; i < length; ++i)
+  for (partial_symbol *psym : symbols)
     {
-      struct partial_symbol *psym = symbols[start + i];
-
       if (psym->aclass == LOC_STATIC)
 	{
 	  CORE_ADDR addr = psym->address (objfile);
@@ -1408,14 +1388,10 @@ psym_find_compunit_symtab_by_address (struct objfile *objfile,
 	{
 	  psym_fill_psymbol_map (objfile, pst,
 				 &seen_addrs,
-				 objfile->partial_symtabs->global_psymbols,
-				 pst->globals_offset,
-				 pst->n_global_syms);
+				 pst->global_psymbols);
 	  psym_fill_psymbol_map (objfile, pst,
 				 &seen_addrs,
-				 objfile->partial_symtabs->static_psymbols,
-				 pst->statics_offset,
-				 pst->n_static_syms);
+				 pst->static_psymbols);
 	}
 
       objfile->psymbol_map.shrink_to_fit ();
@@ -1468,14 +1444,9 @@ static void
 sort_pst_symbols (struct objfile *objfile, struct partial_symtab *pst)
 {
   /* Sort the global list; don't sort the static list.  */
-  auto begin = objfile->partial_symtabs->global_psymbols.begin ();
-  std::advance (begin, pst->globals_offset);
-
-  /* The psymbols for this partial_symtab are currently at the end of the
-     vector.  */
-  auto end = objfile->partial_symtabs->global_psymbols.end ();
-
-  std::sort (begin, end, [] (partial_symbol *s1, partial_symbol *s2)
+  std::sort (pst->global_psymbols.begin (),
+	     pst->global_psymbols.end (),
+	     [] (partial_symbol *s1, partial_symbol *s2)
     {
       return strcmp_iw_ordered (s1->ginfo.search_name (),
 				s2->ginfo.search_name ()) < 0;
@@ -1492,20 +1463,6 @@ partial_symtab::partial_symtab (const char *filename,
 {
   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.  */
-
-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.  */
@@ -1513,26 +1470,8 @@ concat (std::vector<partial_symbol *> *v1, std::vector<partial_symbol *> *v2)
 void
 end_psymtab_common (struct objfile *objfile, struct partial_symtab *pst)
 {
-  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;
+  pst->global_psymbols.shrink_to_fit ();
+  pst->static_psymbols.shrink_to_fit ();
 
   sort_pst_symbols (objfile, pst);
 }
@@ -1603,20 +1542,20 @@ add_psymbol_to_bcache (const partial_symbol &psymbol,
 /* Helper function, adds partial symbol to the given partial symbol list.  */
 
 static void
-append_psymbol_to_list (std::vector<partial_symbol *> *list,
+append_psymbol_to_list (std::vector<partial_symbol *> &list,
 			struct partial_symbol *psym,
 			struct objfile *objfile)
 {
-  list->push_back (psym);
+  list.push_back (psym);
   OBJSTAT (objfile, n_psyms++);
 }
 
 /* See psympriv.h.  */
 
 void
-add_psymbol_to_list (const partial_symbol &psymbol,
-		     psymbol_placement where,
-		     struct objfile *objfile)
+partial_symtab::add_psymbol (const partial_symbol &psymbol,
+			     psymbol_placement where,
+			     struct objfile *objfile)
 {
   struct partial_symbol *psym;
 
@@ -1630,23 +1569,23 @@ add_psymbol_to_list (const partial_symbol &psymbol,
     return;
 
   /* Save pointer to partial symbol in psymtab, growing symtab if needed.  */
-  std::vector<partial_symbol *> *list
+  std::vector<partial_symbol *> &list
     = (where == psymbol_placement::STATIC
-       ? objfile->partial_symtabs->current_static_psymbols.back ()
-       : objfile->partial_symtabs->current_global_psymbols.back ());
+       ? static_psymbols
+       : global_psymbols);
   append_psymbol_to_list (list, psym, objfile);
 }
 
 /* See psympriv.h.  */
 
 void
-add_psymbol_to_list (gdb::string_view name, bool copy_name,
-		     domain_enum domain,
-		     enum address_class theclass,
-		     short section,
-		     psymbol_placement where,
-		     CORE_ADDR coreaddr,
-		     enum language language, struct objfile *objfile)
+partial_symtab::add_psymbol (gdb::string_view name, bool copy_name,
+			     domain_enum domain,
+			     enum address_class theclass,
+			     short section,
+			     psymbol_placement where,
+			     CORE_ADDR coreaddr,
+			     enum language language, struct objfile *objfile)
 {
   struct partial_symbol psymbol;
   memset (&psymbol, 0, sizeof (psymbol));
@@ -1658,7 +1597,7 @@ add_psymbol_to_list (gdb::string_view name, bool copy_name,
   psymbol.ginfo.set_language (language, objfile->partial_symtabs->obstack ());
   psymbol.ginfo.compute_and_set_names (name, copy_name, objfile->per_bfd);
 
-  add_psymbol_to_list (psymbol, where, objfile);
+  add_psymbol (psymbol, where, objfile);
 }
 
 /* See psympriv.h.  */
@@ -1666,16 +1605,6 @@ add_psymbol_to_list (gdb::string_view name, bool copy_name,
 void
 init_psymbol_list (struct objfile *objfile, int total_symbols)
 {
-  if (objfile->partial_symtabs->global_psymbols.capacity () == 0
-      && objfile->partial_symtabs->static_psymbols.capacity () == 0)
-    {
-      /* Current best guess is that approximately a twentieth of the
-	 total symbols (in a debugging file) are global or static
-	 oriented symbols, then multiply that by slop factor of
-	 two.  */
-      objfile->partial_symtabs->global_psymbols.reserve (total_symbols / 10);
-      objfile->partial_symtabs->static_psymbols.reserve (total_symbols / 10);
-    }
 }
 
 /* See psympriv.h.  */
@@ -2045,29 +1974,19 @@ maintenance_info_psymtabs (const char *regexp, int from_tty)
 				 (psymtab->psymtabs_addrmap_supported
 				  ? "yes" : "no"));
 		printf_filtered ("    globals ");
-		if (psymtab->n_global_syms)
-		  {
-		    auto p = &(objfile->partial_symtabs
-			       ->global_psymbols[psymtab->globals_offset]);
-
-		    printf_filtered
-		      ("(* (struct partial_symbol **) %s @ %d)\n",
-		       host_address_to_string (p),
-		       psymtab->n_global_syms);
-		  }
+		if (!psymtab->global_psymbols.empty ())
+		  printf_filtered
+		    ("(* (struct partial_symbol **) %s @ %d)\n",
+		     host_address_to_string (psymtab->global_psymbols.data ()),
+		     (int) psymtab->global_psymbols.size ());
 		else
 		  printf_filtered ("(none)\n");
 		printf_filtered ("    statics ");
-		if (psymtab->n_static_syms)
-		  {
-		    auto p = &(objfile->partial_symtabs
-			       ->static_psymbols[psymtab->statics_offset]);
-
-		    printf_filtered
-		      ("(* (struct partial_symbol **) %s @ %d)\n",
-		       host_address_to_string (p),
-		       psymtab->n_static_syms);
-		  }
+		if (!psymtab->static_psymbols.empty ())
+		  printf_filtered
+		    ("(* (struct partial_symbol **) %s @ %d)\n",
+		     host_address_to_string (psymtab->static_psymbols.data ()),
+		     (int) psymtab->static_psymbols.size ());
 		else
 		  printf_filtered ("(none)\n");
 		if (psymtab->user)
@@ -2114,7 +2033,6 @@ maintenance_check_psymtabs (const char *ignore, int from_tty)
   struct compunit_symtab *cust = NULL;
   const struct blockvector *bv;
   const struct block *b;
-  int i;
 
   for (objfile *objfile : current_program_space->objfiles ())
     for (partial_symtab *ps : require_partial_symbols (objfile, true))
@@ -2146,39 +2064,36 @@ maintenance_check_psymtabs (const char *ignore, int from_tty)
 	  continue;
 	bv = COMPUNIT_BLOCKVECTOR (cust);
 	b = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
-	partial_symbol **psym
-	  = &objfile->partial_symtabs->static_psymbols[ps->statics_offset];
-	for (i = 0; i < ps->n_static_syms; psym++, i++)
+	for (partial_symbol *psym : ps->static_psymbols)
 	  {
 	    /* Skip symbols for inlined functions without address.  These may
 	       or may not have a match in the full symtab.  */
-	    if ((*psym)->aclass == LOC_BLOCK
-		&& (*psym)->ginfo.value.address == 0)
+	    if (psym->aclass == LOC_BLOCK
+		&& psym->ginfo.value.address == 0)
 	      continue;
 
-	    sym = block_lookup_symbol (b, (*psym)->ginfo.search_name (),
+	    sym = block_lookup_symbol (b, psym->ginfo.search_name (),
 				       symbol_name_match_type::SEARCH_NAME,
-				       (*psym)->domain);
+				       psym->domain);
 	    if (!sym)
 	      {
 		printf_filtered ("Static symbol `");
-		puts_filtered ((*psym)->ginfo.linkage_name ());
+		puts_filtered (psym->ginfo.linkage_name ());
 		printf_filtered ("' only found in ");
 		puts_filtered (ps->filename);
 		printf_filtered (" psymtab\n");
 	      }
 	  }
 	b = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
-	psym = &objfile->partial_symtabs->global_psymbols[ps->globals_offset];
-	for (i = 0; i < ps->n_global_syms; psym++, i++)
+	for (partial_symbol *psym : ps->global_psymbols)
 	  {
-	    sym = block_lookup_symbol (b, (*psym)->ginfo.search_name (),
+	    sym = block_lookup_symbol (b, psym->ginfo.search_name (),
 				       symbol_name_match_type::SEARCH_NAME,
-				       (*psym)->domain);
+				       psym->domain);
 	    if (!sym)
 	      {
 		printf_filtered ("Global symbol `");
-		puts_filtered ((*psym)->ginfo.linkage_name ());
+		puts_filtered (psym->ginfo.linkage_name ());
 		printf_filtered ("' only found in ");
 		puts_filtered (ps->filename);
 		printf_filtered (" psymtab\n");
diff --git a/gdb/psymtab.h b/gdb/psymtab.h
index e8bafbe4338..165ee156b6e 100644
--- a/gdb/psymtab.h
+++ b/gdb/psymtab.h
@@ -123,18 +123,6 @@ class psymtab_storage
 
   gdb::bcache psymbol_cache;
 
-  /* Vectors of all partial symbols read in from file.  The actual data
-     is stored in the objfile_obstack.  */
-
-  std::vector<partial_symbol *> global_psymbols;
-  std::vector<partial_symbol *> static_psymbols;
-
-  /* Stack of vectors of partial symbols, using during psymtab
-     initialization.  */
-
-  std::vector<std::vector<partial_symbol *>*> current_global_psymbols;
-  std::vector<std::vector<partial_symbol *>*> current_static_psymbols;
-
 private:
 
   /* The obstack where allocations are made.  This is lazily allocated
diff --git a/gdb/xcoffread.c b/gdb/xcoffread.c
index 389678aa5b7..3588aaed016 100644
--- a/gdb/xcoffread.c
+++ b/gdb/xcoffread.c
@@ -2035,8 +2035,7 @@ xcoff_end_psymtab (struct objfile *objfile, legacy_psymtab *pst,
 
   if (num_includes == 0
       && number_dependencies == 0
-      && pst->n_global_syms == 0
-      && pst->n_static_syms == 0)
+      && pst->empty ())
     {
       /* Throw away this psymtab, it's empty.  */
       /* Empty psymtabs happen as a result of header files which don't have
@@ -2575,25 +2574,25 @@ scan_xcoff_symtab (minimal_symbol_reader &reader,
 	    switch (p[1])
 	      {
 	      case 'S':
-		add_psymbol_to_list (gdb::string_view (namestring,
-						       p - namestring),
-				     true, VAR_DOMAIN, LOC_STATIC,
-				     SECT_OFF_DATA (objfile),
-				     psymbol_placement::STATIC,
-				     symbol.n_value,
-				     psymtab_language, objfile);
+		pst->add_psymbol (gdb::string_view (namestring,
+						    p - namestring),
+				  true, VAR_DOMAIN, LOC_STATIC,
+				  SECT_OFF_DATA (objfile),
+				  psymbol_placement::STATIC,
+				  symbol.n_value,
+				  psymtab_language, objfile);
 		continue;
 
 	      case 'G':
 		/* The addresses in these entries are reported to be
 		   wrong.  See the code that reads 'G's for symtabs.  */
-		add_psymbol_to_list (gdb::string_view (namestring,
-						       p - namestring),
-				     true, VAR_DOMAIN, LOC_STATIC,
-				     SECT_OFF_DATA (objfile),
-				     psymbol_placement::GLOBAL,
-				     symbol.n_value,
-				     psymtab_language, objfile);
+		pst->add_psymbol (gdb::string_view (namestring,
+						    p - namestring),
+				  true, VAR_DOMAIN, LOC_STATIC,
+				  SECT_OFF_DATA (objfile),
+				  psymbol_placement::GLOBAL,
+				  symbol.n_value,
+				  psymtab_language, objfile);
 		continue;
 
 	      case 'T':
@@ -2607,19 +2606,19 @@ scan_xcoff_symtab (minimal_symbol_reader &reader,
 		    || (p == namestring + 1
 			&& namestring[0] != ' '))
 		  {
-		    add_psymbol_to_list (gdb::string_view (namestring,
-							   p - namestring),
-					 true, STRUCT_DOMAIN, LOC_TYPEDEF, -1,
-					 psymbol_placement::STATIC,
-					 0, psymtab_language, objfile);
+		    pst->add_psymbol (gdb::string_view (namestring,
+							p - namestring),
+				      true, STRUCT_DOMAIN, LOC_TYPEDEF, -1,
+				      psymbol_placement::STATIC,
+				      0, psymtab_language, objfile);
 		    if (p[2] == 't')
 		      {
 			/* Also a typedef with the same name.  */
-			add_psymbol_to_list (gdb::string_view (namestring,
-							       p - namestring),
-					     true, VAR_DOMAIN, LOC_TYPEDEF, -1,
-					     psymbol_placement::STATIC,
-					     0, psymtab_language, objfile);
+			pst->add_psymbol (gdb::string_view (namestring,
+							    p - namestring),
+					  true, VAR_DOMAIN, LOC_TYPEDEF, -1,
+					  psymbol_placement::STATIC,
+					  0, psymtab_language, objfile);
 			p += 1;
 		      }
 		  }
@@ -2628,11 +2627,11 @@ scan_xcoff_symtab (minimal_symbol_reader &reader,
 	      case 't':
 		if (p != namestring)	/* a name is there, not just :T...  */
 		  {
-		    add_psymbol_to_list (gdb::string_view (namestring,
-							   p - namestring),
-					 true, VAR_DOMAIN, LOC_TYPEDEF, -1,
-					 psymbol_placement::STATIC,
-					 0, psymtab_language, objfile);
+		    pst->add_psymbol (gdb::string_view (namestring,
+							p - namestring),
+				      true, VAR_DOMAIN, LOC_TYPEDEF, -1,
+				      psymbol_placement::STATIC,
+				      0, psymtab_language, objfile);
 		  }
 	      check_enum:
 		/* If this is an enumerated type, we need to
@@ -2691,10 +2690,10 @@ scan_xcoff_symtab (minimal_symbol_reader &reader,
 			  ;
 			/* Note that the value doesn't matter for
 			   enum constants in psymtabs, just in symtabs.  */
-			add_psymbol_to_list (gdb::string_view (p, q - p), true,
-					     VAR_DOMAIN, LOC_CONST, -1,
-					     psymbol_placement::STATIC,
-					     0, psymtab_language, objfile);
+			pst->add_psymbol (gdb::string_view (p, q - p), true,
+					  VAR_DOMAIN, LOC_CONST, -1,
+					  psymbol_placement::STATIC,
+					  0, psymtab_language, objfile);
 			/* Point past the name.  */
 			p = q;
 			/* Skip over the value.  */
@@ -2709,11 +2708,11 @@ scan_xcoff_symtab (minimal_symbol_reader &reader,
 
 	      case 'c':
 		/* Constant, e.g. from "const" in Pascal.  */
-		add_psymbol_to_list (gdb::string_view (namestring,
-						       p - namestring),
-				     true, VAR_DOMAIN, LOC_CONST, -1,
-				     psymbol_placement::STATIC,
-				     0, psymtab_language, objfile);
+		pst->add_psymbol (gdb::string_view (namestring,
+						    p - namestring),
+				  true, VAR_DOMAIN, LOC_CONST, -1,
+				  psymbol_placement::STATIC,
+				  0, psymtab_language, objfile);
 		continue;
 
 	      case 'f':
@@ -2727,13 +2726,13 @@ scan_xcoff_symtab (minimal_symbol_reader &reader,
 		    function_outside_compilation_unit_complaint (name);
 		    xfree (name);
 		  }
-		add_psymbol_to_list (gdb::string_view (namestring,
-						       p - namestring),
-				     true, VAR_DOMAIN, LOC_BLOCK,
-				     SECT_OFF_TEXT (objfile),
-				     psymbol_placement::STATIC,
-				     symbol.n_value,
-				     psymtab_language, objfile);
+		pst->add_psymbol (gdb::string_view (namestring,
+						    p - namestring),
+				  true, VAR_DOMAIN, LOC_BLOCK,
+				  SECT_OFF_TEXT (objfile),
+				  psymbol_placement::STATIC,
+				  symbol.n_value,
+				  psymtab_language, objfile);
 		continue;
 
 		/* Global functions were ignored here, but now they
@@ -2758,13 +2757,13 @@ scan_xcoff_symtab (minimal_symbol_reader &reader,
 		if (startswith (namestring, "@FIX"))
 		  continue;
 
-		add_psymbol_to_list (gdb::string_view (namestring,
-						       p - namestring),
-				     true, VAR_DOMAIN, LOC_BLOCK,
-				     SECT_OFF_TEXT (objfile),
-				     psymbol_placement::GLOBAL,
-				     symbol.n_value,
-				     psymtab_language, objfile);
+		pst->add_psymbol (gdb::string_view (namestring,
+						    p - namestring),
+				  true, VAR_DOMAIN, LOC_BLOCK,
+				  SECT_OFF_TEXT (objfile),
+				  psymbol_placement::GLOBAL,
+				  symbol.n_value,
+				  psymtab_language, objfile);
 		continue;
 
 		/* Two things show up here (hopefully); static symbols of

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] Have partial symbol tables own psymbol vectors
  2020-08-31 17:09   ` Tom Tromey
@ 2020-08-31 21:39     ` Simon Marchi
  2020-09-01 14:23       ` Tom Tromey
  2020-10-17 22:33       ` Tom Tromey
  2020-09-01 13:24     ` Simon Marchi
                       ` (2 subsequent siblings)
  3 siblings, 2 replies; 13+ messages in thread
From: Simon Marchi @ 2020-08-31 21:39 UTC (permalink / raw)
  To: Tom Tromey; +Cc: gdb-patches

On 2020-08-31 1:09 p.m., Tom Tromey wrote:
> Tom> It occurred to me today that add_psymbol_to_list could now be a method
> Tom> on partial_symtab.  I'm going to make that change and then resubmit.
> 
> Here's the updated patch.
> 
> Tom
> 
> commit ac9fbb7aa1adcbc81cf8f6b9114e84c9193ae512
> Author: Tom Tromey <tom@tromey.com>
> Date:   Tue Aug 25 11:12:26 2020 -0600
> 
>     Have partial symbol tables own psymbol vectors
>     
>     Currently pointers to all partial symbols are stored in two vectors;
>     and then indices into these vectors are stored in each partial_symtab.
>     
>     This patch changes this so that each partial symtab instead has
>     vectors of symbols.  add_psymbol_to_list can now be changed into a
>     method on partial_symtab as well.
>     
>     My main motivation for doing this is that I am looking into calling
>     sort_pst_symbols in the background.  However, I haven't actually
>     implemented this yet.  (Also this may make it more feasible to also
>     sort the static psymbols, though I haven't tried that either.)
>     
>     Also, though, this lets us remove the "current_global_psymbols"
>     vector, because now the callers can simply refer directly to the
>     psymtab that they are modifying (formerly this was implicit).
>     
>     The main drawback of this patch is that it increases the size of
>     partial symtab.


Hi Tom,

I don't have a lot of time to look at this right now, but I'm trying to remember how this
all works (notably how things are shared between objfiles).

I think it would be a good time to get rid of the objfile parameter in the add_psymbol
methods.  This parameter shouldn't be there if the partial symtabs are really
objfile-independent.

Note that partial_symtab::add_psymbol passes the objfile to add_psymbol_to_bcache, which
only uses it to get the psymtab_storage.  is there a way it could get it some other way?

The other use of objfile in partial_symtab::add_psymbol is for stats.  I think that could
be easily implemented some other way that doesn't require passing the objfile.

I'll try to take another look later to better understand the patch.

Simon


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] Have partial symbol tables own psymbol vectors
  2020-08-31 17:09   ` Tom Tromey
  2020-08-31 21:39     ` Simon Marchi
@ 2020-09-01 13:24     ` Simon Marchi
  2020-09-01 14:20       ` Tom Tromey
  2020-09-01 14:41     ` Simon Marchi
  2020-10-17 20:17     ` Tom Tromey
  3 siblings, 1 reply; 13+ messages in thread
From: Simon Marchi @ 2020-09-01 13:24 UTC (permalink / raw)
  To: Tom Tromey; +Cc: gdb-patches

On 2020-08-31 1:09 p.m., Tom Tromey wrote:
>     The main drawback of this patch is that it increases the size of
>     partial symtab.

Regarding this: it seems to me like in the end, no more memory is used (even when
sharing partial symtabs between objfiles), it's just moved around, is that right?
If so, I don't understand why you say it's a "drawback", doesn't it make it sound
a bit scarier than it actually is?

Simon

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] Have partial symbol tables own psymbol vectors
  2020-09-01 13:24     ` Simon Marchi
@ 2020-09-01 14:20       ` Tom Tromey
  2020-09-01 14:30         ` Simon Marchi
  0 siblings, 1 reply; 13+ messages in thread
From: Tom Tromey @ 2020-09-01 14:20 UTC (permalink / raw)
  To: Simon Marchi; +Cc: Tom Tromey, gdb-patches

>>>>> "Simon" == Simon Marchi <simark@simark.ca> writes:

Simon> On 2020-08-31 1:09 p.m., Tom Tromey wrote:
>> The main drawback of this patch is that it increases the size of
>> partial symtab.

Simon> Regarding this: it seems to me like in the end, no more memory is used (even when
Simon> sharing partial symtabs between objfiles), it's just moved around, is that right?
Simon> If so, I don't understand why you say it's a "drawback", doesn't it make it sound
Simon> a bit scarier than it actually is?

No, a bit more memory is used.

Right now there are 2 std::vector<>s used for globals and static.  (And
there is a pair used to track the vectors being updated.)

Each partial symtab currently has integer indexes into these vectors.

After the patch, the vectors are removed from the psymtab storage (this
is per-objfile, so IMO negligible), but now each partial symtab holds
two vectors.  On my machine (x86-64 with GNU libstdc++), a std::vector<>
is 24 bytes.  So, we're going from 4*sizeof(int) == 16 bytes per partial
symtab to 48 bytes per.

Tom

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] Have partial symbol tables own psymbol vectors
  2020-08-31 21:39     ` Simon Marchi
@ 2020-09-01 14:23       ` Tom Tromey
  2020-09-01 14:28         ` Simon Marchi
  2020-10-17 22:33       ` Tom Tromey
  1 sibling, 1 reply; 13+ messages in thread
From: Tom Tromey @ 2020-09-01 14:23 UTC (permalink / raw)
  To: Simon Marchi; +Cc: Tom Tromey, gdb-patches

Simon> I think it would be a good time to get rid of the objfile
Simon> parameter in the add_psymbol methods.  This parameter shouldn't
Simon> be there if the partial symtabs are really objfile-independent.

Yeah.  I have another patch to remove it from end_psymtab_common, but I
didn't look at removing it from the add_psymbol methods.

I think it's a good idea, but it might be a pain to pipe the object
everywhere it is needed.  So I'd prefer to do this as a separate patch.

Simon> The other use of objfile in partial_symtab::add_psymbol is for
Simon> stats.  I think that could be easily implemented some other way
Simon> that doesn't require passing the objfile.

I feel like the stats are not very useful and could just be removed.  I
have never once used them; the bcache already tracks its own efficiency;
and gdb already knows how many psymbols actually exist.

Tom

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] Have partial symbol tables own psymbol vectors
  2020-09-01 14:23       ` Tom Tromey
@ 2020-09-01 14:28         ` Simon Marchi
  0 siblings, 0 replies; 13+ messages in thread
From: Simon Marchi @ 2020-09-01 14:28 UTC (permalink / raw)
  To: Tom Tromey; +Cc: gdb-patches

On 2020-09-01 10:23 a.m., Tom Tromey wrote:
> Simon> I think it would be a good time to get rid of the objfile
> Simon> parameter in the add_psymbol methods.  This parameter shouldn't
> Simon> be there if the partial symtabs are really objfile-independent.
> 
> Yeah.  I have another patch to remove it from end_psymtab_common, but I
> didn't look at removing it from the add_psymbol methods.
> 
> I think it's a good idea, but it might be a pain to pipe the object
> everywhere it is needed.  So I'd prefer to do this as a separate patch.

I have toyed with it and I agree.  It's more of a long term goal and there
are a few little annoying dependencies to remove.  So, not for this patch
indeed.

> Simon> The other use of objfile in partial_symtab::add_psymbol is for
> Simon> stats.  I think that could be easily implemented some other way
> Simon> that doesn't require passing the objfile.
> 
> I feel like the stats are not very useful and could just be removed.  I
> have never once used them; the bcache already tracks its own efficiency;
> and gdb already knows how many psymbols actually exist.

I agree.

Simon

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] Have partial symbol tables own psymbol vectors
  2020-09-01 14:20       ` Tom Tromey
@ 2020-09-01 14:30         ` Simon Marchi
  0 siblings, 0 replies; 13+ messages in thread
From: Simon Marchi @ 2020-09-01 14:30 UTC (permalink / raw)
  To: Tom Tromey; +Cc: gdb-patches

On 2020-09-01 10:20 a.m., Tom Tromey wrote:
>>>>>> "Simon" == Simon Marchi <simark@simark.ca> writes:
> 
> Simon> On 2020-08-31 1:09 p.m., Tom Tromey wrote:
>>> The main drawback of this patch is that it increases the size of
>>> partial symtab.
> 
> Simon> Regarding this: it seems to me like in the end, no more memory is used (even when
> Simon> sharing partial symtabs between objfiles), it's just moved around, is that right?
> Simon> If so, I don't understand why you say it's a "drawback", doesn't it make it sound
> Simon> a bit scarier than it actually is?
> 
> No, a bit more memory is used.
> 
> Right now there are 2 std::vector<>s used for globals and static.  (And
> there is a pair used to track the vectors being updated.)
> 
> Each partial symtab currently has integer indexes into these vectors.
> 
> After the patch, the vectors are removed from the psymtab storage (this
> is per-objfile, so IMO negligible), but now each partial symtab holds
> two vectors.  On my machine (x86-64 with GNU libstdc++), a std::vector<>
> is 24 bytes.  So, we're going from 4*sizeof(int) == 16 bytes per partial
> symtab to 48 bytes per.

Ok, I see.  I don't think that's a problem.

Simon

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] Have partial symbol tables own psymbol vectors
  2020-08-31 17:09   ` Tom Tromey
  2020-08-31 21:39     ` Simon Marchi
  2020-09-01 13:24     ` Simon Marchi
@ 2020-09-01 14:41     ` Simon Marchi
  2020-09-01 17:59       ` Tom Tromey
  2020-10-17 20:17     ` Tom Tromey
  3 siblings, 1 reply; 13+ messages in thread
From: Simon Marchi @ 2020-09-01 14:41 UTC (permalink / raw)
  To: Tom Tromey; +Cc: gdb-patches

I went through the patch again, I think I understand it better and it looks good to me.

Even though there is slightly bigger memory usage, it's much easier to understand how
things are organized like this.

One question here:

> @@ -1666,16 +1605,6 @@ add_psymbol_to_list (gdb::string_view name, bool copy_name,
>  void
>  init_psymbol_list (struct objfile *objfile, int total_symbols)
>  {
> -  if (objfile->partial_symtabs->global_psymbols.capacity () == 0
> -      && objfile->partial_symtabs->static_psymbols.capacity () == 0)
> -    {
> -      /* Current best guess is that approximately a twentieth of the
> -	 total symbols (in a debugging file) are global or static
> -	 oriented symbols, then multiply that by slop factor of
> -	 two.  */
> -      objfile->partial_symtabs->global_psymbols.reserve (total_symbols / 10);
> -      objfile->partial_symtabs->static_psymbols.reserve (total_symbols / 10);
> -    }
>  }

Did you keep this empty function on purpose?

Simon

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] Have partial symbol tables own psymbol vectors
  2020-09-01 14:41     ` Simon Marchi
@ 2020-09-01 17:59       ` Tom Tromey
  0 siblings, 0 replies; 13+ messages in thread
From: Tom Tromey @ 2020-09-01 17:59 UTC (permalink / raw)
  To: Simon Marchi; +Cc: Tom Tromey, gdb-patches

>> @@ -1666,16 +1605,6 @@ add_psymbol_to_list (gdb::string_view name, bool copy_name,
>> void
>> init_psymbol_list (struct objfile *objfile, int total_symbols)
>> {
>> -  if (objfile->partial_symtabs->global_psymbols.capacity () == 0
>> -      && objfile->partial_symtabs->static_psymbols.capacity () == 0)
>> -    {
>> -      /* Current best guess is that approximately a twentieth of the
>> -	 total symbols (in a debugging file) are global or static
>> -	 oriented symbols, then multiply that by slop factor of
>> -	 two.  */
>> -      objfile->partial_symtabs->global_psymbols.reserve (total_symbols / 10);
>> -      objfile->partial_symtabs->static_psymbols.reserve (total_symbols / 10);
>> -    }
>> }

Simon> Did you keep this empty function on purpose?

I wasn't sure if I'd want to introduce some kind of psymtab builder RAII
thing, and the calls to this function would mark the needed spots.

That said, I do have a separate patch somewhere to remove it.  I can
submit it.  I don't think I ended up needing the builder thing.

I did experiment with sorting psymbols in the background, but on this
machine at least it didn't help.  However I suspect maybe it would help
on a more capable machine -- I plan to try it on my work computer soon.
(I've also got a bigger series to try reading each CU in parallel, but
that is unfinished due to some complexity with cross-CU references.)

Tom

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] Have partial symbol tables own psymbol vectors
  2020-08-31 17:09   ` Tom Tromey
                       ` (2 preceding siblings ...)
  2020-09-01 14:41     ` Simon Marchi
@ 2020-10-17 20:17     ` Tom Tromey
  3 siblings, 0 replies; 13+ messages in thread
From: Tom Tromey @ 2020-10-17 20:17 UTC (permalink / raw)
  To: Tom Tromey; +Cc: gdb-patches

Tom> Here's the updated patch.

Tom> Tom

Tom> commit ac9fbb7aa1adcbc81cf8f6b9114e84c9193ae512
Tom> Author: Tom Tromey <tom@tromey.com>
Tom> Date:   Tue Aug 25 11:12:26 2020 -0600

Tom>     Have partial symbol tables own psymbol vectors
    
[...]

I re-regression tested this, and I am going to check it in now.

I'll also write some follow-up patches as suggested in this thread.

Tom

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] Have partial symbol tables own psymbol vectors
  2020-08-31 21:39     ` Simon Marchi
  2020-09-01 14:23       ` Tom Tromey
@ 2020-10-17 22:33       ` Tom Tromey
  1 sibling, 0 replies; 13+ messages in thread
From: Tom Tromey @ 2020-10-17 22:33 UTC (permalink / raw)
  To: Simon Marchi; +Cc: Tom Tromey, gdb-patches

Simon> I think it would be a good time to get rid of the objfile
Simon> parameter in the add_psymbol methods.  This parameter shouldn't
Simon> be there if the partial symtabs are really objfile-independent.

I looked at this again today.  It's pretty easy to get rid of most of
the uses of the objfile, but the last one is a bit of a pain:

  psymbol.ginfo.compute_and_set_names (name, copy_name, objfile->per_bfd);

I suppose we could pass in the per-BFD object.  And maybe I will do this
... not sure.  It just feels a bit weird since it means we'd have to
pass in two "context" objects where really just one would do.

I suppose the deeper problem here is that while psymbols are
objfile-independent, we don't genuinely implement sharing anywhere
except DWARF -- that's the only reader where we did the work of making
sure any auxiliary data is also shareable.

Tom

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2020-10-17 22:33 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-08-28 19:33 [PATCH] Have partial symbol tables own psymbol vectors Tom Tromey
2020-08-30 19:18 ` Tom Tromey
2020-08-31 17:09   ` Tom Tromey
2020-08-31 21:39     ` Simon Marchi
2020-09-01 14:23       ` Tom Tromey
2020-09-01 14:28         ` Simon Marchi
2020-10-17 22:33       ` Tom Tromey
2020-09-01 13:24     ` Simon Marchi
2020-09-01 14:20       ` Tom Tromey
2020-09-01 14:30         ` Simon Marchi
2020-09-01 14:41     ` Simon Marchi
2020-09-01 17:59       ` Tom Tromey
2020-10-17 20:17     ` Tom Tromey

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).