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