* gdbtypes.c (check_typedef): Document that this function can
[platform/upstream/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 {
1087   struct partial_symtab *ps;
1088
1089   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps)
1090     {
1091       const char *fullname;
1092
1093       if (ps->readin)
1094         continue;
1095
1096       QUIT;
1097       fullname = psymtab_to_fullname (ps);
1098       (*fun) (ps->filename, fullname, data);
1099     }
1100 }
1101
1102 int find_and_open_source (const char *filename,
1103                           const char *dirname,
1104                           char **fullname);
1105
1106 /* Finds the fullname that a partial_symtab represents.
1107
1108    If this functions finds the fullname, it will save it in ps->fullname
1109    and it will also return the value.
1110
1111    If this function fails to find the file that this partial_symtab represents,
1112    NULL will be returned and ps->fullname will be set to NULL.  */
1113 static char *
1114 psymtab_to_fullname (struct partial_symtab *ps)
1115 {
1116   int r;
1117
1118   if (!ps)
1119     return NULL;
1120
1121   /* Don't check ps->fullname here, the file could have been
1122      deleted/moved/..., look for it again.  */
1123   r = find_and_open_source (ps->filename, ps->dirname, &ps->fullname);
1124
1125   if (r >= 0)
1126     {
1127       close (r);
1128       return ps->fullname;
1129     }
1130
1131   return NULL;
1132 }
1133
1134 static const char *
1135 find_symbol_file_from_partial (struct objfile *objfile, const char *name)
1136 {
1137   struct partial_symtab *pst;
1138
1139   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, pst)
1140     {
1141       if (lookup_partial_symbol (pst, name, 1, VAR_DOMAIN))
1142         return pst->filename;
1143     }
1144   return NULL;
1145 }
1146
1147 /*  For all symbols, s, in BLOCK that are in NAMESPACE and match NAME
1148     according to the function MATCH, call CALLBACK(BLOCK, s, DATA).
1149     BLOCK is assumed to come from OBJFILE.  Returns 1 iff CALLBACK
1150     ever returns non-zero, and otherwise returns 0.  */
1151
1152 static int
1153 map_block (const char *name, domain_enum namespace, struct objfile *objfile,
1154            struct block *block,
1155            int (*callback) (struct block *, struct symbol *, void *),
1156            void *data, symbol_compare_ftype *match)
1157 {
1158   struct dict_iterator iter;
1159   struct symbol *sym;
1160
1161   for (sym = dict_iter_match_first (BLOCK_DICT (block), name, match, &iter);
1162        sym != NULL; sym = dict_iter_match_next (name, match, &iter))
1163     {
1164       if (symbol_matches_domain (SYMBOL_LANGUAGE (sym), 
1165                                  SYMBOL_DOMAIN (sym), namespace))
1166         {
1167           if (callback (block, sym, data))
1168             return 1;
1169         }
1170     }
1171
1172   return 0;
1173 }
1174
1175 /*  Psymtab version of map_matching_symbols.  See its definition in
1176     the definition of quick_symbol_functions in symfile.h.  */
1177
1178 static void
1179 map_matching_symbols_psymtab (const char *name, domain_enum namespace,
1180                               struct objfile *objfile, int global,
1181                               int (*callback) (struct block *,
1182                                                struct symbol *, void *),
1183                               void *data,
1184                               symbol_compare_ftype *match,
1185                               symbol_compare_ftype *ordered_compare)
1186 {
1187   const int block_kind = global ? GLOBAL_BLOCK : STATIC_BLOCK;
1188   struct partial_symtab *ps;
1189
1190   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps)
1191     {
1192       QUIT;
1193       if (ps->readin
1194           || match_partial_symbol (ps, global, name, namespace, match,
1195                                    ordered_compare))
1196         {
1197           struct symtab *s = PSYMTAB_TO_SYMTAB (ps);
1198           struct block *block;
1199
1200           if (s == NULL || !s->primary)
1201             continue;
1202           block = BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), block_kind);
1203           if (map_block (name, namespace, objfile, block,
1204                          callback, data, match))
1205             return;
1206           if (callback (block, NULL, data))
1207             return;
1208         }
1209     }
1210 }           
1211
1212 static void
1213 expand_symtabs_matching_via_partial (struct objfile *objfile,
1214                                      int (*file_matcher) (const char *,
1215                                                           void *),
1216                                      int (*name_matcher) (const char *,
1217                                                           void *),
1218                                      enum search_domain kind,
1219                                      void *data)
1220 {
1221   struct partial_symtab *ps;
1222
1223   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps)
1224     {
1225       struct partial_symbol **psym;
1226       struct partial_symbol **bound, **gbound, **sbound;
1227       int keep_going = 1;
1228
1229       if (ps->readin)
1230         continue;
1231
1232       if (file_matcher && ! (*file_matcher) (ps->filename, data))
1233         continue;
1234
1235       gbound = objfile->global_psymbols.list
1236         + ps->globals_offset + ps->n_global_syms;
1237       sbound = objfile->static_psymbols.list
1238         + ps->statics_offset + ps->n_static_syms;
1239       bound = gbound;
1240
1241       /* Go through all of the symbols stored in a partial
1242          symtab in one loop.  */
1243       psym = objfile->global_psymbols.list + ps->globals_offset;
1244       while (keep_going)
1245         {
1246           if (psym >= bound)
1247             {
1248               if (bound == gbound && ps->n_static_syms != 0)
1249                 {
1250                   psym = objfile->static_psymbols.list + ps->statics_offset;
1251                   bound = sbound;
1252                 }
1253               else
1254                 keep_going = 0;
1255               continue;
1256             }
1257           else
1258             {
1259               QUIT;
1260
1261               if ((kind == ALL_DOMAIN
1262                    || (kind == VARIABLES_DOMAIN
1263                        && SYMBOL_CLASS (*psym) != LOC_TYPEDEF
1264                        && SYMBOL_CLASS (*psym) != LOC_BLOCK)
1265                    || (kind == FUNCTIONS_DOMAIN
1266                        && SYMBOL_CLASS (*psym) == LOC_BLOCK)
1267                    || (kind == TYPES_DOMAIN
1268                        && SYMBOL_CLASS (*psym) == LOC_TYPEDEF))
1269                   && (*name_matcher) (SYMBOL_NATURAL_NAME (*psym), data))
1270                 {
1271                   PSYMTAB_TO_SYMTAB (ps);
1272                   keep_going = 0;
1273                 }
1274             }
1275           psym++;
1276         }
1277     }
1278 }
1279
1280 static int
1281 objfile_has_psyms (struct objfile *objfile)
1282 {
1283   return objfile->psymtabs != NULL;
1284 }
1285
1286 const struct quick_symbol_functions psym_functions =
1287 {
1288   objfile_has_psyms,
1289   find_last_source_symtab_from_partial,
1290   forget_cached_source_info_partial,
1291   lookup_symtab_via_partial_symtab,
1292   lookup_symbol_aux_psymtabs,
1293   pre_expand_symtabs_matching_psymtabs,
1294   print_psymtab_stats_for_objfile,
1295   dump_psymtabs_for_objfile,
1296   relocate_psymtabs,
1297   read_symtabs_for_function,
1298   expand_partial_symbol_tables,
1299   read_psymtabs_with_filename,
1300   find_symbol_file_from_partial,
1301   map_matching_symbols_psymtab,
1302   expand_symtabs_matching_via_partial,
1303   find_pc_sect_symtab_from_partial,
1304   map_symbol_filenames_psymtab
1305 };
1306
1307 \f
1308
1309 /* This compares two partial symbols by names, using strcmp_iw_ordered
1310    for the comparison.  */
1311
1312 static int
1313 compare_psymbols (const void *s1p, const void *s2p)
1314 {
1315   struct partial_symbol *const *s1 = s1p;
1316   struct partial_symbol *const *s2 = s2p;
1317
1318   return strcmp_iw_ordered (SYMBOL_SEARCH_NAME (*s1),
1319                             SYMBOL_SEARCH_NAME (*s2));
1320 }
1321
1322 void
1323 sort_pst_symbols (struct partial_symtab *pst)
1324 {
1325   /* Sort the global list; don't sort the static list.  */
1326
1327   qsort (pst->objfile->global_psymbols.list + pst->globals_offset,
1328          pst->n_global_syms, sizeof (struct partial_symbol *),
1329          compare_psymbols);
1330 }
1331
1332 /* Allocate and partially fill a partial symtab.  It will be
1333    completely filled at the end of the symbol list.
1334
1335    FILENAME is the name of the symbol-file we are reading from.  */
1336
1337 struct partial_symtab *
1338 start_psymtab_common (struct objfile *objfile,
1339                       struct section_offsets *section_offsets,
1340                       const char *filename,
1341                       CORE_ADDR textlow, struct partial_symbol **global_syms,
1342                       struct partial_symbol **static_syms)
1343 {
1344   struct partial_symtab *psymtab;
1345
1346   psymtab = allocate_psymtab (filename, objfile);
1347   psymtab->section_offsets = section_offsets;
1348   psymtab->textlow = textlow;
1349   psymtab->texthigh = psymtab->textlow;         /* default */
1350   psymtab->globals_offset = global_syms - objfile->global_psymbols.list;
1351   psymtab->statics_offset = static_syms - objfile->static_psymbols.list;
1352   return (psymtab);
1353 }
1354
1355 /* Calculate a hash code for the given partial symbol.  The hash is
1356    calculated using the symbol's value, language, domain, class
1357    and name.  These are the values which are set by
1358    add_psymbol_to_bcache.  */
1359
1360 static unsigned long
1361 psymbol_hash (const void *addr, int length)
1362 {
1363   unsigned long h = 0;
1364   struct partial_symbol *psymbol = (struct partial_symbol *) addr;
1365   unsigned int lang = psymbol->ginfo.language;
1366   unsigned int domain = PSYMBOL_DOMAIN (psymbol);
1367   unsigned int class = PSYMBOL_CLASS (psymbol);
1368
1369   h = hash_continue (&psymbol->ginfo.value, sizeof (psymbol->ginfo.value), h);
1370   h = hash_continue (&lang, sizeof (unsigned int), h);
1371   h = hash_continue (&domain, sizeof (unsigned int), h);
1372   h = hash_continue (&class, sizeof (unsigned int), h);
1373   h = hash_continue (psymbol->ginfo.name, strlen (psymbol->ginfo.name), h);
1374
1375   return h;
1376 }
1377
1378 /* Returns true if the symbol at addr1 equals the symbol at addr2.
1379    For the comparison this function uses a symbols value,
1380    language, domain, class and name.  */
1381
1382 static int
1383 psymbol_compare (const void *addr1, const void *addr2, int length)
1384 {
1385   struct partial_symbol *sym1 = (struct partial_symbol *) addr1;
1386   struct partial_symbol *sym2 = (struct partial_symbol *) addr2;
1387
1388   return (memcmp (&sym1->ginfo.value, &sym1->ginfo.value,
1389                   sizeof (sym1->ginfo.value)) == 0
1390           && sym1->ginfo.language == sym2->ginfo.language
1391           && PSYMBOL_DOMAIN (sym1) == PSYMBOL_DOMAIN (sym2)
1392           && PSYMBOL_CLASS (sym1) == PSYMBOL_CLASS (sym2)
1393           && sym1->ginfo.name == sym2->ginfo.name);
1394 }
1395
1396 /* Initialize a partial symbol bcache.  */
1397
1398 struct psymbol_bcache *
1399 psymbol_bcache_init (void)
1400 {
1401   struct psymbol_bcache *bcache = XCALLOC (1, struct psymbol_bcache);
1402   bcache->bcache = bcache_xmalloc (psymbol_hash, psymbol_compare);
1403   return bcache;
1404 }
1405
1406 /* Free a partial symbol bcache.  */
1407 void
1408 psymbol_bcache_free (struct psymbol_bcache *bcache)
1409 {
1410   if (bcache == NULL)
1411     return;
1412
1413   bcache_xfree (bcache->bcache);
1414   xfree (bcache);
1415 }
1416
1417 /* Return the internal bcache of the psymbol_bcache BCACHE.  */
1418
1419 struct bcache *
1420 psymbol_bcache_get_bcache (struct psymbol_bcache *bcache)
1421 {
1422   return bcache->bcache;
1423 }
1424
1425 /* Find a copy of the SYM in BCACHE.  If BCACHE has never seen this
1426    symbol before, add a copy to BCACHE.  In either case, return a pointer
1427    to BCACHE's copy of the symbol.  If optional ADDED is not NULL, return
1428    1 in case of new entry or 0 if returning an old entry.  */
1429
1430 static const struct partial_symbol *
1431 psymbol_bcache_full (struct partial_symbol *sym,
1432                      struct psymbol_bcache *bcache,
1433                      int *added)
1434 {
1435   return bcache_full (sym,
1436                       sizeof (struct partial_symbol),
1437                       bcache->bcache,
1438                       added);
1439 }
1440
1441 /* Helper function, initialises partial symbol structure and stashes 
1442    it into objfile's bcache.  Note that our caching mechanism will
1443    use all fields of struct partial_symbol to determine hash value of the
1444    structure.  In other words, having two symbols with the same name but
1445    different domain (or address) is possible and correct.  */
1446
1447 static const struct partial_symbol *
1448 add_psymbol_to_bcache (const char *name, int namelength, int copy_name,
1449                        domain_enum domain,
1450                        enum address_class class,
1451                        long val,        /* Value as a long */
1452                        CORE_ADDR coreaddr,      /* Value as a CORE_ADDR */
1453                        enum language language, struct objfile *objfile,
1454                        int *added)
1455 {
1456   struct partial_symbol psymbol;
1457
1458   /* We must ensure that the entire 'value' field has been zeroed
1459      before assigning to it, because an assignment may not write the
1460      entire field.  */
1461   memset (&psymbol.ginfo.value, 0, sizeof (psymbol.ginfo.value));
1462
1463   /* val and coreaddr are mutually exclusive, one of them *will* be zero.  */
1464   if (val != 0)
1465     {
1466       SYMBOL_VALUE (&psymbol) = val;
1467     }
1468   else
1469     {
1470       SYMBOL_VALUE_ADDRESS (&psymbol) = coreaddr;
1471     }
1472   SYMBOL_SECTION (&psymbol) = 0;
1473   SYMBOL_OBJ_SECTION (&psymbol) = NULL;
1474   SYMBOL_SET_LANGUAGE (&psymbol, language);
1475   PSYMBOL_DOMAIN (&psymbol) = domain;
1476   PSYMBOL_CLASS (&psymbol) = class;
1477
1478   SYMBOL_SET_NAMES (&psymbol, name, namelength, copy_name, objfile);
1479
1480   /* Stash the partial symbol away in the cache.  */
1481   return psymbol_bcache_full (&psymbol,
1482                               objfile->psymbol_cache,
1483                               added);
1484 }
1485
1486 /* Increase the space allocated for LISTP, which is probably
1487    global_psymbols or static_psymbols.  This space will eventually
1488    be freed in free_objfile().  */
1489
1490 static void
1491 extend_psymbol_list (struct psymbol_allocation_list *listp,
1492                      struct objfile *objfile)
1493 {
1494   int new_size;
1495
1496   if (listp->size == 0)
1497     {
1498       new_size = 255;
1499       listp->list = (struct partial_symbol **)
1500         xmalloc (new_size * sizeof (struct partial_symbol *));
1501     }
1502   else
1503     {
1504       new_size = listp->size * 2;
1505       listp->list = (struct partial_symbol **)
1506         xrealloc ((char *) listp->list,
1507                   new_size * sizeof (struct partial_symbol *));
1508     }
1509   /* Next assumes we only went one over.  Should be good if
1510      program works correctly.  */
1511   listp->next = listp->list + listp->size;
1512   listp->size = new_size;
1513 }
1514
1515 /* Helper function, adds partial symbol to the given partial symbol
1516    list.  */
1517
1518 static void
1519 append_psymbol_to_list (struct psymbol_allocation_list *list,
1520                         const struct partial_symbol *psym,
1521                         struct objfile *objfile)
1522 {
1523   if (list->next >= list->list + list->size)
1524     extend_psymbol_list (list, objfile);
1525   *list->next++ = (struct partial_symbol *) psym;
1526   OBJSTAT (objfile, n_psyms++);
1527 }
1528
1529 /* Add a symbol with a long value to a psymtab.
1530    Since one arg is a struct, we pass in a ptr and deref it (sigh).
1531    Return the partial symbol that has been added.  */
1532
1533 /* NOTE: carlton/2003-09-11: The reason why we return the partial
1534    symbol is so that callers can get access to the symbol's demangled
1535    name, which they don't have any cheap way to determine otherwise.
1536    (Currenly, dwarf2read.c is the only file who uses that information,
1537    though it's possible that other readers might in the future.)
1538    Elena wasn't thrilled about that, and I don't blame her, but we
1539    couldn't come up with a better way to get that information.  If
1540    it's needed in other situations, we could consider breaking up
1541    SYMBOL_SET_NAMES to provide access to the demangled name lookup
1542    cache.  */
1543
1544 const struct partial_symbol *
1545 add_psymbol_to_list (const char *name, int namelength, int copy_name,
1546                      domain_enum domain,
1547                      enum address_class class,
1548                      struct psymbol_allocation_list *list, 
1549                      long val,  /* Value as a long */
1550                      CORE_ADDR coreaddr,        /* Value as a CORE_ADDR */
1551                      enum language language, struct objfile *objfile)
1552 {
1553   const struct partial_symbol *psym;
1554
1555   int added;
1556
1557   /* Stash the partial symbol away in the cache.  */
1558   psym = add_psymbol_to_bcache (name, namelength, copy_name, domain, class,
1559                                 val, coreaddr, language, objfile, &added);
1560
1561   /* Do not duplicate global partial symbols.  */
1562   if (list == &objfile->global_psymbols
1563       && !added)
1564     return psym;
1565
1566   /* Save pointer to partial symbol in psymtab, growing symtab if needed.  */
1567   append_psymbol_to_list (list, psym, objfile);
1568   return psym;
1569 }
1570
1571 /* Initialize storage for partial symbols.  */
1572
1573 void
1574 init_psymbol_list (struct objfile *objfile, int total_symbols)
1575 {
1576   /* Free any previously allocated psymbol lists.  */
1577
1578   if (objfile->global_psymbols.list)
1579     {
1580       xfree (objfile->global_psymbols.list);
1581     }
1582   if (objfile->static_psymbols.list)
1583     {
1584       xfree (objfile->static_psymbols.list);
1585     }
1586
1587   /* Current best guess is that approximately a twentieth
1588      of the total symbols (in a debugging file) are global or static
1589      oriented symbols.  */
1590
1591   objfile->global_psymbols.size = total_symbols / 10;
1592   objfile->static_psymbols.size = total_symbols / 10;
1593
1594   if (objfile->global_psymbols.size > 0)
1595     {
1596       objfile->global_psymbols.next =
1597         objfile->global_psymbols.list = (struct partial_symbol **)
1598         xmalloc ((objfile->global_psymbols.size
1599                   * sizeof (struct partial_symbol *)));
1600     }
1601   if (objfile->static_psymbols.size > 0)
1602     {
1603       objfile->static_psymbols.next =
1604         objfile->static_psymbols.list = (struct partial_symbol **)
1605         xmalloc ((objfile->static_psymbols.size
1606                   * sizeof (struct partial_symbol *)));
1607     }
1608 }
1609
1610 struct partial_symtab *
1611 allocate_psymtab (const char *filename, struct objfile *objfile)
1612 {
1613   struct partial_symtab *psymtab;
1614
1615   if (objfile->free_psymtabs)
1616     {
1617       psymtab = objfile->free_psymtabs;
1618       objfile->free_psymtabs = psymtab->next;
1619     }
1620   else
1621     psymtab = (struct partial_symtab *)
1622       obstack_alloc (&objfile->objfile_obstack,
1623                      sizeof (struct partial_symtab));
1624
1625   memset (psymtab, 0, sizeof (struct partial_symtab));
1626   psymtab->filename = obsavestring (filename, strlen (filename),
1627                                     &objfile->objfile_obstack);
1628   psymtab->symtab = NULL;
1629
1630   /* Prepend it to the psymtab list for the objfile it belongs to.
1631      Psymtabs are searched in most recent inserted -> least recent
1632      inserted order.  */
1633
1634   psymtab->objfile = objfile;
1635   psymtab->next = objfile->psymtabs;
1636   objfile->psymtabs = psymtab;
1637
1638   return (psymtab);
1639 }
1640
1641 void
1642 discard_psymtab (struct partial_symtab *pst)
1643 {
1644   struct partial_symtab **prev_pst;
1645
1646   /* From dbxread.c:
1647      Empty psymtabs happen as a result of header files which don't
1648      have any symbols in them.  There can be a lot of them.  But this
1649      check is wrong, in that a psymtab with N_SLINE entries but
1650      nothing else is not empty, but we don't realize that.  Fixing
1651      that without slowing things down might be tricky.  */
1652
1653   /* First, snip it out of the psymtab chain.  */
1654
1655   prev_pst = &(pst->objfile->psymtabs);
1656   while ((*prev_pst) != pst)
1657     prev_pst = &((*prev_pst)->next);
1658   (*prev_pst) = pst->next;
1659
1660   /* Next, put it on a free list for recycling.  */
1661
1662   pst->next = pst->objfile->free_psymtabs;
1663   pst->objfile->free_psymtabs = pst;
1664 }
1665
1666 \f
1667
1668 void
1669 maintenance_print_psymbols (char *args, int from_tty)
1670 {
1671   char **argv;
1672   struct ui_file *outfile;
1673   struct cleanup *cleanups;
1674   char *symname = NULL;
1675   char *filename = DEV_TTY;
1676   struct objfile *objfile;
1677   struct partial_symtab *ps;
1678
1679   dont_repeat ();
1680
1681   if (args == NULL)
1682     {
1683       error (_("\
1684 print-psymbols takes an output file name and optional symbol file name"));
1685     }
1686   argv = gdb_buildargv (args);
1687   cleanups = make_cleanup_freeargv (argv);
1688
1689   if (argv[0] != NULL)
1690     {
1691       filename = argv[0];
1692       /* If a second arg is supplied, it is a source file name to match on.  */
1693       if (argv[1] != NULL)
1694         {
1695           symname = argv[1];
1696         }
1697     }
1698
1699   filename = tilde_expand (filename);
1700   make_cleanup (xfree, filename);
1701
1702   outfile = gdb_fopen (filename, FOPEN_WT);
1703   if (outfile == 0)
1704     perror_with_name (filename);
1705   make_cleanup_ui_file_delete (outfile);
1706
1707   immediate_quit++;
1708   ALL_PSYMTABS (objfile, ps)
1709     if (symname == NULL || filename_cmp (symname, ps->filename) == 0)
1710     dump_psymtab (objfile, ps, outfile);
1711   immediate_quit--;
1712   do_cleanups (cleanups);
1713 }
1714
1715 /* List all the partial symbol tables whose names match REGEXP (optional).  */
1716 void
1717 maintenance_info_psymtabs (char *regexp, int from_tty)
1718 {
1719   struct program_space *pspace;
1720   struct objfile *objfile;
1721
1722   if (regexp)
1723     re_comp (regexp);
1724
1725   ALL_PSPACES (pspace)
1726     ALL_PSPACE_OBJFILES (pspace, objfile)
1727     {
1728       struct gdbarch *gdbarch = get_objfile_arch (objfile);
1729       struct partial_symtab *psymtab;
1730
1731       /* We don't want to print anything for this objfile until we
1732          actually find a symtab whose name matches.  */
1733       int printed_objfile_start = 0;
1734
1735       ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, psymtab)
1736         {
1737           QUIT;
1738
1739           if (! regexp
1740               || re_exec (psymtab->filename))
1741             {
1742               if (! printed_objfile_start)
1743                 {
1744                   printf_filtered ("{ objfile %s ", objfile->name);
1745                   wrap_here ("  ");
1746                   printf_filtered ("((struct objfile *) %s)\n", 
1747                                    host_address_to_string (objfile));
1748                   printed_objfile_start = 1;
1749                 }
1750
1751               printf_filtered ("  { psymtab %s ", psymtab->filename);
1752               wrap_here ("    ");
1753               printf_filtered ("((struct partial_symtab *) %s)\n", 
1754                                host_address_to_string (psymtab));
1755
1756               printf_filtered ("    readin %s\n",
1757                                psymtab->readin ? "yes" : "no");
1758               printf_filtered ("    fullname %s\n",
1759                                psymtab->fullname
1760                                ? psymtab->fullname : "(null)");
1761               printf_filtered ("    text addresses ");
1762               fputs_filtered (paddress (gdbarch, psymtab->textlow),
1763                               gdb_stdout);
1764               printf_filtered (" -- ");
1765               fputs_filtered (paddress (gdbarch, psymtab->texthigh),
1766                               gdb_stdout);
1767               printf_filtered ("\n");
1768               printf_filtered ("    globals ");
1769               if (psymtab->n_global_syms)
1770                 {
1771                   printf_filtered ("(* (struct partial_symbol **) %s @ %d)\n",
1772                                    host_address_to_string (psymtab->objfile->global_psymbols.list
1773                                     + psymtab->globals_offset),
1774                                    psymtab->n_global_syms);
1775                 }
1776               else
1777                 printf_filtered ("(none)\n");
1778               printf_filtered ("    statics ");
1779               if (psymtab->n_static_syms)
1780                 {
1781                   printf_filtered ("(* (struct partial_symbol **) %s @ %d)\n",
1782                                    host_address_to_string (psymtab->objfile->static_psymbols.list
1783                                     + psymtab->statics_offset),
1784                                    psymtab->n_static_syms);
1785                 }
1786               else
1787                 printf_filtered ("(none)\n");
1788               printf_filtered ("    dependencies ");
1789               if (psymtab->number_of_dependencies)
1790                 {
1791                   int i;
1792
1793                   printf_filtered ("{\n");
1794                   for (i = 0; i < psymtab->number_of_dependencies; i++)
1795                     {
1796                       struct partial_symtab *dep = psymtab->dependencies[i];
1797
1798                       /* Note the string concatenation there --- no comma.  */
1799                       printf_filtered ("      psymtab %s "
1800                                        "((struct partial_symtab *) %s)\n",
1801                                        dep->filename, 
1802                                        host_address_to_string (dep));
1803                     }
1804                   printf_filtered ("    }\n");
1805                 }
1806               else
1807                 printf_filtered ("(none)\n");
1808               printf_filtered ("  }\n");
1809             }
1810         }
1811
1812       if (printed_objfile_start)
1813         printf_filtered ("}\n");
1814     }
1815 }
1816
1817 /* Check consistency of psymtabs and symtabs.  */
1818
1819 void
1820 maintenance_check_symtabs (char *ignore, int from_tty)
1821 {
1822   struct symbol *sym;
1823   struct partial_symbol **psym;
1824   struct symtab *s = NULL;
1825   struct partial_symtab *ps;
1826   struct blockvector *bv;
1827   struct objfile *objfile;
1828   struct block *b;
1829   int length;
1830
1831   ALL_PSYMTABS (objfile, ps)
1832   {
1833     struct gdbarch *gdbarch = get_objfile_arch (objfile);
1834
1835     s = PSYMTAB_TO_SYMTAB (ps);
1836     if (s == NULL)
1837       continue;
1838     bv = BLOCKVECTOR (s);
1839     b = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
1840     psym = ps->objfile->static_psymbols.list + ps->statics_offset;
1841     length = ps->n_static_syms;
1842     while (length--)
1843       {
1844         sym = lookup_block_symbol (b, SYMBOL_LINKAGE_NAME (*psym),
1845                                    SYMBOL_DOMAIN (*psym));
1846         if (!sym)
1847           {
1848             printf_filtered ("Static symbol `");
1849             puts_filtered (SYMBOL_LINKAGE_NAME (*psym));
1850             printf_filtered ("' only found in ");
1851             puts_filtered (ps->filename);
1852             printf_filtered (" psymtab\n");
1853           }
1854         psym++;
1855       }
1856     b = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
1857     psym = ps->objfile->global_psymbols.list + ps->globals_offset;
1858     length = ps->n_global_syms;
1859     while (length--)
1860       {
1861         sym = lookup_block_symbol (b, SYMBOL_LINKAGE_NAME (*psym),
1862                                    SYMBOL_DOMAIN (*psym));
1863         if (!sym)
1864           {
1865             printf_filtered ("Global symbol `");
1866             puts_filtered (SYMBOL_LINKAGE_NAME (*psym));
1867             printf_filtered ("' only found in ");
1868             puts_filtered (ps->filename);
1869             printf_filtered (" psymtab\n");
1870           }
1871         psym++;
1872       }
1873     if (ps->texthigh < ps->textlow)
1874       {
1875         printf_filtered ("Psymtab ");
1876         puts_filtered (ps->filename);
1877         printf_filtered (" covers bad range ");
1878         fputs_filtered (paddress (gdbarch, ps->textlow), gdb_stdout);
1879         printf_filtered (" - ");
1880         fputs_filtered (paddress (gdbarch, ps->texthigh), gdb_stdout);
1881         printf_filtered ("\n");
1882         continue;
1883       }
1884     if (ps->texthigh == 0)
1885       continue;
1886     if (ps->textlow < BLOCK_START (b) || ps->texthigh > BLOCK_END (b))
1887       {
1888         printf_filtered ("Psymtab ");
1889         puts_filtered (ps->filename);
1890         printf_filtered (" covers ");
1891         fputs_filtered (paddress (gdbarch, ps->textlow), gdb_stdout);
1892         printf_filtered (" - ");
1893         fputs_filtered (paddress (gdbarch, ps->texthigh), gdb_stdout);
1894         printf_filtered (" but symtab covers only ");
1895         fputs_filtered (paddress (gdbarch, BLOCK_START (b)), gdb_stdout);
1896         printf_filtered (" - ");
1897         fputs_filtered (paddress (gdbarch, BLOCK_END (b)), gdb_stdout);
1898         printf_filtered ("\n");
1899       }
1900   }
1901 }
1902
1903 \f
1904
1905 void
1906 expand_partial_symbol_names (int (*fun) (const char *, void *), void *data)
1907 {
1908   struct objfile *objfile;
1909
1910   ALL_OBJFILES (objfile)
1911   {
1912     if (objfile->sf)
1913       objfile->sf->qf->expand_symtabs_matching (objfile, NULL, fun,
1914                                                 ALL_DOMAIN, data);
1915   }
1916 }
1917
1918 void
1919 map_partial_symbol_filenames (symbol_filename_ftype *fun, void *data)
1920 {
1921   struct objfile *objfile;
1922
1923   ALL_OBJFILES (objfile)
1924   {
1925     if (objfile->sf)
1926       objfile->sf->qf->map_symbol_filenames (objfile, fun, data);
1927   }
1928 }