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