Change representation of psymbol to flush out accessors
[external/binutils.git] / gdb / psymtab.c
1 /* Partial symbol tables.
2
3    Copyright (C) 2009-2018 Free Software Foundation, Inc.
4
5    This file is part of GDB.
6
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 3 of the License, or
10    (at your option) any later version.
11
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
19
20 #include "defs.h"
21 #include "symtab.h"
22 #include "psympriv.h"
23 #include "objfiles.h"
24 #include "block.h"
25 #include "filenames.h"
26 #include "source.h"
27 #include "addrmap.h"
28 #include "gdbtypes.h"
29 #include "bcache.h"
30 #include "ui-out.h"
31 #include "command.h"
32 #include "readline/readline.h"
33 #include "gdb_regex.h"
34 #include "dictionary.h"
35 #include "language.h"
36 #include "cp-support.h"
37 #include "gdbcmd.h"
38 #include <algorithm>
39 #include <set>
40
41 struct psymbol_bcache
42 {
43   struct bcache *bcache;
44 };
45
46 static struct partial_symbol *match_partial_symbol (struct objfile *,
47                                                     struct partial_symtab *,
48                                                     int,
49                                                     const char *, domain_enum,
50                                                     symbol_name_match_type,
51                                                     symbol_compare_ftype *);
52
53 static struct partial_symbol *lookup_partial_symbol (struct objfile *,
54                                                      struct partial_symtab *,
55                                                      const char *, int,
56                                                      domain_enum);
57
58 static const char *psymtab_to_fullname (struct partial_symtab *ps);
59
60 static struct partial_symbol *find_pc_sect_psymbol (struct objfile *,
61                                                     struct partial_symtab *,
62                                                     CORE_ADDR,
63                                                     struct obj_section *);
64
65 static void fixup_psymbol_section (struct partial_symbol *psym,
66                                    struct objfile *objfile);
67
68 static struct compunit_symtab *psymtab_to_symtab (struct objfile *objfile,
69                                                   struct partial_symtab *pst);
70
71 /* Ensure that the partial symbols for OBJFILE have been loaded.  This
72    function always returns its argument, as a convenience.  */
73
74 struct objfile *
75 require_partial_symbols (struct objfile *objfile, int verbose)
76 {
77   if ((objfile->flags & OBJF_PSYMTABS_READ) == 0)
78     {
79       objfile->flags |= OBJF_PSYMTABS_READ;
80
81       if (objfile->sf->sym_read_psymbols)
82         {
83           if (verbose)
84             {
85               printf_unfiltered (_("Reading symbols from %s..."),
86                                  objfile_name (objfile));
87               gdb_flush (gdb_stdout);
88             }
89           (*objfile->sf->sym_read_psymbols) (objfile);
90
91           /* Partial symbols list are not expected to changed after this
92              point.  */
93           objfile->global_psymbols.shrink_to_fit ();
94           objfile->static_psymbols.shrink_to_fit ();
95
96           if (verbose)
97             {
98               if (!objfile_has_symbols (objfile))
99                 {
100                   wrap_here ("");
101                   printf_unfiltered (_("(no debugging symbols found)..."));
102                   wrap_here ("");
103                 }
104
105               printf_unfiltered (_("done.\n"));
106             }
107         }
108     }
109
110   return objfile;
111 }
112
113 /* Traverse all psymtabs in one objfile, requiring that the psymtabs
114    be read in.  */
115
116 #define ALL_OBJFILE_PSYMTABS_REQUIRED(objfile, p)               \
117     for ((p) = require_partial_symbols (objfile, 1)->psymtabs;  \
118          (p) != NULL;                                           \
119          (p) = (p)->next)
120
121 /* We want to make sure this file always requires psymtabs.  */
122
123 #undef ALL_OBJFILE_PSYMTABS
124
125 /* Traverse all psymtabs in all objfiles.  */
126
127 #define ALL_PSYMTABS(objfile, p) \
128   ALL_OBJFILES (objfile)         \
129     ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, p)
130
131 /* Helper function for psym_map_symtabs_matching_filename that
132    expands the symtabs and calls the iterator.  */
133
134 static bool
135 partial_map_expand_apply (struct objfile *objfile,
136                           const char *name,
137                           const char *real_path,
138                           struct partial_symtab *pst,
139                           gdb::function_view<bool (symtab *)> callback)
140 {
141   struct compunit_symtab *last_made = objfile->compunit_symtabs;
142
143   /* Shared psymtabs should never be seen here.  Instead they should
144      be handled properly by the caller.  */
145   gdb_assert (pst->user == NULL);
146
147   /* Don't visit already-expanded psymtabs.  */
148   if (pst->readin)
149     return 0;
150
151   /* This may expand more than one symtab, and we want to iterate over
152      all of them.  */
153   psymtab_to_symtab (objfile, pst);
154
155   return iterate_over_some_symtabs (name, real_path, objfile->compunit_symtabs,
156                                     last_made, callback);
157 }
158
159 /*  Psymtab version of map_symtabs_matching_filename.  See its definition in
160     the definition of quick_symbol_functions in symfile.h.  */
161
162 static bool
163 psym_map_symtabs_matching_filename
164   (struct objfile *objfile,
165    const char *name,
166    const char *real_path,
167    gdb::function_view<bool (symtab *)> callback)
168 {
169   struct partial_symtab *pst;
170   const char *name_basename = lbasename (name);
171
172   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, pst)
173   {
174     /* We can skip shared psymtabs here, because any file name will be
175        attached to the unshared psymtab.  */
176     if (pst->user != NULL)
177       continue;
178
179     /* Anonymous psymtabs don't have a file name.  */
180     if (pst->anonymous)
181       continue;
182
183     if (compare_filenames_for_search (pst->filename, name))
184       {
185         if (partial_map_expand_apply (objfile, name, real_path,
186                                       pst, callback))
187           return true;
188         continue;
189       }
190
191     /* Before we invoke realpath, which can get expensive when many
192        files are involved, do a quick comparison of the basenames.  */
193     if (! basenames_may_differ
194         && FILENAME_CMP (name_basename, lbasename (pst->filename)) != 0)
195       continue;
196
197     if (compare_filenames_for_search (psymtab_to_fullname (pst), name))
198       {
199         if (partial_map_expand_apply (objfile, name, real_path,
200                                       pst, callback))
201           return true;
202         continue;
203       }
204
205     /* If the user gave us an absolute path, try to find the file in
206        this symtab and use its absolute path.  */
207     if (real_path != NULL)
208       {
209         gdb_assert (IS_ABSOLUTE_PATH (real_path));
210         gdb_assert (IS_ABSOLUTE_PATH (name));
211         if (filename_cmp (psymtab_to_fullname (pst), real_path) == 0)
212           {
213             if (partial_map_expand_apply (objfile, name, real_path,
214                                           pst, callback))
215               return true;
216             continue;
217           }
218       }
219   }
220
221   return false;
222 }
223
224 /* Find which partial symtab contains PC and SECTION starting at psymtab PST.
225    We may find a different psymtab than PST.  See FIND_PC_SECT_PSYMTAB.  */
226
227 static struct partial_symtab *
228 find_pc_sect_psymtab_closer (struct objfile *objfile,
229                              CORE_ADDR pc, struct obj_section *section,
230                              struct partial_symtab *pst,
231                              struct bound_minimal_symbol msymbol)
232 {
233   struct partial_symtab *tpst;
234   struct partial_symtab *best_pst = pst;
235   CORE_ADDR best_addr = pst->textlow;
236
237   gdb_assert (!pst->psymtabs_addrmap_supported);
238
239   /* An objfile that has its functions reordered might have
240      many partial symbol tables containing the PC, but
241      we want the partial symbol table that contains the
242      function containing the PC.  */
243   if (!(objfile->flags & OBJF_REORDERED)
244       && section == NULL)  /* Can't validate section this way.  */
245     return pst;
246
247   if (msymbol.minsym == NULL)
248     return pst;
249
250   /* The code range of partial symtabs sometimes overlap, so, in
251      the loop below, we need to check all partial symtabs and
252      find the one that fits better for the given PC address.  We
253      select the partial symtab that contains a symbol whose
254      address is closest to the PC address.  By closest we mean
255      that find_pc_sect_symbol returns the symbol with address
256      that is closest and still less than the given PC.  */
257   for (tpst = pst; tpst != NULL; tpst = tpst->next)
258     {
259       if (pc >= tpst->textlow && pc < tpst->texthigh)
260         {
261           struct partial_symbol *p;
262           CORE_ADDR this_addr;
263
264           /* NOTE: This assumes that every psymbol has a
265              corresponding msymbol, which is not necessarily
266              true; the debug info might be much richer than the
267              object's symbol table.  */
268           p = find_pc_sect_psymbol (objfile, tpst, pc, section);
269           if (p != NULL
270               && (p->value.address == BMSYMBOL_VALUE_ADDRESS (msymbol)))
271             return tpst;
272
273           /* Also accept the textlow value of a psymtab as a
274              "symbol", to provide some support for partial
275              symbol tables with line information but no debug
276              symbols (e.g. those produced by an assembler).  */
277           if (p != NULL)
278             this_addr = p->value.address;
279           else
280             this_addr = tpst->textlow;
281
282           /* Check whether it is closer than our current
283              BEST_ADDR.  Since this symbol address is
284              necessarily lower or equal to PC, the symbol closer
285              to PC is the symbol which address is the highest.
286              This way we return the psymtab which contains such
287              best match symbol.  This can help in cases where the
288              symbol information/debuginfo is not complete, like
289              for instance on IRIX6 with gcc, where no debug info
290              is emitted for statics.  (See also the nodebug.exp
291              testcase.)  */
292           if (this_addr > best_addr)
293             {
294               best_addr = this_addr;
295               best_pst = tpst;
296             }
297         }
298     }
299   return best_pst;
300 }
301
302 /* Find which partial symtab contains PC and SECTION.  Return NULL if
303    none.  We return the psymtab that contains a symbol whose address
304    exactly matches PC, or, if we cannot find an exact match, the
305    psymtab that contains a symbol whose address is closest to PC.  */
306
307 static struct partial_symtab *
308 find_pc_sect_psymtab (struct objfile *objfile, CORE_ADDR pc,
309                       struct obj_section *section,
310                       struct bound_minimal_symbol msymbol)
311 {
312   struct partial_symtab *pst;
313
314   /* Try just the PSYMTABS_ADDRMAP mapping first as it has better granularity
315      than the later used TEXTLOW/TEXTHIGH one.  */
316
317   if (objfile->psymtabs_addrmap != NULL)
318     {
319       pst = ((struct partial_symtab *)
320              addrmap_find (objfile->psymtabs_addrmap, pc));
321       if (pst != NULL)
322         {
323           /* FIXME: addrmaps currently do not handle overlayed sections,
324              so fall back to the non-addrmap case if we're debugging
325              overlays and the addrmap returned the wrong section.  */
326           if (overlay_debugging && msymbol.minsym != NULL && section != NULL)
327             {
328               struct partial_symbol *p;
329
330               /* NOTE: This assumes that every psymbol has a
331                  corresponding msymbol, which is not necessarily
332                  true; the debug info might be much richer than the
333                  object's symbol table.  */
334               p = find_pc_sect_psymbol (objfile, pst, pc, section);
335               if (p == NULL
336                   || (p->value.address != BMSYMBOL_VALUE_ADDRESS (msymbol)))
337                 goto next;
338             }
339
340           /* We do not try to call FIND_PC_SECT_PSYMTAB_CLOSER as
341              PSYMTABS_ADDRMAP we used has already the best 1-byte
342              granularity and FIND_PC_SECT_PSYMTAB_CLOSER may mislead us into
343              a worse chosen section due to the TEXTLOW/TEXTHIGH ranges
344              overlap.  */
345
346           return pst;
347         }
348     }
349
350  next:
351
352   /* Existing PSYMTABS_ADDRMAP mapping is present even for PARTIAL_SYMTABs
353      which still have no corresponding full SYMTABs read.  But it is not
354      present for non-DWARF2 debug infos not supporting PSYMTABS_ADDRMAP in GDB
355      so far.  */
356
357   /* Check even OBJFILE with non-zero PSYMTABS_ADDRMAP as only several of
358      its CUs may be missing in PSYMTABS_ADDRMAP as they may be varying
359      debug info type in single OBJFILE.  */
360
361   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, pst)
362     if (!pst->psymtabs_addrmap_supported
363         && pc >= pst->textlow && pc < pst->texthigh)
364       {
365         struct partial_symtab *best_pst;
366
367         best_pst = find_pc_sect_psymtab_closer (objfile, pc, section, pst,
368                                                 msymbol);
369         if (best_pst != NULL)
370           return best_pst;
371       }
372
373   return NULL;
374 }
375
376 /* Psymtab version of find_pc_sect_compunit_symtab.  See its definition in
377    the definition of quick_symbol_functions in symfile.h.  */
378
379 static struct compunit_symtab *
380 psym_find_pc_sect_compunit_symtab (struct objfile *objfile,
381                                    struct bound_minimal_symbol msymbol,
382                                    CORE_ADDR pc,
383                                    struct obj_section *section,
384                                    int warn_if_readin)
385 {
386   struct partial_symtab *ps = find_pc_sect_psymtab (objfile, pc, section,
387                                                     msymbol);
388   if (ps != NULL)
389     {
390       if (warn_if_readin && ps->readin)
391         /* Might want to error() here (in case symtab is corrupt and
392            will cause a core dump), but maybe we can successfully
393            continue, so let's not.  */
394         warning (_("\
395 (Internal error: pc %s in read in psymtab, but not in symtab.)\n"),
396                  paddress (get_objfile_arch (objfile), pc));
397       psymtab_to_symtab (objfile, ps);
398       return ps->compunit_symtab;
399     }
400   return NULL;
401 }
402
403 /* Find which partial symbol within a psymtab matches PC and SECTION.
404    Return NULL if none.  */
405
406 static struct partial_symbol *
407 find_pc_sect_psymbol (struct objfile *objfile,
408                       struct partial_symtab *psymtab, CORE_ADDR pc,
409                       struct obj_section *section)
410 {
411   struct partial_symbol *best = NULL;
412   CORE_ADDR best_pc;
413
414   gdb_assert (psymtab != NULL);
415
416   /* Cope with programs that start at address 0.  */
417   best_pc = (psymtab->textlow != 0) ? psymtab->textlow - 1 : 0;
418
419   /* Search the global symbols as well as the static symbols, so that
420      find_pc_partial_function doesn't use a minimal symbol and thus
421      cache a bad endaddr.  */
422   for (int i = 0; i < psymtab->n_global_syms; i++)
423     {
424       partial_symbol *p = objfile->global_psymbols[psymtab->globals_offset + i];
425
426       if (p->domain == VAR_DOMAIN
427           && p->aclass == LOC_BLOCK
428           && pc >= p->value.address
429           && (p->value.address > best_pc
430               || (psymtab->textlow == 0
431                   && best_pc == 0 && p->value.address == 0)))
432         {
433           if (section != NULL)  /* Match on a specific section.  */
434             {
435               fixup_psymbol_section (p, objfile);
436               if (!matching_obj_sections (p->obj_section (objfile),
437                                           section))
438                 continue;
439             }
440           best_pc = p->value.address;
441           best = p;
442         }
443     }
444
445   for (int i = 0; i < psymtab->n_static_syms; i++)
446     {
447       partial_symbol *p = objfile->static_psymbols[psymtab->statics_offset + i];
448
449       if (p->domain == VAR_DOMAIN
450           && p->aclass == LOC_BLOCK
451           && pc >= p->value.address
452           && (p->value.address > best_pc
453               || (psymtab->textlow == 0
454                   && best_pc == 0 && p->value.address == 0)))
455         {
456           if (section != NULL)  /* Match on a specific section.  */
457             {
458               fixup_psymbol_section (p, objfile);
459               if (!matching_obj_sections (p->obj_section (objfile),
460                                           section))
461                 continue;
462             }
463           best_pc = p->value.address;
464           best = p;
465         }
466     }
467
468   return best;
469 }
470
471 static void
472 fixup_psymbol_section (struct partial_symbol *psym, struct objfile *objfile)
473 {
474   CORE_ADDR addr;
475
476   if (psym == NULL)
477     return;
478
479   if (psym->section >= 0)
480     return;
481
482   gdb_assert (objfile);
483
484   switch (psym->aclass)
485     {
486     case LOC_STATIC:
487     case LOC_LABEL:
488     case LOC_BLOCK:
489       addr = psym->value.address;
490       break;
491     default:
492       /* Nothing else will be listed in the minsyms -- no use looking
493          it up.  */
494       return;
495     }
496
497   fixup_section (psym, addr, objfile);
498 }
499
500 /* Psymtab version of lookup_symbol.  See its definition in
501    the definition of quick_symbol_functions in symfile.h.  */
502
503 static struct compunit_symtab *
504 psym_lookup_symbol (struct objfile *objfile,
505                     int block_index, const char *name,
506                     const domain_enum domain)
507 {
508   struct partial_symtab *ps;
509   const int psymtab_index = (block_index == GLOBAL_BLOCK ? 1 : 0);
510   struct compunit_symtab *stab_best = NULL;
511
512   lookup_name_info lookup_name (name, symbol_name_match_type::FULL);
513
514   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps)
515   {
516     if (!ps->readin && lookup_partial_symbol (objfile, ps, name,
517                                               psymtab_index, domain))
518       {
519         struct symbol *sym, *with_opaque = NULL;
520         struct compunit_symtab *stab = psymtab_to_symtab (objfile, ps);
521         /* Note: While psymtab_to_symtab can return NULL if the partial symtab
522            is empty, we can assume it won't here because lookup_partial_symbol
523            succeeded.  */
524         const struct blockvector *bv = COMPUNIT_BLOCKVECTOR (stab);
525         struct block *block = BLOCKVECTOR_BLOCK (bv, block_index);
526
527         sym = block_find_symbol (block, name, domain,
528                                  block_find_non_opaque_type_preferred,
529                                  &with_opaque);
530
531         /* Some caution must be observed with overloaded functions
532            and methods, since the index will not contain any overload
533            information (but NAME might contain it).  */
534
535         if (sym != NULL
536             && SYMBOL_MATCHES_SEARCH_NAME (sym, lookup_name))
537           return stab;
538         if (with_opaque != NULL
539             && SYMBOL_MATCHES_SEARCH_NAME (with_opaque, lookup_name))
540           stab_best = stab;
541
542         /* Keep looking through other psymtabs.  */
543       }
544   }
545
546   return stab_best;
547 }
548
549 /* Returns true if PSYM matches LOOKUP_NAME.  */
550
551 static bool
552 psymbol_name_matches (partial_symbol *psym,
553                       const lookup_name_info &lookup_name)
554 {
555   const language_defn *lang = language_def (psym->language);
556   symbol_name_matcher_ftype *name_match
557     = get_symbol_name_matcher (lang, lookup_name);
558   return name_match (symbol_search_name (psym), lookup_name, NULL);
559 }
560
561 /* Look in PST for a symbol in DOMAIN whose name matches NAME.  Search
562    the global block of PST if GLOBAL, and otherwise the static block.
563    MATCH is the comparison operation that returns true iff MATCH (s,
564    NAME), where s is a SYMBOL_SEARCH_NAME.  If ORDERED_COMPARE is
565    non-null, the symbols in the block are assumed to be ordered
566    according to it (allowing binary search).  It must be compatible
567    with MATCH.  Returns the symbol, if found, and otherwise NULL.  */
568
569 static struct partial_symbol *
570 match_partial_symbol (struct objfile *objfile,
571                       struct partial_symtab *pst, int global,
572                       const char *name, domain_enum domain,
573                       symbol_name_match_type match_type,
574                       symbol_compare_ftype *ordered_compare)
575 {
576   struct partial_symbol **start, **psym;
577   struct partial_symbol **top, **real_top, **bottom, **center;
578   int length = (global ? pst->n_global_syms : pst->n_static_syms);
579   int do_linear_search = 1;
580
581   if (length == 0)
582     return NULL;
583
584   lookup_name_info lookup_name (name, match_type);
585
586   start = (global ?
587            &objfile->global_psymbols[pst->globals_offset] :
588            &objfile->static_psymbols[pst->statics_offset]);
589
590   if (global && ordered_compare)  /* Can use a binary search.  */
591     {
592       do_linear_search = 0;
593
594       /* Binary search.  This search is guaranteed to end with center
595          pointing at the earliest partial symbol whose name might be
596          correct.  At that point *all* partial symbols with an
597          appropriate name will be checked against the correct
598          domain.  */
599
600       bottom = start;
601       top = start + length - 1;
602       real_top = top;
603       while (top > bottom)
604         {
605           center = bottom + (top - bottom) / 2;
606           gdb_assert (center < top);
607
608           enum language lang = (*center)->language;
609           const char *lang_ln
610             = lookup_name.language_lookup_name (lang).c_str ();
611
612           if (ordered_compare (symbol_search_name (*center), lang_ln) >= 0)
613             top = center;
614           else
615             bottom = center + 1;
616         }
617       gdb_assert (top == bottom);
618
619       while (top <= real_top
620              && psymbol_name_matches (*top, lookup_name))
621         {
622           if (symbol_matches_domain ((*top)->language,
623                                      (*top)->domain, domain))
624             return *top;
625           top++;
626         }
627     }
628
629   /* Can't use a binary search or else we found during the binary search that
630      we should also do a linear search.  */
631
632   if (do_linear_search)
633     {
634       for (psym = start; psym < start + length; psym++)
635         {
636           if (symbol_matches_domain ((*psym)->language,
637                                      (*psym)->domain, domain)
638               && psymbol_name_matches (*psym, lookup_name))
639             return *psym;
640         }
641     }
642
643   return NULL;
644 }
645
646 /* Returns the name used to search psymtabs.  Unlike symtabs, psymtabs do
647    not contain any method/function instance information (since this would
648    force reading type information while reading psymtabs).  Therefore,
649    if NAME contains overload information, it must be stripped before searching
650    psymtabs.  */
651
652 static gdb::unique_xmalloc_ptr<char>
653 psymtab_search_name (const char *name)
654 {
655   switch (current_language->la_language)
656     {
657     case language_cplus:
658       {
659         if (strchr (name, '('))
660           {
661             gdb::unique_xmalloc_ptr<char> ret = cp_remove_params (name);
662
663             if (ret)
664               return ret;
665           }
666       }
667       break;
668
669     default:
670       break;
671     }
672
673   return gdb::unique_xmalloc_ptr<char> (xstrdup (name));
674 }
675
676 /* Look, in partial_symtab PST, for symbol whose natural name is NAME.
677    Check the global symbols if GLOBAL, the static symbols if not.  */
678
679 static struct partial_symbol *
680 lookup_partial_symbol (struct objfile *objfile,
681                        struct partial_symtab *pst, const char *name,
682                        int global, domain_enum domain)
683 {
684   struct partial_symbol **start, **psym;
685   struct partial_symbol **top, **real_top, **bottom, **center;
686   int length = (global ? pst->n_global_syms : pst->n_static_syms);
687   int do_linear_search = 1;
688
689   if (length == 0)
690     return NULL;
691
692   gdb::unique_xmalloc_ptr<char> search_name = psymtab_search_name (name);
693
694   lookup_name_info lookup_name (search_name.get (), symbol_name_match_type::FULL);
695
696   start = (global ?
697            &objfile->global_psymbols[pst->globals_offset] :
698            &objfile->static_psymbols[pst->statics_offset]);
699
700   if (global)                   /* This means we can use a binary search.  */
701     {
702       do_linear_search = 0;
703
704       /* Binary search.  This search is guaranteed to end with center
705          pointing at the earliest partial symbol whose name might be
706          correct.  At that point *all* partial symbols with an
707          appropriate name will be checked against the correct
708          domain.  */
709
710       bottom = start;
711       top = start + length - 1;
712       real_top = top;
713       while (top > bottom)
714         {
715           center = bottom + (top - bottom) / 2;
716           if (!(center < top))
717             internal_error (__FILE__, __LINE__,
718                             _("failed internal consistency check"));
719           if (strcmp_iw_ordered (symbol_search_name (*center),
720                                  search_name.get ()) >= 0)
721             {
722               top = center;
723             }
724           else
725             {
726               bottom = center + 1;
727             }
728         }
729       if (!(top == bottom))
730         internal_error (__FILE__, __LINE__,
731                         _("failed internal consistency check"));
732
733       /* For `case_sensitivity == case_sensitive_off' strcmp_iw_ordered will
734          search more exactly than what matches SYMBOL_MATCHES_SEARCH_NAME.  */
735       while (top >= start && symbol_matches_search_name (*top, lookup_name))
736         top--;
737
738       /* Fixup to have a symbol which matches SYMBOL_MATCHES_SEARCH_NAME.  */
739       top++;
740
741       while (top <= real_top && symbol_matches_search_name (*top, lookup_name))
742         {
743           if (symbol_matches_domain ((*top)->language,
744                                      (*top)->domain, domain))
745             return *top;
746           top++;
747         }
748     }
749
750   /* Can't use a binary search or else we found during the binary search that
751      we should also do a linear search.  */
752
753   if (do_linear_search)
754     {
755       for (psym = start; psym < start + length; psym++)
756         {
757           if (symbol_matches_domain ((*psym)->language,
758                                      (*psym)->domain, domain)
759               && symbol_matches_search_name (*psym, lookup_name))
760             return *psym;
761         }
762     }
763
764   return NULL;
765 }
766
767 /* Get the symbol table that corresponds to a partial_symtab.
768    This is fast after the first time you do it.
769    The result will be NULL if the primary symtab has no symbols,
770    which can happen.  Otherwise the result is the primary symtab
771    that contains PST.  */
772
773 static struct compunit_symtab *
774 psymtab_to_symtab (struct objfile *objfile, struct partial_symtab *pst)
775 {
776   /* If it is a shared psymtab, find an unshared psymtab that includes
777      it.  Any such psymtab will do.  */
778   while (pst->user != NULL)
779     pst = pst->user;
780
781   /* If it's been looked up before, return it.  */
782   if (pst->compunit_symtab)
783     return pst->compunit_symtab;
784
785   /* If it has not yet been read in, read it.  */
786   if (!pst->readin)
787     {
788       scoped_restore decrementer = increment_reading_symtab ();
789
790       (*pst->read_symtab) (pst, objfile);
791     }
792
793   return pst->compunit_symtab;
794 }
795
796 /* Psymtab version of relocate.  See its definition in
797    the definition of quick_symbol_functions in symfile.h.  */
798
799 static void
800 psym_relocate (struct objfile *objfile,
801                const struct section_offsets *new_offsets,
802                const struct section_offsets *delta)
803 {
804   struct partial_symtab *p;
805
806   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, p)
807     {
808       p->textlow += ANOFFSET (delta, SECT_OFF_TEXT (objfile));
809       p->texthigh += ANOFFSET (delta, SECT_OFF_TEXT (objfile));
810     }
811
812   for (partial_symbol *psym : objfile->global_psymbols)
813     {
814       fixup_psymbol_section (psym, objfile);
815       if (psym->section >= 0)
816         psym->value.address += ANOFFSET (delta, psym->section);
817     }
818   for (partial_symbol *psym : objfile->static_psymbols)
819     {
820       fixup_psymbol_section (psym, objfile);
821       if (psym->section >= 0)
822         psym->value.address += ANOFFSET (delta, psym->section);
823     }
824
825   objfile->psymbol_map.clear ();
826 }
827
828 /* Psymtab version of find_last_source_symtab.  See its definition in
829    the definition of quick_symbol_functions in symfile.h.  */
830
831 static struct symtab *
832 psym_find_last_source_symtab (struct objfile *ofp)
833 {
834   struct partial_symtab *ps;
835   struct partial_symtab *cs_pst = NULL;
836
837   ALL_OBJFILE_PSYMTABS_REQUIRED (ofp, ps)
838     {
839       const char *name = ps->filename;
840       int len = strlen (name);
841
842       if (!(len > 2 && (strcmp (&name[len - 2], ".h") == 0
843                         || strcmp (name, "<<C++-namespaces>>") == 0)))
844         cs_pst = ps;
845     }
846
847   if (cs_pst)
848     {
849       if (cs_pst->readin)
850         {
851           internal_error (__FILE__, __LINE__,
852                           _("select_source_symtab: "
853                           "readin pst found and no symtabs."));
854         }
855       else
856         {
857           struct compunit_symtab *cust = psymtab_to_symtab (ofp, cs_pst);
858
859           if (cust == NULL)
860             return NULL;
861           return compunit_primary_filetab (cust);
862         }
863     }
864   return NULL;
865 }
866
867 /* Psymtab version of forget_cached_source_info.  See its definition in
868    the definition of quick_symbol_functions in symfile.h.  */
869
870 static void
871 psym_forget_cached_source_info (struct objfile *objfile)
872 {
873   struct partial_symtab *pst;
874
875   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, pst)
876     {
877       if (pst->fullname != NULL)
878         {
879           xfree (pst->fullname);
880           pst->fullname = NULL;
881         }
882     }
883 }
884
885 static void
886 print_partial_symbols (struct gdbarch *gdbarch,
887                        struct partial_symbol **p, int count, const char *what,
888                        struct ui_file *outfile)
889 {
890   fprintf_filtered (outfile, "  %s partial symbols:\n", what);
891   while (count-- > 0)
892     {
893       QUIT;
894       fprintf_filtered (outfile, "    `%s'", (*p)->name);
895       if (symbol_demangled_name (*p) != NULL)
896         {
897           fprintf_filtered (outfile, "  `%s'", symbol_demangled_name (*p));
898         }
899       fputs_filtered (", ", outfile);
900       switch ((*p)->domain)
901         {
902         case UNDEF_DOMAIN:
903           fputs_filtered ("undefined domain, ", outfile);
904           break;
905         case VAR_DOMAIN:
906           /* This is the usual thing -- don't print it.  */
907           break;
908         case STRUCT_DOMAIN:
909           fputs_filtered ("struct domain, ", outfile);
910           break;
911         case LABEL_DOMAIN:
912           fputs_filtered ("label domain, ", outfile);
913           break;
914         default:
915           fputs_filtered ("<invalid domain>, ", outfile);
916           break;
917         }
918       switch ((*p)->aclass)
919         {
920         case LOC_UNDEF:
921           fputs_filtered ("undefined", outfile);
922           break;
923         case LOC_CONST:
924           fputs_filtered ("constant int", outfile);
925           break;
926         case LOC_STATIC:
927           fputs_filtered ("static", outfile);
928           break;
929         case LOC_REGISTER:
930           fputs_filtered ("register", outfile);
931           break;
932         case LOC_ARG:
933           fputs_filtered ("pass by value", outfile);
934           break;
935         case LOC_REF_ARG:
936           fputs_filtered ("pass by reference", outfile);
937           break;
938         case LOC_REGPARM_ADDR:
939           fputs_filtered ("register address parameter", outfile);
940           break;
941         case LOC_LOCAL:
942           fputs_filtered ("stack parameter", outfile);
943           break;
944         case LOC_TYPEDEF:
945           fputs_filtered ("type", outfile);
946           break;
947         case LOC_LABEL:
948           fputs_filtered ("label", outfile);
949           break;
950         case LOC_BLOCK:
951           fputs_filtered ("function", outfile);
952           break;
953         case LOC_CONST_BYTES:
954           fputs_filtered ("constant bytes", outfile);
955           break;
956         case LOC_UNRESOLVED:
957           fputs_filtered ("unresolved", outfile);
958           break;
959         case LOC_OPTIMIZED_OUT:
960           fputs_filtered ("optimized out", outfile);
961           break;
962         case LOC_COMPUTED:
963           fputs_filtered ("computed at runtime", outfile);
964           break;
965         default:
966           fputs_filtered ("<invalid location>", outfile);
967           break;
968         }
969       fputs_filtered (", ", outfile);
970       fputs_filtered (paddress (gdbarch, (*p)->value.address), outfile);
971       fprintf_filtered (outfile, "\n");
972       p++;
973     }
974 }
975
976 static void
977 dump_psymtab (struct objfile *objfile, struct partial_symtab *psymtab,
978               struct ui_file *outfile)
979 {
980   struct gdbarch *gdbarch = get_objfile_arch (objfile);
981   int i;
982
983   if (psymtab->anonymous)
984     {
985       fprintf_filtered (outfile, "\nAnonymous partial symtab (%s) ",
986                         psymtab->filename);
987     }
988   else
989     {
990       fprintf_filtered (outfile, "\nPartial symtab for source file %s ",
991                         psymtab->filename);
992     }
993   fprintf_filtered (outfile, "(object ");
994   gdb_print_host_address (psymtab, outfile);
995   fprintf_filtered (outfile, ")\n\n");
996   fprintf_unfiltered (outfile, "  Read from object file %s (",
997                       objfile_name (objfile));
998   gdb_print_host_address (objfile, outfile);
999   fprintf_unfiltered (outfile, ")\n");
1000
1001   if (psymtab->readin)
1002     {
1003       fprintf_filtered (outfile,
1004                         "  Full symtab was read (at ");
1005       gdb_print_host_address (psymtab->compunit_symtab, outfile);
1006       fprintf_filtered (outfile, " by function at ");
1007       gdb_print_host_address (psymtab->read_symtab, outfile);
1008       fprintf_filtered (outfile, ")\n");
1009     }
1010
1011   fprintf_filtered (outfile, "  Symbols cover text addresses ");
1012   fputs_filtered (paddress (gdbarch, psymtab->textlow), outfile);
1013   fprintf_filtered (outfile, "-");
1014   fputs_filtered (paddress (gdbarch, psymtab->texthigh), outfile);
1015   fprintf_filtered (outfile, "\n");
1016   fprintf_filtered (outfile, "  Address map supported - %s.\n",
1017                     psymtab->psymtabs_addrmap_supported ? "yes" : "no");
1018   fprintf_filtered (outfile, "  Depends on %d other partial symtabs.\n",
1019                     psymtab->number_of_dependencies);
1020   for (i = 0; i < psymtab->number_of_dependencies; i++)
1021     {
1022       fprintf_filtered (outfile, "    %d ", i);
1023       gdb_print_host_address (psymtab->dependencies[i], outfile);
1024       fprintf_filtered (outfile, " %s\n",
1025                         psymtab->dependencies[i]->filename);
1026     }
1027   if (psymtab->user != NULL)
1028     {
1029       fprintf_filtered (outfile, "  Shared partial symtab with user ");
1030       gdb_print_host_address (psymtab->user, outfile);
1031       fprintf_filtered (outfile, "\n");
1032     }
1033   if (psymtab->n_global_syms > 0)
1034     {
1035       print_partial_symbols (gdbarch,
1036                              &objfile->global_psymbols[psymtab->globals_offset],
1037                              psymtab->n_global_syms, "Global", outfile);
1038     }
1039   if (psymtab->n_static_syms > 0)
1040     {
1041       print_partial_symbols (gdbarch,
1042                              &objfile->static_psymbols[psymtab->statics_offset],
1043                              psymtab->n_static_syms, "Static", outfile);
1044     }
1045   fprintf_filtered (outfile, "\n");
1046 }
1047
1048 /* Psymtab version of print_stats.  See its definition in
1049    the definition of quick_symbol_functions in symfile.h.  */
1050
1051 static void
1052 psym_print_stats (struct objfile *objfile)
1053 {
1054   int i;
1055   struct partial_symtab *ps;
1056
1057   i = 0;
1058   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps)
1059     {
1060       if (ps->readin == 0)
1061         i++;
1062     }
1063   printf_filtered (_("  Number of psym tables (not yet expanded): %d\n"), i);
1064 }
1065
1066 /* Psymtab version of dump.  See its definition in
1067    the definition of quick_symbol_functions in symfile.h.  */
1068
1069 static void
1070 psym_dump (struct objfile *objfile)
1071 {
1072   struct partial_symtab *psymtab;
1073
1074   if (objfile->psymtabs)
1075     {
1076       printf_filtered ("Psymtabs:\n");
1077       for (psymtab = objfile->psymtabs;
1078            psymtab != NULL;
1079            psymtab = psymtab->next)
1080         {
1081           printf_filtered ("%s at ",
1082                            psymtab->filename);
1083           gdb_print_host_address (psymtab, gdb_stdout);
1084           printf_filtered (", ");
1085           wrap_here ("  ");
1086         }
1087       printf_filtered ("\n\n");
1088     }
1089 }
1090
1091 /* Psymtab version of expand_symtabs_for_function.  See its definition in
1092    the definition of quick_symbol_functions in symfile.h.  */
1093
1094 static void
1095 psym_expand_symtabs_for_function (struct objfile *objfile,
1096                                   const char *func_name)
1097 {
1098   struct partial_symtab *ps;
1099
1100   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps)
1101   {
1102     if (ps->readin)
1103       continue;
1104
1105     if ((lookup_partial_symbol (objfile, ps, func_name, 1, VAR_DOMAIN)
1106          != NULL)
1107         || (lookup_partial_symbol (objfile, ps, func_name, 0, VAR_DOMAIN)
1108             != NULL))
1109       psymtab_to_symtab (objfile, ps);
1110   }
1111 }
1112
1113 /* Psymtab version of expand_all_symtabs.  See its definition in
1114    the definition of quick_symbol_functions in symfile.h.  */
1115
1116 static void
1117 psym_expand_all_symtabs (struct objfile *objfile)
1118 {
1119   struct partial_symtab *psymtab;
1120
1121   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, psymtab)
1122     {
1123       psymtab_to_symtab (objfile, psymtab);
1124     }
1125 }
1126
1127 /* Psymtab version of expand_symtabs_with_fullname.  See its definition in
1128    the definition of quick_symbol_functions in symfile.h.  */
1129
1130 static void
1131 psym_expand_symtabs_with_fullname (struct objfile *objfile,
1132                                    const char *fullname)
1133 {
1134   struct partial_symtab *p;
1135
1136   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, p)
1137     {
1138       /* Anonymous psymtabs don't have a name of a source file.  */
1139       if (p->anonymous)
1140         continue;
1141
1142       /* psymtab_to_fullname tries to open the file which is slow.
1143          Don't call it if we know the basenames don't match.  */
1144       if ((basenames_may_differ
1145            || filename_cmp (lbasename (fullname), lbasename (p->filename)) == 0)
1146           && filename_cmp (fullname, psymtab_to_fullname (p)) == 0)
1147         psymtab_to_symtab (objfile, p);
1148     }
1149 }
1150
1151 /* Psymtab version of map_symbol_filenames.  See its definition in
1152    the definition of quick_symbol_functions in symfile.h.  */
1153
1154 static void
1155 psym_map_symbol_filenames (struct objfile *objfile,
1156                            symbol_filename_ftype *fun, void *data,
1157                            int need_fullname)
1158 {
1159   struct partial_symtab *ps;
1160
1161   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps)
1162     {
1163       const char *fullname;
1164
1165       if (ps->readin)
1166         continue;
1167
1168       /* We can skip shared psymtabs here, because any file name will be
1169          attached to the unshared psymtab.  */
1170       if (ps->user != NULL)
1171         continue;
1172
1173       /* Anonymous psymtabs don't have a file name.  */
1174       if (ps->anonymous)
1175         continue;
1176
1177       QUIT;
1178       if (need_fullname)
1179         fullname = psymtab_to_fullname (ps);
1180       else
1181         fullname = NULL;
1182       (*fun) (ps->filename, fullname, data);
1183     }
1184 }
1185
1186 /* Finds the fullname that a partial_symtab represents.
1187
1188    If this functions finds the fullname, it will save it in ps->fullname
1189    and it will also return the value.
1190
1191    If this function fails to find the file that this partial_symtab represents,
1192    NULL will be returned and ps->fullname will be set to NULL.  */
1193
1194 static const char *
1195 psymtab_to_fullname (struct partial_symtab *ps)
1196 {
1197   gdb_assert (!ps->anonymous);
1198
1199   /* Use cached copy if we have it.
1200      We rely on forget_cached_source_info being called appropriately
1201      to handle cases like the file being moved.  */
1202   if (ps->fullname == NULL)
1203     {
1204       gdb::unique_xmalloc_ptr<char> fullname;
1205       int fd = find_and_open_source (ps->filename, ps->dirname, &fullname);
1206       ps->fullname = fullname.release ();
1207
1208       if (fd >= 0)
1209         close (fd);
1210       else
1211         {
1212           /* rewrite_source_path would be applied by find_and_open_source, we
1213              should report the pathname where GDB tried to find the file.  */
1214
1215           if (ps->dirname == NULL || IS_ABSOLUTE_PATH (ps->filename))
1216             fullname.reset (xstrdup (ps->filename));
1217           else
1218             fullname.reset (concat (ps->dirname, SLASH_STRING,
1219                                     ps->filename, (char *) NULL));
1220
1221           ps->fullname = rewrite_source_path (fullname.get ()).release ();
1222           if (ps->fullname == NULL)
1223             ps->fullname = fullname.release ();
1224         }
1225     }
1226
1227   return ps->fullname;
1228 }
1229
1230 /* For all symbols, s, in BLOCK that are in DOMAIN and match NAME
1231    according to the function MATCH, call CALLBACK(BLOCK, s, DATA).
1232    BLOCK is assumed to come from OBJFILE.  Returns 1 iff CALLBACK
1233    ever returns non-zero, and otherwise returns 0.  */
1234
1235 static int
1236 map_block (const char *name, domain_enum domain, struct objfile *objfile,
1237            struct block *block,
1238            int (*callback) (struct block *, struct symbol *, void *),
1239            void *data, symbol_name_match_type match)
1240 {
1241   struct block_iterator iter;
1242   struct symbol *sym;
1243
1244   lookup_name_info lookup_name (name, match);
1245
1246   for (sym = block_iter_match_first (block, lookup_name, &iter);
1247        sym != NULL;
1248        sym = block_iter_match_next (lookup_name, &iter))
1249     {
1250       if (symbol_matches_domain (SYMBOL_LANGUAGE (sym),
1251                                  SYMBOL_DOMAIN (sym), domain))
1252         {
1253           if (callback (block, sym, data))
1254             return 1;
1255         }
1256     }
1257
1258   return 0;
1259 }
1260
1261 /* Psymtab version of map_matching_symbols.  See its definition in
1262    the definition of quick_symbol_functions in symfile.h.  */
1263
1264 static void
1265 psym_map_matching_symbols (struct objfile *objfile,
1266                            const char *name, domain_enum domain,
1267                            int global,
1268                            int (*callback) (struct block *,
1269                                             struct symbol *, void *),
1270                            void *data,
1271                            symbol_name_match_type match,
1272                            symbol_compare_ftype *ordered_compare)
1273 {
1274   const int block_kind = global ? GLOBAL_BLOCK : STATIC_BLOCK;
1275   struct partial_symtab *ps;
1276
1277   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps)
1278     {
1279       QUIT;
1280       if (ps->readin
1281           || match_partial_symbol (objfile, ps, global, name, domain, match,
1282                                    ordered_compare))
1283         {
1284           struct compunit_symtab *cust = psymtab_to_symtab (objfile, ps);
1285           struct block *block;
1286
1287           if (cust == NULL)
1288             continue;
1289           block = BLOCKVECTOR_BLOCK (COMPUNIT_BLOCKVECTOR (cust), block_kind);
1290           if (map_block (name, domain, objfile, block,
1291                          callback, data, match))
1292             return;
1293           if (callback (block, NULL, data))
1294             return;
1295         }
1296     }
1297 }
1298
1299 /* A helper for psym_expand_symtabs_matching that handles searching
1300    included psymtabs.  This returns true if a symbol is found, and
1301    false otherwise.  It also updates the 'searched_flag' on the
1302    various psymtabs that it searches.  */
1303
1304 static bool
1305 recursively_search_psymtabs
1306   (struct partial_symtab *ps, struct objfile *objfile, enum search_domain domain,
1307    const lookup_name_info &lookup_name,
1308    gdb::function_view<expand_symtabs_symbol_matcher_ftype> sym_matcher)
1309 {
1310   int keep_going = 1;
1311   enum psymtab_search_status result = PST_SEARCHED_AND_NOT_FOUND;
1312   int i;
1313
1314   if (ps->searched_flag != PST_NOT_SEARCHED)
1315     return ps->searched_flag == PST_SEARCHED_AND_FOUND;
1316
1317   /* Recurse into shared psymtabs first, because they may have already
1318      been searched, and this could save some time.  */
1319   for (i = 0; i < ps->number_of_dependencies; ++i)
1320     {
1321       int r;
1322
1323       /* Skip non-shared dependencies, these are handled elsewhere.  */
1324       if (ps->dependencies[i]->user == NULL)
1325         continue;
1326
1327       r = recursively_search_psymtabs (ps->dependencies[i],
1328                                        objfile, domain, lookup_name,
1329                                        sym_matcher);
1330       if (r != 0)
1331         {
1332           ps->searched_flag = PST_SEARCHED_AND_FOUND;
1333           return true;
1334         }
1335     }
1336
1337   partial_symbol **gbound
1338     = objfile->global_psymbols.data () + ps->globals_offset + ps->n_global_syms;
1339   partial_symbol **sbound
1340     = objfile->static_psymbols.data () + ps->statics_offset + ps->n_static_syms;
1341   partial_symbol **bound = gbound;
1342
1343   /* Go through all of the symbols stored in a partial
1344      symtab in one loop.  */
1345   partial_symbol **psym = objfile->global_psymbols.data () + ps->globals_offset;
1346   while (keep_going)
1347     {
1348       if (psym >= bound)
1349         {
1350           if (bound == gbound && ps->n_static_syms != 0)
1351             {
1352               psym = objfile->static_psymbols.data () + ps->statics_offset;
1353               bound = sbound;
1354             }
1355           else
1356             keep_going = 0;
1357           continue;
1358         }
1359       else
1360         {
1361           QUIT;
1362
1363           if ((domain == ALL_DOMAIN
1364                || (domain == VARIABLES_DOMAIN
1365                    && (*psym)->aclass != LOC_TYPEDEF
1366                    && (*psym)->aclass != LOC_BLOCK)
1367                || (domain == FUNCTIONS_DOMAIN
1368                    && (*psym)->aclass == LOC_BLOCK)
1369                || (domain == TYPES_DOMAIN
1370                    && (*psym)->aclass == LOC_TYPEDEF))
1371               && psymbol_name_matches (*psym, lookup_name)
1372               && (sym_matcher == NULL || sym_matcher (symbol_search_name (*psym))))
1373             {
1374               /* Found a match, so notify our caller.  */
1375               result = PST_SEARCHED_AND_FOUND;
1376               keep_going = 0;
1377             }
1378         }
1379       psym++;
1380     }
1381
1382   ps->searched_flag = result;
1383   return result == PST_SEARCHED_AND_FOUND;
1384 }
1385
1386 /* Psymtab version of expand_symtabs_matching.  See its definition in
1387    the definition of quick_symbol_functions in symfile.h.  */
1388
1389 static void
1390 psym_expand_symtabs_matching
1391   (struct objfile *objfile,
1392    gdb::function_view<expand_symtabs_file_matcher_ftype> file_matcher,
1393    const lookup_name_info &lookup_name_in,
1394    gdb::function_view<expand_symtabs_symbol_matcher_ftype> symbol_matcher,
1395    gdb::function_view<expand_symtabs_exp_notify_ftype> expansion_notify,
1396    enum search_domain domain)
1397 {
1398   struct partial_symtab *ps;
1399
1400   lookup_name_info lookup_name = lookup_name_in.make_ignore_params ();
1401
1402   /* Clear the search flags.  */
1403   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps)
1404     {
1405       ps->searched_flag = PST_NOT_SEARCHED;
1406     }
1407
1408   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps)
1409     {
1410       QUIT;
1411
1412       if (ps->readin)
1413         continue;
1414
1415       /* We skip shared psymtabs because file-matching doesn't apply
1416          to them; but we search them later in the loop.  */
1417       if (ps->user != NULL)
1418         continue;
1419
1420       if (file_matcher)
1421         {
1422           bool match;
1423
1424           if (ps->anonymous)
1425             continue;
1426
1427           match = file_matcher (ps->filename, false);
1428           if (!match)
1429             {
1430               /* Before we invoke realpath, which can get expensive when many
1431                  files are involved, do a quick comparison of the basenames.  */
1432               if (basenames_may_differ
1433                   || file_matcher (lbasename (ps->filename), true))
1434                 match = file_matcher (psymtab_to_fullname (ps), false);
1435             }
1436           if (!match)
1437             continue;
1438         }
1439
1440       if (recursively_search_psymtabs (ps, objfile, domain,
1441                                        lookup_name, symbol_matcher))
1442         {
1443           struct compunit_symtab *symtab =
1444             psymtab_to_symtab (objfile, ps);
1445
1446           if (expansion_notify != NULL)
1447             expansion_notify (symtab);
1448         }
1449     }
1450 }
1451
1452 /* Psymtab version of has_symbols.  See its definition in
1453    the definition of quick_symbol_functions in symfile.h.  */
1454
1455 static int
1456 psym_has_symbols (struct objfile *objfile)
1457 {
1458   return objfile->psymtabs != NULL;
1459 }
1460
1461 /* Helper function for psym_find_compunit_symtab_by_address that fills
1462    in psymbol_map for a given range of psymbols.  */
1463
1464 static void
1465 psym_fill_psymbol_map (struct objfile *objfile,
1466                        struct partial_symtab *psymtab,
1467                        std::set<CORE_ADDR> *seen_addrs,
1468                        const std::vector<partial_symbol *> &symbols,
1469                        int start,
1470                        int length)
1471 {
1472   for (int i = 0; i < length; ++i)
1473     {
1474       struct partial_symbol *psym = symbols[start + i];
1475
1476       if (psym->aclass == LOC_STATIC)
1477         {
1478           CORE_ADDR addr = psym->value.address;
1479           if (seen_addrs->find (addr) == seen_addrs->end ())
1480             {
1481               seen_addrs->insert (addr);
1482               objfile->psymbol_map.emplace_back (addr, psymtab);
1483             }
1484         }
1485     }
1486 }
1487
1488 /* See find_compunit_symtab_by_address in quick_symbol_functions, in
1489    symfile.h.  */
1490
1491 static compunit_symtab *
1492 psym_find_compunit_symtab_by_address (struct objfile *objfile,
1493                                       CORE_ADDR address)
1494 {
1495   if (objfile->psymbol_map.empty ())
1496     {
1497       struct partial_symtab *pst;
1498
1499       std::set<CORE_ADDR> seen_addrs;
1500
1501       ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, pst)
1502       {
1503         psym_fill_psymbol_map (objfile, pst,
1504                                &seen_addrs,
1505                                objfile->global_psymbols,
1506                                pst->globals_offset,
1507                                pst->n_global_syms);
1508         psym_fill_psymbol_map (objfile, pst,
1509                                &seen_addrs,
1510                                objfile->static_psymbols,
1511                                pst->statics_offset,
1512                                pst->n_static_syms);
1513       }
1514
1515       objfile->psymbol_map.shrink_to_fit ();
1516
1517       std::sort (objfile->psymbol_map.begin (), objfile->psymbol_map.end (),
1518                  [] (const std::pair<CORE_ADDR, partial_symtab *> &a,
1519                      const std::pair<CORE_ADDR, partial_symtab *> &b)
1520                  {
1521                    return a.first < b.first;
1522                  });
1523     }
1524
1525   auto iter = std::lower_bound
1526     (objfile->psymbol_map.begin (), objfile->psymbol_map.end (), address,
1527      [] (const std::pair<CORE_ADDR, partial_symtab *> &a,
1528          CORE_ADDR b)
1529      {
1530        return a.first < b;
1531      });
1532
1533   if (iter == objfile->psymbol_map.end () || iter->first != address)
1534     return NULL;
1535
1536   return psymtab_to_symtab (objfile, iter->second);
1537 }
1538
1539 const struct quick_symbol_functions psym_functions =
1540 {
1541   psym_has_symbols,
1542   psym_find_last_source_symtab,
1543   psym_forget_cached_source_info,
1544   psym_map_symtabs_matching_filename,
1545   psym_lookup_symbol,
1546   psym_print_stats,
1547   psym_dump,
1548   psym_relocate,
1549   psym_expand_symtabs_for_function,
1550   psym_expand_all_symtabs,
1551   psym_expand_symtabs_with_fullname,
1552   psym_map_matching_symbols,
1553   psym_expand_symtabs_matching,
1554   psym_find_pc_sect_compunit_symtab,
1555   psym_find_compunit_symtab_by_address,
1556   psym_map_symbol_filenames
1557 };
1558
1559 \f
1560
1561 static void
1562 sort_pst_symbols (struct objfile *objfile, struct partial_symtab *pst)
1563 {
1564   /* Sort the global list; don't sort the static list.  */
1565   auto begin = objfile->global_psymbols.begin ();
1566   std::advance (begin, pst->globals_offset);
1567
1568   /* The psymbols for this partial_symtab are currently at the end of the
1569      vector.  */
1570   auto end = objfile->global_psymbols.end ();
1571
1572   std::sort (begin, end, [] (partial_symbol *s1, partial_symbol *s2)
1573     {
1574       return strcmp_iw_ordered (symbol_search_name (s1),
1575                                 symbol_search_name (s2)) < 0;
1576     });
1577 }
1578
1579 /* Allocate and partially fill a partial symtab.  It will be
1580    completely filled at the end of the symbol list.
1581
1582    FILENAME is the name of the symbol-file we are reading from.  */
1583
1584 struct partial_symtab *
1585 start_psymtab_common (struct objfile *objfile,
1586                       const char *filename,
1587                       CORE_ADDR textlow,
1588                       std::vector<partial_symbol *> &global_psymbols,
1589                       std::vector<partial_symbol *> &static_psymbols)
1590 {
1591   struct partial_symtab *psymtab;
1592
1593   psymtab = allocate_psymtab (filename, objfile);
1594   psymtab->textlow = textlow;
1595   psymtab->texthigh = psymtab->textlow;         /* default */
1596   psymtab->globals_offset = global_psymbols.size ();
1597   psymtab->statics_offset = static_psymbols.size ();
1598   return psymtab;
1599 }
1600
1601 /* Perform "finishing up" operations of a partial symtab.  */
1602
1603 void
1604 end_psymtab_common (struct objfile *objfile, struct partial_symtab *pst)
1605 {
1606   pst->n_global_syms = objfile->global_psymbols.size () - pst->globals_offset;
1607   pst->n_static_syms = objfile->static_psymbols.size () - pst->statics_offset;
1608
1609   sort_pst_symbols (objfile, pst);
1610 }
1611
1612 /* Calculate a hash code for the given partial symbol.  The hash is
1613    calculated using the symbol's value, language, domain, class
1614    and name.  These are the values which are set by
1615    add_psymbol_to_bcache.  */
1616
1617 static unsigned long
1618 psymbol_hash (const void *addr, int length)
1619 {
1620   unsigned long h = 0;
1621   struct partial_symbol *psymbol = (struct partial_symbol *) addr;
1622   unsigned int lang = psymbol->language;
1623   unsigned int domain = psymbol->domain;
1624   unsigned int theclass = psymbol->aclass;
1625
1626   h = hash_continue (&psymbol->value, sizeof (psymbol->value), h);
1627   h = hash_continue (&lang, sizeof (unsigned int), h);
1628   h = hash_continue (&domain, sizeof (unsigned int), h);
1629   h = hash_continue (&theclass, sizeof (unsigned int), h);
1630   /* Note that psymbol names are interned via symbol_set_names, so
1631      there's no need to hash the contents of the name here.  */
1632   h = hash_continue (&psymbol->name,
1633                      sizeof (psymbol->name), h);
1634
1635   return h;
1636 }
1637
1638 /* Returns true if the symbol at addr1 equals the symbol at addr2.
1639    For the comparison this function uses a symbols value,
1640    language, domain, class and name.  */
1641
1642 static int
1643 psymbol_compare (const void *addr1, const void *addr2, int length)
1644 {
1645   struct partial_symbol *sym1 = (struct partial_symbol *) addr1;
1646   struct partial_symbol *sym2 = (struct partial_symbol *) addr2;
1647
1648   return (memcmp (&sym1->value, &sym2->value,
1649                   sizeof (sym1->value)) == 0
1650           && sym1->language == sym2->language
1651           && sym1->domain == sym2->domain
1652           && sym1->aclass == sym2->aclass
1653           /* Note that psymbol names are interned via
1654              symbol_set_names, so there's no need to compare the
1655              contents of the name here.  */
1656           && sym1->name == sym2->name);
1657 }
1658
1659 /* Initialize a partial symbol bcache.  */
1660
1661 struct psymbol_bcache *
1662 psymbol_bcache_init (void)
1663 {
1664   struct psymbol_bcache *bcache = XCNEW (struct psymbol_bcache);
1665
1666   bcache->bcache = bcache_xmalloc (psymbol_hash, psymbol_compare);
1667   return bcache;
1668 }
1669
1670 /* Free a partial symbol bcache.  */
1671
1672 void
1673 psymbol_bcache_free (struct psymbol_bcache *bcache)
1674 {
1675   if (bcache == NULL)
1676     return;
1677
1678   bcache_xfree (bcache->bcache);
1679   xfree (bcache);
1680 }
1681
1682 /* Return the internal bcache of the psymbol_bcache BCACHE.  */
1683
1684 struct bcache *
1685 psymbol_bcache_get_bcache (struct psymbol_bcache *bcache)
1686 {
1687   return bcache->bcache;
1688 }
1689
1690 /* Find a copy of the SYM in BCACHE.  If BCACHE has never seen this
1691    symbol before, add a copy to BCACHE.  In either case, return a pointer
1692    to BCACHE's copy of the symbol.  If optional ADDED is not NULL, return
1693    1 in case of new entry or 0 if returning an old entry.  */
1694
1695 static struct partial_symbol *
1696 psymbol_bcache_full (struct partial_symbol *sym,
1697                      struct psymbol_bcache *bcache,
1698                      int *added)
1699 {
1700   return ((struct partial_symbol *)
1701           bcache_full (sym, sizeof (struct partial_symbol), bcache->bcache,
1702                        added));
1703 }
1704
1705 /* Helper function, initialises partial symbol structure and stashes
1706    it into objfile's bcache.  Note that our caching mechanism will
1707    use all fields of struct partial_symbol to determine hash value of the
1708    structure.  In other words, having two symbols with the same name but
1709    different domain (or address) is possible and correct.  */
1710
1711 static struct partial_symbol *
1712 add_psymbol_to_bcache (const char *name, int namelength, int copy_name,
1713                        domain_enum domain,
1714                        enum address_class theclass,
1715                        CORE_ADDR coreaddr,
1716                        enum language language, struct objfile *objfile,
1717                        int *added)
1718 {
1719   struct partial_symbol psymbol;
1720
1721   psymbol.value.address = coreaddr;
1722   psymbol.section = -1;
1723   psymbol.domain = domain;
1724   psymbol.aclass = theclass;
1725
1726   memset (&psymbol.language_specific, 0, sizeof (psymbol.language_specific));
1727   psymbol.ada_mangled = 0;
1728   symbol_set_language (&psymbol, language, &objfile->objfile_obstack);
1729   symbol_set_names (&psymbol, name, namelength, copy_name, objfile);
1730
1731   /* Stash the partial symbol away in the cache.  */
1732   return psymbol_bcache_full (&psymbol, objfile->psymbol_cache, added);
1733 }
1734
1735 /* Helper function, adds partial symbol to the given partial symbol list.  */
1736
1737 static void
1738 append_psymbol_to_list (std::vector<partial_symbol *> *list,
1739                         struct partial_symbol *psym,
1740                         struct objfile *objfile)
1741 {
1742   list->push_back (psym);
1743   OBJSTAT (objfile, n_psyms++);
1744 }
1745
1746 /* Add a symbol with a long value to a psymtab.
1747    Since one arg is a struct, we pass in a ptr and deref it (sigh).
1748    The only value we need to store for psyms is an address.
1749    For all other psyms pass zero for COREADDR.
1750    Return the partial symbol that has been added.  */
1751
1752 void
1753 add_psymbol_to_list (const char *name, int namelength, int copy_name,
1754                      domain_enum domain,
1755                      enum address_class theclass,
1756                      std::vector<partial_symbol *> *list,
1757                      CORE_ADDR coreaddr,
1758                      enum language language, struct objfile *objfile)
1759 {
1760   struct partial_symbol *psym;
1761
1762   int added;
1763
1764   /* Stash the partial symbol away in the cache.  */
1765   psym = add_psymbol_to_bcache (name, namelength, copy_name, domain, theclass,
1766                                 coreaddr, language, objfile, &added);
1767
1768   /* Do not duplicate global partial symbols.  */
1769   if (list == &objfile->global_psymbols
1770       && !added)
1771     return;
1772
1773   /* Save pointer to partial symbol in psymtab, growing symtab if needed.  */
1774   append_psymbol_to_list (list, psym, objfile);
1775 }
1776
1777 /* Initialize storage for partial symbols.  */
1778
1779 void
1780 init_psymbol_list (struct objfile *objfile, int total_symbols)
1781 {
1782   /* Free any previously allocated psymbol lists.  */
1783   objfile->global_psymbols.clear ();
1784   objfile->static_psymbols.clear ();
1785
1786   /* Current best guess is that approximately a twentieth
1787      of the total symbols (in a debugging file) are global or static
1788      oriented symbols, then multiply that by slop factor of two.  */
1789   objfile->global_psymbols.reserve (total_symbols / 10);
1790   objfile->static_psymbols.reserve (total_symbols / 10);
1791 }
1792
1793 struct partial_symtab *
1794 allocate_psymtab (const char *filename, struct objfile *objfile)
1795 {
1796   struct partial_symtab *psymtab;
1797
1798   if (objfile->free_psymtabs)
1799     {
1800       psymtab = objfile->free_psymtabs;
1801       objfile->free_psymtabs = psymtab->next;
1802     }
1803   else
1804     psymtab = XOBNEW (&objfile->objfile_obstack, partial_symtab);
1805
1806   memset (psymtab, 0, sizeof (struct partial_symtab));
1807   psymtab->filename
1808     = (const char *) bcache (filename, strlen (filename) + 1,
1809                              objfile->per_bfd->filename_cache);
1810   psymtab->compunit_symtab = NULL;
1811
1812   /* Prepend it to the psymtab list for the objfile it belongs to.
1813      Psymtabs are searched in most recent inserted -> least recent
1814      inserted order.  */
1815
1816   psymtab->next = objfile->psymtabs;
1817   objfile->psymtabs = psymtab;
1818
1819   if (symtab_create_debug)
1820     {
1821       /* Be a bit clever with debugging messages, and don't print objfile
1822          every time, only when it changes.  */
1823       static char *last_objfile_name = NULL;
1824
1825       if (last_objfile_name == NULL
1826           || strcmp (last_objfile_name, objfile_name (objfile)) != 0)
1827         {
1828           xfree (last_objfile_name);
1829           last_objfile_name = xstrdup (objfile_name (objfile));
1830           fprintf_unfiltered (gdb_stdlog,
1831                               "Creating one or more psymtabs for objfile %s ...\n",
1832                               last_objfile_name);
1833         }
1834       fprintf_unfiltered (gdb_stdlog,
1835                           "Created psymtab %s for module %s.\n",
1836                           host_address_to_string (psymtab), filename);
1837     }
1838
1839   return psymtab;
1840 }
1841
1842 void
1843 discard_psymtab (struct objfile *objfile, struct partial_symtab *pst)
1844 {
1845   struct partial_symtab **prev_pst;
1846
1847   /* From dbxread.c:
1848      Empty psymtabs happen as a result of header files which don't
1849      have any symbols in them.  There can be a lot of them.  But this
1850      check is wrong, in that a psymtab with N_SLINE entries but
1851      nothing else is not empty, but we don't realize that.  Fixing
1852      that without slowing things down might be tricky.  */
1853
1854   /* First, snip it out of the psymtab chain.  */
1855
1856   prev_pst = &(objfile->psymtabs);
1857   while ((*prev_pst) != pst)
1858     prev_pst = &((*prev_pst)->next);
1859   (*prev_pst) = pst->next;
1860
1861   /* Next, put it on a free list for recycling.  */
1862
1863   pst->next = objfile->free_psymtabs;
1864   objfile->free_psymtabs = pst;
1865 }
1866
1867 \f
1868
1869 /* We need to pass a couple of items to the addrmap_foreach function,
1870    so use a struct.  */
1871
1872 struct dump_psymtab_addrmap_data
1873 {
1874   struct objfile *objfile;
1875   struct partial_symtab *psymtab;
1876   struct ui_file *outfile;
1877
1878   /* Non-zero if the previously printed addrmap entry was for PSYMTAB.
1879      If so, we want to print the next one as well (since the next addrmap
1880      entry defines the end of the range).  */
1881   int previous_matched;
1882 };
1883
1884 /* Helper function for dump_psymtab_addrmap to print an addrmap entry.  */
1885
1886 static int
1887 dump_psymtab_addrmap_1 (void *datap, CORE_ADDR start_addr, void *obj)
1888 {
1889   struct dump_psymtab_addrmap_data *data
1890     = (struct dump_psymtab_addrmap_data *) datap;
1891   struct gdbarch *gdbarch = get_objfile_arch (data->objfile);
1892   struct partial_symtab *addrmap_psymtab = (struct partial_symtab *) obj;
1893   const char *psymtab_address_or_end = NULL;
1894
1895   QUIT;
1896
1897   if (data->psymtab == NULL
1898       || data->psymtab == addrmap_psymtab)
1899     psymtab_address_or_end = host_address_to_string (addrmap_psymtab);
1900   else if (data->previous_matched)
1901     psymtab_address_or_end = "<ends here>";
1902
1903   if (data->psymtab == NULL
1904       || data->psymtab == addrmap_psymtab
1905       || data->previous_matched)
1906     {
1907       fprintf_filtered (data->outfile, "  %s%s %s\n",
1908                         data->psymtab != NULL ? "  " : "",
1909                         paddress (gdbarch, start_addr),
1910                         psymtab_address_or_end);
1911     }
1912
1913   data->previous_matched = (data->psymtab == NULL
1914                             || data->psymtab == addrmap_psymtab);
1915
1916   return 0;
1917 }
1918
1919 /* Helper function for maintenance_print_psymbols to print the addrmap
1920    of PSYMTAB.  If PSYMTAB is NULL print the entire addrmap.  */
1921
1922 static void
1923 dump_psymtab_addrmap (struct objfile *objfile, struct partial_symtab *psymtab,
1924                       struct ui_file *outfile)
1925 {
1926   struct dump_psymtab_addrmap_data addrmap_dump_data;
1927
1928   if ((psymtab == NULL
1929        || psymtab->psymtabs_addrmap_supported)
1930       && objfile->psymtabs_addrmap != NULL)
1931     {
1932       addrmap_dump_data.objfile = objfile;
1933       addrmap_dump_data.psymtab = psymtab;
1934       addrmap_dump_data.outfile = outfile;
1935       addrmap_dump_data.previous_matched = 0;
1936       fprintf_filtered (outfile, "%sddress map:\n",
1937                         psymtab == NULL ? "Entire a" : "  A");
1938       addrmap_foreach (objfile->psymtabs_addrmap, dump_psymtab_addrmap_1,
1939                        &addrmap_dump_data);
1940     }
1941 }
1942
1943 static void
1944 maintenance_print_psymbols (const char *args, int from_tty)
1945 {
1946   struct ui_file *outfile = gdb_stdout;
1947   char *address_arg = NULL, *source_arg = NULL, *objfile_arg = NULL;
1948   struct objfile *objfile;
1949   struct partial_symtab *ps;
1950   int i, outfile_idx, found;
1951   CORE_ADDR pc = 0;
1952   struct obj_section *section = NULL;
1953
1954   dont_repeat ();
1955
1956   gdb_argv argv (args);
1957
1958   for (i = 0; argv != NULL && argv[i] != NULL; ++i)
1959     {
1960       if (strcmp (argv[i], "-pc") == 0)
1961         {
1962           if (argv[i + 1] == NULL)
1963             error (_("Missing pc value"));
1964           address_arg = argv[++i];
1965         }
1966       else if (strcmp (argv[i], "-source") == 0)
1967         {
1968           if (argv[i + 1] == NULL)
1969             error (_("Missing source file"));
1970           source_arg = argv[++i];
1971         }
1972       else if (strcmp (argv[i], "-objfile") == 0)
1973         {
1974           if (argv[i + 1] == NULL)
1975             error (_("Missing objfile name"));
1976           objfile_arg = argv[++i];
1977         }
1978       else if (strcmp (argv[i], "--") == 0)
1979         {
1980           /* End of options.  */
1981           ++i;
1982           break;
1983         }
1984       else if (argv[i][0] == '-')
1985         {
1986           /* Future proofing: Don't allow OUTFILE to begin with "-".  */
1987           error (_("Unknown option: %s"), argv[i]);
1988         }
1989       else
1990         break;
1991     }
1992   outfile_idx = i;
1993
1994   if (address_arg != NULL && source_arg != NULL)
1995     error (_("Must specify at most one of -pc and -source"));
1996
1997   stdio_file arg_outfile;
1998
1999   if (argv != NULL && argv[outfile_idx] != NULL)
2000     {
2001       if (argv[outfile_idx + 1] != NULL)
2002         error (_("Junk at end of command"));
2003       gdb::unique_xmalloc_ptr<char> outfile_name
2004         (tilde_expand (argv[outfile_idx]));
2005       if (!arg_outfile.open (outfile_name.get (), FOPEN_WT))
2006         perror_with_name (outfile_name.get ());
2007       outfile = &arg_outfile;
2008     }
2009
2010   if (address_arg != NULL)
2011     {
2012       pc = parse_and_eval_address (address_arg);
2013       /* If we fail to find a section, that's ok, try the lookup anyway.  */
2014       section = find_pc_section (pc);
2015     }
2016
2017   found = 0;
2018   ALL_OBJFILES (objfile)
2019     {
2020       int printed_objfile_header = 0;
2021       int print_for_objfile = 1;
2022
2023       QUIT;
2024       if (objfile_arg != NULL)
2025         print_for_objfile
2026           = compare_filenames_for_search (objfile_name (objfile),
2027                                           objfile_arg);
2028       if (!print_for_objfile)
2029         continue;
2030
2031       if (address_arg != NULL)
2032         {
2033           struct bound_minimal_symbol msymbol = { NULL, NULL };
2034
2035           /* We don't assume each pc has a unique objfile (this is for
2036              debugging).  */
2037           ps = find_pc_sect_psymtab (objfile, pc, section, msymbol);
2038           if (ps != NULL)
2039             {
2040               if (!printed_objfile_header)
2041                 {
2042                   outfile->printf ("\nPartial symtabs for objfile %s\n",
2043                                   objfile_name (objfile));
2044                   printed_objfile_header = 1;
2045                 }
2046               dump_psymtab (objfile, ps, outfile);
2047               dump_psymtab_addrmap (objfile, ps, outfile);
2048               found = 1;
2049             }
2050         }
2051       else
2052         {
2053           ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps)
2054             {
2055               int print_for_source = 0;
2056
2057               QUIT;
2058               if (source_arg != NULL)
2059                 {
2060                   print_for_source
2061                     = compare_filenames_for_search (ps->filename, source_arg);
2062                   found = 1;
2063                 }
2064               if (source_arg == NULL
2065                   || print_for_source)
2066                 {
2067                   if (!printed_objfile_header)
2068                     {
2069                       outfile->printf ("\nPartial symtabs for objfile %s\n",
2070                                        objfile_name (objfile));
2071                       printed_objfile_header = 1;
2072                     }
2073                   dump_psymtab (objfile, ps, outfile);
2074                   dump_psymtab_addrmap (objfile, ps, outfile);
2075                 }
2076             }
2077         }
2078
2079       /* If we're printing all the objfile's symbols dump the full addrmap.  */
2080
2081       if (address_arg == NULL
2082           && source_arg == NULL
2083           && objfile->psymtabs_addrmap != NULL)
2084         {
2085           outfile->puts ("\n");
2086           dump_psymtab_addrmap (objfile, NULL, outfile);
2087         }
2088     }
2089
2090   if (!found)
2091     {
2092       if (address_arg != NULL)
2093         error (_("No partial symtab for address: %s"), address_arg);
2094       if (source_arg != NULL)
2095         error (_("No partial symtab for source file: %s"), source_arg);
2096     }
2097 }
2098
2099 /* List all the partial symbol tables whose names match REGEXP (optional).  */
2100
2101 static void
2102 maintenance_info_psymtabs (const char *regexp, int from_tty)
2103 {
2104   struct program_space *pspace;
2105   struct objfile *objfile;
2106
2107   if (regexp)
2108     re_comp (regexp);
2109
2110   ALL_PSPACES (pspace)
2111     ALL_PSPACE_OBJFILES (pspace, objfile)
2112     {
2113       struct gdbarch *gdbarch = get_objfile_arch (objfile);
2114       struct partial_symtab *psymtab;
2115
2116       /* We don't want to print anything for this objfile until we
2117          actually find a symtab whose name matches.  */
2118       int printed_objfile_start = 0;
2119
2120       ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, psymtab)
2121         {
2122           QUIT;
2123
2124           if (! regexp
2125               || re_exec (psymtab->filename))
2126             {
2127               if (! printed_objfile_start)
2128                 {
2129                   printf_filtered ("{ objfile %s ", objfile_name (objfile));
2130                   wrap_here ("  ");
2131                   printf_filtered ("((struct objfile *) %s)\n",
2132                                    host_address_to_string (objfile));
2133                   printed_objfile_start = 1;
2134                 }
2135
2136               printf_filtered ("  { psymtab %s ", psymtab->filename);
2137               wrap_here ("    ");
2138               printf_filtered ("((struct partial_symtab *) %s)\n",
2139                                host_address_to_string (psymtab));
2140
2141               printf_filtered ("    readin %s\n",
2142                                psymtab->readin ? "yes" : "no");
2143               printf_filtered ("    fullname %s\n",
2144                                psymtab->fullname
2145                                ? psymtab->fullname : "(null)");
2146               printf_filtered ("    text addresses ");
2147               fputs_filtered (paddress (gdbarch, psymtab->textlow),
2148                               gdb_stdout);
2149               printf_filtered (" -- ");
2150               fputs_filtered (paddress (gdbarch, psymtab->texthigh),
2151                               gdb_stdout);
2152               printf_filtered ("\n");
2153               printf_filtered ("    psymtabs_addrmap_supported %s\n",
2154                                (psymtab->psymtabs_addrmap_supported
2155                                 ? "yes" : "no"));
2156               printf_filtered ("    globals ");
2157               if (psymtab->n_global_syms)
2158                 {
2159                   auto p = &objfile->global_psymbols[psymtab->globals_offset];
2160
2161                   printf_filtered ("(* (struct partial_symbol **) %s @ %d)\n",
2162                                    host_address_to_string (p),
2163                                    psymtab->n_global_syms);
2164                 }
2165               else
2166                 printf_filtered ("(none)\n");
2167               printf_filtered ("    statics ");
2168               if (psymtab->n_static_syms)
2169                 {
2170                   auto p = &objfile->static_psymbols[psymtab->statics_offset];
2171
2172                   printf_filtered ("(* (struct partial_symbol **) %s @ %d)\n",
2173                                    host_address_to_string (p),
2174                                    psymtab->n_static_syms);
2175                 }
2176               else
2177                 printf_filtered ("(none)\n");
2178               printf_filtered ("    dependencies ");
2179               if (psymtab->number_of_dependencies)
2180                 {
2181                   int i;
2182
2183                   printf_filtered ("{\n");
2184                   for (i = 0; i < psymtab->number_of_dependencies; i++)
2185                     {
2186                       struct partial_symtab *dep = psymtab->dependencies[i];
2187
2188                       /* Note the string concatenation there --- no comma.  */
2189                       printf_filtered ("      psymtab %s "
2190                                        "((struct partial_symtab *) %s)\n",
2191                                        dep->filename,
2192                                        host_address_to_string (dep));
2193                     }
2194                   printf_filtered ("    }\n");
2195                 }
2196               else
2197                 printf_filtered ("(none)\n");
2198               printf_filtered ("  }\n");
2199             }
2200         }
2201
2202       if (printed_objfile_start)
2203         printf_filtered ("}\n");
2204     }
2205 }
2206
2207 /* Check consistency of currently expanded psymtabs vs symtabs.  */
2208
2209 static void
2210 maintenance_check_psymtabs (const char *ignore, int from_tty)
2211 {
2212   struct symbol *sym;
2213   struct compunit_symtab *cust = NULL;
2214   struct partial_symtab *ps;
2215   const struct blockvector *bv;
2216   struct objfile *objfile;
2217   struct block *b;
2218   int length;
2219
2220   ALL_PSYMTABS (objfile, ps)
2221   {
2222     struct gdbarch *gdbarch = get_objfile_arch (objfile);
2223
2224     /* We don't call psymtab_to_symtab here because that may cause symtab
2225        expansion.  When debugging a problem it helps if checkers leave
2226        things unchanged.  */
2227     cust = ps->compunit_symtab;
2228
2229     /* First do some checks that don't require the associated symtab.  */
2230     if (ps->texthigh < ps->textlow)
2231       {
2232         printf_filtered ("Psymtab ");
2233         puts_filtered (ps->filename);
2234         printf_filtered (" covers bad range ");
2235         fputs_filtered (paddress (gdbarch, ps->textlow), gdb_stdout);
2236         printf_filtered (" - ");
2237         fputs_filtered (paddress (gdbarch, ps->texthigh), gdb_stdout);
2238         printf_filtered ("\n");
2239         continue;
2240       }
2241
2242     /* Now do checks requiring the associated symtab.  */
2243     if (cust == NULL)
2244       continue;
2245     bv = COMPUNIT_BLOCKVECTOR (cust);
2246     b = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
2247     partial_symbol **psym = &objfile->static_psymbols[ps->statics_offset];
2248     length = ps->n_static_syms;
2249     while (length--)
2250       {
2251         sym = block_lookup_symbol (b, symbol_search_name (*psym),
2252                                    symbol_name_match_type::SEARCH_NAME,
2253                                    (*psym)->domain);
2254         if (!sym)
2255           {
2256             printf_filtered ("Static symbol `");
2257             puts_filtered ((*psym)->name);
2258             printf_filtered ("' only found in ");
2259             puts_filtered (ps->filename);
2260             printf_filtered (" psymtab\n");
2261           }
2262         psym++;
2263       }
2264     b = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
2265     psym = &objfile->global_psymbols[ps->globals_offset];
2266     length = ps->n_global_syms;
2267     while (length--)
2268       {
2269         sym = block_lookup_symbol (b, symbol_search_name (*psym),
2270                                    symbol_name_match_type::SEARCH_NAME,
2271                                    (*psym)->domain);
2272         if (!sym)
2273           {
2274             printf_filtered ("Global symbol `");
2275             puts_filtered ((*psym)->name);
2276             printf_filtered ("' only found in ");
2277             puts_filtered (ps->filename);
2278             printf_filtered (" psymtab\n");
2279           }
2280         psym++;
2281       }
2282     if (ps->texthigh != 0
2283         && (ps->textlow < BLOCK_START (b) || ps->texthigh > BLOCK_END (b)))
2284       {
2285         printf_filtered ("Psymtab ");
2286         puts_filtered (ps->filename);
2287         printf_filtered (" covers ");
2288         fputs_filtered (paddress (gdbarch, ps->textlow), gdb_stdout);
2289         printf_filtered (" - ");
2290         fputs_filtered (paddress (gdbarch, ps->texthigh), gdb_stdout);
2291         printf_filtered (" but symtab covers only ");
2292         fputs_filtered (paddress (gdbarch, BLOCK_START (b)), gdb_stdout);
2293         printf_filtered (" - ");
2294         fputs_filtered (paddress (gdbarch, BLOCK_END (b)), gdb_stdout);
2295         printf_filtered ("\n");
2296       }
2297   }
2298 }
2299
2300 void
2301 _initialize_psymtab (void)
2302 {
2303   add_cmd ("psymbols", class_maintenance, maintenance_print_psymbols, _("\
2304 Print dump of current partial symbol definitions.\n\
2305 Usage: mt print psymbols [-objfile objfile] [-pc address] [--] [outfile]\n\
2306        mt print psymbols [-objfile objfile] [-source source] [--] [outfile]\n\
2307 Entries in the partial symbol table are dumped to file OUTFILE,\n\
2308 or the terminal if OUTFILE is unspecified.\n\
2309 If ADDRESS is provided, dump only the file for that address.\n\
2310 If SOURCE is provided, dump only that file's symbols.\n\
2311 If OBJFILE is provided, dump only that file's minimal symbols."),
2312            &maintenanceprintlist);
2313
2314   add_cmd ("psymtabs", class_maintenance, maintenance_info_psymtabs, _("\
2315 List the partial symbol tables for all object files.\n\
2316 This does not include information about individual partial symbols,\n\
2317 just the symbol table structures themselves."),
2318            &maintenanceinfolist);
2319
2320   add_cmd ("check-psymtabs", class_maintenance, maintenance_check_psymtabs,
2321            _("\
2322 Check consistency of currently expanded psymtabs versus symtabs."),
2323            &maintenancelist);
2324 }