* dwarf2read.c (dw2_map_symbol_filenames): New parameter
[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       /* For `case_sensitivity == case_sensitive_off' strcmp_iw_ordered will
695          search more exactly than what matches SYMBOL_MATCHES_SEARCH_NAME.  */
696       while (top >= start && SYMBOL_MATCHES_SEARCH_NAME (*top, search_name))
697         top--;
698
699       /* Fixup to have a symbol which matches SYMBOL_MATCHES_SEARCH_NAME.  */
700       top++;
701
702       while (top <= real_top && SYMBOL_MATCHES_SEARCH_NAME (*top, search_name))
703         {
704           if (symbol_matches_domain (SYMBOL_LANGUAGE (*top),
705                                      SYMBOL_DOMAIN (*top), domain))
706             {
707               do_cleanups (cleanup);
708               return (*top);
709             }
710           top++;
711         }
712     }
713
714   /* Can't use a binary search or else we found during the binary search that
715      we should also do a linear search.  */
716
717   if (do_linear_search)
718     {
719       for (psym = start; psym < start + length; psym++)
720         {
721           if (symbol_matches_domain (SYMBOL_LANGUAGE (*psym),
722                                      SYMBOL_DOMAIN (*psym), domain)
723               && SYMBOL_MATCHES_SEARCH_NAME (*psym, search_name))
724             {
725               do_cleanups (cleanup);
726               return (*psym);
727             }
728         }
729     }
730
731   do_cleanups (cleanup);
732   return (NULL);
733 }
734
735 /* Get the symbol table that corresponds to a partial_symtab.
736    This is fast after the first time you do it.  In fact, there
737    is an even faster macro PSYMTAB_TO_SYMTAB that does the fast
738    case inline.  */
739
740 static struct symtab *
741 psymtab_to_symtab (struct partial_symtab *pst)
742 {
743   /* If it's been looked up before, return it.  */
744   if (pst->symtab)
745     return pst->symtab;
746
747   /* If it has not yet been read in, read it.  */
748   if (!pst->readin)
749     {
750       struct cleanup *back_to = increment_reading_symtab ();
751
752       (*pst->read_symtab) (pst);
753       do_cleanups (back_to);
754     }
755
756   return pst->symtab;
757 }
758
759 static void
760 relocate_psymtabs (struct objfile *objfile,
761                    struct section_offsets *new_offsets,
762                    struct section_offsets *delta)
763 {
764   struct partial_symbol **psym;
765   struct partial_symtab *p;
766
767   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, p)
768     {
769       p->textlow += ANOFFSET (delta, SECT_OFF_TEXT (objfile));
770       p->texthigh += ANOFFSET (delta, SECT_OFF_TEXT (objfile));
771     }
772
773   for (psym = objfile->global_psymbols.list;
774        psym < objfile->global_psymbols.next;
775        psym++)
776     {
777       fixup_psymbol_section (*psym, objfile);
778       if (SYMBOL_SECTION (*psym) >= 0)
779         SYMBOL_VALUE_ADDRESS (*psym) += ANOFFSET (delta,
780                                                   SYMBOL_SECTION (*psym));
781     }
782   for (psym = objfile->static_psymbols.list;
783        psym < objfile->static_psymbols.next;
784        psym++)
785     {
786       fixup_psymbol_section (*psym, objfile);
787       if (SYMBOL_SECTION (*psym) >= 0)
788         SYMBOL_VALUE_ADDRESS (*psym) += ANOFFSET (delta,
789                                                   SYMBOL_SECTION (*psym));
790     }
791 }
792
793 static struct symtab *
794 find_last_source_symtab_from_partial (struct objfile *ofp)
795 {
796   struct partial_symtab *ps;
797   struct partial_symtab *cs_pst = 0;
798
799   ALL_OBJFILE_PSYMTABS_REQUIRED (ofp, ps)
800     {
801       const char *name = ps->filename;
802       int len = strlen (name);
803
804       if (!(len > 2 && (strcmp (&name[len - 2], ".h") == 0
805                         || strcmp (name, "<<C++-namespaces>>") == 0)))
806         cs_pst = ps;
807     }
808
809   if (cs_pst)
810     {
811       if (cs_pst->readin)
812         {
813           internal_error (__FILE__, __LINE__,
814                           _("select_source_symtab: "
815                           "readin pst found and no symtabs."));
816         }
817       else
818         return PSYMTAB_TO_SYMTAB (cs_pst);
819     }
820   return NULL;
821 }
822
823 static void
824 forget_cached_source_info_partial (struct objfile *objfile)
825 {
826   struct partial_symtab *pst;
827
828   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, pst)
829     {
830       if (pst->fullname != NULL)
831         {
832           xfree (pst->fullname);
833           pst->fullname = NULL;
834         }
835     }
836 }
837
838 static void
839 print_partial_symbols (struct gdbarch *gdbarch,
840                        struct partial_symbol **p, int count, char *what,
841                        struct ui_file *outfile)
842 {
843   fprintf_filtered (outfile, "  %s partial symbols:\n", what);
844   while (count-- > 0)
845     {
846       fprintf_filtered (outfile, "    `%s'", SYMBOL_LINKAGE_NAME (*p));
847       if (SYMBOL_DEMANGLED_NAME (*p) != NULL)
848         {
849           fprintf_filtered (outfile, "  `%s'", SYMBOL_DEMANGLED_NAME (*p));
850         }
851       fputs_filtered (", ", outfile);
852       switch (SYMBOL_DOMAIN (*p))
853         {
854         case UNDEF_DOMAIN:
855           fputs_filtered ("undefined domain, ", outfile);
856           break;
857         case VAR_DOMAIN:
858           /* This is the usual thing -- don't print it.  */
859           break;
860         case STRUCT_DOMAIN:
861           fputs_filtered ("struct domain, ", outfile);
862           break;
863         case LABEL_DOMAIN:
864           fputs_filtered ("label domain, ", outfile);
865           break;
866         default:
867           fputs_filtered ("<invalid domain>, ", outfile);
868           break;
869         }
870       switch (SYMBOL_CLASS (*p))
871         {
872         case LOC_UNDEF:
873           fputs_filtered ("undefined", outfile);
874           break;
875         case LOC_CONST:
876           fputs_filtered ("constant int", outfile);
877           break;
878         case LOC_STATIC:
879           fputs_filtered ("static", outfile);
880           break;
881         case LOC_REGISTER:
882           fputs_filtered ("register", outfile);
883           break;
884         case LOC_ARG:
885           fputs_filtered ("pass by value", outfile);
886           break;
887         case LOC_REF_ARG:
888           fputs_filtered ("pass by reference", outfile);
889           break;
890         case LOC_REGPARM_ADDR:
891           fputs_filtered ("register address parameter", outfile);
892           break;
893         case LOC_LOCAL:
894           fputs_filtered ("stack parameter", outfile);
895           break;
896         case LOC_TYPEDEF:
897           fputs_filtered ("type", outfile);
898           break;
899         case LOC_LABEL:
900           fputs_filtered ("label", outfile);
901           break;
902         case LOC_BLOCK:
903           fputs_filtered ("function", outfile);
904           break;
905         case LOC_CONST_BYTES:
906           fputs_filtered ("constant bytes", outfile);
907           break;
908         case LOC_UNRESOLVED:
909           fputs_filtered ("unresolved", outfile);
910           break;
911         case LOC_OPTIMIZED_OUT:
912           fputs_filtered ("optimized out", outfile);
913           break;
914         case LOC_COMPUTED:
915           fputs_filtered ("computed at runtime", outfile);
916           break;
917         default:
918           fputs_filtered ("<invalid location>", outfile);
919           break;
920         }
921       fputs_filtered (", ", outfile);
922       fputs_filtered (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (*p)), outfile);
923       fprintf_filtered (outfile, "\n");
924       p++;
925     }
926 }
927
928 static void
929 dump_psymtab (struct objfile *objfile, struct partial_symtab *psymtab,
930               struct ui_file *outfile)
931 {
932   struct gdbarch *gdbarch = get_objfile_arch (objfile);
933   int i;
934
935   fprintf_filtered (outfile, "\nPartial symtab for source file %s ",
936                     psymtab->filename);
937   fprintf_filtered (outfile, "(object ");
938   gdb_print_host_address (psymtab, outfile);
939   fprintf_filtered (outfile, ")\n\n");
940   fprintf_unfiltered (outfile, "  Read from object file %s (",
941                       objfile->name);
942   gdb_print_host_address (objfile, outfile);
943   fprintf_unfiltered (outfile, ")\n");
944
945   if (psymtab->readin)
946     {
947       fprintf_filtered (outfile,
948                         "  Full symtab was read (at ");
949       gdb_print_host_address (psymtab->symtab, outfile);
950       fprintf_filtered (outfile, " by function at ");
951       gdb_print_host_address (psymtab->read_symtab, outfile);
952       fprintf_filtered (outfile, ")\n");
953     }
954
955   fprintf_filtered (outfile, "  Relocate symbols by ");
956   for (i = 0; i < psymtab->objfile->num_sections; ++i)
957     {
958       if (i != 0)
959         fprintf_filtered (outfile, ", ");
960       wrap_here ("    ");
961       fputs_filtered (paddress (gdbarch,
962                                 ANOFFSET (psymtab->section_offsets, i)),
963                       outfile);
964     }
965   fprintf_filtered (outfile, "\n");
966
967   fprintf_filtered (outfile, "  Symbols cover text addresses ");
968   fputs_filtered (paddress (gdbarch, psymtab->textlow), outfile);
969   fprintf_filtered (outfile, "-");
970   fputs_filtered (paddress (gdbarch, psymtab->texthigh), outfile);
971   fprintf_filtered (outfile, "\n");
972   fprintf_filtered (outfile, "  Depends on %d other partial symtabs.\n",
973                     psymtab->number_of_dependencies);
974   for (i = 0; i < psymtab->number_of_dependencies; i++)
975     {
976       fprintf_filtered (outfile, "    %d ", i);
977       gdb_print_host_address (psymtab->dependencies[i], outfile);
978       fprintf_filtered (outfile, " %s\n",
979                         psymtab->dependencies[i]->filename);
980     }
981   if (psymtab->n_global_syms > 0)
982     {
983       print_partial_symbols (gdbarch,
984                              objfile->global_psymbols.list
985                              + psymtab->globals_offset,
986                              psymtab->n_global_syms, "Global", outfile);
987     }
988   if (psymtab->n_static_syms > 0)
989     {
990       print_partial_symbols (gdbarch,
991                              objfile->static_psymbols.list
992                              + psymtab->statics_offset,
993                              psymtab->n_static_syms, "Static", outfile);
994     }
995   fprintf_filtered (outfile, "\n");
996 }
997
998 static void
999 print_psymtab_stats_for_objfile (struct objfile *objfile)
1000 {
1001   int i;
1002   struct partial_symtab *ps;
1003
1004   i = 0;
1005   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps)
1006     {
1007       if (ps->readin == 0)
1008         i++;
1009     }
1010   printf_filtered (_("  Number of psym tables (not yet expanded): %d\n"), i);
1011 }
1012
1013 static void
1014 dump_psymtabs_for_objfile (struct objfile *objfile)
1015 {
1016   struct partial_symtab *psymtab;
1017
1018   if (objfile->psymtabs)
1019     {
1020       printf_filtered ("Psymtabs:\n");
1021       for (psymtab = objfile->psymtabs;
1022            psymtab != NULL;
1023            psymtab = psymtab->next)
1024         {
1025           printf_filtered ("%s at ",
1026                            psymtab->filename);
1027           gdb_print_host_address (psymtab, gdb_stdout);
1028           printf_filtered (", ");
1029           if (psymtab->objfile != objfile)
1030             {
1031               printf_filtered ("NOT ON CHAIN!  ");
1032             }
1033           wrap_here ("  ");
1034         }
1035       printf_filtered ("\n\n");
1036     }
1037 }
1038
1039 /* Look through the partial symtabs for all symbols which begin
1040    by matching FUNC_NAME.  Make sure we read that symbol table in.  */
1041
1042 static void
1043 read_symtabs_for_function (struct objfile *objfile, const char *func_name)
1044 {
1045   struct partial_symtab *ps;
1046
1047   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps)
1048   {
1049     if (ps->readin)
1050       continue;
1051
1052     if ((lookup_partial_symbol (ps, func_name, 1, VAR_DOMAIN)
1053          != NULL)
1054         || (lookup_partial_symbol (ps, func_name, 0, VAR_DOMAIN)
1055             != NULL))
1056       psymtab_to_symtab (ps);
1057   }
1058 }
1059
1060 static void
1061 expand_partial_symbol_tables (struct objfile *objfile)
1062 {
1063   struct partial_symtab *psymtab;
1064
1065   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, psymtab)
1066     {
1067       psymtab_to_symtab (psymtab);
1068     }
1069 }
1070
1071 static void
1072 read_psymtabs_with_filename (struct objfile *objfile, const char *filename)
1073 {
1074   struct partial_symtab *p;
1075
1076   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, p)
1077     {
1078       if (filename_cmp (filename, p->filename) == 0)
1079         PSYMTAB_TO_SYMTAB (p);
1080     }
1081 }
1082
1083 static void
1084 map_symbol_filenames_psymtab (struct objfile *objfile,
1085                               symbol_filename_ftype *fun, void *data,
1086                               int need_fullname)
1087 {
1088   struct partial_symtab *ps;
1089
1090   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps)
1091     {
1092       const char *fullname;
1093
1094       if (ps->readin)
1095         continue;
1096
1097       QUIT;
1098       if (need_fullname)
1099         fullname = psymtab_to_fullname (ps);
1100       else
1101         fullname = NULL;
1102       (*fun) (ps->filename, fullname, data);
1103     }
1104 }
1105
1106 int find_and_open_source (const char *filename,
1107                           const char *dirname,
1108                           char **fullname);
1109
1110 /* Finds the fullname that a partial_symtab represents.
1111
1112    If this functions finds the fullname, it will save it in ps->fullname
1113    and it will also return the value.
1114
1115    If this function fails to find the file that this partial_symtab represents,
1116    NULL will be returned and ps->fullname will be set to NULL.  */
1117
1118 static char *
1119 psymtab_to_fullname (struct partial_symtab *ps)
1120 {
1121   int r;
1122
1123   if (!ps)
1124     return NULL;
1125
1126   /* Use cached copy if we have it.
1127      We rely on forget_cached_source_info being called appropriately
1128      to handle cases like the file being moved.  */
1129   if (ps->fullname)
1130     return ps->fullname;
1131
1132   r = find_and_open_source (ps->filename, ps->dirname, &ps->fullname);
1133
1134   if (r >= 0)
1135     {
1136       close (r);
1137       return ps->fullname;
1138     }
1139
1140   return NULL;
1141 }
1142
1143 static const char *
1144 find_symbol_file_from_partial (struct objfile *objfile, const char *name)
1145 {
1146   struct partial_symtab *pst;
1147
1148   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, pst)
1149     {
1150       if (lookup_partial_symbol (pst, name, 1, VAR_DOMAIN))
1151         return pst->filename;
1152     }
1153   return NULL;
1154 }
1155
1156 /*  For all symbols, s, in BLOCK that are in NAMESPACE and match NAME
1157     according to the function MATCH, call CALLBACK(BLOCK, s, DATA).
1158     BLOCK is assumed to come from OBJFILE.  Returns 1 iff CALLBACK
1159     ever returns non-zero, and otherwise returns 0.  */
1160
1161 static int
1162 map_block (const char *name, domain_enum namespace, struct objfile *objfile,
1163            struct block *block,
1164            int (*callback) (struct block *, struct symbol *, void *),
1165            void *data, symbol_compare_ftype *match)
1166 {
1167   struct dict_iterator iter;
1168   struct symbol *sym;
1169
1170   for (sym = dict_iter_match_first (BLOCK_DICT (block), name, match, &iter);
1171        sym != NULL; sym = dict_iter_match_next (name, match, &iter))
1172     {
1173       if (symbol_matches_domain (SYMBOL_LANGUAGE (sym), 
1174                                  SYMBOL_DOMAIN (sym), namespace))
1175         {
1176           if (callback (block, sym, data))
1177             return 1;
1178         }
1179     }
1180
1181   return 0;
1182 }
1183
1184 /*  Psymtab version of map_matching_symbols.  See its definition in
1185     the definition of quick_symbol_functions in symfile.h.  */
1186
1187 static void
1188 map_matching_symbols_psymtab (const char *name, domain_enum namespace,
1189                               struct objfile *objfile, int global,
1190                               int (*callback) (struct block *,
1191                                                struct symbol *, void *),
1192                               void *data,
1193                               symbol_compare_ftype *match,
1194                               symbol_compare_ftype *ordered_compare)
1195 {
1196   const int block_kind = global ? GLOBAL_BLOCK : STATIC_BLOCK;
1197   struct partial_symtab *ps;
1198
1199   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps)
1200     {
1201       QUIT;
1202       if (ps->readin
1203           || match_partial_symbol (ps, global, name, namespace, match,
1204                                    ordered_compare))
1205         {
1206           struct symtab *s = PSYMTAB_TO_SYMTAB (ps);
1207           struct block *block;
1208
1209           if (s == NULL || !s->primary)
1210             continue;
1211           block = BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), block_kind);
1212           if (map_block (name, namespace, objfile, block,
1213                          callback, data, match))
1214             return;
1215           if (callback (block, NULL, data))
1216             return;
1217         }
1218     }
1219 }           
1220
1221 static void
1222 expand_symtabs_matching_via_partial (struct objfile *objfile,
1223                                      int (*file_matcher) (const char *,
1224                                                           void *),
1225                                      int (*name_matcher) (const char *,
1226                                                           void *),
1227                                      enum search_domain kind,
1228                                      void *data)
1229 {
1230   struct partial_symtab *ps;
1231
1232   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps)
1233     {
1234       struct partial_symbol **psym;
1235       struct partial_symbol **bound, **gbound, **sbound;
1236       int keep_going = 1;
1237
1238       if (ps->readin)
1239         continue;
1240
1241       if (file_matcher && ! (*file_matcher) (ps->filename, data))
1242         continue;
1243
1244       gbound = objfile->global_psymbols.list
1245         + ps->globals_offset + ps->n_global_syms;
1246       sbound = objfile->static_psymbols.list
1247         + ps->statics_offset + ps->n_static_syms;
1248       bound = gbound;
1249
1250       /* Go through all of the symbols stored in a partial
1251          symtab in one loop.  */
1252       psym = objfile->global_psymbols.list + ps->globals_offset;
1253       while (keep_going)
1254         {
1255           if (psym >= bound)
1256             {
1257               if (bound == gbound && ps->n_static_syms != 0)
1258                 {
1259                   psym = objfile->static_psymbols.list + ps->statics_offset;
1260                   bound = sbound;
1261                 }
1262               else
1263                 keep_going = 0;
1264               continue;
1265             }
1266           else
1267             {
1268               QUIT;
1269
1270               if ((kind == ALL_DOMAIN
1271                    || (kind == VARIABLES_DOMAIN
1272                        && SYMBOL_CLASS (*psym) != LOC_TYPEDEF
1273                        && SYMBOL_CLASS (*psym) != LOC_BLOCK)
1274                    || (kind == FUNCTIONS_DOMAIN
1275                        && SYMBOL_CLASS (*psym) == LOC_BLOCK)
1276                    || (kind == TYPES_DOMAIN
1277                        && SYMBOL_CLASS (*psym) == LOC_TYPEDEF))
1278                   && (*name_matcher) (SYMBOL_NATURAL_NAME (*psym), data))
1279                 {
1280                   PSYMTAB_TO_SYMTAB (ps);
1281                   keep_going = 0;
1282                 }
1283             }
1284           psym++;
1285         }
1286     }
1287 }
1288
1289 static int
1290 objfile_has_psyms (struct objfile *objfile)
1291 {
1292   return objfile->psymtabs != NULL;
1293 }
1294
1295 const struct quick_symbol_functions psym_functions =
1296 {
1297   objfile_has_psyms,
1298   find_last_source_symtab_from_partial,
1299   forget_cached_source_info_partial,
1300   lookup_symtab_via_partial_symtab,
1301   lookup_symbol_aux_psymtabs,
1302   pre_expand_symtabs_matching_psymtabs,
1303   print_psymtab_stats_for_objfile,
1304   dump_psymtabs_for_objfile,
1305   relocate_psymtabs,
1306   read_symtabs_for_function,
1307   expand_partial_symbol_tables,
1308   read_psymtabs_with_filename,
1309   find_symbol_file_from_partial,
1310   map_matching_symbols_psymtab,
1311   expand_symtabs_matching_via_partial,
1312   find_pc_sect_symtab_from_partial,
1313   map_symbol_filenames_psymtab
1314 };
1315
1316 \f
1317
1318 /* This compares two partial symbols by names, using strcmp_iw_ordered
1319    for the comparison.  */
1320
1321 static int
1322 compare_psymbols (const void *s1p, const void *s2p)
1323 {
1324   struct partial_symbol *const *s1 = s1p;
1325   struct partial_symbol *const *s2 = s2p;
1326
1327   return strcmp_iw_ordered (SYMBOL_SEARCH_NAME (*s1),
1328                             SYMBOL_SEARCH_NAME (*s2));
1329 }
1330
1331 void
1332 sort_pst_symbols (struct partial_symtab *pst)
1333 {
1334   /* Sort the global list; don't sort the static list.  */
1335
1336   qsort (pst->objfile->global_psymbols.list + pst->globals_offset,
1337          pst->n_global_syms, sizeof (struct partial_symbol *),
1338          compare_psymbols);
1339 }
1340
1341 /* Allocate and partially fill a partial symtab.  It will be
1342    completely filled at the end of the symbol list.
1343
1344    FILENAME is the name of the symbol-file we are reading from.  */
1345
1346 struct partial_symtab *
1347 start_psymtab_common (struct objfile *objfile,
1348                       struct section_offsets *section_offsets,
1349                       const char *filename,
1350                       CORE_ADDR textlow, struct partial_symbol **global_syms,
1351                       struct partial_symbol **static_syms)
1352 {
1353   struct partial_symtab *psymtab;
1354
1355   psymtab = allocate_psymtab (filename, objfile);
1356   psymtab->section_offsets = section_offsets;
1357   psymtab->textlow = textlow;
1358   psymtab->texthigh = psymtab->textlow;         /* default */
1359   psymtab->globals_offset = global_syms - objfile->global_psymbols.list;
1360   psymtab->statics_offset = static_syms - objfile->static_psymbols.list;
1361   return (psymtab);
1362 }
1363
1364 /* Calculate a hash code for the given partial symbol.  The hash is
1365    calculated using the symbol's value, language, domain, class
1366    and name.  These are the values which are set by
1367    add_psymbol_to_bcache.  */
1368
1369 static unsigned long
1370 psymbol_hash (const void *addr, int length)
1371 {
1372   unsigned long h = 0;
1373   struct partial_symbol *psymbol = (struct partial_symbol *) addr;
1374   unsigned int lang = psymbol->ginfo.language;
1375   unsigned int domain = PSYMBOL_DOMAIN (psymbol);
1376   unsigned int class = PSYMBOL_CLASS (psymbol);
1377
1378   h = hash_continue (&psymbol->ginfo.value, sizeof (psymbol->ginfo.value), h);
1379   h = hash_continue (&lang, sizeof (unsigned int), h);
1380   h = hash_continue (&domain, sizeof (unsigned int), h);
1381   h = hash_continue (&class, sizeof (unsigned int), h);
1382   h = hash_continue (psymbol->ginfo.name, strlen (psymbol->ginfo.name), h);
1383
1384   return h;
1385 }
1386
1387 /* Returns true if the symbol at addr1 equals the symbol at addr2.
1388    For the comparison this function uses a symbols value,
1389    language, domain, class and name.  */
1390
1391 static int
1392 psymbol_compare (const void *addr1, const void *addr2, int length)
1393 {
1394   struct partial_symbol *sym1 = (struct partial_symbol *) addr1;
1395   struct partial_symbol *sym2 = (struct partial_symbol *) addr2;
1396
1397   return (memcmp (&sym1->ginfo.value, &sym1->ginfo.value,
1398                   sizeof (sym1->ginfo.value)) == 0
1399           && sym1->ginfo.language == sym2->ginfo.language
1400           && PSYMBOL_DOMAIN (sym1) == PSYMBOL_DOMAIN (sym2)
1401           && PSYMBOL_CLASS (sym1) == PSYMBOL_CLASS (sym2)
1402           && sym1->ginfo.name == sym2->ginfo.name);
1403 }
1404
1405 /* Initialize a partial symbol bcache.  */
1406
1407 struct psymbol_bcache *
1408 psymbol_bcache_init (void)
1409 {
1410   struct psymbol_bcache *bcache = XCALLOC (1, struct psymbol_bcache);
1411   bcache->bcache = bcache_xmalloc (psymbol_hash, psymbol_compare);
1412   return bcache;
1413 }
1414
1415 /* Free a partial symbol bcache.  */
1416 void
1417 psymbol_bcache_free (struct psymbol_bcache *bcache)
1418 {
1419   if (bcache == NULL)
1420     return;
1421
1422   bcache_xfree (bcache->bcache);
1423   xfree (bcache);
1424 }
1425
1426 /* Return the internal bcache of the psymbol_bcache BCACHE.  */
1427
1428 struct bcache *
1429 psymbol_bcache_get_bcache (struct psymbol_bcache *bcache)
1430 {
1431   return bcache->bcache;
1432 }
1433
1434 /* Find a copy of the SYM in BCACHE.  If BCACHE has never seen this
1435    symbol before, add a copy to BCACHE.  In either case, return a pointer
1436    to BCACHE's copy of the symbol.  If optional ADDED is not NULL, return
1437    1 in case of new entry or 0 if returning an old entry.  */
1438
1439 static const struct partial_symbol *
1440 psymbol_bcache_full (struct partial_symbol *sym,
1441                      struct psymbol_bcache *bcache,
1442                      int *added)
1443 {
1444   return bcache_full (sym,
1445                       sizeof (struct partial_symbol),
1446                       bcache->bcache,
1447                       added);
1448 }
1449
1450 /* Helper function, initialises partial symbol structure and stashes 
1451    it into objfile's bcache.  Note that our caching mechanism will
1452    use all fields of struct partial_symbol to determine hash value of the
1453    structure.  In other words, having two symbols with the same name but
1454    different domain (or address) is possible and correct.  */
1455
1456 static const struct partial_symbol *
1457 add_psymbol_to_bcache (const char *name, int namelength, int copy_name,
1458                        domain_enum domain,
1459                        enum address_class class,
1460                        long val,        /* Value as a long */
1461                        CORE_ADDR coreaddr,      /* Value as a CORE_ADDR */
1462                        enum language language, struct objfile *objfile,
1463                        int *added)
1464 {
1465   struct partial_symbol psymbol;
1466
1467   /* We must ensure that the entire 'value' field has been zeroed
1468      before assigning to it, because an assignment may not write the
1469      entire field.  */
1470   memset (&psymbol.ginfo.value, 0, sizeof (psymbol.ginfo.value));
1471
1472   /* val and coreaddr are mutually exclusive, one of them *will* be zero.  */
1473   if (val != 0)
1474     {
1475       SYMBOL_VALUE (&psymbol) = val;
1476     }
1477   else
1478     {
1479       SYMBOL_VALUE_ADDRESS (&psymbol) = coreaddr;
1480     }
1481   SYMBOL_SECTION (&psymbol) = 0;
1482   SYMBOL_OBJ_SECTION (&psymbol) = NULL;
1483   SYMBOL_SET_LANGUAGE (&psymbol, language);
1484   PSYMBOL_DOMAIN (&psymbol) = domain;
1485   PSYMBOL_CLASS (&psymbol) = class;
1486
1487   SYMBOL_SET_NAMES (&psymbol, name, namelength, copy_name, objfile);
1488
1489   /* Stash the partial symbol away in the cache.  */
1490   return psymbol_bcache_full (&psymbol,
1491                               objfile->psymbol_cache,
1492                               added);
1493 }
1494
1495 /* Increase the space allocated for LISTP, which is probably
1496    global_psymbols or static_psymbols.  This space will eventually
1497    be freed in free_objfile().  */
1498
1499 static void
1500 extend_psymbol_list (struct psymbol_allocation_list *listp,
1501                      struct objfile *objfile)
1502 {
1503   int new_size;
1504
1505   if (listp->size == 0)
1506     {
1507       new_size = 255;
1508       listp->list = (struct partial_symbol **)
1509         xmalloc (new_size * sizeof (struct partial_symbol *));
1510     }
1511   else
1512     {
1513       new_size = listp->size * 2;
1514       listp->list = (struct partial_symbol **)
1515         xrealloc ((char *) listp->list,
1516                   new_size * sizeof (struct partial_symbol *));
1517     }
1518   /* Next assumes we only went one over.  Should be good if
1519      program works correctly.  */
1520   listp->next = listp->list + listp->size;
1521   listp->size = new_size;
1522 }
1523
1524 /* Helper function, adds partial symbol to the given partial symbol
1525    list.  */
1526
1527 static void
1528 append_psymbol_to_list (struct psymbol_allocation_list *list,
1529                         const struct partial_symbol *psym,
1530                         struct objfile *objfile)
1531 {
1532   if (list->next >= list->list + list->size)
1533     extend_psymbol_list (list, objfile);
1534   *list->next++ = (struct partial_symbol *) psym;
1535   OBJSTAT (objfile, n_psyms++);
1536 }
1537
1538 /* Add a symbol with a long value to a psymtab.
1539    Since one arg is a struct, we pass in a ptr and deref it (sigh).
1540    Return the partial symbol that has been added.  */
1541
1542 /* NOTE: carlton/2003-09-11: The reason why we return the partial
1543    symbol is so that callers can get access to the symbol's demangled
1544    name, which they don't have any cheap way to determine otherwise.
1545    (Currenly, dwarf2read.c is the only file who uses that information,
1546    though it's possible that other readers might in the future.)
1547    Elena wasn't thrilled about that, and I don't blame her, but we
1548    couldn't come up with a better way to get that information.  If
1549    it's needed in other situations, we could consider breaking up
1550    SYMBOL_SET_NAMES to provide access to the demangled name lookup
1551    cache.  */
1552
1553 const struct partial_symbol *
1554 add_psymbol_to_list (const char *name, int namelength, int copy_name,
1555                      domain_enum domain,
1556                      enum address_class class,
1557                      struct psymbol_allocation_list *list, 
1558                      long val,  /* Value as a long */
1559                      CORE_ADDR coreaddr,        /* Value as a CORE_ADDR */
1560                      enum language language, struct objfile *objfile)
1561 {
1562   const struct partial_symbol *psym;
1563
1564   int added;
1565
1566   /* Stash the partial symbol away in the cache.  */
1567   psym = add_psymbol_to_bcache (name, namelength, copy_name, domain, class,
1568                                 val, coreaddr, language, objfile, &added);
1569
1570   /* Do not duplicate global partial symbols.  */
1571   if (list == &objfile->global_psymbols
1572       && !added)
1573     return psym;
1574
1575   /* Save pointer to partial symbol in psymtab, growing symtab if needed.  */
1576   append_psymbol_to_list (list, psym, objfile);
1577   return psym;
1578 }
1579
1580 /* Initialize storage for partial symbols.  */
1581
1582 void
1583 init_psymbol_list (struct objfile *objfile, int total_symbols)
1584 {
1585   /* Free any previously allocated psymbol lists.  */
1586
1587   if (objfile->global_psymbols.list)
1588     {
1589       xfree (objfile->global_psymbols.list);
1590     }
1591   if (objfile->static_psymbols.list)
1592     {
1593       xfree (objfile->static_psymbols.list);
1594     }
1595
1596   /* Current best guess is that approximately a twentieth
1597      of the total symbols (in a debugging file) are global or static
1598      oriented symbols.  */
1599
1600   objfile->global_psymbols.size = total_symbols / 10;
1601   objfile->static_psymbols.size = total_symbols / 10;
1602
1603   if (objfile->global_psymbols.size > 0)
1604     {
1605       objfile->global_psymbols.next =
1606         objfile->global_psymbols.list = (struct partial_symbol **)
1607         xmalloc ((objfile->global_psymbols.size
1608                   * sizeof (struct partial_symbol *)));
1609     }
1610   if (objfile->static_psymbols.size > 0)
1611     {
1612       objfile->static_psymbols.next =
1613         objfile->static_psymbols.list = (struct partial_symbol **)
1614         xmalloc ((objfile->static_psymbols.size
1615                   * sizeof (struct partial_symbol *)));
1616     }
1617 }
1618
1619 struct partial_symtab *
1620 allocate_psymtab (const char *filename, struct objfile *objfile)
1621 {
1622   struct partial_symtab *psymtab;
1623
1624   if (objfile->free_psymtabs)
1625     {
1626       psymtab = objfile->free_psymtabs;
1627       objfile->free_psymtabs = psymtab->next;
1628     }
1629   else
1630     psymtab = (struct partial_symtab *)
1631       obstack_alloc (&objfile->objfile_obstack,
1632                      sizeof (struct partial_symtab));
1633
1634   memset (psymtab, 0, sizeof (struct partial_symtab));
1635   psymtab->filename = obsavestring (filename, strlen (filename),
1636                                     &objfile->objfile_obstack);
1637   psymtab->symtab = NULL;
1638
1639   /* Prepend it to the psymtab list for the objfile it belongs to.
1640      Psymtabs are searched in most recent inserted -> least recent
1641      inserted order.  */
1642
1643   psymtab->objfile = objfile;
1644   psymtab->next = objfile->psymtabs;
1645   objfile->psymtabs = psymtab;
1646
1647   return (psymtab);
1648 }
1649
1650 void
1651 discard_psymtab (struct partial_symtab *pst)
1652 {
1653   struct partial_symtab **prev_pst;
1654
1655   /* From dbxread.c:
1656      Empty psymtabs happen as a result of header files which don't
1657      have any symbols in them.  There can be a lot of them.  But this
1658      check is wrong, in that a psymtab with N_SLINE entries but
1659      nothing else is not empty, but we don't realize that.  Fixing
1660      that without slowing things down might be tricky.  */
1661
1662   /* First, snip it out of the psymtab chain.  */
1663
1664   prev_pst = &(pst->objfile->psymtabs);
1665   while ((*prev_pst) != pst)
1666     prev_pst = &((*prev_pst)->next);
1667   (*prev_pst) = pst->next;
1668
1669   /* Next, put it on a free list for recycling.  */
1670
1671   pst->next = pst->objfile->free_psymtabs;
1672   pst->objfile->free_psymtabs = pst;
1673 }
1674
1675 \f
1676
1677 void
1678 maintenance_print_psymbols (char *args, int from_tty)
1679 {
1680   char **argv;
1681   struct ui_file *outfile;
1682   struct cleanup *cleanups;
1683   char *symname = NULL;
1684   char *filename = DEV_TTY;
1685   struct objfile *objfile;
1686   struct partial_symtab *ps;
1687
1688   dont_repeat ();
1689
1690   if (args == NULL)
1691     {
1692       error (_("\
1693 print-psymbols takes an output file name and optional symbol file name"));
1694     }
1695   argv = gdb_buildargv (args);
1696   cleanups = make_cleanup_freeargv (argv);
1697
1698   if (argv[0] != NULL)
1699     {
1700       filename = argv[0];
1701       /* If a second arg is supplied, it is a source file name to match on.  */
1702       if (argv[1] != NULL)
1703         {
1704           symname = argv[1];
1705         }
1706     }
1707
1708   filename = tilde_expand (filename);
1709   make_cleanup (xfree, filename);
1710
1711   outfile = gdb_fopen (filename, FOPEN_WT);
1712   if (outfile == 0)
1713     perror_with_name (filename);
1714   make_cleanup_ui_file_delete (outfile);
1715
1716   immediate_quit++;
1717   ALL_PSYMTABS (objfile, ps)
1718     if (symname == NULL || filename_cmp (symname, ps->filename) == 0)
1719     dump_psymtab (objfile, ps, outfile);
1720   immediate_quit--;
1721   do_cleanups (cleanups);
1722 }
1723
1724 /* List all the partial symbol tables whose names match REGEXP (optional).  */
1725 void
1726 maintenance_info_psymtabs (char *regexp, int from_tty)
1727 {
1728   struct program_space *pspace;
1729   struct objfile *objfile;
1730
1731   if (regexp)
1732     re_comp (regexp);
1733
1734   ALL_PSPACES (pspace)
1735     ALL_PSPACE_OBJFILES (pspace, objfile)
1736     {
1737       struct gdbarch *gdbarch = get_objfile_arch (objfile);
1738       struct partial_symtab *psymtab;
1739
1740       /* We don't want to print anything for this objfile until we
1741          actually find a symtab whose name matches.  */
1742       int printed_objfile_start = 0;
1743
1744       ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, psymtab)
1745         {
1746           QUIT;
1747
1748           if (! regexp
1749               || re_exec (psymtab->filename))
1750             {
1751               if (! printed_objfile_start)
1752                 {
1753                   printf_filtered ("{ objfile %s ", objfile->name);
1754                   wrap_here ("  ");
1755                   printf_filtered ("((struct objfile *) %s)\n", 
1756                                    host_address_to_string (objfile));
1757                   printed_objfile_start = 1;
1758                 }
1759
1760               printf_filtered ("  { psymtab %s ", psymtab->filename);
1761               wrap_here ("    ");
1762               printf_filtered ("((struct partial_symtab *) %s)\n", 
1763                                host_address_to_string (psymtab));
1764
1765               printf_filtered ("    readin %s\n",
1766                                psymtab->readin ? "yes" : "no");
1767               printf_filtered ("    fullname %s\n",
1768                                psymtab->fullname
1769                                ? psymtab->fullname : "(null)");
1770               printf_filtered ("    text addresses ");
1771               fputs_filtered (paddress (gdbarch, psymtab->textlow),
1772                               gdb_stdout);
1773               printf_filtered (" -- ");
1774               fputs_filtered (paddress (gdbarch, psymtab->texthigh),
1775                               gdb_stdout);
1776               printf_filtered ("\n");
1777               printf_filtered ("    globals ");
1778               if (psymtab->n_global_syms)
1779                 {
1780                   printf_filtered ("(* (struct partial_symbol **) %s @ %d)\n",
1781                                    host_address_to_string (psymtab->objfile->global_psymbols.list
1782                                     + psymtab->globals_offset),
1783                                    psymtab->n_global_syms);
1784                 }
1785               else
1786                 printf_filtered ("(none)\n");
1787               printf_filtered ("    statics ");
1788               if (psymtab->n_static_syms)
1789                 {
1790                   printf_filtered ("(* (struct partial_symbol **) %s @ %d)\n",
1791                                    host_address_to_string (psymtab->objfile->static_psymbols.list
1792                                     + psymtab->statics_offset),
1793                                    psymtab->n_static_syms);
1794                 }
1795               else
1796                 printf_filtered ("(none)\n");
1797               printf_filtered ("    dependencies ");
1798               if (psymtab->number_of_dependencies)
1799                 {
1800                   int i;
1801
1802                   printf_filtered ("{\n");
1803                   for (i = 0; i < psymtab->number_of_dependencies; i++)
1804                     {
1805                       struct partial_symtab *dep = psymtab->dependencies[i];
1806
1807                       /* Note the string concatenation there --- no comma.  */
1808                       printf_filtered ("      psymtab %s "
1809                                        "((struct partial_symtab *) %s)\n",
1810                                        dep->filename, 
1811                                        host_address_to_string (dep));
1812                     }
1813                   printf_filtered ("    }\n");
1814                 }
1815               else
1816                 printf_filtered ("(none)\n");
1817               printf_filtered ("  }\n");
1818             }
1819         }
1820
1821       if (printed_objfile_start)
1822         printf_filtered ("}\n");
1823     }
1824 }
1825
1826 /* Check consistency of psymtabs and symtabs.  */
1827
1828 void
1829 maintenance_check_symtabs (char *ignore, int from_tty)
1830 {
1831   struct symbol *sym;
1832   struct partial_symbol **psym;
1833   struct symtab *s = NULL;
1834   struct partial_symtab *ps;
1835   struct blockvector *bv;
1836   struct objfile *objfile;
1837   struct block *b;
1838   int length;
1839
1840   ALL_PSYMTABS (objfile, ps)
1841   {
1842     struct gdbarch *gdbarch = get_objfile_arch (objfile);
1843
1844     s = PSYMTAB_TO_SYMTAB (ps);
1845     if (s == NULL)
1846       continue;
1847     bv = BLOCKVECTOR (s);
1848     b = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
1849     psym = ps->objfile->static_psymbols.list + ps->statics_offset;
1850     length = ps->n_static_syms;
1851     while (length--)
1852       {
1853         sym = lookup_block_symbol (b, SYMBOL_LINKAGE_NAME (*psym),
1854                                    SYMBOL_DOMAIN (*psym));
1855         if (!sym)
1856           {
1857             printf_filtered ("Static symbol `");
1858             puts_filtered (SYMBOL_LINKAGE_NAME (*psym));
1859             printf_filtered ("' only found in ");
1860             puts_filtered (ps->filename);
1861             printf_filtered (" psymtab\n");
1862           }
1863         psym++;
1864       }
1865     b = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
1866     psym = ps->objfile->global_psymbols.list + ps->globals_offset;
1867     length = ps->n_global_syms;
1868     while (length--)
1869       {
1870         sym = lookup_block_symbol (b, SYMBOL_LINKAGE_NAME (*psym),
1871                                    SYMBOL_DOMAIN (*psym));
1872         if (!sym)
1873           {
1874             printf_filtered ("Global symbol `");
1875             puts_filtered (SYMBOL_LINKAGE_NAME (*psym));
1876             printf_filtered ("' only found in ");
1877             puts_filtered (ps->filename);
1878             printf_filtered (" psymtab\n");
1879           }
1880         psym++;
1881       }
1882     if (ps->texthigh < ps->textlow)
1883       {
1884         printf_filtered ("Psymtab ");
1885         puts_filtered (ps->filename);
1886         printf_filtered (" covers bad range ");
1887         fputs_filtered (paddress (gdbarch, ps->textlow), gdb_stdout);
1888         printf_filtered (" - ");
1889         fputs_filtered (paddress (gdbarch, ps->texthigh), gdb_stdout);
1890         printf_filtered ("\n");
1891         continue;
1892       }
1893     if (ps->texthigh == 0)
1894       continue;
1895     if (ps->textlow < BLOCK_START (b) || ps->texthigh > BLOCK_END (b))
1896       {
1897         printf_filtered ("Psymtab ");
1898         puts_filtered (ps->filename);
1899         printf_filtered (" covers ");
1900         fputs_filtered (paddress (gdbarch, ps->textlow), gdb_stdout);
1901         printf_filtered (" - ");
1902         fputs_filtered (paddress (gdbarch, ps->texthigh), gdb_stdout);
1903         printf_filtered (" but symtab covers only ");
1904         fputs_filtered (paddress (gdbarch, BLOCK_START (b)), gdb_stdout);
1905         printf_filtered (" - ");
1906         fputs_filtered (paddress (gdbarch, BLOCK_END (b)), gdb_stdout);
1907         printf_filtered ("\n");
1908       }
1909   }
1910 }
1911
1912 \f
1913
1914 void
1915 expand_partial_symbol_names (int (*fun) (const char *, void *), void *data)
1916 {
1917   struct objfile *objfile;
1918
1919   ALL_OBJFILES (objfile)
1920   {
1921     if (objfile->sf)
1922       objfile->sf->qf->expand_symtabs_matching (objfile, NULL, fun,
1923                                                 ALL_DOMAIN, data);
1924   }
1925 }
1926
1927 void
1928 map_partial_symbol_filenames (symbol_filename_ftype *fun, void *data,
1929                               int need_fullname)
1930 {
1931   struct objfile *objfile;
1932
1933   ALL_OBJFILES (objfile)
1934   {
1935     if (objfile->sf)
1936       objfile->sf->qf->map_symbol_filenames (objfile, fun, data,
1937                                              need_fullname);
1938   }
1939 }