gdbarch.sh: Remove commented out TARGET_CHAR_BIT definition
[deliverable/binutils-gdb.git] / gdb / psymtab.c
index 4ee9dc1e82fe93812ae4f8ed0732303b6d7c06c8..bb482ee2cb4afac36fff5b496474cc8e87f7f76e 100644 (file)
@@ -1,6 +1,6 @@
 /* Partial symbol tables.
-   
-   Copyright (C) 2009-2015 Free Software Foundation, Inc.
+
+   Copyright (C) 2009-2017 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
 #include "cp-support.h"
 #include "gdbcmd.h"
 
-#ifndef DEV_TTY
-#define DEV_TTY "/dev/tty"
-#endif
-
 struct psymbol_bcache
 {
   struct bcache *bcache;
@@ -127,13 +123,12 @@ require_partial_symbols (struct objfile *objfile, int verbose)
 /* Helper function for psym_map_symtabs_matching_filename that
    expands the symtabs and calls the iterator.  */
 
-static int
+static bool
 partial_map_expand_apply (struct objfile *objfile,
                          const char *name,
                          const char *real_path,
                          struct partial_symtab *pst,
-                         int (*callback) (struct symtab *, void *),
-                         void *data)
+                         gdb::function_view<bool (symtab *)> callback)
 {
   struct compunit_symtab *last_made = objfile->compunit_symtabs;
 
@@ -149,20 +144,19 @@ partial_map_expand_apply (struct objfile *objfile,
      all of them.  */
   psymtab_to_symtab (objfile, pst);
 
-  return iterate_over_some_symtabs (name, real_path, callback, data,
-                                   objfile->compunit_symtabs, last_made);
+  return iterate_over_some_symtabs (name, real_path, objfile->compunit_symtabs,
+                                   last_made, callback);
 }
 
 /*  Psymtab version of map_symtabs_matching_filename.  See its definition in
     the definition of quick_symbol_functions in symfile.h.  */
 
-static int
-psym_map_symtabs_matching_filename (struct objfile *objfile,
-                                   const char *name,
-                                   const char *real_path,
-                                   int (*callback) (struct symtab *,
-                                                    void *),
-                                   void *data)
+static bool
+psym_map_symtabs_matching_filename
+  (struct objfile *objfile,
+   const char *name,
+   const char *real_path,
+   gdb::function_view<bool (symtab *)> callback)
 {
   struct partial_symtab *pst;
   const char *name_basename = lbasename (name);
@@ -181,8 +175,8 @@ psym_map_symtabs_matching_filename (struct objfile *objfile,
     if (compare_filenames_for_search (pst->filename, name))
       {
        if (partial_map_expand_apply (objfile, name, real_path,
-                                     pst, callback, data))
-         return 1;
+                                     pst, callback))
+         return true;
        continue;
       }
 
@@ -195,8 +189,8 @@ psym_map_symtabs_matching_filename (struct objfile *objfile,
     if (compare_filenames_for_search (psymtab_to_fullname (pst), name))
       {
        if (partial_map_expand_apply (objfile, name, real_path,
-                                     pst, callback, data))
-         return 1;
+                                     pst, callback))
+         return true;
        continue;
       }
 
@@ -209,14 +203,14 @@ psym_map_symtabs_matching_filename (struct objfile *objfile,
        if (filename_cmp (psymtab_to_fullname (pst), real_path) == 0)
          {
            if (partial_map_expand_apply (objfile, name, real_path,
-                                         pst, callback, data))
-             return 1;
+                                         pst, callback))
+             return true;
            continue;
          }
       }
   }
 
-  return 0;
+  return false;
 }
 
 /* Find which partial symtab contains PC and SECTION starting at psymtab PST.
@@ -238,12 +232,12 @@ find_pc_sect_psymtab_closer (struct objfile *objfile,
      many partial symbol tables containing the PC, but
      we want the partial symbol table that contains the
      function containing the PC.  */
-  if (!(objfile->flags & OBJF_REORDERED) &&
-      section == 0)    /* Can't validate section this way.  */
+  if (!(objfile->flags & OBJF_REORDERED)
+      && section == NULL)  /* Can't validate section this way.  */
     return pst;
 
   if (msymbol.minsym == NULL)
-    return (pst);
+    return pst;
 
   /* The code range of partial symtabs sometimes overlap, so, in
      the loop below, we need to check all partial symtabs and
@@ -265,8 +259,8 @@ find_pc_sect_psymtab_closer (struct objfile *objfile,
             object's symbol table.  */
          p = find_pc_sect_psymbol (objfile, tpst, pc, section);
          if (p != NULL
-             && SYMBOL_VALUE_ADDRESS (p)
-             == BMSYMBOL_VALUE_ADDRESS (msymbol))
+             && (SYMBOL_VALUE_ADDRESS (p)
+                 == BMSYMBOL_VALUE_ADDRESS (msymbol)))
            return tpst;
 
          /* Also accept the textlow value of a psymtab as a
@@ -298,10 +292,11 @@ find_pc_sect_psymtab_closer (struct objfile *objfile,
   return best_pst;
 }
 
-/* Find which partial symtab contains PC and SECTION.  Return 0 if
+/* Find which partial symtab contains PC and SECTION.  Return NULL if
    none.  We return the psymtab that contains a symbol whose address
    exactly matches PC, or, if we cannot find an exact match, the
    psymtab that contains a symbol whose address is closest to PC.  */
+
 static struct partial_symtab *
 find_pc_sect_psymtab (struct objfile *objfile, CORE_ADDR pc,
                      struct obj_section *section,
@@ -314,13 +309,14 @@ find_pc_sect_psymtab (struct objfile *objfile, CORE_ADDR pc,
 
   if (objfile->psymtabs_addrmap != NULL)
     {
-      pst = addrmap_find (objfile->psymtabs_addrmap, pc);
+      pst = ((struct partial_symtab *)
+            addrmap_find (objfile->psymtabs_addrmap, pc));
       if (pst != NULL)
        {
          /* FIXME: addrmaps currently do not handle overlayed sections,
             so fall back to the non-addrmap case if we're debugging
             overlays and the addrmap returned the wrong section.  */
-         if (overlay_debugging && msymbol.minsym && section)
+         if (overlay_debugging && msymbol.minsym != NULL && section != NULL)
            {
              struct partial_symbol *p;
 
@@ -329,9 +325,9 @@ find_pc_sect_psymtab (struct objfile *objfile, CORE_ADDR pc,
                 true; the debug info might be much richer than the
                 object's symbol table.  */
              p = find_pc_sect_psymbol (objfile, pst, pc, section);
-             if (!p
-                 || SYMBOL_VALUE_ADDRESS (p)
-                 != BMSYMBOL_VALUE_ADDRESS (msymbol))
+             if (p == NULL
+                 || (SYMBOL_VALUE_ADDRESS (p)
+                     != BMSYMBOL_VALUE_ADDRESS (msymbol)))
                goto next;
            }
 
@@ -371,8 +367,8 @@ find_pc_sect_psymtab (struct objfile *objfile, CORE_ADDR pc,
   return NULL;
 }
 
-/*  Psymtab version of find_pc_sect_compunit_symtab.  See its definition in
-    the definition of quick_symbol_functions in symfile.h.  */
+/* Psymtab version of find_pc_sect_compunit_symtab.  See its definition in
+   the definition of quick_symbol_functions in symfile.h.  */
 
 static struct compunit_symtab *
 psym_find_pc_sect_compunit_symtab (struct objfile *objfile,
@@ -383,7 +379,7 @@ psym_find_pc_sect_compunit_symtab (struct objfile *objfile,
 {
   struct partial_symtab *ps = find_pc_sect_psymtab (objfile, pc, section,
                                                    msymbol);
-  if (ps)
+  if (ps != NULL)
     {
       if (warn_if_readin && ps->readin)
        /* Might want to error() here (in case symtab is corrupt and
@@ -399,7 +395,7 @@ psym_find_pc_sect_compunit_symtab (struct objfile *objfile,
 }
 
 /* Find which partial symbol within a psymtab matches PC and SECTION.
-   Return 0 if none.  */
+   Return NULL if none.  */
 
 static struct partial_symbol *
 find_pc_sect_psymbol (struct objfile *objfile,
@@ -418,8 +414,8 @@ find_pc_sect_psymbol (struct objfile *objfile,
      find_pc_partial_function doesn't use a minimal symbol and thus
      cache a bad endaddr.  */
   for (pp = objfile->global_psymbols.list + psymtab->globals_offset;
-    (pp - (objfile->global_psymbols.list + psymtab->globals_offset)
-     < psymtab->n_global_syms);
+       (pp - (objfile->global_psymbols.list + psymtab->globals_offset)
+       < psymtab->n_global_syms);
        pp++)
     {
       p = *pp;
@@ -430,7 +426,7 @@ find_pc_sect_psymbol (struct objfile *objfile,
              || (psymtab->textlow == 0
                  && best_pc == 0 && SYMBOL_VALUE_ADDRESS (p) == 0)))
        {
-         if (section)          /* Match on a specific section.  */
+         if (section != NULL)  /* Match on a specific section.  */
            {
              fixup_psymbol_section (p, objfile);
              if (!matching_obj_sections (SYMBOL_OBJ_SECTION (objfile, p),
@@ -443,8 +439,8 @@ find_pc_sect_psymbol (struct objfile *objfile,
     }
 
   for (pp = objfile->static_psymbols.list + psymtab->statics_offset;
-    (pp - (objfile->static_psymbols.list + psymtab->statics_offset)
-     < psymtab->n_static_syms);
+       (pp - (objfile->static_psymbols.list + psymtab->statics_offset)
+       < psymtab->n_static_syms);
        pp++)
     {
       p = *pp;
@@ -455,7 +451,7 @@ find_pc_sect_psymbol (struct objfile *objfile,
              || (psymtab->textlow == 0
                  && best_pc == 0 && SYMBOL_VALUE_ADDRESS (p) == 0)))
        {
-         if (section)          /* Match on a specific section.  */
+         if (section != NULL)  /* Match on a specific section.  */
            {
              fixup_psymbol_section (p, objfile);
              if (!matching_obj_sections (SYMBOL_OBJ_SECTION (objfile, p),
@@ -475,7 +471,7 @@ fixup_psymbol_section (struct partial_symbol *psym, struct objfile *objfile)
 {
   CORE_ADDR addr;
 
-  if (!psym)
+  if (psym == NULL)
     return;
 
   if (SYMBOL_SECTION (psym) >= 0)
@@ -499,8 +495,8 @@ fixup_psymbol_section (struct partial_symbol *psym, struct objfile *objfile)
   fixup_section (&psym->ginfo, addr, objfile);
 }
 
-/*  Psymtab version of lookup_symbol.  See its definition in
-    the definition of quick_symbol_functions in symfile.h.  */
+/* Psymtab version of lookup_symbol.  See its definition in
+   the definition of quick_symbol_functions in symfile.h.  */
 
 static struct compunit_symtab *
 psym_lookup_symbol (struct objfile *objfile,
@@ -516,7 +512,7 @@ psym_lookup_symbol (struct objfile *objfile,
     if (!ps->readin && lookup_partial_symbol (objfile, ps, name,
                                              psymtab_index, domain))
       {
-       struct symbol *sym = NULL;
+       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
@@ -524,18 +520,20 @@ psym_lookup_symbol (struct objfile *objfile,
        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 psymtab will not contain any overload
+          and methods, since the index will not contain any overload
           information (but NAME might contain it).  */
-       sym = block_lookup_symbol (block, name, domain);
-
-       if (sym && strcmp_iw (SYMBOL_SEARCH_NAME (sym), name) == 0)
-         {
-           if (!TYPE_IS_OPAQUE (SYMBOL_TYPE (sym)))
-             return stab;
 
-           stab_best = stab;
-         }
+       if (sym != NULL
+           && strcmp_iw (SYMBOL_SEARCH_NAME (sym), name) == 0)
+         return stab;
+       if (with_opaque != NULL
+           && strcmp_iw (SYMBOL_SEARCH_NAME (with_opaque), name) == 0)
+         stab_best = stab;
 
        /* Keep looking through other psymtabs.  */
       }
@@ -587,9 +585,6 @@ match_partial_symbol (struct objfile *objfile,
        {
          center = bottom + (top - bottom) / 2;
          gdb_assert (center < top);
-         if (!do_linear_search
-             && (SYMBOL_LANGUAGE (*center) == language_java))
-           do_linear_search = 1;
          if (ordered_compare (SYMBOL_SEARCH_NAME (*center), name) >= 0)
            top = center;
          else
@@ -638,7 +633,6 @@ psymtab_search_name (const char *name)
   switch (current_language->la_language)
     {
     case language_cplus:
-    case language_java:
       {
        if (strchr (name, '('))
          {
@@ -673,9 +667,7 @@ lookup_partial_symbol (struct objfile *objfile,
   struct cleanup *cleanup;
 
   if (length == 0)
-    {
-      return (NULL);
-    }
+    return NULL;
 
   search_name = psymtab_search_name (name);
   cleanup = make_cleanup (xfree, search_name);
@@ -702,11 +694,6 @@ lookup_partial_symbol (struct objfile *objfile,
          if (!(center < top))
            internal_error (__FILE__, __LINE__,
                            _("failed internal consistency check"));
-         if (!do_linear_search
-             && SYMBOL_LANGUAGE (*center) == language_java)
-           {
-             do_linear_search = 1;
-           }
          if (strcmp_iw_ordered (SYMBOL_SEARCH_NAME (*center),
                                 search_name) >= 0)
            {
@@ -735,7 +722,7 @@ lookup_partial_symbol (struct objfile *objfile,
                                     SYMBOL_DOMAIN (*top), domain))
            {
              do_cleanups (cleanup);
-             return (*top);
+             return *top;
            }
          top++;
        }
@@ -753,13 +740,13 @@ lookup_partial_symbol (struct objfile *objfile,
              && SYMBOL_MATCHES_SEARCH_NAME (*psym, search_name))
            {
              do_cleanups (cleanup);
-             return (*psym);
+             return *psym;
            }
        }
     }
 
   do_cleanups (cleanup);
-  return (NULL);
+  return NULL;
 }
 
 /* Get the symbol table that corresponds to a partial_symtab.
@@ -783,17 +770,16 @@ psymtab_to_symtab (struct objfile *objfile, struct partial_symtab *pst)
   /* If it has not yet been read in, read it.  */
   if (!pst->readin)
     {
-      struct cleanup *back_to = increment_reading_symtab ();
+      scoped_restore decrementer = increment_reading_symtab ();
 
       (*pst->read_symtab) (pst, objfile);
-      do_cleanups (back_to);
     }
 
   return pst->compunit_symtab;
 }
 
-/*  Psymtab version of relocate.  See its definition in
-    the definition of quick_symbol_functions in symfile.h.  */
+/* Psymtab version of relocate.  See its definition in
+   the definition of quick_symbol_functions in symfile.h.  */
 
 static void
 psym_relocate (struct objfile *objfile,
@@ -829,14 +815,14 @@ psym_relocate (struct objfile *objfile,
     }
 }
 
-/*  Psymtab version of find_last_source_symtab.  See its definition in
-    the definition of quick_symbol_functions in symfile.h.  */
+/* Psymtab version of find_last_source_symtab.  See its definition in
+   the definition of quick_symbol_functions in symfile.h.  */
 
 static struct symtab *
 psym_find_last_source_symtab (struct objfile *ofp)
 {
   struct partial_symtab *ps;
-  struct partial_symtab *cs_pst = 0;
+  struct partial_symtab *cs_pst = NULL;
 
   ALL_OBJFILE_PSYMTABS_REQUIRED (ofp, ps)
     {
@@ -868,8 +854,8 @@ psym_find_last_source_symtab (struct objfile *ofp)
   return NULL;
 }
 
-/*  Psymtab version of forget_cached_source_info.  See its definition in
-    the definition of quick_symbol_functions in symfile.h.  */
+/* Psymtab version of forget_cached_source_info.  See its definition in
+   the definition of quick_symbol_functions in symfile.h.  */
 
 static void
 psym_forget_cached_source_info (struct objfile *objfile)
@@ -888,7 +874,7 @@ psym_forget_cached_source_info (struct objfile *objfile)
 
 static void
 print_partial_symbols (struct gdbarch *gdbarch,
-                      struct partial_symbol **p, int count, char *what,
+                      struct partial_symbol **p, int count, const char *what,
                       struct ui_file *outfile)
 {
   fprintf_filtered (outfile, "  %s partial symbols:\n", what);
@@ -1012,18 +998,6 @@ dump_psymtab (struct objfile *objfile, struct partial_symtab *psymtab,
       fprintf_filtered (outfile, ")\n");
     }
 
-  fprintf_filtered (outfile, "  Relocate symbols by ");
-  for (i = 0; i < objfile->num_sections; ++i)
-    {
-      if (i != 0)
-       fprintf_filtered (outfile, ", ");
-      wrap_here ("    ");
-      fputs_filtered (paddress (gdbarch,
-                               ANOFFSET (psymtab->section_offsets, i)),
-                     outfile);
-    }
-  fprintf_filtered (outfile, "\n");
-
   fprintf_filtered (outfile, "  Symbols cover text addresses ");
   fputs_filtered (paddress (gdbarch, psymtab->textlow), outfile);
   fprintf_filtered (outfile, "-");
@@ -1063,8 +1037,8 @@ dump_psymtab (struct objfile *objfile, struct partial_symtab *psymtab,
   fprintf_filtered (outfile, "\n");
 }
 
-/*  Psymtab version of print_stats.  See its definition in
-    the definition of quick_symbol_functions in symfile.h.  */
+/* Psymtab version of print_stats.  See its definition in
+   the definition of quick_symbol_functions in symfile.h.  */
 
 static void
 psym_print_stats (struct objfile *objfile)
@@ -1081,8 +1055,8 @@ psym_print_stats (struct objfile *objfile)
   printf_filtered (_("  Number of psym tables (not yet expanded): %d\n"), i);
 }
 
-/*  Psymtab version of dump.  See its definition in
-    the definition of quick_symbol_functions in symfile.h.  */
+/* Psymtab version of dump.  See its definition in
+   the definition of quick_symbol_functions in symfile.h.  */
 
 static void
 psym_dump (struct objfile *objfile)
@@ -1106,8 +1080,8 @@ psym_dump (struct objfile *objfile)
     }
 }
 
-/*  Psymtab version of expand_symtabs_for_function.  See its definition in
-    the definition of quick_symbol_functions in symfile.h.  */
+/* Psymtab version of expand_symtabs_for_function.  See its definition in
+   the definition of quick_symbol_functions in symfile.h.  */
 
 static void
 psym_expand_symtabs_for_function (struct objfile *objfile,
@@ -1128,8 +1102,8 @@ psym_expand_symtabs_for_function (struct objfile *objfile,
   }
 }
 
-/*  Psymtab version of expand_all_symtabs.  See its definition in
-    the definition of quick_symbol_functions in symfile.h.  */
+/* Psymtab version of expand_all_symtabs.  See its definition in
+   the definition of quick_symbol_functions in symfile.h.  */
 
 static void
 psym_expand_all_symtabs (struct objfile *objfile)
@@ -1142,8 +1116,8 @@ psym_expand_all_symtabs (struct objfile *objfile)
     }
 }
 
-/*  Psymtab version of expand_symtabs_with_fullname.  See its definition in
-    the definition of quick_symbol_functions in symfile.h.  */
+/* Psymtab version of expand_symtabs_with_fullname.  See its definition in
+   the definition of quick_symbol_functions in symfile.h.  */
 
 static void
 psym_expand_symtabs_with_fullname (struct objfile *objfile,
@@ -1166,8 +1140,8 @@ psym_expand_symtabs_with_fullname (struct objfile *objfile,
     }
 }
 
-/*  Psymtab version of map_symbol_filenames.  See its definition in
-    the definition of quick_symbol_functions in symfile.h.  */
+/* Psymtab version of map_symbol_filenames.  See its definition in
+   the definition of quick_symbol_functions in symfile.h.  */
 
 static void
 psym_map_symbol_filenames (struct objfile *objfile,
@@ -1234,7 +1208,8 @@ psymtab_to_fullname (struct partial_symtab *ps)
          if (ps->dirname == NULL || IS_ABSOLUTE_PATH (ps->filename))
            fullname = xstrdup (ps->filename);
          else
-           fullname = concat (ps->dirname, SLASH_STRING, ps->filename, NULL);
+           fullname = concat (ps->dirname, SLASH_STRING,
+                              ps->filename, (char *) NULL);
 
          back_to = make_cleanup (xfree, fullname);
          ps->fullname = rewrite_source_path (fullname);
@@ -1242,18 +1217,18 @@ psymtab_to_fullname (struct partial_symtab *ps)
            ps->fullname = xstrdup (fullname);
          do_cleanups (back_to);
        }
-    } 
+    }
 
   return ps->fullname;
 }
 
-/*  For all symbols, s, in BLOCK that are in NAMESPACE and match NAME
-    according to the function MATCH, call CALLBACK(BLOCK, s, DATA).
-    BLOCK is assumed to come from OBJFILE.  Returns 1 iff CALLBACK
-    ever returns non-zero, and otherwise returns 0.  */
+/* For all symbols, s, in BLOCK that are in DOMAIN and match NAME
+   according to the function MATCH, call CALLBACK(BLOCK, s, DATA).
+   BLOCK is assumed to come from OBJFILE.  Returns 1 iff CALLBACK
+   ever returns non-zero, and otherwise returns 0.  */
 
 static int
-map_block (const char *name, domain_enum namespace, struct objfile *objfile,
+map_block (const char *name, domain_enum domain, struct objfile *objfile,
           struct block *block,
           int (*callback) (struct block *, struct symbol *, void *),
           void *data, symbol_compare_ftype *match)
@@ -1264,8 +1239,8 @@ map_block (const char *name, domain_enum namespace, struct objfile *objfile,
   for (sym = block_iter_match_first (block, name, match, &iter);
        sym != NULL; sym = block_iter_match_next (name, match, &iter))
     {
-      if (symbol_matches_domain (SYMBOL_LANGUAGE (sym), 
-                                SYMBOL_DOMAIN (sym), namespace))
+      if (symbol_matches_domain (SYMBOL_LANGUAGE (sym),
+                                SYMBOL_DOMAIN (sym), domain))
        {
          if (callback (block, sym, data))
            return 1;
@@ -1275,12 +1250,12 @@ map_block (const char *name, domain_enum namespace, struct objfile *objfile,
   return 0;
 }
 
-/*  Psymtab version of map_matching_symbols.  See its definition in
-    the definition of quick_symbol_functions in symfile.h.  */
+/* Psymtab version of map_matching_symbols.  See its definition in
+   the definition of quick_symbol_functions in symfile.h.  */
 
 static void
 psym_map_matching_symbols (struct objfile *objfile,
-                          const char *name, domain_enum namespace,
+                          const char *name, domain_enum domain,
                           int global,
                           int (*callback) (struct block *,
                                            struct symbol *, void *),
@@ -1295,7 +1270,7 @@ psym_map_matching_symbols (struct objfile *objfile,
     {
       QUIT;
       if (ps->readin
-         || match_partial_symbol (objfile, ps, global, name, namespace, match,
+         || match_partial_symbol (objfile, ps, global, name, domain, match,
                                   ordered_compare))
        {
          struct compunit_symtab *cust = psymtab_to_symtab (objfile, ps);
@@ -1304,31 +1279,29 @@ psym_map_matching_symbols (struct objfile *objfile,
          if (cust == NULL)
            continue;
          block = BLOCKVECTOR_BLOCK (COMPUNIT_BLOCKVECTOR (cust), block_kind);
-         if (map_block (name, namespace, objfile, block,
+         if (map_block (name, domain, objfile, block,
                         callback, data, match))
            return;
          if (callback (block, NULL, data))
            return;
        }
     }
-}          
+}
 
-/* A helper for psym_expand_symtabs_matching that handles
-   searching included psymtabs.  This returns 1 if a symbol is found,
-   and zero otherwise.  It also updates the 'searched_flag' on the
+/* A helper for psym_expand_symtabs_matching that handles searching
+   included psymtabs.  This returns true if a symbol is found, and
+   false otherwise.  It also updates the 'searched_flag' on the
    various psymtabs that it searches.  */
 
-static int
-recursively_search_psymtabs (struct partial_symtab *ps,
-                            struct objfile *objfile,
-                            enum search_domain kind,
-                            expand_symtabs_symbol_matcher_ftype *sym_matcher,
-                            void *data)
+static bool
+recursively_search_psymtabs
+  (struct partial_symtab *ps, struct objfile *objfile, enum search_domain kind,
+   gdb::function_view<expand_symtabs_symbol_matcher_ftype> sym_matcher)
 {
   struct partial_symbol **psym;
   struct partial_symbol **bound, **gbound, **sbound;
   int keep_going = 1;
-  int result = PST_SEARCHED_AND_NOT_FOUND;
+  enum psymtab_search_status result = PST_SEARCHED_AND_NOT_FOUND;
   int i;
 
   if (ps->searched_flag != PST_NOT_SEARCHED)
@@ -1345,11 +1318,11 @@ recursively_search_psymtabs (struct partial_symtab *ps,
        continue;
 
       r = recursively_search_psymtabs (ps->dependencies[i],
-                                      objfile, kind, sym_matcher, data);
+                                      objfile, kind, sym_matcher);
       if (r != 0)
        {
          ps->searched_flag = PST_SEARCHED_AND_FOUND;
-         return 1;
+         return true;
        }
     }
 
@@ -1387,7 +1360,7 @@ recursively_search_psymtabs (struct partial_symtab *ps,
                   && PSYMBOL_CLASS (*psym) == LOC_BLOCK)
               || (kind == TYPES_DOMAIN
                   && PSYMBOL_CLASS (*psym) == LOC_TYPEDEF))
-             && (*sym_matcher) (SYMBOL_SEARCH_NAME (*psym), data))
+             && sym_matcher (SYMBOL_SEARCH_NAME (*psym)))
            {
              /* Found a match, so notify our caller.  */
              result = PST_SEARCHED_AND_FOUND;
@@ -1401,17 +1374,16 @@ recursively_search_psymtabs (struct partial_symtab *ps,
   return result == PST_SEARCHED_AND_FOUND;
 }
 
-/*  Psymtab version of expand_symtabs_matching.  See its definition in
-    the definition of quick_symbol_functions in symfile.h.  */
+/* Psymtab version of expand_symtabs_matching.  See its definition in
+   the definition of quick_symbol_functions in symfile.h.  */
 
 static void
 psym_expand_symtabs_matching
   (struct objfile *objfile,
-   expand_symtabs_file_matcher_ftype *file_matcher,
-   expand_symtabs_symbol_matcher_ftype *symbol_matcher,
-   expand_symtabs_exp_notify_ftype *expansion_notify,
-   enum search_domain kind,
-   void *data)
+   gdb::function_view<expand_symtabs_file_matcher_ftype> file_matcher,
+   gdb::function_view<expand_symtabs_symbol_matcher_ftype> symbol_matcher,
+   gdb::function_view<expand_symtabs_exp_notify_ftype> expansion_notify,
+   enum search_domain kind)
 {
   struct partial_symtab *ps;
 
@@ -1423,6 +1395,8 @@ psym_expand_symtabs_matching
 
   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps)
     {
+      QUIT;
+
       if (ps->readin)
        continue;
 
@@ -1433,37 +1407,37 @@ psym_expand_symtabs_matching
 
       if (file_matcher)
        {
-         int match;
+         bool match;
 
          if (ps->anonymous)
            continue;
 
-         match = (*file_matcher) (ps->filename, data, 0);
+         match = file_matcher (ps->filename, false);
          if (!match)
            {
              /* Before we invoke realpath, which can get expensive when many
                 files are involved, do a quick comparison of the basenames.  */
              if (basenames_may_differ
-                 || (*file_matcher) (lbasename (ps->filename), data, 1))
-               match = (*file_matcher) (psymtab_to_fullname (ps), data, 0);
+                 || file_matcher (lbasename (ps->filename), true))
+               match = file_matcher (psymtab_to_fullname (ps), false);
            }
          if (!match)
            continue;
        }
 
-      if (recursively_search_psymtabs (ps, objfile, kind, symbol_matcher, data))
+      if (recursively_search_psymtabs (ps, objfile, kind, symbol_matcher))
        {
          struct compunit_symtab *symtab =
            psymtab_to_symtab (objfile, ps);
 
          if (expansion_notify != NULL)
-           expansion_notify (symtab, data);
+           expansion_notify (symtab);
        }
     }
 }
 
-/*  Psymtab version of has_symbols.  See its definition in
-    the definition of quick_symbol_functions in symfile.h.  */
+/* Psymtab version of has_symbols.  See its definition in
+   the definition of quick_symbol_functions in symfile.h.  */
 
 static int
 psym_has_symbols (struct objfile *objfile)
@@ -1498,14 +1472,14 @@ const struct quick_symbol_functions psym_functions =
 static int
 compare_psymbols (const void *s1p, const void *s2p)
 {
-  struct partial_symbol *const *s1 = s1p;
-  struct partial_symbol *const *s2 = s2p;
+  struct partial_symbol *const *s1 = (struct partial_symbol * const*) s1p;
+  struct partial_symbol *const *s2 = (struct partial_symbol * const*) s2p;
 
   return strcmp_iw_ordered (SYMBOL_SEARCH_NAME (*s1),
                            SYMBOL_SEARCH_NAME (*s2));
 }
 
-void
+static void
 sort_pst_symbols (struct objfile *objfile, struct partial_symtab *pst)
 {
   /* Sort the global list; don't sort the static list.  */
@@ -1522,7 +1496,6 @@ sort_pst_symbols (struct objfile *objfile, struct partial_symtab *pst)
 
 struct partial_symtab *
 start_psymtab_common (struct objfile *objfile,
-                     struct section_offsets *section_offsets,
                      const char *filename,
                      CORE_ADDR textlow, struct partial_symbol **global_syms,
                      struct partial_symbol **static_syms)
@@ -1530,12 +1503,26 @@ start_psymtab_common (struct objfile *objfile,
   struct partial_symtab *psymtab;
 
   psymtab = allocate_psymtab (filename, objfile);
-  psymtab->section_offsets = section_offsets;
   psymtab->textlow = textlow;
   psymtab->texthigh = psymtab->textlow;                /* default */
   psymtab->globals_offset = global_syms - objfile->global_psymbols.list;
   psymtab->statics_offset = static_syms - objfile->static_psymbols.list;
-  return (psymtab);
+  return psymtab;
+}
+
+/* Perform "finishing up" operations of a partial symtab.  */
+
+void
+end_psymtab_common (struct objfile *objfile, struct partial_symtab *pst)
+{
+  pst->n_global_syms
+    = objfile->global_psymbols.next - (objfile->global_psymbols.list
+                                      + pst->globals_offset);
+  pst->n_static_syms
+    = objfile->static_psymbols.next - (objfile->static_psymbols.list
+                                      + pst->statics_offset);
+
+  sort_pst_symbols (objfile, pst);
 }
 
 /* Calculate a hash code for the given partial symbol.  The hash is
@@ -1550,12 +1537,12 @@ psymbol_hash (const void *addr, int length)
   struct partial_symbol *psymbol = (struct partial_symbol *) addr;
   unsigned int lang = psymbol->ginfo.language;
   unsigned int domain = PSYMBOL_DOMAIN (psymbol);
-  unsigned int class = PSYMBOL_CLASS (psymbol);
+  unsigned int theclass = PSYMBOL_CLASS (psymbol);
 
   h = hash_continue (&psymbol->ginfo.value, sizeof (psymbol->ginfo.value), h);
   h = hash_continue (&lang, sizeof (unsigned int), h);
   h = hash_continue (&domain, sizeof (unsigned int), h);
-  h = hash_continue (&class, sizeof (unsigned int), h);
+  h = hash_continue (&theclass, sizeof (unsigned int), h);
   h = hash_continue (psymbol->ginfo.name, strlen (psymbol->ginfo.name), h);
 
   return h;
@@ -1571,7 +1558,7 @@ psymbol_compare (const void *addr1, const void *addr2, int length)
   struct partial_symbol *sym1 = (struct partial_symbol *) addr1;
   struct partial_symbol *sym2 = (struct partial_symbol *) addr2;
 
-  return (memcmp (&sym1->ginfo.value, &sym1->ginfo.value,
+  return (memcmp (&sym1->ginfo.value, &sym2->ginfo.value,
                   sizeof (sym1->ginfo.value)) == 0
          && sym1->ginfo.language == sym2->ginfo.language
           && PSYMBOL_DOMAIN (sym1) == PSYMBOL_DOMAIN (sym2)
@@ -1585,11 +1572,13 @@ struct psymbol_bcache *
 psymbol_bcache_init (void)
 {
   struct psymbol_bcache *bcache = XCNEW (struct psymbol_bcache);
+
   bcache->bcache = bcache_xmalloc (psymbol_hash, psymbol_compare);
   return bcache;
 }
 
 /* Free a partial symbol bcache.  */
+
 void
 psymbol_bcache_free (struct psymbol_bcache *bcache)
 {
@@ -1618,13 +1607,12 @@ psymbol_bcache_full (struct partial_symbol *sym,
                      struct psymbol_bcache *bcache,
                      int *added)
 {
-  return bcache_full (sym,
-                      sizeof (struct partial_symbol),
-                      bcache->bcache,
-                      added);
+  return ((const struct partial_symbol *)
+         bcache_full (sym, sizeof (struct partial_symbol), bcache->bcache,
+                      added));
 }
 
-/* Helper function, initialises partial symbol structure and stashes 
+/* Helper function, initialises partial symbol structure and stashes
    it into objfile's bcache.  Note that our caching mechanism will
    use all fields of struct partial_symbol to determine hash value of the
    structure.  In other words, having two symbols with the same name but
@@ -1633,9 +1621,8 @@ psymbol_bcache_full (struct partial_symbol *sym,
 static const struct partial_symbol *
 add_psymbol_to_bcache (const char *name, int namelength, int copy_name,
                       domain_enum domain,
-                      enum address_class class,
-                      long val,        /* Value as a long */
-                      CORE_ADDR coreaddr,      /* Value as a CORE_ADDR */
+                      enum address_class theclass,
+                      CORE_ADDR coreaddr,
                       enum language language, struct objfile *objfile,
                       int *added)
 {
@@ -1646,26 +1633,16 @@ add_psymbol_to_bcache (const char *name, int namelength, int copy_name,
      holes.  */
   memset (&psymbol, 0, sizeof (psymbol));
 
-  /* val and coreaddr are mutually exclusive, one of them *will* be zero.  */
-  if (val != 0)
-    {
-      SYMBOL_VALUE (&psymbol) = val;
-    }
-  else
-    {
-      SYMBOL_VALUE_ADDRESS (&psymbol) = coreaddr;
-    }
+  SYMBOL_VALUE_ADDRESS (&psymbol) = coreaddr;
   SYMBOL_SECTION (&psymbol) = -1;
   SYMBOL_SET_LANGUAGE (&psymbol, language, &objfile->objfile_obstack);
   PSYMBOL_DOMAIN (&psymbol) = domain;
-  PSYMBOL_CLASS (&psymbol) = class;
+  PSYMBOL_CLASS (&psymbol) = theclass;
 
   SYMBOL_SET_NAMES (&psymbol, name, namelength, copy_name, objfile);
 
   /* Stash the partial symbol away in the cache.  */
-  return psymbol_bcache_full (&psymbol,
-                              objfile->psymbol_cache,
-                              added);
+  return psymbol_bcache_full (&psymbol, objfile->psymbol_cache, added);
 }
 
 /* Increase the space allocated for LISTP, which is probably
@@ -1681,8 +1658,7 @@ extend_psymbol_list (struct psymbol_allocation_list *listp,
   if (listp->size == 0)
     {
       new_size = 255;
-      listp->list = (struct partial_symbol **)
-       xmalloc (new_size * sizeof (struct partial_symbol *));
+      listp->list = XNEWVEC (struct partial_symbol *, new_size);
     }
   else
     {
@@ -1697,8 +1673,7 @@ extend_psymbol_list (struct psymbol_allocation_list *listp,
   listp->size = new_size;
 }
 
-/* Helper function, adds partial symbol to the given partial symbol
-   list.  */
+/* Helper function, adds partial symbol to the given partial symbol list.  */
 
 static void
 append_psymbol_to_list (struct psymbol_allocation_list *list,
@@ -1713,15 +1688,16 @@ append_psymbol_to_list (struct psymbol_allocation_list *list,
 
 /* Add a symbol with a long value to a psymtab.
    Since one arg is a struct, we pass in a ptr and deref it (sigh).
+   The only value we need to store for psyms is an address.
+   For all other psyms pass zero for COREADDR.
    Return the partial symbol that has been added.  */
 
 void
 add_psymbol_to_list (const char *name, int namelength, int copy_name,
                     domain_enum domain,
-                    enum address_class class,
-                    struct psymbol_allocation_list *list, 
-                    long val,  /* Value as a long */
-                    CORE_ADDR coreaddr,        /* Value as a CORE_ADDR */
+                    enum address_class theclass,
+                    struct psymbol_allocation_list *list,
+                    CORE_ADDR coreaddr,
                     enum language language, struct objfile *objfile)
 {
   const struct partial_symbol *psym;
@@ -1729,8 +1705,8 @@ add_psymbol_to_list (const char *name, int namelength, int copy_name,
   int added;
 
   /* Stash the partial symbol away in the cache.  */
-  psym = add_psymbol_to_bcache (name, namelength, copy_name, domain, class,
-                               val, coreaddr, language, objfile, &added);
+  psym = add_psymbol_to_bcache (name, namelength, copy_name, domain, theclass,
+                               coreaddr, language, objfile, &added);
 
   /* Do not duplicate global partial symbols.  */
   if (list == &objfile->global_psymbols
@@ -1749,13 +1725,9 @@ init_psymbol_list (struct objfile *objfile, int total_symbols)
   /* Free any previously allocated psymbol lists.  */
 
   if (objfile->global_psymbols.list)
-    {
-      xfree (objfile->global_psymbols.list);
-    }
+    xfree (objfile->global_psymbols.list);
   if (objfile->static_psymbols.list)
-    {
-      xfree (objfile->static_psymbols.list);
-    }
+    xfree (objfile->static_psymbols.list);
 
   /* Current best guess is that approximately a twentieth
      of the total symbols (in a debugging file) are global or static
@@ -1767,16 +1739,14 @@ init_psymbol_list (struct objfile *objfile, int total_symbols)
   if (objfile->global_psymbols.size > 0)
     {
       objfile->global_psymbols.next =
-       objfile->global_psymbols.list = (struct partial_symbol **)
-       xmalloc ((objfile->global_psymbols.size
-                 * sizeof (struct partial_symbol *)));
+       objfile->global_psymbols.list =
+         XNEWVEC (struct partial_symbol *, objfile->global_psymbols.size);
     }
   if (objfile->static_psymbols.size > 0)
     {
       objfile->static_psymbols.next =
-       objfile->static_psymbols.list = (struct partial_symbol **)
-       xmalloc ((objfile->static_psymbols.size
-                 * sizeof (struct partial_symbol *)));
+       objfile->static_psymbols.list =
+         XNEWVEC (struct partial_symbol *, objfile->static_psymbols.size);
     }
 }
 
@@ -1796,8 +1766,9 @@ allocate_psymtab (const char *filename, struct objfile *objfile)
                     sizeof (struct partial_symtab));
 
   memset (psymtab, 0, sizeof (struct partial_symtab));
-  psymtab->filename = bcache (filename, strlen (filename) + 1,
-                             objfile->per_bfd->filename_cache);
+  psymtab->filename
+    = (const char *) bcache (filename, strlen (filename) + 1,
+                            objfile->per_bfd->filename_cache);
   psymtab->compunit_symtab = NULL;
 
   /* Prepend it to the psymtab list for the objfile it belongs to.
@@ -1827,7 +1798,7 @@ allocate_psymtab (const char *filename, struct objfile *objfile)
                          host_address_to_string (psymtab), filename);
     }
 
-  return (psymtab);
+  return psymtab;
 }
 
 void
@@ -1855,95 +1826,247 @@ discard_psymtab (struct objfile *objfile, struct partial_symtab *pst)
   objfile->free_psymtabs = pst;
 }
 
-/* An object of this type is passed to discard_psymtabs_upto.  */
+\f
+
+/* We need to pass a couple of items to the addrmap_foreach function,
+   so use a struct.  */
 
-struct psymtab_state
+struct dump_psymtab_addrmap_data
 {
-  /* The objfile where psymtabs are discarded.  */
-
   struct objfile *objfile;
+  struct partial_symtab *psymtab;
+  struct ui_file *outfile;
 
-  /* The first psymtab to save.  */
-
-  struct partial_symtab *save;
+  /* Non-zero if the previously printed addrmap entry was for PSYMTAB.
+     If so, we want to print the next one as well (since the next addrmap
+     entry defines the end of the range).  */
+  int previous_matched;
 };
 
-/* A cleanup function used by make_cleanup_discard_psymtabs.  */
+/* Helper function for dump_psymtab_addrmap to print an addrmap entry.  */
 
-static void
-discard_psymtabs_upto (void *arg)
+static int
+dump_psymtab_addrmap_1 (void *datap, CORE_ADDR start_addr, void *obj)
 {
-  struct psymtab_state *state = arg;
+  struct dump_psymtab_addrmap_data *data
+    = (struct dump_psymtab_addrmap_data *) datap;
+  struct gdbarch *gdbarch = get_objfile_arch (data->objfile);
+  struct partial_symtab *addrmap_psymtab = (struct partial_symtab *) obj;
+  const char *psymtab_address_or_end = NULL;
+
+  QUIT;
+
+  if (data->psymtab == NULL
+      || data->psymtab == addrmap_psymtab)
+    psymtab_address_or_end = host_address_to_string (addrmap_psymtab);
+  else if (data->previous_matched)
+    psymtab_address_or_end = "<ends here>";
+
+  if (data->psymtab == NULL
+      || data->psymtab == addrmap_psymtab
+      || data->previous_matched)
+    {
+      fprintf_filtered (data->outfile, "  %s%s %s\n",
+                       data->psymtab != NULL ? "  " : "",
+                       paddress (gdbarch, start_addr),
+                       psymtab_address_or_end);
+    }
+
+  data->previous_matched = (data->psymtab == NULL
+                           || data->psymtab == addrmap_psymtab);
 
-  while (state->objfile->psymtabs != state->save)
-    discard_psymtab (state->objfile, state->objfile->psymtabs);
+  return 0;
 }
 
-/* Return a new cleanup that discards all psymtabs created in OBJFILE
-   after this function is called.  */
+/* Helper function for maintenance_print_psymbols to print the addrmap
+   of PSYMTAB.  If PSYMTAB is NULL print the entire addrmap.  */
 
-struct cleanup *
-make_cleanup_discard_psymtabs (struct objfile *objfile)
+static void
+dump_psymtab_addrmap (struct objfile *objfile, struct partial_symtab *psymtab,
+                     struct ui_file *outfile)
 {
-  struct psymtab_state *state = XNEW (struct psymtab_state);
+  struct dump_psymtab_addrmap_data addrmap_dump_data;
 
-  state->objfile = objfile;
-  state->save = objfile->psymtabs;
-
-  return make_cleanup_dtor (discard_psymtabs_upto, state, xfree);
+  if ((psymtab == NULL
+       || psymtab->psymtabs_addrmap_supported)
+      && objfile->psymtabs_addrmap != NULL)
+    {
+      addrmap_dump_data.objfile = objfile;
+      addrmap_dump_data.psymtab = psymtab;
+      addrmap_dump_data.outfile = outfile;
+      addrmap_dump_data.previous_matched = 0;
+      fprintf_filtered (outfile, "%sddress map:\n",
+                       psymtab == NULL ? "Entire a" : "  A");
+      addrmap_foreach (objfile->psymtabs_addrmap, dump_psymtab_addrmap_1,
+                      &addrmap_dump_data);
+    }
 }
 
-\f
-
 static void
 maintenance_print_psymbols (char *args, int from_tty)
 {
   char **argv;
-  struct ui_file *outfile;
+  struct ui_file *outfile = gdb_stdout;
   struct cleanup *cleanups;
-  char *symname = NULL;
-  char *filename = DEV_TTY;
+  char *address_arg = NULL, *source_arg = NULL, *objfile_arg = NULL;
   struct objfile *objfile;
   struct partial_symtab *ps;
+  int i, outfile_idx, found;
+  CORE_ADDR pc = 0;
+  struct obj_section *section = NULL;
 
   dont_repeat ();
 
-  if (args == NULL)
-    {
-      error (_("\
-print-psymbols takes an output file name and optional symbol file name"));
-    }
   argv = gdb_buildargv (args);
   cleanups = make_cleanup_freeargv (argv);
 
-  if (argv[0] != NULL)
+  for (i = 0; argv != NULL && argv[i] != NULL; ++i)
     {
-      filename = argv[0];
-      /* If a second arg is supplied, it is a source file name to match on.  */
-      if (argv[1] != NULL)
+      if (strcmp (argv[i], "-pc") == 0)
        {
-         symname = argv[1];
+         if (argv[i + 1] == NULL)
+           error (_("Missing pc value"));
+         address_arg = argv[++i];
        }
+      else if (strcmp (argv[i], "-source") == 0)
+       {
+         if (argv[i + 1] == NULL)
+           error (_("Missing source file"));
+         source_arg = argv[++i];
+       }
+      else if (strcmp (argv[i], "-objfile") == 0)
+       {
+         if (argv[i + 1] == NULL)
+           error (_("Missing objfile name"));
+         objfile_arg = argv[++i];
+       }
+      else if (strcmp (argv[i], "--") == 0)
+       {
+         /* End of options.  */
+         ++i;
+         break;
+       }
+      else if (argv[i][0] == '-')
+       {
+         /* Future proofing: Don't allow OUTFILE to begin with "-".  */
+         error (_("Unknown option: %s"), argv[i]);
+       }
+      else
+       break;
     }
+  outfile_idx = i;
 
-  filename = tilde_expand (filename);
-  make_cleanup (xfree, filename);
+  if (address_arg != NULL && source_arg != NULL)
+    error (_("Must specify at most one of -pc and -source"));
 
-  outfile = gdb_fopen (filename, FOPEN_WT);
-  if (outfile == 0)
-    perror_with_name (filename);
-  make_cleanup_ui_file_delete (outfile);
+  stdio_file arg_outfile;
 
-  ALL_PSYMTABS (objfile, ps)
+  if (argv != NULL && argv[outfile_idx] != NULL)
+    {
+      char *outfile_name;
+
+      if (argv[outfile_idx + 1] != NULL)
+       error (_("Junk at end of command"));
+      outfile_name = tilde_expand (argv[outfile_idx]);
+      make_cleanup (xfree, outfile_name);
+      if (!arg_outfile.open (outfile_name, FOPEN_WT))
+       perror_with_name (outfile_name);
+      outfile = &arg_outfile;
+    }
+
+  if (address_arg != NULL)
+    {
+      pc = parse_and_eval_address (address_arg);
+      /* If we fail to find a section, that's ok, try the lookup anyway.  */
+      section = find_pc_section (pc);
+    }
+
+  found = 0;
+  ALL_OBJFILES (objfile)
     {
+      int printed_objfile_header = 0;
+      int print_for_objfile = 1;
+
       QUIT;
-      if (symname == NULL || filename_cmp (symname, ps->filename) == 0)
-       dump_psymtab (objfile, ps, outfile);
+      if (objfile_arg != NULL)
+       print_for_objfile
+         = compare_filenames_for_search (objfile_name (objfile),
+                                         objfile_arg);
+      if (!print_for_objfile)
+       continue;
+
+      if (address_arg != NULL)
+       {
+         struct bound_minimal_symbol msymbol = { NULL, NULL };
+
+         /* We don't assume each pc has a unique objfile (this is for
+            debugging).  */
+         ps = find_pc_sect_psymtab (objfile, pc, section, msymbol);
+         if (ps != NULL)
+           {
+             if (!printed_objfile_header)
+               {
+                 outfile->printf ("\nPartial symtabs for objfile %s\n",
+                                 objfile_name (objfile));
+                 printed_objfile_header = 1;
+               }
+             dump_psymtab (objfile, ps, outfile);
+             dump_psymtab_addrmap (objfile, ps, outfile);
+             found = 1;
+           }
+       }
+      else
+       {
+         ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps)
+           {
+             int print_for_source = 0;
+
+             QUIT;
+             if (source_arg != NULL)
+               {
+                 print_for_source
+                   = compare_filenames_for_search (ps->filename, source_arg);
+                 found = 1;
+               }
+             if (source_arg == NULL
+                 || print_for_source)
+               {
+                 if (!printed_objfile_header)
+                   {
+                     outfile->printf ("\nPartial symtabs for objfile %s\n",
+                                      objfile_name (objfile));
+                     printed_objfile_header = 1;
+                   }
+                 dump_psymtab (objfile, ps, outfile);
+                 dump_psymtab_addrmap (objfile, ps, outfile);
+               }
+           }
+       }
+
+      /* If we're printing all the objfile's symbols dump the full addrmap.  */
+
+      if (address_arg == NULL
+         && source_arg == NULL
+         && objfile->psymtabs_addrmap != NULL)
+       {
+         outfile->puts ("\n");
+         dump_psymtab_addrmap (objfile, NULL, outfile);
+       }
+    }
+
+  if (!found)
+    {
+      if (address_arg != NULL)
+       error (_("No partial symtab for address: %s"), address_arg);
+      if (source_arg != NULL)
+       error (_("No partial symtab for source file: %s"), source_arg);
     }
+
   do_cleanups (cleanups);
 }
 
 /* List all the partial symbol tables whose names match REGEXP (optional).  */
+
 static void
 maintenance_info_psymtabs (char *regexp, int from_tty)
 {
@@ -1974,14 +2097,14 @@ maintenance_info_psymtabs (char *regexp, int from_tty)
                {
                  printf_filtered ("{ objfile %s ", objfile_name (objfile));
                  wrap_here ("  ");
-                 printf_filtered ("((struct objfile *) %s)\n", 
+                 printf_filtered ("((struct objfile *) %s)\n",
                                   host_address_to_string (objfile));
                  printed_objfile_start = 1;
                }
 
              printf_filtered ("  { psymtab %s ", psymtab->filename);
              wrap_here ("    ");
-             printf_filtered ("((struct partial_symtab *) %s)\n", 
+             printf_filtered ("((struct partial_symtab *) %s)\n",
                               host_address_to_string (psymtab));
 
              printf_filtered ("    readin %s\n",
@@ -2032,7 +2155,7 @@ maintenance_info_psymtabs (char *regexp, int from_tty)
                      /* Note the string concatenation there --- no comma.  */
                      printf_filtered ("      psymtab %s "
                                       "((struct partial_symtab *) %s)\n",
-                                      dep->filename, 
+                                      dep->filename,
                                       host_address_to_string (dep));
                    }
                  printf_filtered ("    }\n");
@@ -2149,8 +2272,13 @@ _initialize_psymtab (void)
 {
   add_cmd ("psymbols", class_maintenance, maintenance_print_psymbols, _("\
 Print dump of current partial symbol definitions.\n\
-Entries in the partial symbol table are dumped to file OUTFILE.\n\
-If a SOURCE file is specified, dump only that file's partial symbols."),
+Usage: mt print psymbols [-objfile objfile] [-pc address] [--] [outfile]\n\
+       mt print psymbols [-objfile objfile] [-source source] [--] [outfile]\n\
+Entries in the partial symbol table are dumped to file OUTFILE,\n\
+or the terminal if OUTFILE is unspecified.\n\
+If ADDRESS is provided, dump only the file for that address.\n\
+If SOURCE is provided, dump only that file's symbols.\n\
+If OBJFILE is provided, dump only that file's minimal symbols."),
           &maintenanceprintlist);
 
   add_cmd ("psymtabs", class_maintenance, maintenance_info_psymtabs, _("\
This page took 0.042974 seconds and 4 git commands to generate.