* symtab.h (domain_enum): Split in two...
[external/binutils.git] / gdb / psymtab.c
1 /* Partial symbol tables.
2    
3    Copyright (C) 2009, 2010, 2011 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
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 /* A fast way to get from a psymtab to its symtab (after the first time).  */
49 #define PSYMTAB_TO_SYMTAB(pst)  \
50     ((pst) -> symtab != NULL ? (pst) -> symtab : psymtab_to_symtab (pst))
51
52 static struct partial_symbol *match_partial_symbol (struct partial_symtab *,
53                                                     int,
54                                                     const char *, domain_enum,
55                                                     symbol_compare_ftype *,
56                                                     symbol_compare_ftype *);
57
58 static struct partial_symbol *lookup_partial_symbol (struct partial_symtab *,
59                                                      const char *, int,
60                                                      domain_enum);
61
62 static char *psymtab_to_fullname (struct partial_symtab *ps);
63
64 static struct partial_symbol *find_pc_sect_psymbol (struct partial_symtab *,
65                                                     CORE_ADDR,
66                                                     struct obj_section *);
67
68 static struct partial_symbol *fixup_psymbol_section (struct partial_symbol
69                                                      *psym,
70                                                      struct objfile *objfile);
71
72 static struct symtab *psymtab_to_symtab (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 /* Lookup the partial symbol table of a source file named NAME.
129    *If* there is no '/' in the name, a match after a '/'
130    in the psymtab filename will also work.  */
131
132 static struct partial_symtab *
133 lookup_partial_symtab (struct objfile *objfile, const char *name,
134                        const char *full_path, const char *real_path)
135 {
136   struct partial_symtab *pst;
137
138   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, pst)
139   {
140     if (FILENAME_CMP (name, pst->filename) == 0)
141       {
142         return (pst);
143       }
144
145     /* If the user gave us an absolute path, try to find the file in
146        this symtab and use its absolute path.  */
147     if (full_path != NULL)
148       {
149         psymtab_to_fullname (pst);
150         if (pst->fullname != NULL
151             && FILENAME_CMP (full_path, pst->fullname) == 0)
152           {
153             return pst;
154           }
155       }
156
157     if (real_path != NULL)
158       {
159         char *rp = NULL;
160         psymtab_to_fullname (pst);
161         if (pst->fullname != NULL)
162           {
163             rp = gdb_realpath (pst->fullname);
164             make_cleanup (xfree, rp);
165           }
166         if (rp != NULL && FILENAME_CMP (real_path, rp) == 0)
167           {
168             return pst;
169           }
170       }
171   }
172
173   /* Now, search for a matching tail (only if name doesn't have any dirs).  */
174
175   if (lbasename (name) == name)
176     ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, pst)
177     {
178       if (FILENAME_CMP (lbasename (pst->filename), name) == 0)
179         return (pst);
180     }
181
182   return (NULL);
183 }
184
185 static int
186 lookup_symtab_via_partial_symtab (struct objfile *objfile, const char *name,
187                                   const char *full_path, const char *real_path,
188                                   struct symtab **result)
189 {
190   struct partial_symtab *ps;
191
192   ps = lookup_partial_symtab (objfile, name, full_path, real_path);
193   if (!ps)
194     return 0;
195
196   if (ps->readin)
197     error (_("Internal: readin %s pst for `%s' found when no symtab found."),
198            ps->filename, name);
199
200   *result = PSYMTAB_TO_SYMTAB (ps);
201   return 1;
202 }
203
204 /* Find which partial symtab contains PC and SECTION starting at psymtab PST.
205    We may find a different psymtab than PST.  See FIND_PC_SECT_PSYMTAB.  */
206
207 static struct partial_symtab *
208 find_pc_sect_psymtab_closer (CORE_ADDR pc, struct obj_section *section,
209                              struct partial_symtab *pst,
210                              struct minimal_symbol *msymbol)
211 {
212   struct objfile *objfile = pst->objfile;
213   struct partial_symtab *tpst;
214   struct partial_symtab *best_pst = pst;
215   CORE_ADDR best_addr = pst->textlow;
216
217   /* An objfile that has its functions reordered might have
218      many partial symbol tables containing the PC, but
219      we want the partial symbol table that contains the
220      function containing the PC.  */
221   if (!(objfile->flags & OBJF_REORDERED) &&
222       section == 0)     /* Can't validate section this way.  */
223     return pst;
224
225   if (msymbol == NULL)
226     return (pst);
227
228   /* The code range of partial symtabs sometimes overlap, so, in
229      the loop below, we need to check all partial symtabs and
230      find the one that fits better for the given PC address.  We
231      select the partial symtab that contains a symbol whose
232      address is closest to the PC address.  By closest we mean
233      that find_pc_sect_symbol returns the symbol with address
234      that is closest and still less than the given PC.  */
235   for (tpst = pst; tpst != NULL; tpst = tpst->next)
236     {
237       if (pc >= tpst->textlow && pc < tpst->texthigh)
238         {
239           struct partial_symbol *p;
240           CORE_ADDR this_addr;
241
242           /* NOTE: This assumes that every psymbol has a
243              corresponding msymbol, which is not necessarily
244              true; the debug info might be much richer than the
245              object's symbol table.  */
246           p = find_pc_sect_psymbol (tpst, pc, section);
247           if (p != NULL
248               && SYMBOL_VALUE_ADDRESS (p)
249               == SYMBOL_VALUE_ADDRESS (msymbol))
250             return tpst;
251
252           /* Also accept the textlow value of a psymtab as a
253              "symbol", to provide some support for partial
254              symbol tables with line information but no debug
255              symbols (e.g. those produced by an assembler).  */
256           if (p != NULL)
257             this_addr = SYMBOL_VALUE_ADDRESS (p);
258           else
259             this_addr = tpst->textlow;
260
261           /* Check whether it is closer than our current
262              BEST_ADDR.  Since this symbol address is
263              necessarily lower or equal to PC, the symbol closer
264              to PC is the symbol which address is the highest.
265              This way we return the psymtab which contains such
266              best match symbol.  This can help in cases where the
267              symbol information/debuginfo is not complete, like
268              for instance on IRIX6 with gcc, where no debug info
269              is emitted for statics.  (See also the nodebug.exp
270              testcase.)  */
271           if (this_addr > best_addr)
272             {
273               best_addr = this_addr;
274               best_pst = tpst;
275             }
276         }
277     }
278   return best_pst;
279 }
280
281 /* Find which partial symtab contains PC and SECTION.  Return 0 if
282    none.  We return the psymtab that contains a symbol whose address
283    exactly matches PC, or, if we cannot find an exact match, the
284    psymtab that contains a symbol whose address is closest to PC.  */
285 static struct partial_symtab *
286 find_pc_sect_psymtab (struct objfile *objfile, CORE_ADDR pc,
287                       struct obj_section *section,
288                       struct minimal_symbol *msymbol)
289 {
290   struct partial_symtab *pst;
291
292   /* Try just the PSYMTABS_ADDRMAP mapping first as it has better granularity
293      than the later used TEXTLOW/TEXTHIGH one.  */
294
295   if (objfile->psymtabs_addrmap != NULL)
296     {
297       pst = addrmap_find (objfile->psymtabs_addrmap, pc);
298       if (pst != NULL)
299         {
300           /* FIXME: addrmaps currently do not handle overlayed sections,
301              so fall back to the non-addrmap case if we're debugging
302              overlays and the addrmap returned the wrong section.  */
303           if (overlay_debugging && msymbol && section)
304             {
305               struct partial_symbol *p;
306
307               /* NOTE: This assumes that every psymbol has a
308                  corresponding msymbol, which is not necessarily
309                  true; the debug info might be much richer than the
310                  object's symbol table.  */
311               p = find_pc_sect_psymbol (pst, pc, section);
312               if (!p
313                   || SYMBOL_VALUE_ADDRESS (p)
314                   != SYMBOL_VALUE_ADDRESS (msymbol))
315                 goto next;
316             }
317
318           /* We do not try to call FIND_PC_SECT_PSYMTAB_CLOSER as
319              PSYMTABS_ADDRMAP we used has already the best 1-byte
320              granularity and FIND_PC_SECT_PSYMTAB_CLOSER may mislead us into
321              a worse chosen section due to the TEXTLOW/TEXTHIGH ranges
322              overlap.  */
323
324           return pst;
325         }
326     }
327
328  next:
329
330   /* Existing PSYMTABS_ADDRMAP mapping is present even for PARTIAL_SYMTABs
331      which still have no corresponding full SYMTABs read.  But it is not
332      present for non-DWARF2 debug infos not supporting PSYMTABS_ADDRMAP in GDB
333      so far.  */
334
335   /* Check even OBJFILE with non-zero PSYMTABS_ADDRMAP as only several of
336      its CUs may be missing in PSYMTABS_ADDRMAP as they may be varying
337      debug info type in single OBJFILE.  */
338
339   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, pst)
340     if (pc >= pst->textlow && pc < pst->texthigh)
341       {
342         struct partial_symtab *best_pst;
343
344         best_pst = find_pc_sect_psymtab_closer (pc, section, pst, msymbol);
345         if (best_pst != NULL)
346           return best_pst;
347       }
348
349   return NULL;
350 }
351
352 static struct symtab *
353 find_pc_sect_symtab_from_partial (struct objfile *objfile,
354                                   struct minimal_symbol *msymbol,
355                                   CORE_ADDR pc, struct obj_section *section,
356                                   int warn_if_readin)
357 {
358   struct partial_symtab *ps = find_pc_sect_psymtab (objfile, pc, section,
359                                                     msymbol);
360   if (ps)
361     {
362       if (warn_if_readin && ps->readin)
363         /* Might want to error() here (in case symtab is corrupt and
364            will cause a core dump), but maybe we can successfully
365            continue, so let's not.  */
366         warning (_("\
367 (Internal error: pc %s in read in psymtab, but not in symtab.)\n"),
368                  paddress (get_objfile_arch (ps->objfile), pc));
369       return PSYMTAB_TO_SYMTAB (ps);
370     }
371   return NULL;
372 }
373
374 /* Find which partial symbol within a psymtab matches PC and SECTION.
375    Return 0 if none.  */
376
377 static struct partial_symbol *
378 find_pc_sect_psymbol (struct partial_symtab *psymtab, CORE_ADDR pc,
379                       struct obj_section *section)
380 {
381   struct partial_symbol *best = NULL, *p, **pp;
382   CORE_ADDR best_pc;
383
384   gdb_assert (psymtab != NULL);
385
386   /* Cope with programs that start at address 0.  */
387   best_pc = (psymtab->textlow != 0) ? psymtab->textlow - 1 : 0;
388
389   /* Search the global symbols as well as the static symbols, so that
390      find_pc_partial_function doesn't use a minimal symbol and thus
391      cache a bad endaddr.  */
392   for (pp = psymtab->objfile->global_psymbols.list + psymtab->globals_offset;
393     (pp - (psymtab->objfile->global_psymbols.list + psymtab->globals_offset)
394      < psymtab->n_global_syms);
395        pp++)
396     {
397       p = *pp;
398       if (SYMBOL_DOMAIN (p) == VAR_DOMAIN
399           && SYMBOL_CLASS (p) == LOC_BLOCK
400           && pc >= SYMBOL_VALUE_ADDRESS (p)
401           && (SYMBOL_VALUE_ADDRESS (p) > best_pc
402               || (psymtab->textlow == 0
403                   && best_pc == 0 && SYMBOL_VALUE_ADDRESS (p) == 0)))
404         {
405           if (section)          /* Match on a specific section.  */
406             {
407               fixup_psymbol_section (p, psymtab->objfile);
408               if (!matching_obj_sections (SYMBOL_OBJ_SECTION (p), section))
409                 continue;
410             }
411           best_pc = SYMBOL_VALUE_ADDRESS (p);
412           best = p;
413         }
414     }
415
416   for (pp = psymtab->objfile->static_psymbols.list + psymtab->statics_offset;
417     (pp - (psymtab->objfile->static_psymbols.list + psymtab->statics_offset)
418      < psymtab->n_static_syms);
419        pp++)
420     {
421       p = *pp;
422       if (SYMBOL_DOMAIN (p) == VAR_DOMAIN
423           && SYMBOL_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, psymtab->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   return best;
441 }
442
443 static struct partial_symbol *
444 fixup_psymbol_section (struct partial_symbol *psym, struct objfile *objfile)
445 {
446   CORE_ADDR addr;
447
448   if (!psym)
449     return NULL;
450
451   if (SYMBOL_OBJ_SECTION (psym))
452     return psym;
453
454   gdb_assert (objfile);
455
456   switch (SYMBOL_CLASS (psym))
457     {
458     case LOC_STATIC:
459     case LOC_LABEL:
460     case LOC_BLOCK:
461       addr = SYMBOL_VALUE_ADDRESS (psym);
462       break;
463     default:
464       /* Nothing else will be listed in the minsyms -- no use looking
465          it up.  */
466       return psym;
467     }
468
469   fixup_section (&psym->ginfo, addr, objfile);
470
471   return psym;
472 }
473
474 static struct symtab *
475 lookup_symbol_aux_psymtabs (struct objfile *objfile,
476                             int block_index, const char *name,
477                             const domain_enum domain)
478 {
479   struct partial_symtab *ps;
480   const int psymtab_index = (block_index == GLOBAL_BLOCK ? 1 : 0);
481
482   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps)
483   {
484     if (!ps->readin && lookup_partial_symbol (ps, name, psymtab_index, domain))
485       {
486         struct symbol *sym = NULL;
487         struct symtab *stab = PSYMTAB_TO_SYMTAB (ps);
488
489         /* Some caution must be observed with overloaded functions
490            and methods, since the psymtab will not contain any overload
491            information (but NAME might contain it).  */
492         if (stab->primary)
493           {
494             struct blockvector *bv = BLOCKVECTOR (stab);
495             struct block *block = BLOCKVECTOR_BLOCK (bv, block_index);
496
497             sym = lookup_block_symbol (block, name, domain);
498           }
499
500         if (sym && strcmp_iw (SYMBOL_SEARCH_NAME (sym), name) == 0)
501           return stab;
502
503         /* Keep looking through other psymtabs.  */
504       }
505   }
506
507   return NULL;
508 }
509
510 /* Look in PST for a symbol in DOMAIN whose name matches NAME.  Search
511    the global block of PST if GLOBAL, and otherwise the static block.
512    MATCH is the comparison operation that returns true iff MATCH (s,
513    NAME), where s is a SYMBOL_SEARCH_NAME.  If ORDERED_COMPARE is
514    non-null, the symbols in the block are assumed to be ordered
515    according to it (allowing binary search).  It must be compatible
516    with MATCH.  Returns the symbol, if found, and otherwise NULL.  */
517
518 static struct partial_symbol *
519 match_partial_symbol (struct partial_symtab *pst, int global,
520                       const char *name, domain_enum domain,
521                       symbol_compare_ftype *match,
522                       symbol_compare_ftype *ordered_compare)
523 {
524   struct partial_symbol **start, **psym;
525   struct partial_symbol **top, **real_top, **bottom, **center;
526   int length = (global ? pst->n_global_syms : pst->n_static_syms);
527   int do_linear_search = 1;
528
529   if (length == 0)
530       return NULL;
531   start = (global ?
532            pst->objfile->global_psymbols.list + pst->globals_offset :
533            pst->objfile->static_psymbols.list + pst->statics_offset);
534
535   if (global && ordered_compare)  /* Can use a binary search.  */
536     {
537       do_linear_search = 0;
538
539       /* Binary search.  This search is guaranteed to end with center
540          pointing at the earliest partial symbol whose name might be
541          correct.  At that point *all* partial symbols with an
542          appropriate name will be checked against the correct
543          domain.  */
544
545       bottom = start;
546       top = start + length - 1;
547       real_top = top;
548       while (top > bottom)
549         {
550           center = bottom + (top - bottom) / 2;
551           gdb_assert (center < top);
552           if (!do_linear_search
553               && (SYMBOL_LANGUAGE (*center) == language_java))
554             do_linear_search = 1;
555           if (ordered_compare (SYMBOL_SEARCH_NAME (*center), name) >= 0)
556             top = center;
557           else
558             bottom = center + 1;
559         }
560       gdb_assert (top == bottom);
561
562       while (top <= real_top
563              && match (SYMBOL_SEARCH_NAME (*top), name) == 0)
564         {
565           if (symbol_matches_domain (SYMBOL_LANGUAGE (*top),
566                                      SYMBOL_DOMAIN (*top), domain))
567             return *top;
568           top++;
569         }
570     }
571
572   /* Can't use a binary search or else we found during the binary search that
573      we should also do a linear search.  */
574
575   if (do_linear_search)
576     {
577       for (psym = start; psym < start + length; psym++)
578         {
579           if (symbol_matches_domain (SYMBOL_LANGUAGE (*psym),
580                                      SYMBOL_DOMAIN (*psym), domain)
581               && match (SYMBOL_SEARCH_NAME (*psym), name) == 0)
582             return *psym;
583         }
584     }
585
586   return NULL;
587 }
588
589 static void
590 pre_expand_symtabs_matching_psymtabs (struct objfile *objfile,
591                                       enum block_enum block_kind,
592                                       const char *name,
593                                       domain_enum domain)
594 {
595   /* Nothing.  */
596 }
597
598 /* Returns the name used to search psymtabs.  Unlike symtabs, psymtabs do
599    not contain any method/function instance information (since this would
600    force reading type information while reading psymtabs).  Therefore,
601    if NAME contains overload information, it must be stripped before searching
602    psymtabs.
603
604    The caller is responsible for freeing the return result.  */
605
606 static char *
607 psymtab_search_name (const char *name)
608 {
609   switch (current_language->la_language)
610     {
611     case language_cplus:
612     case language_java:
613       {
614        if (strchr (name, '('))
615          {
616            char *ret = cp_remove_params (name);
617
618            if (ret)
619              return ret;
620          }
621       }
622       break;
623
624     default:
625       break;
626     }
627
628   return xstrdup (name);
629 }
630
631 /* Look, in partial_symtab PST, for symbol whose natural name is NAME.
632    Check the global symbols if GLOBAL, the static symbols if not.  */
633
634 static struct partial_symbol *
635 lookup_partial_symbol (struct partial_symtab *pst, const char *name,
636                        int global, domain_enum domain)
637 {
638   struct partial_symbol **start, **psym;
639   struct partial_symbol **top, **real_top, **bottom, **center;
640   int length = (global ? pst->n_global_syms : pst->n_static_syms);
641   int do_linear_search = 1;
642   char *search_name;
643   struct cleanup *cleanup;
644
645   if (length == 0)
646     {
647       return (NULL);
648     }
649
650   search_name = psymtab_search_name (name);
651   cleanup = make_cleanup (xfree, search_name);
652   start = (global ?
653            pst->objfile->global_psymbols.list + pst->globals_offset :
654            pst->objfile->static_psymbols.list + pst->statics_offset);
655
656   if (global)                   /* This means we can use a binary search.  */
657     {
658       do_linear_search = 0;
659
660       /* Binary search.  This search is guaranteed to end with center
661          pointing at the earliest partial symbol whose name might be
662          correct.  At that point *all* partial symbols with an
663          appropriate name will be checked against the correct
664          domain.  */
665
666       bottom = start;
667       top = start + length - 1;
668       real_top = top;
669       while (top > bottom)
670         {
671           center = bottom + (top - bottom) / 2;
672           if (!(center < top))
673             internal_error (__FILE__, __LINE__,
674                             _("failed internal consistency check"));
675           if (!do_linear_search
676               && SYMBOL_LANGUAGE (*center) == language_java)
677             {
678               do_linear_search = 1;
679             }
680           if (strcmp_iw_ordered (SYMBOL_SEARCH_NAME (*center),
681                                  search_name) >= 0)
682             {
683               top = center;
684             }
685           else
686             {
687               bottom = center + 1;
688             }
689         }
690       if (!(top == bottom))
691         internal_error (__FILE__, __LINE__,
692                         _("failed internal consistency check"));
693
694       while (top <= real_top
695              && SYMBOL_MATCHES_SEARCH_NAME (*top, search_name))
696         {
697           if (symbol_matches_domain (SYMBOL_LANGUAGE (*top),
698                                      SYMBOL_DOMAIN (*top), domain))
699             {
700               do_cleanups (cleanup);
701               return (*top);
702             }
703           top++;
704         }
705     }
706
707   /* Can't use a binary search or else we found during the binary search that
708      we should also do a linear search.  */
709
710   if (do_linear_search)
711     {
712       for (psym = start; psym < start + length; psym++)
713         {
714           if (symbol_matches_domain (SYMBOL_LANGUAGE (*psym),
715                                      SYMBOL_DOMAIN (*psym), domain)
716               && SYMBOL_MATCHES_SEARCH_NAME (*psym, search_name))
717             {
718               do_cleanups (cleanup);
719               return (*psym);
720             }
721         }
722     }
723
724   do_cleanups (cleanup);
725   return (NULL);
726 }
727
728 /* Get the symbol table that corresponds to a partial_symtab.
729    This is fast after the first time you do it.  In fact, there
730    is an even faster macro PSYMTAB_TO_SYMTAB that does the fast
731    case inline.  */
732
733 static struct symtab *
734 psymtab_to_symtab (struct partial_symtab *pst)
735 {
736   /* If it's been looked up before, return it.  */
737   if (pst->symtab)
738     return pst->symtab;
739
740   /* If it has not yet been read in, read it.  */
741   if (!pst->readin)
742     {
743       struct cleanup *back_to = increment_reading_symtab ();
744
745       (*pst->read_symtab) (pst);
746       do_cleanups (back_to);
747     }
748
749   return pst->symtab;
750 }
751
752 static void
753 relocate_psymtabs (struct objfile *objfile,
754                    struct section_offsets *new_offsets,
755                    struct section_offsets *delta)
756 {
757   struct partial_symbol **psym;
758   struct partial_symtab *p;
759
760   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, p)
761     {
762       p->textlow += ANOFFSET (delta, SECT_OFF_TEXT (objfile));
763       p->texthigh += ANOFFSET (delta, SECT_OFF_TEXT (objfile));
764     }
765
766   for (psym = objfile->global_psymbols.list;
767        psym < objfile->global_psymbols.next;
768        psym++)
769     {
770       fixup_psymbol_section (*psym, objfile);
771       if (SYMBOL_SECTION (*psym) >= 0)
772         SYMBOL_VALUE_ADDRESS (*psym) += ANOFFSET (delta,
773                                                   SYMBOL_SECTION (*psym));
774     }
775   for (psym = objfile->static_psymbols.list;
776        psym < objfile->static_psymbols.next;
777        psym++)
778     {
779       fixup_psymbol_section (*psym, objfile);
780       if (SYMBOL_SECTION (*psym) >= 0)
781         SYMBOL_VALUE_ADDRESS (*psym) += ANOFFSET (delta,
782                                                   SYMBOL_SECTION (*psym));
783     }
784 }
785
786 static struct symtab *
787 find_last_source_symtab_from_partial (struct objfile *ofp)
788 {
789   struct partial_symtab *ps;
790   struct partial_symtab *cs_pst = 0;
791
792   ALL_OBJFILE_PSYMTABS_REQUIRED (ofp, ps)
793     {
794       const char *name = ps->filename;
795       int len = strlen (name);
796
797       if (!(len > 2 && (strcmp (&name[len - 2], ".h") == 0
798                         || strcmp (name, "<<C++-namespaces>>") == 0)))
799         cs_pst = ps;
800     }
801
802   if (cs_pst)
803     {
804       if (cs_pst->readin)
805         {
806           internal_error (__FILE__, __LINE__,
807                           _("select_source_symtab: "
808                           "readin pst found and no symtabs."));
809         }
810       else
811         return PSYMTAB_TO_SYMTAB (cs_pst);
812     }
813   return NULL;
814 }
815
816 static void
817 forget_cached_source_info_partial (struct objfile *objfile)
818 {
819   struct partial_symtab *pst;
820
821   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, pst)
822     {
823       if (pst->fullname != NULL)
824         {
825           xfree (pst->fullname);
826           pst->fullname = NULL;
827         }
828     }
829 }
830
831 static void
832 print_partial_symbols (struct gdbarch *gdbarch,
833                        struct partial_symbol **p, int count, char *what,
834                        struct ui_file *outfile)
835 {
836   fprintf_filtered (outfile, "  %s partial symbols:\n", what);
837   while (count-- > 0)
838     {
839       fprintf_filtered (outfile, "    `%s'", SYMBOL_LINKAGE_NAME (*p));
840       if (SYMBOL_DEMANGLED_NAME (*p) != NULL)
841         {
842           fprintf_filtered (outfile, "  `%s'", SYMBOL_DEMANGLED_NAME (*p));
843         }
844       fputs_filtered (", ", outfile);
845       switch (SYMBOL_DOMAIN (*p))
846         {
847         case UNDEF_DOMAIN:
848           fputs_filtered ("undefined domain, ", outfile);
849           break;
850         case VAR_DOMAIN:
851           /* This is the usual thing -- don't print it.  */
852           break;
853         case STRUCT_DOMAIN:
854           fputs_filtered ("struct domain, ", outfile);
855           break;
856         case LABEL_DOMAIN:
857           fputs_filtered ("label domain, ", outfile);
858           break;
859         default:
860           fputs_filtered ("<invalid domain>, ", outfile);
861           break;
862         }
863       switch (SYMBOL_CLASS (*p))
864         {
865         case LOC_UNDEF:
866           fputs_filtered ("undefined", outfile);
867           break;
868         case LOC_CONST:
869           fputs_filtered ("constant int", outfile);
870           break;
871         case LOC_STATIC:
872           fputs_filtered ("static", outfile);
873           break;
874         case LOC_REGISTER:
875           fputs_filtered ("register", outfile);
876           break;
877         case LOC_ARG:
878           fputs_filtered ("pass by value", outfile);
879           break;
880         case LOC_REF_ARG:
881           fputs_filtered ("pass by reference", outfile);
882           break;
883         case LOC_REGPARM_ADDR:
884           fputs_filtered ("register address parameter", outfile);
885           break;
886         case LOC_LOCAL:
887           fputs_filtered ("stack parameter", outfile);
888           break;
889         case LOC_TYPEDEF:
890           fputs_filtered ("type", outfile);
891           break;
892         case LOC_LABEL:
893           fputs_filtered ("label", outfile);
894           break;
895         case LOC_BLOCK:
896           fputs_filtered ("function", outfile);
897           break;
898         case LOC_CONST_BYTES:
899           fputs_filtered ("constant bytes", outfile);
900           break;
901         case LOC_UNRESOLVED:
902           fputs_filtered ("unresolved", outfile);
903           break;
904         case LOC_OPTIMIZED_OUT:
905           fputs_filtered ("optimized out", outfile);
906           break;
907         case LOC_COMPUTED:
908           fputs_filtered ("computed at runtime", outfile);
909           break;
910         default:
911           fputs_filtered ("<invalid location>", outfile);
912           break;
913         }
914       fputs_filtered (", ", outfile);
915       fputs_filtered (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (*p)), outfile);
916       fprintf_filtered (outfile, "\n");
917       p++;
918     }
919 }
920
921 static void
922 dump_psymtab (struct objfile *objfile, struct partial_symtab *psymtab,
923               struct ui_file *outfile)
924 {
925   struct gdbarch *gdbarch = get_objfile_arch (objfile);
926   int i;
927
928   fprintf_filtered (outfile, "\nPartial symtab for source file %s ",
929                     psymtab->filename);
930   fprintf_filtered (outfile, "(object ");
931   gdb_print_host_address (psymtab, outfile);
932   fprintf_filtered (outfile, ")\n\n");
933   fprintf_unfiltered (outfile, "  Read from object file %s (",
934                       objfile->name);
935   gdb_print_host_address (objfile, outfile);
936   fprintf_unfiltered (outfile, ")\n");
937
938   if (psymtab->readin)
939     {
940       fprintf_filtered (outfile,
941                         "  Full symtab was read (at ");
942       gdb_print_host_address (psymtab->symtab, outfile);
943       fprintf_filtered (outfile, " by function at ");
944       gdb_print_host_address (psymtab->read_symtab, outfile);
945       fprintf_filtered (outfile, ")\n");
946     }
947
948   fprintf_filtered (outfile, "  Relocate symbols by ");
949   for (i = 0; i < psymtab->objfile->num_sections; ++i)
950     {
951       if (i != 0)
952         fprintf_filtered (outfile, ", ");
953       wrap_here ("    ");
954       fputs_filtered (paddress (gdbarch,
955                                 ANOFFSET (psymtab->section_offsets, i)),
956                       outfile);
957     }
958   fprintf_filtered (outfile, "\n");
959
960   fprintf_filtered (outfile, "  Symbols cover text addresses ");
961   fputs_filtered (paddress (gdbarch, psymtab->textlow), outfile);
962   fprintf_filtered (outfile, "-");
963   fputs_filtered (paddress (gdbarch, psymtab->texthigh), outfile);
964   fprintf_filtered (outfile, "\n");
965   fprintf_filtered (outfile, "  Depends on %d other partial symtabs.\n",
966                     psymtab->number_of_dependencies);
967   for (i = 0; i < psymtab->number_of_dependencies; i++)
968     {
969       fprintf_filtered (outfile, "    %d ", i);
970       gdb_print_host_address (psymtab->dependencies[i], outfile);
971       fprintf_filtered (outfile, " %s\n",
972                         psymtab->dependencies[i]->filename);
973     }
974   if (psymtab->n_global_syms > 0)
975     {
976       print_partial_symbols (gdbarch,
977                              objfile->global_psymbols.list
978                              + psymtab->globals_offset,
979                              psymtab->n_global_syms, "Global", outfile);
980     }
981   if (psymtab->n_static_syms > 0)
982     {
983       print_partial_symbols (gdbarch,
984                              objfile->static_psymbols.list
985                              + psymtab->statics_offset,
986                              psymtab->n_static_syms, "Static", outfile);
987     }
988   fprintf_filtered (outfile, "\n");
989 }
990
991 static void
992 print_psymtab_stats_for_objfile (struct objfile *objfile)
993 {
994   int i;
995   struct partial_symtab *ps;
996
997   i = 0;
998   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps)
999     {
1000       if (ps->readin == 0)
1001         i++;
1002     }
1003   printf_filtered (_("  Number of psym tables (not yet expanded): %d\n"), i);
1004 }
1005
1006 static void
1007 dump_psymtabs_for_objfile (struct objfile *objfile)
1008 {
1009   struct partial_symtab *psymtab;
1010
1011   if (objfile->psymtabs)
1012     {
1013       printf_filtered ("Psymtabs:\n");
1014       for (psymtab = objfile->psymtabs;
1015            psymtab != NULL;
1016            psymtab = psymtab->next)
1017         {
1018           printf_filtered ("%s at ",
1019                            psymtab->filename);
1020           gdb_print_host_address (psymtab, gdb_stdout);
1021           printf_filtered (", ");
1022           if (psymtab->objfile != objfile)
1023             {
1024               printf_filtered ("NOT ON CHAIN!  ");
1025             }
1026           wrap_here ("  ");
1027         }
1028       printf_filtered ("\n\n");
1029     }
1030 }
1031
1032 /* Look through the partial symtabs for all symbols which begin
1033    by matching FUNC_NAME.  Make sure we read that symbol table in.  */
1034
1035 static void
1036 read_symtabs_for_function (struct objfile *objfile, const char *func_name)
1037 {
1038   struct partial_symtab *ps;
1039
1040   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps)
1041   {
1042     if (ps->readin)
1043       continue;
1044
1045     if ((lookup_partial_symbol (ps, func_name, 1, VAR_DOMAIN)
1046          != NULL)
1047         || (lookup_partial_symbol (ps, func_name, 0, VAR_DOMAIN)
1048             != NULL))
1049       psymtab_to_symtab (ps);
1050   }
1051 }
1052
1053 static void
1054 expand_partial_symbol_tables (struct objfile *objfile)
1055 {
1056   struct partial_symtab *psymtab;
1057
1058   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, psymtab)
1059     {
1060       psymtab_to_symtab (psymtab);
1061     }
1062 }
1063
1064 static void
1065 read_psymtabs_with_filename (struct objfile *objfile, const char *filename)
1066 {
1067   struct partial_symtab *p;
1068
1069   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, p)
1070     {
1071       if (filename_cmp (filename, p->filename) == 0)
1072         PSYMTAB_TO_SYMTAB (p);
1073     }
1074 }
1075
1076 static void
1077 map_symbol_names_psymtab (struct objfile *objfile,
1078                           void (*fun) (const char *, void *), void *data)
1079 {
1080   struct partial_symtab *ps;
1081
1082   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps)
1083     {
1084       struct partial_symbol **psym;
1085
1086       /* If the psymtab's been read in we'll get it when we search
1087          through the blockvector.  */
1088       if (ps->readin)
1089         continue;
1090
1091       for (psym = objfile->global_psymbols.list + ps->globals_offset;
1092            psym < (objfile->global_psymbols.list + ps->globals_offset
1093                    + ps->n_global_syms);
1094            psym++)
1095         {
1096           /* If interrupted, then quit.  */
1097           QUIT;
1098           (*fun) (SYMBOL_NATURAL_NAME (*psym), data);
1099         }
1100
1101       for (psym = objfile->static_psymbols.list + ps->statics_offset;
1102            psym < (objfile->static_psymbols.list + ps->statics_offset
1103                    + ps->n_static_syms);
1104            psym++)
1105         {
1106           QUIT;
1107           (*fun) (SYMBOL_NATURAL_NAME (*psym), data);
1108         }
1109     }
1110 }
1111
1112 static void
1113 map_symbol_filenames_psymtab (struct objfile *objfile,
1114                               void (*fun) (const char *, const char *,
1115                                            void *),
1116                               void *data)
1117 {
1118   struct partial_symtab *ps;
1119
1120   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps)
1121     {
1122       const char *fullname;
1123
1124       if (ps->readin)
1125         continue;
1126
1127       fullname = psymtab_to_fullname (ps);
1128       (*fun) (ps->filename, fullname, data);
1129     }
1130 }
1131
1132 int find_and_open_source (const char *filename,
1133                           const char *dirname,
1134                           char **fullname);
1135
1136 /* Finds the fullname that a partial_symtab represents.
1137
1138    If this functions finds the fullname, it will save it in ps->fullname
1139    and it will also return the value.
1140
1141    If this function fails to find the file that this partial_symtab represents,
1142    NULL will be returned and ps->fullname will be set to NULL.  */
1143 static char *
1144 psymtab_to_fullname (struct partial_symtab *ps)
1145 {
1146   int r;
1147
1148   if (!ps)
1149     return NULL;
1150
1151   /* Don't check ps->fullname here, the file could have been
1152      deleted/moved/..., look for it again.  */
1153   r = find_and_open_source (ps->filename, ps->dirname, &ps->fullname);
1154
1155   if (r >= 0)
1156     {
1157       close (r);
1158       return ps->fullname;
1159     }
1160
1161   return NULL;
1162 }
1163
1164 static const char *
1165 find_symbol_file_from_partial (struct objfile *objfile, const char *name)
1166 {
1167   struct partial_symtab *pst;
1168
1169   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, pst)
1170     {
1171       if (lookup_partial_symbol (pst, name, 1, VAR_DOMAIN))
1172         return pst->filename;
1173     }
1174   return NULL;
1175 }
1176
1177 /*  For all symbols, s, in BLOCK that are in NAMESPACE and match NAME
1178     according to the function MATCH, call CALLBACK(BLOCK, s, DATA).
1179     BLOCK is assumed to come from OBJFILE.  Returns 1 iff CALLBACK
1180     ever returns non-zero, and otherwise returns 0.  */
1181
1182 static int
1183 map_block (const char *name, domain_enum namespace, struct objfile *objfile,
1184            struct block *block,
1185            int (*callback) (struct block *, struct symbol *, void *),
1186            void *data, symbol_compare_ftype *match)
1187 {
1188   struct dict_iterator iter;
1189   struct symbol *sym;
1190
1191   for (sym = dict_iter_match_first (BLOCK_DICT (block), name, match, &iter);
1192        sym != NULL; sym = dict_iter_match_next (name, match, &iter))
1193     {
1194       if (symbol_matches_domain (SYMBOL_LANGUAGE (sym), 
1195                                  SYMBOL_DOMAIN (sym), namespace))
1196         {
1197           if (callback (block, sym, data))
1198             return 1;
1199         }
1200     }
1201
1202   return 0;
1203 }
1204
1205 /*  Psymtab version of map_matching_symbols.  See its definition in
1206     the definition of quick_symbol_functions in symfile.h.  */
1207
1208 static void
1209 map_matching_symbols_psymtab (const char *name, domain_enum namespace,
1210                               struct objfile *objfile, int global,
1211                               int (*callback) (struct block *,
1212                                                struct symbol *, void *),
1213                               void *data,
1214                               symbol_compare_ftype *match,
1215                               symbol_compare_ftype *ordered_compare)
1216 {
1217   const int block_kind = global ? GLOBAL_BLOCK : STATIC_BLOCK;
1218   struct partial_symtab *ps;
1219
1220   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps)
1221     {
1222       QUIT;
1223       if (ps->readin
1224           || match_partial_symbol (ps, global, name, namespace, match,
1225                                    ordered_compare))
1226         {
1227           struct symtab *s = PSYMTAB_TO_SYMTAB (ps);
1228           struct block *block;
1229
1230           if (s == NULL || !s->primary)
1231             continue;
1232           block = BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), block_kind);
1233           if (map_block (name, namespace, objfile, block,
1234                          callback, data, match))
1235             return;
1236           if (callback (block, NULL, data))
1237             return;
1238         }
1239     }
1240 }           
1241
1242 static void
1243 expand_symtabs_matching_via_partial (struct objfile *objfile,
1244                                      int (*file_matcher) (const char *,
1245                                                           void *),
1246                                      int (*name_matcher) (const char *,
1247                                                           void *),
1248                                      enum search_domain kind,
1249                                      void *data)
1250 {
1251   struct partial_symtab *ps;
1252
1253   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps)
1254     {
1255       struct partial_symbol **psym;
1256       struct partial_symbol **bound, **gbound, **sbound;
1257       int keep_going = 1;
1258
1259       if (ps->readin)
1260         continue;
1261
1262       if (! (*file_matcher) (ps->filename, data))
1263         continue;
1264
1265       gbound = objfile->global_psymbols.list
1266         + ps->globals_offset + ps->n_global_syms;
1267       sbound = objfile->static_psymbols.list
1268         + ps->statics_offset + ps->n_static_syms;
1269       bound = gbound;
1270
1271       /* Go through all of the symbols stored in a partial
1272          symtab in one loop.  */
1273       psym = objfile->global_psymbols.list + ps->globals_offset;
1274       while (keep_going)
1275         {
1276           if (psym >= bound)
1277             {
1278               if (bound == gbound && ps->n_static_syms != 0)
1279                 {
1280                   psym = objfile->static_psymbols.list + ps->statics_offset;
1281                   bound = sbound;
1282                 }
1283               else
1284                 keep_going = 0;
1285               continue;
1286             }
1287           else
1288             {
1289               QUIT;
1290
1291               if ((*name_matcher) (SYMBOL_NATURAL_NAME (*psym), data)
1292                   && ((kind == VARIABLES_DOMAIN
1293                        && SYMBOL_CLASS (*psym) != LOC_TYPEDEF
1294                        && SYMBOL_CLASS (*psym) != LOC_BLOCK)
1295                       || (kind == FUNCTIONS_DOMAIN
1296                           && SYMBOL_CLASS (*psym) == LOC_BLOCK)
1297                       || (kind == TYPES_DOMAIN
1298                           && SYMBOL_CLASS (*psym) == LOC_TYPEDEF)))
1299                 {
1300                   PSYMTAB_TO_SYMTAB (ps);
1301                   keep_going = 0;
1302                 }
1303             }
1304           psym++;
1305         }
1306     }
1307 }
1308
1309 static int
1310 objfile_has_psyms (struct objfile *objfile)
1311 {
1312   return objfile->psymtabs != NULL;
1313 }
1314
1315 const struct quick_symbol_functions psym_functions =
1316 {
1317   objfile_has_psyms,
1318   find_last_source_symtab_from_partial,
1319   forget_cached_source_info_partial,
1320   lookup_symtab_via_partial_symtab,
1321   lookup_symbol_aux_psymtabs,
1322   pre_expand_symtabs_matching_psymtabs,
1323   print_psymtab_stats_for_objfile,
1324   dump_psymtabs_for_objfile,
1325   relocate_psymtabs,
1326   read_symtabs_for_function,
1327   expand_partial_symbol_tables,
1328   read_psymtabs_with_filename,
1329   find_symbol_file_from_partial,
1330   map_matching_symbols_psymtab,
1331   expand_symtabs_matching_via_partial,
1332   find_pc_sect_symtab_from_partial,
1333   map_symbol_names_psymtab,
1334   map_symbol_filenames_psymtab
1335 };
1336
1337 \f
1338
1339 /* This compares two partial symbols by names, using strcmp_iw_ordered
1340    for the comparison.  */
1341
1342 static int
1343 compare_psymbols (const void *s1p, const void *s2p)
1344 {
1345   struct partial_symbol *const *s1 = s1p;
1346   struct partial_symbol *const *s2 = s2p;
1347
1348   return strcmp_iw_ordered (SYMBOL_SEARCH_NAME (*s1),
1349                             SYMBOL_SEARCH_NAME (*s2));
1350 }
1351
1352 void
1353 sort_pst_symbols (struct partial_symtab *pst)
1354 {
1355   /* Sort the global list; don't sort the static list.  */
1356
1357   qsort (pst->objfile->global_psymbols.list + pst->globals_offset,
1358          pst->n_global_syms, sizeof (struct partial_symbol *),
1359          compare_psymbols);
1360 }
1361
1362 /* Allocate and partially fill a partial symtab.  It will be
1363    completely filled at the end of the symbol list.
1364
1365    FILENAME is the name of the symbol-file we are reading from.  */
1366
1367 struct partial_symtab *
1368 start_psymtab_common (struct objfile *objfile,
1369                       struct section_offsets *section_offsets,
1370                       const char *filename,
1371                       CORE_ADDR textlow, struct partial_symbol **global_syms,
1372                       struct partial_symbol **static_syms)
1373 {
1374   struct partial_symtab *psymtab;
1375
1376   psymtab = allocate_psymtab (filename, objfile);
1377   psymtab->section_offsets = section_offsets;
1378   psymtab->textlow = textlow;
1379   psymtab->texthigh = psymtab->textlow;         /* default */
1380   psymtab->globals_offset = global_syms - objfile->global_psymbols.list;
1381   psymtab->statics_offset = static_syms - objfile->static_psymbols.list;
1382   return (psymtab);
1383 }
1384
1385 /* Calculate a hash code for the given partial symbol.  The hash is
1386    calculated using the symbol's value, language, domain, class
1387    and name.  These are the values which are set by
1388    add_psymbol_to_bcache.  */
1389
1390 static unsigned long
1391 psymbol_hash (const void *addr, int length)
1392 {
1393   unsigned long h = 0;
1394   struct partial_symbol *psymbol = (struct partial_symbol *) addr;
1395   unsigned int lang = psymbol->ginfo.language;
1396   unsigned int domain = PSYMBOL_DOMAIN (psymbol);
1397   unsigned int class = PSYMBOL_CLASS (psymbol);
1398
1399   h = hash_continue (&psymbol->ginfo.value, sizeof (psymbol->ginfo.value), h);
1400   h = hash_continue (&lang, sizeof (unsigned int), h);
1401   h = hash_continue (&domain, sizeof (unsigned int), h);
1402   h = hash_continue (&class, sizeof (unsigned int), h);
1403   h = hash_continue (psymbol->ginfo.name, strlen (psymbol->ginfo.name), h);
1404
1405   return h;
1406 }
1407
1408 /* Returns true if the symbol at addr1 equals the symbol at addr2.
1409    For the comparison this function uses a symbols value,
1410    language, domain, class and name.  */
1411
1412 static int
1413 psymbol_compare (const void *addr1, const void *addr2, int length)
1414 {
1415   struct partial_symbol *sym1 = (struct partial_symbol *) addr1;
1416   struct partial_symbol *sym2 = (struct partial_symbol *) addr2;
1417
1418   return (memcmp (&sym1->ginfo.value, &sym1->ginfo.value,
1419                   sizeof (sym1->ginfo.value)) == 0
1420           && sym1->ginfo.language == sym2->ginfo.language
1421           && PSYMBOL_DOMAIN (sym1) == PSYMBOL_DOMAIN (sym2)
1422           && PSYMBOL_CLASS (sym1) == PSYMBOL_CLASS (sym2)
1423           && sym1->ginfo.name == sym2->ginfo.name);
1424 }
1425
1426 /* Initialize a partial symbol bcache.  */
1427
1428 struct psymbol_bcache *
1429 psymbol_bcache_init (void)
1430 {
1431   struct psymbol_bcache *bcache = XCALLOC (1, struct psymbol_bcache);
1432   bcache->bcache = bcache_xmalloc (psymbol_hash, psymbol_compare);
1433   return bcache;
1434 }
1435
1436 /* Free a partial symbol bcache.  */
1437 void
1438 psymbol_bcache_free (struct psymbol_bcache *bcache)
1439 {
1440   if (bcache == NULL)
1441     return;
1442
1443   bcache_xfree (bcache->bcache);
1444   xfree (bcache);
1445 }
1446
1447 /* Return the internal bcache of the psymbol_bcache BCACHE.  */
1448
1449 struct bcache *
1450 psymbol_bcache_get_bcache (struct psymbol_bcache *bcache)
1451 {
1452   return bcache->bcache;
1453 }
1454
1455 /* Find a copy of the SYM in BCACHE.  If BCACHE has never seen this
1456    symbol before, add a copy to BCACHE.  In either case, return a pointer
1457    to BCACHE's copy of the symbol.  If optional ADDED is not NULL, return
1458    1 in case of new entry or 0 if returning an old entry.  */
1459
1460 static const struct partial_symbol *
1461 psymbol_bcache_full (struct partial_symbol *sym,
1462                      struct psymbol_bcache *bcache,
1463                      int *added)
1464 {
1465   return bcache_full (sym,
1466                       sizeof (struct partial_symbol),
1467                       bcache->bcache,
1468                       added);
1469 }
1470
1471 /* Helper function, initialises partial symbol structure and stashes 
1472    it into objfile's bcache.  Note that our caching mechanism will
1473    use all fields of struct partial_symbol to determine hash value of the
1474    structure.  In other words, having two symbols with the same name but
1475    different domain (or address) is possible and correct.  */
1476
1477 static const struct partial_symbol *
1478 add_psymbol_to_bcache (const char *name, int namelength, int copy_name,
1479                        domain_enum domain,
1480                        enum address_class class,
1481                        long val,        /* Value as a long */
1482                        CORE_ADDR coreaddr,      /* Value as a CORE_ADDR */
1483                        enum language language, struct objfile *objfile,
1484                        int *added)
1485 {
1486   struct partial_symbol psymbol;
1487
1488   /* We must ensure that the entire 'value' field has been zeroed
1489      before assigning to it, because an assignment may not write the
1490      entire field.  */
1491   memset (&psymbol.ginfo.value, 0, sizeof (psymbol.ginfo.value));
1492
1493   /* val and coreaddr are mutually exclusive, one of them *will* be zero.  */
1494   if (val != 0)
1495     {
1496       SYMBOL_VALUE (&psymbol) = val;
1497     }
1498   else
1499     {
1500       SYMBOL_VALUE_ADDRESS (&psymbol) = coreaddr;
1501     }
1502   SYMBOL_SECTION (&psymbol) = 0;
1503   SYMBOL_OBJ_SECTION (&psymbol) = NULL;
1504   SYMBOL_SET_LANGUAGE (&psymbol, language);
1505   PSYMBOL_DOMAIN (&psymbol) = domain;
1506   PSYMBOL_CLASS (&psymbol) = class;
1507
1508   SYMBOL_SET_NAMES (&psymbol, name, namelength, copy_name, objfile);
1509
1510   /* Stash the partial symbol away in the cache.  */
1511   return psymbol_bcache_full (&psymbol,
1512                               objfile->psymbol_cache,
1513                               added);
1514 }
1515
1516 /* Increase the space allocated for LISTP, which is probably
1517    global_psymbols or static_psymbols.  This space will eventually
1518    be freed in free_objfile().  */
1519
1520 static void
1521 extend_psymbol_list (struct psymbol_allocation_list *listp,
1522                      struct objfile *objfile)
1523 {
1524   int new_size;
1525
1526   if (listp->size == 0)
1527     {
1528       new_size = 255;
1529       listp->list = (struct partial_symbol **)
1530         xmalloc (new_size * sizeof (struct partial_symbol *));
1531     }
1532   else
1533     {
1534       new_size = listp->size * 2;
1535       listp->list = (struct partial_symbol **)
1536         xrealloc ((char *) listp->list,
1537                   new_size * sizeof (struct partial_symbol *));
1538     }
1539   /* Next assumes we only went one over.  Should be good if
1540      program works correctly.  */
1541   listp->next = listp->list + listp->size;
1542   listp->size = new_size;
1543 }
1544
1545 /* Helper function, adds partial symbol to the given partial symbol
1546    list.  */
1547
1548 static void
1549 append_psymbol_to_list (struct psymbol_allocation_list *list,
1550                         const struct partial_symbol *psym,
1551                         struct objfile *objfile)
1552 {
1553   if (list->next >= list->list + list->size)
1554     extend_psymbol_list (list, objfile);
1555   *list->next++ = (struct partial_symbol *) psym;
1556   OBJSTAT (objfile, n_psyms++);
1557 }
1558
1559 /* Add a symbol with a long value to a psymtab.
1560    Since one arg is a struct, we pass in a ptr and deref it (sigh).
1561    Return the partial symbol that has been added.  */
1562
1563 /* NOTE: carlton/2003-09-11: The reason why we return the partial
1564    symbol is so that callers can get access to the symbol's demangled
1565    name, which they don't have any cheap way to determine otherwise.
1566    (Currenly, dwarf2read.c is the only file who uses that information,
1567    though it's possible that other readers might in the future.)
1568    Elena wasn't thrilled about that, and I don't blame her, but we
1569    couldn't come up with a better way to get that information.  If
1570    it's needed in other situations, we could consider breaking up
1571    SYMBOL_SET_NAMES to provide access to the demangled name lookup
1572    cache.  */
1573
1574 const struct partial_symbol *
1575 add_psymbol_to_list (const char *name, int namelength, int copy_name,
1576                      domain_enum domain,
1577                      enum address_class class,
1578                      struct psymbol_allocation_list *list, 
1579                      long val,  /* Value as a long */
1580                      CORE_ADDR coreaddr,        /* Value as a CORE_ADDR */
1581                      enum language language, struct objfile *objfile)
1582 {
1583   const struct partial_symbol *psym;
1584
1585   int added;
1586
1587   /* Stash the partial symbol away in the cache.  */
1588   psym = add_psymbol_to_bcache (name, namelength, copy_name, domain, class,
1589                                 val, coreaddr, language, objfile, &added);
1590
1591   /* Do not duplicate global partial symbols.  */
1592   if (list == &objfile->global_psymbols
1593       && !added)
1594     return psym;
1595
1596   /* Save pointer to partial symbol in psymtab, growing symtab if needed.  */
1597   append_psymbol_to_list (list, psym, objfile);
1598   return psym;
1599 }
1600
1601 /* Initialize storage for partial symbols.  */
1602
1603 void
1604 init_psymbol_list (struct objfile *objfile, int total_symbols)
1605 {
1606   /* Free any previously allocated psymbol lists.  */
1607
1608   if (objfile->global_psymbols.list)
1609     {
1610       xfree (objfile->global_psymbols.list);
1611     }
1612   if (objfile->static_psymbols.list)
1613     {
1614       xfree (objfile->static_psymbols.list);
1615     }
1616
1617   /* Current best guess is that approximately a twentieth
1618      of the total symbols (in a debugging file) are global or static
1619      oriented symbols.  */
1620
1621   objfile->global_psymbols.size = total_symbols / 10;
1622   objfile->static_psymbols.size = total_symbols / 10;
1623
1624   if (objfile->global_psymbols.size > 0)
1625     {
1626       objfile->global_psymbols.next =
1627         objfile->global_psymbols.list = (struct partial_symbol **)
1628         xmalloc ((objfile->global_psymbols.size
1629                   * sizeof (struct partial_symbol *)));
1630     }
1631   if (objfile->static_psymbols.size > 0)
1632     {
1633       objfile->static_psymbols.next =
1634         objfile->static_psymbols.list = (struct partial_symbol **)
1635         xmalloc ((objfile->static_psymbols.size
1636                   * sizeof (struct partial_symbol *)));
1637     }
1638 }
1639
1640 struct partial_symtab *
1641 allocate_psymtab (const char *filename, struct objfile *objfile)
1642 {
1643   struct partial_symtab *psymtab;
1644
1645   if (objfile->free_psymtabs)
1646     {
1647       psymtab = objfile->free_psymtabs;
1648       objfile->free_psymtabs = psymtab->next;
1649     }
1650   else
1651     psymtab = (struct partial_symtab *)
1652       obstack_alloc (&objfile->objfile_obstack,
1653                      sizeof (struct partial_symtab));
1654
1655   memset (psymtab, 0, sizeof (struct partial_symtab));
1656   psymtab->filename = obsavestring (filename, strlen (filename),
1657                                     &objfile->objfile_obstack);
1658   psymtab->symtab = NULL;
1659
1660   /* Prepend it to the psymtab list for the objfile it belongs to.
1661      Psymtabs are searched in most recent inserted -> least recent
1662      inserted order.  */
1663
1664   psymtab->objfile = objfile;
1665   psymtab->next = objfile->psymtabs;
1666   objfile->psymtabs = psymtab;
1667
1668   return (psymtab);
1669 }
1670
1671 void
1672 discard_psymtab (struct partial_symtab *pst)
1673 {
1674   struct partial_symtab **prev_pst;
1675
1676   /* From dbxread.c:
1677      Empty psymtabs happen as a result of header files which don't
1678      have any symbols in them.  There can be a lot of them.  But this
1679      check is wrong, in that a psymtab with N_SLINE entries but
1680      nothing else is not empty, but we don't realize that.  Fixing
1681      that without slowing things down might be tricky.  */
1682
1683   /* First, snip it out of the psymtab chain.  */
1684
1685   prev_pst = &(pst->objfile->psymtabs);
1686   while ((*prev_pst) != pst)
1687     prev_pst = &((*prev_pst)->next);
1688   (*prev_pst) = pst->next;
1689
1690   /* Next, put it on a free list for recycling.  */
1691
1692   pst->next = pst->objfile->free_psymtabs;
1693   pst->objfile->free_psymtabs = pst;
1694 }
1695
1696 \f
1697
1698 void
1699 maintenance_print_psymbols (char *args, int from_tty)
1700 {
1701   char **argv;
1702   struct ui_file *outfile;
1703   struct cleanup *cleanups;
1704   char *symname = NULL;
1705   char *filename = DEV_TTY;
1706   struct objfile *objfile;
1707   struct partial_symtab *ps;
1708
1709   dont_repeat ();
1710
1711   if (args == NULL)
1712     {
1713       error (_("\
1714 print-psymbols takes an output file name and optional symbol file name"));
1715     }
1716   argv = gdb_buildargv (args);
1717   cleanups = make_cleanup_freeargv (argv);
1718
1719   if (argv[0] != NULL)
1720     {
1721       filename = argv[0];
1722       /* If a second arg is supplied, it is a source file name to match on.  */
1723       if (argv[1] != NULL)
1724         {
1725           symname = argv[1];
1726         }
1727     }
1728
1729   filename = tilde_expand (filename);
1730   make_cleanup (xfree, filename);
1731
1732   outfile = gdb_fopen (filename, FOPEN_WT);
1733   if (outfile == 0)
1734     perror_with_name (filename);
1735   make_cleanup_ui_file_delete (outfile);
1736
1737   immediate_quit++;
1738   ALL_PSYMTABS (objfile, ps)
1739     if (symname == NULL || filename_cmp (symname, ps->filename) == 0)
1740     dump_psymtab (objfile, ps, outfile);
1741   immediate_quit--;
1742   do_cleanups (cleanups);
1743 }
1744
1745 /* List all the partial symbol tables whose names match REGEXP (optional).  */
1746 void
1747 maintenance_info_psymtabs (char *regexp, int from_tty)
1748 {
1749   struct program_space *pspace;
1750   struct objfile *objfile;
1751
1752   if (regexp)
1753     re_comp (regexp);
1754
1755   ALL_PSPACES (pspace)
1756     ALL_PSPACE_OBJFILES (pspace, objfile)
1757     {
1758       struct gdbarch *gdbarch = get_objfile_arch (objfile);
1759       struct partial_symtab *psymtab;
1760
1761       /* We don't want to print anything for this objfile until we
1762          actually find a symtab whose name matches.  */
1763       int printed_objfile_start = 0;
1764
1765       ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, psymtab)
1766         {
1767           QUIT;
1768
1769           if (! regexp
1770               || re_exec (psymtab->filename))
1771             {
1772               if (! printed_objfile_start)
1773                 {
1774                   printf_filtered ("{ objfile %s ", objfile->name);
1775                   wrap_here ("  ");
1776                   printf_filtered ("((struct objfile *) %s)\n", 
1777                                    host_address_to_string (objfile));
1778                   printed_objfile_start = 1;
1779                 }
1780
1781               printf_filtered ("  { psymtab %s ", psymtab->filename);
1782               wrap_here ("    ");
1783               printf_filtered ("((struct partial_symtab *) %s)\n", 
1784                                host_address_to_string (psymtab));
1785
1786               printf_filtered ("    readin %s\n",
1787                                psymtab->readin ? "yes" : "no");
1788               printf_filtered ("    fullname %s\n",
1789                                psymtab->fullname
1790                                ? psymtab->fullname : "(null)");
1791               printf_filtered ("    text addresses ");
1792               fputs_filtered (paddress (gdbarch, psymtab->textlow),
1793                               gdb_stdout);
1794               printf_filtered (" -- ");
1795               fputs_filtered (paddress (gdbarch, psymtab->texthigh),
1796                               gdb_stdout);
1797               printf_filtered ("\n");
1798               printf_filtered ("    globals ");
1799               if (psymtab->n_global_syms)
1800                 {
1801                   printf_filtered ("(* (struct partial_symbol **) %s @ %d)\n",
1802                                    host_address_to_string (psymtab->objfile->global_psymbols.list
1803                                     + psymtab->globals_offset),
1804                                    psymtab->n_global_syms);
1805                 }
1806               else
1807                 printf_filtered ("(none)\n");
1808               printf_filtered ("    statics ");
1809               if (psymtab->n_static_syms)
1810                 {
1811                   printf_filtered ("(* (struct partial_symbol **) %s @ %d)\n",
1812                                    host_address_to_string (psymtab->objfile->static_psymbols.list
1813                                     + psymtab->statics_offset),
1814                                    psymtab->n_static_syms);
1815                 }
1816               else
1817                 printf_filtered ("(none)\n");
1818               printf_filtered ("    dependencies ");
1819               if (psymtab->number_of_dependencies)
1820                 {
1821                   int i;
1822
1823                   printf_filtered ("{\n");
1824                   for (i = 0; i < psymtab->number_of_dependencies; i++)
1825                     {
1826                       struct partial_symtab *dep = psymtab->dependencies[i];
1827
1828                       /* Note the string concatenation there --- no comma.  */
1829                       printf_filtered ("      psymtab %s "
1830                                        "((struct partial_symtab *) %s)\n",
1831                                        dep->filename, 
1832                                        host_address_to_string (dep));
1833                     }
1834                   printf_filtered ("    }\n");
1835                 }
1836               else
1837                 printf_filtered ("(none)\n");
1838               printf_filtered ("  }\n");
1839             }
1840         }
1841
1842       if (printed_objfile_start)
1843         printf_filtered ("}\n");
1844     }
1845 }
1846
1847 /* Check consistency of psymtabs and symtabs.  */
1848
1849 void
1850 maintenance_check_symtabs (char *ignore, int from_tty)
1851 {
1852   struct symbol *sym;
1853   struct partial_symbol **psym;
1854   struct symtab *s = NULL;
1855   struct partial_symtab *ps;
1856   struct blockvector *bv;
1857   struct objfile *objfile;
1858   struct block *b;
1859   int length;
1860
1861   ALL_PSYMTABS (objfile, ps)
1862   {
1863     struct gdbarch *gdbarch = get_objfile_arch (objfile);
1864
1865     s = PSYMTAB_TO_SYMTAB (ps);
1866     if (s == NULL)
1867       continue;
1868     bv = BLOCKVECTOR (s);
1869     b = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
1870     psym = ps->objfile->static_psymbols.list + ps->statics_offset;
1871     length = ps->n_static_syms;
1872     while (length--)
1873       {
1874         sym = lookup_block_symbol (b, SYMBOL_LINKAGE_NAME (*psym),
1875                                    SYMBOL_DOMAIN (*psym));
1876         if (!sym)
1877           {
1878             printf_filtered ("Static symbol `");
1879             puts_filtered (SYMBOL_LINKAGE_NAME (*psym));
1880             printf_filtered ("' only found in ");
1881             puts_filtered (ps->filename);
1882             printf_filtered (" psymtab\n");
1883           }
1884         psym++;
1885       }
1886     b = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
1887     psym = ps->objfile->global_psymbols.list + ps->globals_offset;
1888     length = ps->n_global_syms;
1889     while (length--)
1890       {
1891         sym = lookup_block_symbol (b, SYMBOL_LINKAGE_NAME (*psym),
1892                                    SYMBOL_DOMAIN (*psym));
1893         if (!sym)
1894           {
1895             printf_filtered ("Global symbol `");
1896             puts_filtered (SYMBOL_LINKAGE_NAME (*psym));
1897             printf_filtered ("' only found in ");
1898             puts_filtered (ps->filename);
1899             printf_filtered (" psymtab\n");
1900           }
1901         psym++;
1902       }
1903     if (ps->texthigh < ps->textlow)
1904       {
1905         printf_filtered ("Psymtab ");
1906         puts_filtered (ps->filename);
1907         printf_filtered (" covers bad range ");
1908         fputs_filtered (paddress (gdbarch, ps->textlow), gdb_stdout);
1909         printf_filtered (" - ");
1910         fputs_filtered (paddress (gdbarch, ps->texthigh), gdb_stdout);
1911         printf_filtered ("\n");
1912         continue;
1913       }
1914     if (ps->texthigh == 0)
1915       continue;
1916     if (ps->textlow < BLOCK_START (b) || ps->texthigh > BLOCK_END (b))
1917       {
1918         printf_filtered ("Psymtab ");
1919         puts_filtered (ps->filename);
1920         printf_filtered (" covers ");
1921         fputs_filtered (paddress (gdbarch, ps->textlow), gdb_stdout);
1922         printf_filtered (" - ");
1923         fputs_filtered (paddress (gdbarch, ps->texthigh), gdb_stdout);
1924         printf_filtered (" but symtab covers only ");
1925         fputs_filtered (paddress (gdbarch, BLOCK_START (b)), gdb_stdout);
1926         printf_filtered (" - ");
1927         fputs_filtered (paddress (gdbarch, BLOCK_END (b)), gdb_stdout);
1928         printf_filtered ("\n");
1929       }
1930   }
1931 }
1932
1933 \f
1934
1935 void
1936 map_partial_symbol_names (void (*fun) (const char *, void *), void *data)
1937 {
1938   struct objfile *objfile;
1939
1940   ALL_OBJFILES (objfile)
1941   {
1942     if (objfile->sf)
1943       objfile->sf->qf->map_symbol_names (objfile, fun, data);
1944   }
1945 }
1946
1947 void
1948 map_partial_symbol_filenames (void (*fun) (const char *, const char *,
1949                                            void *),
1950                               void *data)
1951 {
1952   struct objfile *objfile;
1953
1954   ALL_OBJFILES (objfile)
1955   {
1956     if (objfile->sf)
1957       objfile->sf->qf->map_symbol_filenames (objfile, fun, data);
1958   }
1959 }