Remove ALL_OBJFILE_PSYMTABS
authorTom Tromey <tom@tromey.com>
Sat, 24 Nov 2018 21:22:25 +0000 (14:22 -0700)
committerTom Tromey <tom@tromey.com>
Thu, 10 Jan 2019 01:28:15 +0000 (18:28 -0700)
This removes the ALL_OBJFILE_PSYMTABS macro, replacing its uses with
ranged for loops.

gdb/ChangeLog
2019-01-09  Tom Tromey  <tom@tromey.com>

* dbxread.c (dbx_end_psymtab): Use objfile_psymtabs.
* mdebugread.c (parse_partial_symbols): Use objfile_psymtabs.
* psymtab.c (ALL_OBJFILE_PSYMTABS_REQUIRED): Remove.
(psym_map_symtabs_matching_filename, find_pc_sect_psymtab)
(psym_lookup_symbol, psym_find_last_source_symtab)
(psym_forget_cached_source_info, psym_print_stats)
(psym_expand_symtabs_for_function, psym_expand_all_symtabs)
(psym_expand_symtabs_with_fullname, psym_map_symbol_filenames)
(psym_map_matching_symbols, psym_expand_symtabs_matching)
(psym_find_compunit_symtab_by_address)
(maintenance_print_psymbols, maintenance_info_psymtabs)
(maintenance_check_psymtabs): Use ranged for.
* psymtab.h (class objfile_psymtabs): New.
(require_partial_symbols): Return objfile_psymtabs.
* psympriv.h (ALL_OBJFILE_PSYMTABS): Remove.

gdb/ChangeLog
gdb/dbxread.c
gdb/mdebugread.c
gdb/psympriv.h
gdb/psymtab.c
gdb/psymtab.h

index d7d1ad6..35c34d5 100644 (file)
@@ -1,5 +1,23 @@
 2019-01-09  Tom Tromey  <tom@tromey.com>
 
+       * dbxread.c (dbx_end_psymtab): Use objfile_psymtabs.
+       * mdebugread.c (parse_partial_symbols): Use objfile_psymtabs.
+       * psymtab.c (ALL_OBJFILE_PSYMTABS_REQUIRED): Remove.
+       (psym_map_symtabs_matching_filename, find_pc_sect_psymtab)
+       (psym_lookup_symbol, psym_find_last_source_symtab)
+       (psym_forget_cached_source_info, psym_print_stats)
+       (psym_expand_symtabs_for_function, psym_expand_all_symtabs)
+       (psym_expand_symtabs_with_fullname, psym_map_symbol_filenames)
+       (psym_map_matching_symbols, psym_expand_symtabs_matching)
+       (psym_find_compunit_symtab_by_address)
+       (maintenance_print_psymbols, maintenance_info_psymtabs)
+       (maintenance_check_psymtabs): Use ranged for.
+       * psymtab.h (class objfile_psymtabs): New.
+       (require_partial_symbols): Return objfile_psymtabs.
+       * psympriv.h (ALL_OBJFILE_PSYMTABS): Remove.
+
+2019-01-09  Tom Tromey  <tom@tromey.com>
+
        * symfile.c (overlay_invalidate_all, find_pc_overlay)
        (find_pc_mapped_section, list_overlays_command)
        (map_overlay_command, unmap_overlay_command)
index f63d18a..e3a9520 100644 (file)
@@ -2014,18 +2014,14 @@ dbx_end_psymtab (struct objfile *objfile, struct partial_symtab *pst,
     pst->set_text_low (pst->raw_text_high ());
   else
     {
-      struct partial_symtab *p1;
-
       /* If we know our own starting text address, then walk through all other
          psymtabs for this objfile, and if any didn't know their ending text
          address, set it to our starting address.  Take care to not set our
          own ending address to our starting address.  */
 
-      ALL_OBJFILE_PSYMTABS (objfile, p1)
-      {
+      for (partial_symtab *p1 : objfile_psymtabs (objfile))
        if (!p1->text_high_valid && p1->text_low_valid && p1 != pst)
          p1->set_text_high (pst->raw_text_low ());
-      }
     }
 
   /* End of kludge for patching Solaris textlow and texthigh.  */
index bb7e066..0583ce2 100644 (file)
@@ -3681,17 +3681,17 @@ parse_partial_symbols (minimal_symbol_reader &reader,
          && save_pst->text_low_valid
          && !(objfile->flags & OBJF_REORDERED))
        {
-         ALL_OBJFILE_PSYMTABS (objfile, pst)
-         {
-           if (save_pst != pst
-               && save_pst->raw_text_low () >= pst->raw_text_low ()
-               && save_pst->raw_text_low () < pst->raw_text_high ()
-               && save_pst->raw_text_high () > pst->raw_text_high ())
-             {
-               objfile->flags |= OBJF_REORDERED;
-               break;
-             }
-         }
+         for (partial_symtab *iter : objfile_psymtabs (objfile))
+           {
+             if (save_pst != iter
+                 && save_pst->raw_text_low () >= iter->raw_text_low ()
+                 && save_pst->raw_text_low () < iter->raw_text_high ()
+                 && save_pst->raw_text_high () > iter->raw_text_high ())
+               {
+                 objfile->flags |= OBJF_REORDERED;
+                 break;
+               }
+           }
        }
     }
 
index 29332dd..e28adfe 100644 (file)
@@ -331,9 +331,4 @@ class psymtab_discarder
   struct partial_symtab *m_psymtab;
 };
 
-/* Traverse all psymtabs in one objfile.  */
-
-#define        ALL_OBJFILE_PSYMTABS(objfile, p) \
-    for ((p) = (objfile) -> psymtabs; (p) != NULL; (p) = (p) -> next)
-
 #endif /* PSYMPRIV_H */
index cd1f503..d5bd5b1 100644 (file)
@@ -19,8 +19,8 @@
 
 #include "defs.h"
 #include "symtab.h"
-#include "psympriv.h"
 #include "objfiles.h"
+#include "psympriv.h"
 #include "block.h"
 #include "filenames.h"
 #include "source.h"
@@ -65,10 +65,9 @@ static struct partial_symbol *find_pc_sect_psymbol (struct objfile *,
 static struct compunit_symtab *psymtab_to_symtab (struct objfile *objfile,
                                                  struct partial_symtab *pst);
 
-/* Ensure that the partial symbols for OBJFILE have been loaded.  This
-   function always returns its argument, as a convenience.  */
+/* See psymtab.h.  */
 
-struct objfile *
+objfile_psymtabs
 require_partial_symbols (struct objfile *objfile, int verbose)
 {
   if ((objfile->flags & OBJF_PSYMTABS_READ) == 0)
@@ -93,21 +92,9 @@ require_partial_symbols (struct objfile *objfile, int verbose)
        }
     }
 
-  return objfile;
+  return objfile_psymtabs (objfile);
 }
 
-/* Traverse all psymtabs in one objfile, requiring that the psymtabs
-   be read in.  */
-
-#define ALL_OBJFILE_PSYMTABS_REQUIRED(objfile, p)              \
-    for ((p) = require_partial_symbols (objfile, 1)->psymtabs; \
-        (p) != NULL;                                           \
-        (p) = (p)->next)
-
-/* We want to make sure this file always requires psymtabs.  */
-
-#undef ALL_OBJFILE_PSYMTABS
-
 /* Helper function for psym_map_symtabs_matching_filename that
    expands the symtabs and calls the iterator.  */
 
@@ -146,57 +133,56 @@ psym_map_symtabs_matching_filename
    const char *real_path,
    gdb::function_view<bool (symtab *)> callback)
 {
-  struct partial_symtab *pst;
   const char *name_basename = lbasename (name);
 
-  ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, pst)
-  {
-    /* We can skip shared psymtabs here, because any file name will be
-       attached to the unshared psymtab.  */
-    if (pst->user != NULL)
-      continue;
-
-    /* Anonymous psymtabs don't have a file name.  */
-    if (pst->anonymous)
-      continue;
+  for (partial_symtab *pst : require_partial_symbols (objfile, 1))
+    {
+      /* We can skip shared psymtabs here, because any file name will be
+        attached to the unshared psymtab.  */
+      if (pst->user != NULL)
+       continue;
 
-    if (compare_filenames_for_search (pst->filename, name))
-      {
-       if (partial_map_expand_apply (objfile, name, real_path,
-                                     pst, callback))
-         return true;
+      /* Anonymous psymtabs don't have a file name.  */
+      if (pst->anonymous)
        continue;
-      }
 
-    /* Before we invoke realpath, which can get expensive when many
-       files are involved, do a quick comparison of the basenames.  */
-    if (! basenames_may_differ
-       && FILENAME_CMP (name_basename, lbasename (pst->filename)) != 0)
-      continue;
+      if (compare_filenames_for_search (pst->filename, name))
+       {
+         if (partial_map_expand_apply (objfile, name, real_path,
+                                       pst, callback))
+           return true;
+         continue;
+       }
 
-    if (compare_filenames_for_search (psymtab_to_fullname (pst), name))
-      {
-       if (partial_map_expand_apply (objfile, name, real_path,
-                                     pst, callback))
-         return true;
+      /* Before we invoke realpath, which can get expensive when many
+        files are involved, do a quick comparison of the basenames.  */
+      if (! basenames_may_differ
+         && FILENAME_CMP (name_basename, lbasename (pst->filename)) != 0)
        continue;
-      }
 
-    /* If the user gave us an absolute path, try to find the file in
-       this symtab and use its absolute path.  */
-    if (real_path != NULL)
-      {
-       gdb_assert (IS_ABSOLUTE_PATH (real_path));
-       gdb_assert (IS_ABSOLUTE_PATH (name));
-       if (filename_cmp (psymtab_to_fullname (pst), real_path) == 0)
-         {
-           if (partial_map_expand_apply (objfile, name, real_path,
-                                         pst, callback))
-             return true;
-           continue;
-         }
-      }
-  }
+      if (compare_filenames_for_search (psymtab_to_fullname (pst), name))
+       {
+         if (partial_map_expand_apply (objfile, name, real_path,
+                                       pst, callback))
+           return true;
+         continue;
+       }
+
+      /* If the user gave us an absolute path, try to find the file in
+        this symtab and use its absolute path.  */
+      if (real_path != NULL)
+       {
+         gdb_assert (IS_ABSOLUTE_PATH (real_path));
+         gdb_assert (IS_ABSOLUTE_PATH (name));
+         if (filename_cmp (psymtab_to_fullname (pst), real_path) == 0)
+           {
+             if (partial_map_expand_apply (objfile, name, real_path,
+                                           pst, callback))
+               return true;
+             continue;
+           }
+       }
+    }
 
   return false;
 }
@@ -289,7 +275,6 @@ find_pc_sect_psymtab (struct objfile *objfile, CORE_ADDR pc,
                      struct obj_section *section,
                      struct bound_minimal_symbol msymbol)
 {
-  struct partial_symtab *pst;
   CORE_ADDR baseaddr = ANOFFSET (objfile->section_offsets,
                                 SECT_OFF_TEXT (objfile));
 
@@ -298,8 +283,9 @@ find_pc_sect_psymtab (struct objfile *objfile, CORE_ADDR pc,
 
   if (objfile->psymtabs_addrmap != NULL)
     {
-      pst = ((struct partial_symtab *)
-            addrmap_find (objfile->psymtabs_addrmap, pc - baseaddr));
+      struct partial_symtab *pst
+       = ((struct partial_symtab *)
+          addrmap_find (objfile->psymtabs_addrmap, pc - baseaddr));
       if (pst != NULL)
        {
          /* FIXME: addrmaps currently do not handle overlayed sections,
@@ -341,7 +327,7 @@ find_pc_sect_psymtab (struct objfile *objfile, CORE_ADDR pc,
      its CUs may be missing in PSYMTABS_ADDRMAP as they may be varying
      debug info type in single OBJFILE.  */
 
-  ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, pst)
+  for (partial_symtab *pst : require_partial_symbols (objfile, 1))
     if (!pst->psymtabs_addrmap_supported
        && pc >= pst->text_low (objfile) && pc < pst->text_high (objfile))
       {
@@ -458,43 +444,42 @@ psym_lookup_symbol (struct objfile *objfile,
                    int block_index, const char *name,
                    const domain_enum domain)
 {
-  struct partial_symtab *ps;
   const int psymtab_index = (block_index == GLOBAL_BLOCK ? 1 : 0);
   struct compunit_symtab *stab_best = NULL;
 
   lookup_name_info lookup_name (name, symbol_name_match_type::FULL);
 
-  ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps)
-  {
-    if (!ps->readin && lookup_partial_symbol (objfile, ps, name,
-                                             psymtab_index, domain))
-      {
-       struct symbol *sym, *with_opaque = NULL;
-       struct compunit_symtab *stab = psymtab_to_symtab (objfile, ps);
-       /* Note: While psymtab_to_symtab can return NULL if the partial symtab
-          is empty, we can assume it won't here because lookup_partial_symbol
-          succeeded.  */
-       const struct blockvector *bv = COMPUNIT_BLOCKVECTOR (stab);
-       struct block *block = BLOCKVECTOR_BLOCK (bv, block_index);
-
-       sym = block_find_symbol (block, name, domain,
-                                block_find_non_opaque_type_preferred,
-                                &with_opaque);
-
-       /* Some caution must be observed with overloaded functions
-          and methods, since the index will not contain any overload
-          information (but NAME might contain it).  */
-
-       if (sym != NULL
-           && SYMBOL_MATCHES_SEARCH_NAME (sym, lookup_name))
-         return stab;
-       if (with_opaque != NULL
-           && SYMBOL_MATCHES_SEARCH_NAME (with_opaque, lookup_name))
-         stab_best = stab;
-
-       /* Keep looking through other psymtabs.  */
-      }
-  }
+  for (partial_symtab *ps : require_partial_symbols (objfile, 1))
+    {
+      if (!ps->readin && lookup_partial_symbol (objfile, ps, name,
+                                               psymtab_index, domain))
+       {
+         struct symbol *sym, *with_opaque = NULL;
+         struct compunit_symtab *stab = psymtab_to_symtab (objfile, ps);
+         /* Note: While psymtab_to_symtab can return NULL if the
+            partial symtab is empty, we can assume it won't here
+            because lookup_partial_symbol succeeded.  */
+         const struct blockvector *bv = COMPUNIT_BLOCKVECTOR (stab);
+         struct block *block = BLOCKVECTOR_BLOCK (bv, block_index);
+
+         sym = block_find_symbol (block, name, domain,
+                                  block_find_non_opaque_type_preferred,
+                                  &with_opaque);
+
+         /* Some caution must be observed with overloaded functions
+            and methods, since the index will not contain any overload
+            information (but NAME might contain it).  */
+
+         if (sym != NULL
+             && SYMBOL_MATCHES_SEARCH_NAME (sym, lookup_name))
+           return stab;
+         if (with_opaque != NULL
+             && SYMBOL_MATCHES_SEARCH_NAME (with_opaque, lookup_name))
+           stab_best = stab;
+
+         /* Keep looking through other psymtabs.  */
+       }
+    }
 
   return stab_best;
 }
@@ -752,10 +737,9 @@ psymtab_to_symtab (struct objfile *objfile, struct partial_symtab *pst)
 static struct symtab *
 psym_find_last_source_symtab (struct objfile *ofp)
 {
-  struct partial_symtab *ps;
   struct partial_symtab *cs_pst = NULL;
 
-  ALL_OBJFILE_PSYMTABS_REQUIRED (ofp, ps)
+  for (partial_symtab *ps : require_partial_symbols (ofp, 1))
     {
       const char *name = ps->filename;
       int len = strlen (name);
@@ -791,9 +775,7 @@ psym_find_last_source_symtab (struct objfile *ofp)
 static void
 psym_forget_cached_source_info (struct objfile *objfile)
 {
-  struct partial_symtab *pst;
-
-  ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, pst)
+  for (partial_symtab *pst : require_partial_symbols (objfile, 1))
     {
       if (pst->fullname != NULL)
        {
@@ -973,10 +955,9 @@ static void
 psym_print_stats (struct objfile *objfile)
 {
   int i;
-  struct partial_symtab *ps;
 
   i = 0;
-  ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps)
+  for (partial_symtab *ps : require_partial_symbols (objfile, 1))
     {
       if (ps->readin == 0)
        i++;
@@ -1016,19 +997,17 @@ static void
 psym_expand_symtabs_for_function (struct objfile *objfile,
                                  const char *func_name)
 {
-  struct partial_symtab *ps;
-
-  ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps)
-  {
-    if (ps->readin)
-      continue;
+  for (partial_symtab *ps : require_partial_symbols (objfile, 1))
+    {
+      if (ps->readin)
+       continue;
 
-    if ((lookup_partial_symbol (objfile, ps, func_name, 1, VAR_DOMAIN)
-        != NULL)
-       || (lookup_partial_symbol (objfile, ps, func_name, 0, VAR_DOMAIN)
-           != NULL))
-      psymtab_to_symtab (objfile, ps);
-  }
+      if ((lookup_partial_symbol (objfile, ps, func_name, 1, VAR_DOMAIN)
+          != NULL)
+         || (lookup_partial_symbol (objfile, ps, func_name, 0, VAR_DOMAIN)
+             != NULL))
+       psymtab_to_symtab (objfile, ps);
+    }
 }
 
 /* Psymtab version of expand_all_symtabs.  See its definition in
@@ -1037,12 +1016,8 @@ psym_expand_symtabs_for_function (struct objfile *objfile,
 static void
 psym_expand_all_symtabs (struct objfile *objfile)
 {
-  struct partial_symtab *psymtab;
-
-  ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, psymtab)
-    {
-      psymtab_to_symtab (objfile, psymtab);
-    }
+  for (partial_symtab *psymtab : require_partial_symbols (objfile, 1))
+    psymtab_to_symtab (objfile, psymtab);
 }
 
 /* Psymtab version of expand_symtabs_with_fullname.  See its definition in
@@ -1052,9 +1027,7 @@ static void
 psym_expand_symtabs_with_fullname (struct objfile *objfile,
                                   const char *fullname)
 {
-  struct partial_symtab *p;
-
-  ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, p)
+  for (partial_symtab *p : require_partial_symbols (objfile, 1))
     {
       /* Anonymous psymtabs don't have a name of a source file.  */
       if (p->anonymous)
@@ -1077,9 +1050,7 @@ psym_map_symbol_filenames (struct objfile *objfile,
                           symbol_filename_ftype *fun, void *data,
                           int need_fullname)
 {
-  struct partial_symtab *ps;
-
-  ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps)
+  for (partial_symtab *ps : require_partial_symbols (objfile, 1))
     {
       const char *fullname;
 
@@ -1192,9 +1163,8 @@ psym_map_matching_symbols (struct objfile *objfile,
                           symbol_compare_ftype *ordered_compare)
 {
   const int block_kind = global ? GLOBAL_BLOCK : STATIC_BLOCK;
-  struct partial_symtab *ps;
 
-  ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps)
+  for (partial_symtab *ps : require_partial_symbols (objfile, 1))
     {
       QUIT;
       if (ps->readin
@@ -1317,17 +1287,13 @@ psym_expand_symtabs_matching
    gdb::function_view<expand_symtabs_exp_notify_ftype> expansion_notify,
    enum search_domain domain)
 {
-  struct partial_symtab *ps;
-
   lookup_name_info lookup_name = lookup_name_in.make_ignore_params ();
 
   /* Clear the search flags.  */
-  ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps)
-    {
-      ps->searched_flag = PST_NOT_SEARCHED;
-    }
+  for (partial_symtab *ps : require_partial_symbols (objfile, 1))
+    ps->searched_flag = PST_NOT_SEARCHED;
 
-  ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps)
+  for (partial_symtab *ps : objfile_psymtabs (objfile))
     {
       QUIT;
 
@@ -1416,23 +1382,21 @@ psym_find_compunit_symtab_by_address (struct objfile *objfile,
 {
   if (objfile->psymbol_map.empty ())
     {
-      struct partial_symtab *pst;
-
       std::set<CORE_ADDR> seen_addrs;
 
-      ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, pst)
-      {
-       psym_fill_psymbol_map (objfile, pst,
-                              &seen_addrs,
-                              objfile->global_psymbols,
-                              pst->globals_offset,
-                              pst->n_global_syms);
-       psym_fill_psymbol_map (objfile, pst,
-                              &seen_addrs,
-                              objfile->static_psymbols,
-                              pst->statics_offset,
-                              pst->n_static_syms);
-      }
+      for (partial_symtab *pst : require_partial_symbols (objfile, 1))
+       {
+         psym_fill_psymbol_map (objfile, pst,
+                                &seen_addrs,
+                                objfile->global_psymbols,
+                                pst->globals_offset,
+                                pst->n_global_syms);
+         psym_fill_psymbol_map (objfile, pst,
+                                &seen_addrs,
+                                objfile->static_psymbols,
+                                pst->statics_offset,
+                                pst->n_static_syms);
+       }
 
       objfile->psymbol_map.shrink_to_fit ();
 
@@ -1868,7 +1832,6 @@ maintenance_print_psymbols (const char *args, int from_tty)
 {
   struct ui_file *outfile = gdb_stdout;
   char *address_arg = NULL, *source_arg = NULL, *objfile_arg = NULL;
-  struct partial_symtab *ps;
   int i, outfile_idx, found;
   CORE_ADDR pc = 0;
   struct obj_section *section = NULL;
@@ -1956,7 +1919,8 @@ maintenance_print_psymbols (const char *args, int from_tty)
 
          /* We don't assume each pc has a unique objfile (this is for
             debugging).  */
-         ps = find_pc_sect_psymtab (objfile, pc, section, msymbol);
+         struct partial_symtab *ps = find_pc_sect_psymtab (objfile, pc,
+                                                           section, msymbol);
          if (ps != NULL)
            {
              if (!printed_objfile_header)
@@ -1972,7 +1936,7 @@ maintenance_print_psymbols (const char *args, int from_tty)
        }
       else
        {
-         ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps)
+         for (partial_symtab *ps : require_partial_symbols (objfile, 1))
            {
              int print_for_source = 0;
 
@@ -2032,13 +1996,12 @@ maintenance_info_psymtabs (const char *regexp, int from_tty)
     for (objfile *objfile : all_objfiles (pspace))
       {
        struct gdbarch *gdbarch = get_objfile_arch (objfile);
-       struct partial_symtab *psymtab;
 
        /* We don't want to print anything for this objfile until we
           actually find a symtab whose name matches.  */
        int printed_objfile_start = 0;
 
-       ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, psymtab)
+       for (partial_symtab *psymtab : require_partial_symbols (objfile, 1))
          {
            QUIT;
 
@@ -2139,13 +2102,12 @@ maintenance_check_psymtabs (const char *ignore, int from_tty)
 {
   struct symbol *sym;
   struct compunit_symtab *cust = NULL;
-  struct partial_symtab *ps;
   const struct blockvector *bv;
   struct block *b;
   int length;
 
   for (objfile *objfile : all_objfiles (current_program_space))
-    ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps)
+    for (partial_symtab *ps : require_partial_symbols (objfile, 1))
       {
        struct gdbarch *gdbarch = get_objfile_arch (objfile);
 
index ed400e9..a1cab96 100644 (file)
@@ -21,6 +21,7 @@
 #define PSYMTAB_H
 
 #include "symfile.h"
+#include "common/next-iterator.h"
 
 /* A bcache for partial symbols.  */
 
@@ -35,12 +36,25 @@ extern const struct quick_symbol_functions psym_functions;
 extern const struct quick_symbol_functions dwarf2_gdb_index_functions;
 extern const struct quick_symbol_functions dwarf2_debug_names_functions;
 
+/* A range adapter that makes it possible to iterate over all
+   psymtabs in one objfile.  */
+
+class objfile_psymtabs : public next_adapter<struct partial_symtab>
+{
+public:
+
+  explicit objfile_psymtabs (struct objfile *objfile)
+    : next_adapter<struct partial_symtab> (objfile->psymtabs)
+  {
+  }
+};
+
 /* Ensure that the partial symbols for OBJFILE have been loaded.  If
    VERBOSE is non-zero, then this will print a message when symbols
-   are loaded.  This function always returns its argument, as a
-   convenience.  */
+   are loaded.  This function returns a range adapter suitable for
+   iterating over the psymtabs of OBJFILE.  */
 
-extern struct objfile *require_partial_symbols (struct objfile *objfile,
-                                               int verbose);
+extern objfile_psymtabs require_partial_symbols (struct objfile *objfile,
+                                                int verbose);
 
 #endif /* PSYMTAB_H */