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