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