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