2011-10-31 Pedro Alves <pedro@codesourcery.com>
[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 /* 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 }
This page took 0.103051 seconds and 4 git commands to generate.