9124b55c2d355f016f90a344e5f3071a819a2c1a
[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 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 /* Calculate a hash code for the given partial symbol.  The hash is
1531    calculated using the symbol's value, language, domain, class
1532    and name.  These are the values which are set by
1533    add_psymbol_to_bcache.  */
1534
1535 static unsigned long
1536 psymbol_hash (const void *addr, int length)
1537 {
1538   unsigned long h = 0;
1539   struct partial_symbol *psymbol = (struct partial_symbol *) addr;
1540   unsigned int lang = psymbol->ginfo.language;
1541   unsigned int domain = PSYMBOL_DOMAIN (psymbol);
1542   unsigned int theclass = PSYMBOL_CLASS (psymbol);
1543
1544   h = hash_continue (&psymbol->ginfo.value, sizeof (psymbol->ginfo.value), h);
1545   h = hash_continue (&lang, sizeof (unsigned int), h);
1546   h = hash_continue (&domain, sizeof (unsigned int), h);
1547   h = hash_continue (&theclass, sizeof (unsigned int), h);
1548   h = hash_continue (psymbol->ginfo.name, strlen (psymbol->ginfo.name), h);
1549
1550   return h;
1551 }
1552
1553 /* Returns true if the symbol at addr1 equals the symbol at addr2.
1554    For the comparison this function uses a symbols value,
1555    language, domain, class and name.  */
1556
1557 static int
1558 psymbol_compare (const void *addr1, const void *addr2, int length)
1559 {
1560   struct partial_symbol *sym1 = (struct partial_symbol *) addr1;
1561   struct partial_symbol *sym2 = (struct partial_symbol *) addr2;
1562
1563   return (memcmp (&sym1->ginfo.value, &sym1->ginfo.value,
1564                   sizeof (sym1->ginfo.value)) == 0
1565           && sym1->ginfo.language == sym2->ginfo.language
1566           && PSYMBOL_DOMAIN (sym1) == PSYMBOL_DOMAIN (sym2)
1567           && PSYMBOL_CLASS (sym1) == PSYMBOL_CLASS (sym2)
1568           && sym1->ginfo.name == sym2->ginfo.name);
1569 }
1570
1571 /* Initialize a partial symbol bcache.  */
1572
1573 struct psymbol_bcache *
1574 psymbol_bcache_init (void)
1575 {
1576   struct psymbol_bcache *bcache = XCNEW (struct psymbol_bcache);
1577
1578   bcache->bcache = bcache_xmalloc (psymbol_hash, psymbol_compare);
1579   return bcache;
1580 }
1581
1582 /* Free a partial symbol bcache.  */
1583
1584 void
1585 psymbol_bcache_free (struct psymbol_bcache *bcache)
1586 {
1587   if (bcache == NULL)
1588     return;
1589
1590   bcache_xfree (bcache->bcache);
1591   xfree (bcache);
1592 }
1593
1594 /* Return the internal bcache of the psymbol_bcache BCACHE.  */
1595
1596 struct bcache *
1597 psymbol_bcache_get_bcache (struct psymbol_bcache *bcache)
1598 {
1599   return bcache->bcache;
1600 }
1601
1602 /* Find a copy of the SYM in BCACHE.  If BCACHE has never seen this
1603    symbol before, add a copy to BCACHE.  In either case, return a pointer
1604    to BCACHE's copy of the symbol.  If optional ADDED is not NULL, return
1605    1 in case of new entry or 0 if returning an old entry.  */
1606
1607 static const struct partial_symbol *
1608 psymbol_bcache_full (struct partial_symbol *sym,
1609                      struct psymbol_bcache *bcache,
1610                      int *added)
1611 {
1612   return bcache_full (sym,
1613                       sizeof (struct partial_symbol),
1614                       bcache->bcache,
1615                       added);
1616 }
1617
1618 /* Helper function, initialises partial symbol structure and stashes
1619    it into objfile's bcache.  Note that our caching mechanism will
1620    use all fields of struct partial_symbol to determine hash value of the
1621    structure.  In other words, having two symbols with the same name but
1622    different domain (or address) is possible and correct.  */
1623
1624 static const struct partial_symbol *
1625 add_psymbol_to_bcache (const char *name, int namelength, int copy_name,
1626                        domain_enum domain,
1627                        enum address_class theclass,
1628                        long val,        /* Value as a long */
1629                        CORE_ADDR coreaddr,      /* Value as a CORE_ADDR */
1630                        enum language language, struct objfile *objfile,
1631                        int *added)
1632 {
1633   struct partial_symbol psymbol;
1634
1635   /* We must ensure that the entire struct has been zeroed before
1636      assigning to it, because an assignment may not touch some of the
1637      holes.  */
1638   memset (&psymbol, 0, sizeof (psymbol));
1639
1640   /* val and coreaddr are mutually exclusive, one of them *will* be zero.  */
1641   if (val != 0)
1642     {
1643       SYMBOL_VALUE (&psymbol) = val;
1644     }
1645   else
1646     {
1647       SYMBOL_VALUE_ADDRESS (&psymbol) = coreaddr;
1648     }
1649   SYMBOL_SECTION (&psymbol) = -1;
1650   SYMBOL_SET_LANGUAGE (&psymbol, language, &objfile->objfile_obstack);
1651   PSYMBOL_DOMAIN (&psymbol) = domain;
1652   PSYMBOL_CLASS (&psymbol) = theclass;
1653
1654   SYMBOL_SET_NAMES (&psymbol, name, namelength, copy_name, objfile);
1655
1656   /* Stash the partial symbol away in the cache.  */
1657   return psymbol_bcache_full (&psymbol, objfile->psymbol_cache, added);
1658 }
1659
1660 /* Increase the space allocated for LISTP, which is probably
1661    global_psymbols or static_psymbols.  This space will eventually
1662    be freed in free_objfile().  */
1663
1664 static void
1665 extend_psymbol_list (struct psymbol_allocation_list *listp,
1666                      struct objfile *objfile)
1667 {
1668   int new_size;
1669
1670   if (listp->size == 0)
1671     {
1672       new_size = 255;
1673       listp->list = (struct partial_symbol **)
1674         xmalloc (new_size * sizeof (struct partial_symbol *));
1675     }
1676   else
1677     {
1678       new_size = listp->size * 2;
1679       listp->list = (struct partial_symbol **)
1680         xrealloc ((char *) listp->list,
1681                   new_size * sizeof (struct partial_symbol *));
1682     }
1683   /* Next assumes we only went one over.  Should be good if
1684      program works correctly.  */
1685   listp->next = listp->list + listp->size;
1686   listp->size = new_size;
1687 }
1688
1689 /* Helper function, adds partial symbol to the given partial symbol list.  */
1690
1691 static void
1692 append_psymbol_to_list (struct psymbol_allocation_list *list,
1693                         const struct partial_symbol *psym,
1694                         struct objfile *objfile)
1695 {
1696   if (list->next >= list->list + list->size)
1697     extend_psymbol_list (list, objfile);
1698   *list->next++ = (struct partial_symbol *) psym;
1699   OBJSTAT (objfile, n_psyms++);
1700 }
1701
1702 /* Add a symbol with a long value to a psymtab.
1703    Since one arg is a struct, we pass in a ptr and deref it (sigh).
1704    Return the partial symbol that has been added.  */
1705
1706 void
1707 add_psymbol_to_list (const char *name, int namelength, int copy_name,
1708                      domain_enum domain,
1709                      enum address_class theclass,
1710                      struct psymbol_allocation_list *list,
1711                      long val,  /* Value as a long */
1712                      CORE_ADDR coreaddr,        /* Value as a CORE_ADDR */
1713                      enum language language, struct objfile *objfile)
1714 {
1715   const struct partial_symbol *psym;
1716
1717   int added;
1718
1719   /* Stash the partial symbol away in the cache.  */
1720   psym = add_psymbol_to_bcache (name, namelength, copy_name, domain, theclass,
1721                                 val, coreaddr, language, objfile, &added);
1722
1723   /* Do not duplicate global partial symbols.  */
1724   if (list == &objfile->global_psymbols
1725       && !added)
1726     return;
1727
1728   /* Save pointer to partial symbol in psymtab, growing symtab if needed.  */
1729   append_psymbol_to_list (list, psym, objfile);
1730 }
1731
1732 /* Initialize storage for partial symbols.  */
1733
1734 void
1735 init_psymbol_list (struct objfile *objfile, int total_symbols)
1736 {
1737   /* Free any previously allocated psymbol lists.  */
1738
1739   if (objfile->global_psymbols.list)
1740     xfree (objfile->global_psymbols.list);
1741   if (objfile->static_psymbols.list)
1742     xfree (objfile->static_psymbols.list);
1743
1744   /* Current best guess is that approximately a twentieth
1745      of the total symbols (in a debugging file) are global or static
1746      oriented symbols, then multiply that by slop factor of two.  */
1747
1748   objfile->global_psymbols.size = total_symbols / 10;
1749   objfile->static_psymbols.size = total_symbols / 10;
1750
1751   if (objfile->global_psymbols.size > 0)
1752     {
1753       objfile->global_psymbols.next =
1754         objfile->global_psymbols.list = (struct partial_symbol **)
1755         xmalloc ((objfile->global_psymbols.size
1756                   * sizeof (struct partial_symbol *)));
1757     }
1758   if (objfile->static_psymbols.size > 0)
1759     {
1760       objfile->static_psymbols.next =
1761         objfile->static_psymbols.list = (struct partial_symbol **)
1762         xmalloc ((objfile->static_psymbols.size
1763                   * sizeof (struct partial_symbol *)));
1764     }
1765 }
1766
1767 struct partial_symtab *
1768 allocate_psymtab (const char *filename, struct objfile *objfile)
1769 {
1770   struct partial_symtab *psymtab;
1771
1772   if (objfile->free_psymtabs)
1773     {
1774       psymtab = objfile->free_psymtabs;
1775       objfile->free_psymtabs = psymtab->next;
1776     }
1777   else
1778     psymtab = (struct partial_symtab *)
1779       obstack_alloc (&objfile->objfile_obstack,
1780                      sizeof (struct partial_symtab));
1781
1782   memset (psymtab, 0, sizeof (struct partial_symtab));
1783   psymtab->filename = bcache (filename, strlen (filename) + 1,
1784                               objfile->per_bfd->filename_cache);
1785   psymtab->compunit_symtab = NULL;
1786
1787   /* Prepend it to the psymtab list for the objfile it belongs to.
1788      Psymtabs are searched in most recent inserted -> least recent
1789      inserted order.  */
1790
1791   psymtab->next = objfile->psymtabs;
1792   objfile->psymtabs = psymtab;
1793
1794   if (symtab_create_debug)
1795     {
1796       /* Be a bit clever with debugging messages, and don't print objfile
1797          every time, only when it changes.  */
1798       static char *last_objfile_name = NULL;
1799
1800       if (last_objfile_name == NULL
1801           || strcmp (last_objfile_name, objfile_name (objfile)) != 0)
1802         {
1803           xfree (last_objfile_name);
1804           last_objfile_name = xstrdup (objfile_name (objfile));
1805           fprintf_unfiltered (gdb_stdlog,
1806                               "Creating one or more psymtabs for objfile %s ...\n",
1807                               last_objfile_name);
1808         }
1809       fprintf_unfiltered (gdb_stdlog,
1810                           "Created psymtab %s for module %s.\n",
1811                           host_address_to_string (psymtab), filename);
1812     }
1813
1814   return psymtab;
1815 }
1816
1817 void
1818 discard_psymtab (struct objfile *objfile, struct partial_symtab *pst)
1819 {
1820   struct partial_symtab **prev_pst;
1821
1822   /* From dbxread.c:
1823      Empty psymtabs happen as a result of header files which don't
1824      have any symbols in them.  There can be a lot of them.  But this
1825      check is wrong, in that a psymtab with N_SLINE entries but
1826      nothing else is not empty, but we don't realize that.  Fixing
1827      that without slowing things down might be tricky.  */
1828
1829   /* First, snip it out of the psymtab chain.  */
1830
1831   prev_pst = &(objfile->psymtabs);
1832   while ((*prev_pst) != pst)
1833     prev_pst = &((*prev_pst)->next);
1834   (*prev_pst) = pst->next;
1835
1836   /* Next, put it on a free list for recycling.  */
1837
1838   pst->next = objfile->free_psymtabs;
1839   objfile->free_psymtabs = pst;
1840 }
1841
1842 /* An object of this type is passed to discard_psymtabs_upto.  */
1843
1844 struct psymtab_state
1845 {
1846   /* The objfile where psymtabs are discarded.  */
1847
1848   struct objfile *objfile;
1849
1850   /* The first psymtab to save.  */
1851
1852   struct partial_symtab *save;
1853 };
1854
1855 /* A cleanup function used by make_cleanup_discard_psymtabs.  */
1856
1857 static void
1858 discard_psymtabs_upto (void *arg)
1859 {
1860   struct psymtab_state *state = arg;
1861
1862   while (state->objfile->psymtabs != state->save)
1863     discard_psymtab (state->objfile, state->objfile->psymtabs);
1864 }
1865
1866 /* Return a new cleanup that discards all psymtabs created in OBJFILE
1867    after this function is called.  */
1868
1869 struct cleanup *
1870 make_cleanup_discard_psymtabs (struct objfile *objfile)
1871 {
1872   struct psymtab_state *state = XNEW (struct psymtab_state);
1873
1874   state->objfile = objfile;
1875   state->save = objfile->psymtabs;
1876
1877   return make_cleanup_dtor (discard_psymtabs_upto, state, xfree);
1878 }
1879
1880 \f
1881
1882 static void
1883 maintenance_print_psymbols (char *args, int from_tty)
1884 {
1885   char **argv;
1886   struct ui_file *outfile;
1887   struct cleanup *cleanups;
1888   char *symname = NULL;
1889   char *filename = DEV_TTY;
1890   struct objfile *objfile;
1891   struct partial_symtab *ps;
1892
1893   dont_repeat ();
1894
1895   if (args == NULL)
1896     {
1897       error (_("\
1898 print-psymbols takes an output file name and optional symbol file name"));
1899     }
1900   argv = gdb_buildargv (args);
1901   cleanups = make_cleanup_freeargv (argv);
1902
1903   if (argv[0] != NULL)
1904     {
1905       filename = argv[0];
1906       /* If a second arg is supplied, it is a source file name to match on.  */
1907       if (argv[1] != NULL)
1908         {
1909           symname = argv[1];
1910         }
1911     }
1912
1913   filename = tilde_expand (filename);
1914   make_cleanup (xfree, filename);
1915
1916   outfile = gdb_fopen (filename, FOPEN_WT);
1917   if (outfile == NULL)
1918     perror_with_name (filename);
1919   make_cleanup_ui_file_delete (outfile);
1920
1921   ALL_PSYMTABS (objfile, ps)
1922     {
1923       QUIT;
1924       if (symname == NULL || filename_cmp (symname, ps->filename) == 0)
1925         dump_psymtab (objfile, ps, outfile);
1926     }
1927   do_cleanups (cleanups);
1928 }
1929
1930 /* List all the partial symbol tables whose names match REGEXP (optional).  */
1931
1932 static void
1933 maintenance_info_psymtabs (char *regexp, int from_tty)
1934 {
1935   struct program_space *pspace;
1936   struct objfile *objfile;
1937
1938   if (regexp)
1939     re_comp (regexp);
1940
1941   ALL_PSPACES (pspace)
1942     ALL_PSPACE_OBJFILES (pspace, objfile)
1943     {
1944       struct gdbarch *gdbarch = get_objfile_arch (objfile);
1945       struct partial_symtab *psymtab;
1946
1947       /* We don't want to print anything for this objfile until we
1948          actually find a symtab whose name matches.  */
1949       int printed_objfile_start = 0;
1950
1951       ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, psymtab)
1952         {
1953           QUIT;
1954
1955           if (! regexp
1956               || re_exec (psymtab->filename))
1957             {
1958               if (! printed_objfile_start)
1959                 {
1960                   printf_filtered ("{ objfile %s ", objfile_name (objfile));
1961                   wrap_here ("  ");
1962                   printf_filtered ("((struct objfile *) %s)\n",
1963                                    host_address_to_string (objfile));
1964                   printed_objfile_start = 1;
1965                 }
1966
1967               printf_filtered ("  { psymtab %s ", psymtab->filename);
1968               wrap_here ("    ");
1969               printf_filtered ("((struct partial_symtab *) %s)\n",
1970                                host_address_to_string (psymtab));
1971
1972               printf_filtered ("    readin %s\n",
1973                                psymtab->readin ? "yes" : "no");
1974               printf_filtered ("    fullname %s\n",
1975                                psymtab->fullname
1976                                ? psymtab->fullname : "(null)");
1977               printf_filtered ("    text addresses ");
1978               fputs_filtered (paddress (gdbarch, psymtab->textlow),
1979                               gdb_stdout);
1980               printf_filtered (" -- ");
1981               fputs_filtered (paddress (gdbarch, psymtab->texthigh),
1982                               gdb_stdout);
1983               printf_filtered ("\n");
1984               printf_filtered ("    psymtabs_addrmap_supported %s\n",
1985                                (psymtab->psymtabs_addrmap_supported
1986                                 ? "yes" : "no"));
1987               printf_filtered ("    globals ");
1988               if (psymtab->n_global_syms)
1989                 {
1990                   printf_filtered ("(* (struct partial_symbol **) %s @ %d)\n",
1991                                    host_address_to_string (objfile->global_psymbols.list
1992                                     + psymtab->globals_offset),
1993                                    psymtab->n_global_syms);
1994                 }
1995               else
1996                 printf_filtered ("(none)\n");
1997               printf_filtered ("    statics ");
1998               if (psymtab->n_static_syms)
1999                 {
2000                   printf_filtered ("(* (struct partial_symbol **) %s @ %d)\n",
2001                                    host_address_to_string (objfile->static_psymbols.list
2002                                     + psymtab->statics_offset),
2003                                    psymtab->n_static_syms);
2004                 }
2005               else
2006                 printf_filtered ("(none)\n");
2007               printf_filtered ("    dependencies ");
2008               if (psymtab->number_of_dependencies)
2009                 {
2010                   int i;
2011
2012                   printf_filtered ("{\n");
2013                   for (i = 0; i < psymtab->number_of_dependencies; i++)
2014                     {
2015                       struct partial_symtab *dep = psymtab->dependencies[i];
2016
2017                       /* Note the string concatenation there --- no comma.  */
2018                       printf_filtered ("      psymtab %s "
2019                                        "((struct partial_symtab *) %s)\n",
2020                                        dep->filename,
2021                                        host_address_to_string (dep));
2022                     }
2023                   printf_filtered ("    }\n");
2024                 }
2025               else
2026                 printf_filtered ("(none)\n");
2027               printf_filtered ("  }\n");
2028             }
2029         }
2030
2031       if (printed_objfile_start)
2032         printf_filtered ("}\n");
2033     }
2034 }
2035
2036 /* Check consistency of currently expanded psymtabs vs symtabs.  */
2037
2038 static void
2039 maintenance_check_psymtabs (char *ignore, int from_tty)
2040 {
2041   struct symbol *sym;
2042   struct partial_symbol **psym;
2043   struct compunit_symtab *cust = NULL;
2044   struct partial_symtab *ps;
2045   const struct blockvector *bv;
2046   struct objfile *objfile;
2047   struct block *b;
2048   int length;
2049
2050   ALL_PSYMTABS (objfile, ps)
2051   {
2052     struct gdbarch *gdbarch = get_objfile_arch (objfile);
2053
2054     /* We don't call psymtab_to_symtab here because that may cause symtab
2055        expansion.  When debugging a problem it helps if checkers leave
2056        things unchanged.  */
2057     cust = ps->compunit_symtab;
2058
2059     /* First do some checks that don't require the associated symtab.  */
2060     if (ps->texthigh < ps->textlow)
2061       {
2062         printf_filtered ("Psymtab ");
2063         puts_filtered (ps->filename);
2064         printf_filtered (" covers bad range ");
2065         fputs_filtered (paddress (gdbarch, ps->textlow), gdb_stdout);
2066         printf_filtered (" - ");
2067         fputs_filtered (paddress (gdbarch, ps->texthigh), gdb_stdout);
2068         printf_filtered ("\n");
2069         continue;
2070       }
2071
2072     /* Now do checks requiring the associated symtab.  */
2073     if (cust == NULL)
2074       continue;
2075     bv = COMPUNIT_BLOCKVECTOR (cust);
2076     b = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
2077     psym = objfile->static_psymbols.list + ps->statics_offset;
2078     length = ps->n_static_syms;
2079     while (length--)
2080       {
2081         sym = block_lookup_symbol (b, SYMBOL_LINKAGE_NAME (*psym),
2082                                    SYMBOL_DOMAIN (*psym));
2083         if (!sym)
2084           {
2085             printf_filtered ("Static symbol `");
2086             puts_filtered (SYMBOL_LINKAGE_NAME (*psym));
2087             printf_filtered ("' only found in ");
2088             puts_filtered (ps->filename);
2089             printf_filtered (" psymtab\n");
2090           }
2091         psym++;
2092       }
2093     b = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
2094     psym = objfile->global_psymbols.list + ps->globals_offset;
2095     length = ps->n_global_syms;
2096     while (length--)
2097       {
2098         sym = block_lookup_symbol (b, SYMBOL_LINKAGE_NAME (*psym),
2099                                    SYMBOL_DOMAIN (*psym));
2100         if (!sym)
2101           {
2102             printf_filtered ("Global symbol `");
2103             puts_filtered (SYMBOL_LINKAGE_NAME (*psym));
2104             printf_filtered ("' only found in ");
2105             puts_filtered (ps->filename);
2106             printf_filtered (" psymtab\n");
2107           }
2108         psym++;
2109       }
2110     if (ps->texthigh != 0
2111         && (ps->textlow < BLOCK_START (b) || ps->texthigh > BLOCK_END (b)))
2112       {
2113         printf_filtered ("Psymtab ");
2114         puts_filtered (ps->filename);
2115         printf_filtered (" covers ");
2116         fputs_filtered (paddress (gdbarch, ps->textlow), gdb_stdout);
2117         printf_filtered (" - ");
2118         fputs_filtered (paddress (gdbarch, ps->texthigh), gdb_stdout);
2119         printf_filtered (" but symtab covers only ");
2120         fputs_filtered (paddress (gdbarch, BLOCK_START (b)), gdb_stdout);
2121         printf_filtered (" - ");
2122         fputs_filtered (paddress (gdbarch, BLOCK_END (b)), gdb_stdout);
2123         printf_filtered ("\n");
2124       }
2125   }
2126 }
2127
2128 \f
2129
2130 extern initialize_file_ftype _initialize_psymtab;
2131
2132 void
2133 _initialize_psymtab (void)
2134 {
2135   add_cmd ("psymbols", class_maintenance, maintenance_print_psymbols, _("\
2136 Print dump of current partial symbol definitions.\n\
2137 Entries in the partial symbol table are dumped to file OUTFILE.\n\
2138 If a SOURCE file is specified, dump only that file's partial symbols."),
2139            &maintenanceprintlist);
2140
2141   add_cmd ("psymtabs", class_maintenance, maintenance_info_psymtabs, _("\
2142 List the partial symbol tables for all object files.\n\
2143 This does not include information about individual partial symbols,\n\
2144 just the symbol table structures themselves."),
2145            &maintenanceinfolist);
2146
2147   add_cmd ("check-psymtabs", class_maintenance, maintenance_check_psymtabs,
2148            _("\
2149 Check consistency of currently expanded psymtabs versus symtabs."),
2150            &maintenancelist);
2151 }