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