1 /* Partial symbol tables.
3 Copyright (C) 2009-2012 Free Software Foundation, Inc.
5 This file is part of GDB.
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.
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.
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/>. */
24 #include "gdb_assert.h"
26 #include "filenames.h"
33 #include "readline/readline.h"
34 #include "gdb_regex.h"
35 #include "dictionary.h"
37 #include "cp-support.h"
40 #define DEV_TTY "/dev/tty"
45 struct bcache *bcache;
48 static struct partial_symbol *match_partial_symbol (struct objfile *,
49 struct partial_symtab *,
51 const char *, domain_enum,
52 symbol_compare_ftype *,
53 symbol_compare_ftype *);
55 static struct partial_symbol *lookup_partial_symbol (struct objfile *,
56 struct partial_symtab *,
60 static char *psymtab_to_fullname (struct partial_symtab *ps);
62 static struct partial_symbol *find_pc_sect_psymbol (struct objfile *,
63 struct partial_symtab *,
65 struct obj_section *);
67 static struct partial_symbol *fixup_psymbol_section (struct partial_symbol
69 struct objfile *objfile);
71 static struct symtab *psymtab_to_symtab (struct objfile *objfile,
72 struct partial_symtab *pst);
74 /* Ensure that the partial symbols for OBJFILE have been loaded. This
75 function always returns its argument, as a convenience. */
78 require_partial_symbols (struct objfile *objfile, int verbose)
80 if ((objfile->flags & OBJF_PSYMTABS_READ) == 0)
82 objfile->flags |= OBJF_PSYMTABS_READ;
84 if (objfile->sf->sym_read_psymbols)
88 printf_unfiltered (_("Reading symbols from %s..."),
90 gdb_flush (gdb_stdout);
92 (*objfile->sf->sym_read_psymbols) (objfile);
95 if (!objfile_has_symbols (objfile))
98 printf_unfiltered (_("(no debugging symbols found)..."));
102 printf_unfiltered (_("done.\n"));
110 /* Traverse all psymtabs in one objfile, requiring that the psymtabs
113 #define ALL_OBJFILE_PSYMTABS_REQUIRED(objfile, p) \
114 for ((p) = require_partial_symbols (objfile, 1)->psymtabs; \
118 /* We want to make sure this file always requires psymtabs. */
120 #undef ALL_OBJFILE_PSYMTABS
122 /* Traverse all psymtabs in all objfiles. */
124 #define ALL_PSYMTABS(objfile, p) \
125 ALL_OBJFILES (objfile) \
126 ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, p)
128 /* Helper function for partial_map_symtabs_matching_filename that
129 expands the symtabs and calls the iterator. */
132 partial_map_expand_apply (struct objfile *objfile,
134 const char *full_path,
135 const char *real_path,
136 struct partial_symtab *pst,
137 int (*callback) (struct symtab *, void *),
140 struct symtab *last_made = objfile->symtabs;
142 /* Shared psymtabs should never be seen here. Instead they should
143 be handled properly by the caller. */
144 gdb_assert (pst->user == NULL);
146 /* Don't visit already-expanded psymtabs. */
150 /* This may expand more than one symtab, and we want to iterate over
152 psymtab_to_symtab (objfile, pst);
154 return iterate_over_some_symtabs (name, full_path, real_path, callback, data,
155 objfile->symtabs, last_made);
158 /* Implementation of the map_symtabs_matching_filename method. */
161 partial_map_symtabs_matching_filename (struct objfile *objfile,
163 const char *full_path,
164 const char *real_path,
165 int (*callback) (struct symtab *,
169 struct partial_symtab *pst;
170 const char *name_basename = lbasename (name);
171 int is_abs = IS_ABSOLUTE_PATH (name);
173 ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, pst)
175 /* We can skip shared psymtabs here, because any file name will be
176 attached to the unshared psymtab. */
177 if (pst->user != NULL)
180 /* Anonymous psymtabs don't have a file name. */
184 if (FILENAME_CMP (name, pst->filename) == 0
185 || (!is_abs && compare_filenames_for_search (pst->filename, name)))
187 if (partial_map_expand_apply (objfile, name, full_path, real_path,
188 pst, callback, data))
192 /* Before we invoke realpath, which can get expensive when many
193 files are involved, do a quick comparison of the basenames. */
194 if (! basenames_may_differ
195 && FILENAME_CMP (name_basename, lbasename (pst->filename)) != 0)
198 /* If the user gave us an absolute path, try to find the file in
199 this symtab and use its absolute path. */
200 if (full_path != NULL)
202 psymtab_to_fullname (pst);
203 if (pst->fullname != NULL
204 && (FILENAME_CMP (full_path, pst->fullname) == 0
205 || (!is_abs && compare_filenames_for_search (pst->fullname,
208 if (partial_map_expand_apply (objfile, name, full_path, real_path,
209 pst, callback, data))
214 if (real_path != NULL)
217 psymtab_to_fullname (pst);
218 if (pst->fullname != NULL)
220 rp = gdb_realpath (pst->fullname);
221 make_cleanup (xfree, rp);
224 && (FILENAME_CMP (real_path, rp) == 0
225 || (!is_abs && compare_filenames_for_search (real_path, name))))
227 if (partial_map_expand_apply (objfile, name, full_path, real_path,
228 pst, callback, data))
237 /* Find which partial symtab contains PC and SECTION starting at psymtab PST.
238 We may find a different psymtab than PST. See FIND_PC_SECT_PSYMTAB. */
240 static struct partial_symtab *
241 find_pc_sect_psymtab_closer (struct objfile *objfile,
242 CORE_ADDR pc, struct obj_section *section,
243 struct partial_symtab *pst,
244 struct minimal_symbol *msymbol)
246 struct partial_symtab *tpst;
247 struct partial_symtab *best_pst = pst;
248 CORE_ADDR best_addr = pst->textlow;
250 gdb_assert (!pst->psymtabs_addrmap_supported);
252 /* An objfile that has its functions reordered might have
253 many partial symbol tables containing the PC, but
254 we want the partial symbol table that contains the
255 function containing the PC. */
256 if (!(objfile->flags & OBJF_REORDERED) &&
257 section == 0) /* Can't validate section this way. */
263 /* The code range of partial symtabs sometimes overlap, so, in
264 the loop below, we need to check all partial symtabs and
265 find the one that fits better for the given PC address. We
266 select the partial symtab that contains a symbol whose
267 address is closest to the PC address. By closest we mean
268 that find_pc_sect_symbol returns the symbol with address
269 that is closest and still less than the given PC. */
270 for (tpst = pst; tpst != NULL; tpst = tpst->next)
272 if (pc >= tpst->textlow && pc < tpst->texthigh)
274 struct partial_symbol *p;
277 /* NOTE: This assumes that every psymbol has a
278 corresponding msymbol, which is not necessarily
279 true; the debug info might be much richer than the
280 object's symbol table. */
281 p = find_pc_sect_psymbol (objfile, tpst, pc, section);
283 && SYMBOL_VALUE_ADDRESS (p)
284 == SYMBOL_VALUE_ADDRESS (msymbol))
287 /* Also accept the textlow value of a psymtab as a
288 "symbol", to provide some support for partial
289 symbol tables with line information but no debug
290 symbols (e.g. those produced by an assembler). */
292 this_addr = SYMBOL_VALUE_ADDRESS (p);
294 this_addr = tpst->textlow;
296 /* Check whether it is closer than our current
297 BEST_ADDR. Since this symbol address is
298 necessarily lower or equal to PC, the symbol closer
299 to PC is the symbol which address is the highest.
300 This way we return the psymtab which contains such
301 best match symbol. This can help in cases where the
302 symbol information/debuginfo is not complete, like
303 for instance on IRIX6 with gcc, where no debug info
304 is emitted for statics. (See also the nodebug.exp
306 if (this_addr > best_addr)
308 best_addr = this_addr;
316 /* Find which partial symtab contains PC and SECTION. Return 0 if
317 none. We return the psymtab that contains a symbol whose address
318 exactly matches PC, or, if we cannot find an exact match, the
319 psymtab that contains a symbol whose address is closest to PC. */
320 static struct partial_symtab *
321 find_pc_sect_psymtab (struct objfile *objfile, CORE_ADDR pc,
322 struct obj_section *section,
323 struct minimal_symbol *msymbol)
325 struct partial_symtab *pst;
327 /* Try just the PSYMTABS_ADDRMAP mapping first as it has better granularity
328 than the later used TEXTLOW/TEXTHIGH one. */
330 if (objfile->psymtabs_addrmap != NULL)
332 pst = addrmap_find (objfile->psymtabs_addrmap, pc);
335 /* FIXME: addrmaps currently do not handle overlayed sections,
336 so fall back to the non-addrmap case if we're debugging
337 overlays and the addrmap returned the wrong section. */
338 if (overlay_debugging && msymbol && section)
340 struct partial_symbol *p;
342 /* NOTE: This assumes that every psymbol has a
343 corresponding msymbol, which is not necessarily
344 true; the debug info might be much richer than the
345 object's symbol table. */
346 p = find_pc_sect_psymbol (objfile, pst, pc, section);
348 || SYMBOL_VALUE_ADDRESS (p)
349 != SYMBOL_VALUE_ADDRESS (msymbol))
353 /* We do not try to call FIND_PC_SECT_PSYMTAB_CLOSER as
354 PSYMTABS_ADDRMAP we used has already the best 1-byte
355 granularity and FIND_PC_SECT_PSYMTAB_CLOSER may mislead us into
356 a worse chosen section due to the TEXTLOW/TEXTHIGH ranges
365 /* Existing PSYMTABS_ADDRMAP mapping is present even for PARTIAL_SYMTABs
366 which still have no corresponding full SYMTABs read. But it is not
367 present for non-DWARF2 debug infos not supporting PSYMTABS_ADDRMAP in GDB
370 /* Check even OBJFILE with non-zero PSYMTABS_ADDRMAP as only several of
371 its CUs may be missing in PSYMTABS_ADDRMAP as they may be varying
372 debug info type in single OBJFILE. */
374 ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, pst)
375 if (!pst->psymtabs_addrmap_supported
376 && pc >= pst->textlow && pc < pst->texthigh)
378 struct partial_symtab *best_pst;
380 best_pst = find_pc_sect_psymtab_closer (objfile, pc, section, pst,
382 if (best_pst != NULL)
389 static struct symtab *
390 find_pc_sect_symtab_from_partial (struct objfile *objfile,
391 struct minimal_symbol *msymbol,
392 CORE_ADDR pc, struct obj_section *section,
395 struct partial_symtab *ps = find_pc_sect_psymtab (objfile, pc, section,
399 if (warn_if_readin && ps->readin)
400 /* Might want to error() here (in case symtab is corrupt and
401 will cause a core dump), but maybe we can successfully
402 continue, so let's not. */
404 (Internal error: pc %s in read in psymtab, but not in symtab.)\n"),
405 paddress (get_objfile_arch (objfile), pc));
406 psymtab_to_symtab (objfile, ps);
412 /* Find which partial symbol within a psymtab matches PC and SECTION.
415 static struct partial_symbol *
416 find_pc_sect_psymbol (struct objfile *objfile,
417 struct partial_symtab *psymtab, CORE_ADDR pc,
418 struct obj_section *section)
420 struct partial_symbol *best = NULL, *p, **pp;
423 gdb_assert (psymtab != NULL);
425 /* Cope with programs that start at address 0. */
426 best_pc = (psymtab->textlow != 0) ? psymtab->textlow - 1 : 0;
428 /* Search the global symbols as well as the static symbols, so that
429 find_pc_partial_function doesn't use a minimal symbol and thus
430 cache a bad endaddr. */
431 for (pp = objfile->global_psymbols.list + psymtab->globals_offset;
432 (pp - (objfile->global_psymbols.list + psymtab->globals_offset)
433 < psymtab->n_global_syms);
437 if (SYMBOL_DOMAIN (p) == VAR_DOMAIN
438 && SYMBOL_CLASS (p) == LOC_BLOCK
439 && pc >= SYMBOL_VALUE_ADDRESS (p)
440 && (SYMBOL_VALUE_ADDRESS (p) > best_pc
441 || (psymtab->textlow == 0
442 && best_pc == 0 && SYMBOL_VALUE_ADDRESS (p) == 0)))
444 if (section) /* Match on a specific section. */
446 fixup_psymbol_section (p, objfile);
447 if (!matching_obj_sections (SYMBOL_OBJ_SECTION (p), section))
450 best_pc = SYMBOL_VALUE_ADDRESS (p);
455 for (pp = objfile->static_psymbols.list + psymtab->statics_offset;
456 (pp - (objfile->static_psymbols.list + psymtab->statics_offset)
457 < psymtab->n_static_syms);
461 if (SYMBOL_DOMAIN (p) == VAR_DOMAIN
462 && SYMBOL_CLASS (p) == LOC_BLOCK
463 && pc >= SYMBOL_VALUE_ADDRESS (p)
464 && (SYMBOL_VALUE_ADDRESS (p) > best_pc
465 || (psymtab->textlow == 0
466 && best_pc == 0 && SYMBOL_VALUE_ADDRESS (p) == 0)))
468 if (section) /* Match on a specific section. */
470 fixup_psymbol_section (p, objfile);
471 if (!matching_obj_sections (SYMBOL_OBJ_SECTION (p), section))
474 best_pc = SYMBOL_VALUE_ADDRESS (p);
482 static struct partial_symbol *
483 fixup_psymbol_section (struct partial_symbol *psym, struct objfile *objfile)
490 if (SYMBOL_OBJ_SECTION (psym))
493 gdb_assert (objfile);
495 switch (SYMBOL_CLASS (psym))
500 addr = SYMBOL_VALUE_ADDRESS (psym);
503 /* Nothing else will be listed in the minsyms -- no use looking
508 fixup_section (&psym->ginfo, addr, objfile);
513 static struct symtab *
514 lookup_symbol_aux_psymtabs (struct objfile *objfile,
515 int block_index, const char *name,
516 const domain_enum domain)
518 struct partial_symtab *ps;
519 const int psymtab_index = (block_index == GLOBAL_BLOCK ? 1 : 0);
520 struct symtab *stab_best = NULL;
522 ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps)
524 if (!ps->readin && lookup_partial_symbol (objfile, ps, name,
525 psymtab_index, domain))
527 struct symbol *sym = NULL;
528 struct symtab *stab = psymtab_to_symtab (objfile, ps);
530 /* Some caution must be observed with overloaded functions
531 and methods, since the psymtab will not contain any overload
532 information (but NAME might contain it). */
535 struct blockvector *bv = BLOCKVECTOR (stab);
536 struct block *block = BLOCKVECTOR_BLOCK (bv, block_index);
538 sym = lookup_block_symbol (block, name, domain);
541 if (sym && strcmp_iw (SYMBOL_SEARCH_NAME (sym), name) == 0)
543 if (!TYPE_IS_OPAQUE (SYMBOL_TYPE (sym)))
549 /* Keep looking through other psymtabs. */
556 /* Look in PST for a symbol in DOMAIN whose name matches NAME. Search
557 the global block of PST if GLOBAL, and otherwise the static block.
558 MATCH is the comparison operation that returns true iff MATCH (s,
559 NAME), where s is a SYMBOL_SEARCH_NAME. If ORDERED_COMPARE is
560 non-null, the symbols in the block are assumed to be ordered
561 according to it (allowing binary search). It must be compatible
562 with MATCH. Returns the symbol, if found, and otherwise NULL. */
564 static struct partial_symbol *
565 match_partial_symbol (struct objfile *objfile,
566 struct partial_symtab *pst, int global,
567 const char *name, domain_enum domain,
568 symbol_compare_ftype *match,
569 symbol_compare_ftype *ordered_compare)
571 struct partial_symbol **start, **psym;
572 struct partial_symbol **top, **real_top, **bottom, **center;
573 int length = (global ? pst->n_global_syms : pst->n_static_syms);
574 int do_linear_search = 1;
579 objfile->global_psymbols.list + pst->globals_offset :
580 objfile->static_psymbols.list + pst->statics_offset);
582 if (global && ordered_compare) /* Can use a binary search. */
584 do_linear_search = 0;
586 /* Binary search. This search is guaranteed to end with center
587 pointing at the earliest partial symbol whose name might be
588 correct. At that point *all* partial symbols with an
589 appropriate name will be checked against the correct
593 top = start + length - 1;
597 center = bottom + (top - bottom) / 2;
598 gdb_assert (center < top);
599 if (!do_linear_search
600 && (SYMBOL_LANGUAGE (*center) == language_java))
601 do_linear_search = 1;
602 if (ordered_compare (SYMBOL_SEARCH_NAME (*center), name) >= 0)
607 gdb_assert (top == bottom);
609 while (top <= real_top
610 && match (SYMBOL_SEARCH_NAME (*top), name) == 0)
612 if (symbol_matches_domain (SYMBOL_LANGUAGE (*top),
613 SYMBOL_DOMAIN (*top), domain))
619 /* Can't use a binary search or else we found during the binary search that
620 we should also do a linear search. */
622 if (do_linear_search)
624 for (psym = start; psym < start + length; psym++)
626 if (symbol_matches_domain (SYMBOL_LANGUAGE (*psym),
627 SYMBOL_DOMAIN (*psym), domain)
628 && match (SYMBOL_SEARCH_NAME (*psym), name) == 0)
637 pre_expand_symtabs_matching_psymtabs (struct objfile *objfile,
638 enum block_enum block_kind,
645 /* Returns the name used to search psymtabs. Unlike symtabs, psymtabs do
646 not contain any method/function instance information (since this would
647 force reading type information while reading psymtabs). Therefore,
648 if NAME contains overload information, it must be stripped before searching
651 The caller is responsible for freeing the return result. */
654 psymtab_search_name (const char *name)
656 switch (current_language->la_language)
661 if (strchr (name, '('))
663 char *ret = cp_remove_params (name);
675 return xstrdup (name);
678 /* Look, in partial_symtab PST, for symbol whose natural name is NAME.
679 Check the global symbols if GLOBAL, the static symbols if not. */
681 static struct partial_symbol *
682 lookup_partial_symbol (struct objfile *objfile,
683 struct partial_symtab *pst, const char *name,
684 int global, domain_enum domain)
686 struct partial_symbol **start, **psym;
687 struct partial_symbol **top, **real_top, **bottom, **center;
688 int length = (global ? pst->n_global_syms : pst->n_static_syms);
689 int do_linear_search = 1;
691 struct cleanup *cleanup;
698 search_name = psymtab_search_name (name);
699 cleanup = make_cleanup (xfree, search_name);
701 objfile->global_psymbols.list + pst->globals_offset :
702 objfile->static_psymbols.list + pst->statics_offset);
704 if (global) /* This means we can use a binary search. */
706 do_linear_search = 0;
708 /* Binary search. This search is guaranteed to end with center
709 pointing at the earliest partial symbol whose name might be
710 correct. At that point *all* partial symbols with an
711 appropriate name will be checked against the correct
715 top = start + length - 1;
719 center = bottom + (top - bottom) / 2;
721 internal_error (__FILE__, __LINE__,
722 _("failed internal consistency check"));
723 if (!do_linear_search
724 && SYMBOL_LANGUAGE (*center) == language_java)
726 do_linear_search = 1;
728 if (strcmp_iw_ordered (SYMBOL_SEARCH_NAME (*center),
738 if (!(top == bottom))
739 internal_error (__FILE__, __LINE__,
740 _("failed internal consistency check"));
742 /* For `case_sensitivity == case_sensitive_off' strcmp_iw_ordered will
743 search more exactly than what matches SYMBOL_MATCHES_SEARCH_NAME. */
744 while (top >= start && SYMBOL_MATCHES_SEARCH_NAME (*top, search_name))
747 /* Fixup to have a symbol which matches SYMBOL_MATCHES_SEARCH_NAME. */
750 while (top <= real_top && SYMBOL_MATCHES_SEARCH_NAME (*top, search_name))
752 if (symbol_matches_domain (SYMBOL_LANGUAGE (*top),
753 SYMBOL_DOMAIN (*top), domain))
755 do_cleanups (cleanup);
762 /* Can't use a binary search or else we found during the binary search that
763 we should also do a linear search. */
765 if (do_linear_search)
767 for (psym = start; psym < start + length; psym++)
769 if (symbol_matches_domain (SYMBOL_LANGUAGE (*psym),
770 SYMBOL_DOMAIN (*psym), domain)
771 && SYMBOL_MATCHES_SEARCH_NAME (*psym, search_name))
773 do_cleanups (cleanup);
779 do_cleanups (cleanup);
783 /* Get the symbol table that corresponds to a partial_symtab.
784 This is fast after the first time you do it. */
786 static struct symtab *
787 psymtab_to_symtab (struct objfile *objfile, struct partial_symtab *pst)
789 /* If it is a shared psymtab, find an unshared psymtab that includes
790 it. Any such psymtab will do. */
791 while (pst->user != NULL)
794 /* If it's been looked up before, return it. */
798 /* If it has not yet been read in, read it. */
801 struct cleanup *back_to = increment_reading_symtab ();
803 (*pst->read_symtab) (objfile, pst);
804 do_cleanups (back_to);
811 relocate_psymtabs (struct objfile *objfile,
812 struct section_offsets *new_offsets,
813 struct section_offsets *delta)
815 struct partial_symbol **psym;
816 struct partial_symtab *p;
818 ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, p)
820 p->textlow += ANOFFSET (delta, SECT_OFF_TEXT (objfile));
821 p->texthigh += ANOFFSET (delta, SECT_OFF_TEXT (objfile));
824 for (psym = objfile->global_psymbols.list;
825 psym < objfile->global_psymbols.next;
828 fixup_psymbol_section (*psym, objfile);
829 if (SYMBOL_SECTION (*psym) >= 0)
830 SYMBOL_VALUE_ADDRESS (*psym) += ANOFFSET (delta,
831 SYMBOL_SECTION (*psym));
833 for (psym = objfile->static_psymbols.list;
834 psym < objfile->static_psymbols.next;
837 fixup_psymbol_section (*psym, objfile);
838 if (SYMBOL_SECTION (*psym) >= 0)
839 SYMBOL_VALUE_ADDRESS (*psym) += ANOFFSET (delta,
840 SYMBOL_SECTION (*psym));
844 static struct symtab *
845 find_last_source_symtab_from_partial (struct objfile *ofp)
847 struct partial_symtab *ps;
848 struct partial_symtab *cs_pst = 0;
850 ALL_OBJFILE_PSYMTABS_REQUIRED (ofp, ps)
852 const char *name = ps->filename;
853 int len = strlen (name);
855 if (!(len > 2 && (strcmp (&name[len - 2], ".h") == 0
856 || strcmp (name, "<<C++-namespaces>>") == 0)))
864 internal_error (__FILE__, __LINE__,
865 _("select_source_symtab: "
866 "readin pst found and no symtabs."));
869 return psymtab_to_symtab (ofp, cs_pst);
875 forget_cached_source_info_partial (struct objfile *objfile)
877 struct partial_symtab *pst;
879 ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, pst)
881 if (pst->fullname != NULL)
883 xfree (pst->fullname);
884 pst->fullname = NULL;
890 print_partial_symbols (struct gdbarch *gdbarch,
891 struct partial_symbol **p, int count, char *what,
892 struct ui_file *outfile)
894 fprintf_filtered (outfile, " %s partial symbols:\n", what);
898 fprintf_filtered (outfile, " `%s'", SYMBOL_LINKAGE_NAME (*p));
899 if (SYMBOL_DEMANGLED_NAME (*p) != NULL)
901 fprintf_filtered (outfile, " `%s'", SYMBOL_DEMANGLED_NAME (*p));
903 fputs_filtered (", ", outfile);
904 switch (SYMBOL_DOMAIN (*p))
907 fputs_filtered ("undefined domain, ", outfile);
910 /* This is the usual thing -- don't print it. */
913 fputs_filtered ("struct domain, ", outfile);
916 fputs_filtered ("label domain, ", outfile);
919 fputs_filtered ("<invalid domain>, ", outfile);
922 switch (SYMBOL_CLASS (*p))
925 fputs_filtered ("undefined", outfile);
928 fputs_filtered ("constant int", outfile);
931 fputs_filtered ("static", outfile);
934 fputs_filtered ("register", outfile);
937 fputs_filtered ("pass by value", outfile);
940 fputs_filtered ("pass by reference", outfile);
942 case LOC_REGPARM_ADDR:
943 fputs_filtered ("register address parameter", outfile);
946 fputs_filtered ("stack parameter", outfile);
949 fputs_filtered ("type", outfile);
952 fputs_filtered ("label", outfile);
955 fputs_filtered ("function", outfile);
957 case LOC_CONST_BYTES:
958 fputs_filtered ("constant bytes", outfile);
961 fputs_filtered ("unresolved", outfile);
963 case LOC_OPTIMIZED_OUT:
964 fputs_filtered ("optimized out", outfile);
967 fputs_filtered ("computed at runtime", outfile);
970 fputs_filtered ("<invalid location>", outfile);
973 fputs_filtered (", ", outfile);
974 fputs_filtered (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (*p)), outfile);
975 fprintf_filtered (outfile, "\n");
981 dump_psymtab (struct objfile *objfile, struct partial_symtab *psymtab,
982 struct ui_file *outfile)
984 struct gdbarch *gdbarch = get_objfile_arch (objfile);
987 if (psymtab->anonymous)
989 fprintf_filtered (outfile, "\nAnonymous partial symtab (%s) ",
994 fprintf_filtered (outfile, "\nPartial symtab for source file %s ",
997 fprintf_filtered (outfile, "(object ");
998 gdb_print_host_address (psymtab, outfile);
999 fprintf_filtered (outfile, ")\n\n");
1000 fprintf_unfiltered (outfile, " Read from object file %s (",
1002 gdb_print_host_address (objfile, outfile);
1003 fprintf_unfiltered (outfile, ")\n");
1005 if (psymtab->readin)
1007 fprintf_filtered (outfile,
1008 " Full symtab was read (at ");
1009 gdb_print_host_address (psymtab->symtab, outfile);
1010 fprintf_filtered (outfile, " by function at ");
1011 gdb_print_host_address (psymtab->read_symtab, outfile);
1012 fprintf_filtered (outfile, ")\n");
1015 fprintf_filtered (outfile, " Relocate symbols by ");
1016 for (i = 0; i < objfile->num_sections; ++i)
1019 fprintf_filtered (outfile, ", ");
1021 fputs_filtered (paddress (gdbarch,
1022 ANOFFSET (psymtab->section_offsets, i)),
1025 fprintf_filtered (outfile, "\n");
1027 fprintf_filtered (outfile, " Symbols cover text addresses ");
1028 fputs_filtered (paddress (gdbarch, psymtab->textlow), outfile);
1029 fprintf_filtered (outfile, "-");
1030 fputs_filtered (paddress (gdbarch, psymtab->texthigh), outfile);
1031 fprintf_filtered (outfile, "\n");
1032 fprintf_filtered (outfile, " Address map supported - %s.\n",
1033 psymtab->psymtabs_addrmap_supported ? "yes" : "no");
1034 fprintf_filtered (outfile, " Depends on %d other partial symtabs.\n",
1035 psymtab->number_of_dependencies);
1036 for (i = 0; i < psymtab->number_of_dependencies; i++)
1038 fprintf_filtered (outfile, " %d ", i);
1039 gdb_print_host_address (psymtab->dependencies[i], outfile);
1040 fprintf_filtered (outfile, " %s\n",
1041 psymtab->dependencies[i]->filename);
1043 if (psymtab->user != NULL)
1045 fprintf_filtered (outfile, " Shared partial symtab with user ");
1046 gdb_print_host_address (psymtab->user, outfile);
1047 fprintf_filtered (outfile, "\n");
1049 if (psymtab->n_global_syms > 0)
1051 print_partial_symbols (gdbarch,
1052 objfile->global_psymbols.list
1053 + psymtab->globals_offset,
1054 psymtab->n_global_syms, "Global", outfile);
1056 if (psymtab->n_static_syms > 0)
1058 print_partial_symbols (gdbarch,
1059 objfile->static_psymbols.list
1060 + psymtab->statics_offset,
1061 psymtab->n_static_syms, "Static", outfile);
1063 fprintf_filtered (outfile, "\n");
1067 print_psymtab_stats_for_objfile (struct objfile *objfile)
1070 struct partial_symtab *ps;
1073 ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps)
1075 if (ps->readin == 0)
1078 printf_filtered (_(" Number of psym tables (not yet expanded): %d\n"), i);
1082 dump_psymtabs_for_objfile (struct objfile *objfile)
1084 struct partial_symtab *psymtab;
1086 if (objfile->psymtabs)
1088 printf_filtered ("Psymtabs:\n");
1089 for (psymtab = objfile->psymtabs;
1091 psymtab = psymtab->next)
1093 printf_filtered ("%s at ",
1095 gdb_print_host_address (psymtab, gdb_stdout);
1096 printf_filtered (", ");
1099 printf_filtered ("\n\n");
1103 /* Look through the partial symtabs for all symbols which begin
1104 by matching FUNC_NAME. Make sure we read that symbol table in. */
1107 read_symtabs_for_function (struct objfile *objfile, const char *func_name)
1109 struct partial_symtab *ps;
1111 ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps)
1116 if ((lookup_partial_symbol (objfile, ps, func_name, 1, VAR_DOMAIN)
1118 || (lookup_partial_symbol (objfile, ps, func_name, 0, VAR_DOMAIN)
1120 psymtab_to_symtab (objfile, ps);
1125 expand_partial_symbol_tables (struct objfile *objfile)
1127 struct partial_symtab *psymtab;
1129 ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, psymtab)
1131 psymtab_to_symtab (objfile, psymtab);
1136 read_psymtabs_with_filename (struct objfile *objfile, const char *filename)
1138 struct partial_symtab *p;
1140 ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, p)
1142 /* Anonymous psymtabs don't have a name of a source file. */
1146 if (filename_cmp (filename, p->filename) == 0)
1147 psymtab_to_symtab (objfile, p);
1152 map_symbol_filenames_psymtab (struct objfile *objfile,
1153 symbol_filename_ftype *fun, void *data,
1156 struct partial_symtab *ps;
1158 ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps)
1160 const char *fullname;
1165 /* We can skip shared psymtabs here, because any file name will be
1166 attached to the unshared psymtab. */
1167 if (ps->user != NULL)
1170 /* Anonymous psymtabs don't have a file name. */
1176 fullname = psymtab_to_fullname (ps);
1179 (*fun) (ps->filename, fullname, data);
1183 /* Finds the fullname that a partial_symtab represents.
1185 If this functions finds the fullname, it will save it in ps->fullname
1186 and it will also return the value.
1188 If this function fails to find the file that this partial_symtab represents,
1189 NULL will be returned and ps->fullname will be set to NULL. */
1192 psymtab_to_fullname (struct partial_symtab *ps)
1201 /* Use cached copy if we have it.
1202 We rely on forget_cached_source_info being called appropriately
1203 to handle cases like the file being moved. */
1205 return ps->fullname;
1207 r = find_and_open_source (ps->filename, ps->dirname, &ps->fullname);
1212 return ps->fullname;
1219 find_symbol_file_from_partial (struct objfile *objfile, const char *name)
1221 struct partial_symtab *pst;
1223 ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, pst)
1225 if (lookup_partial_symbol (objfile, pst, name, 1, VAR_DOMAIN))
1226 return pst->filename;
1231 /* For all symbols, s, in BLOCK that are in NAMESPACE and match NAME
1232 according to the function MATCH, call CALLBACK(BLOCK, s, DATA).
1233 BLOCK is assumed to come from OBJFILE. Returns 1 iff CALLBACK
1234 ever returns non-zero, and otherwise returns 0. */
1237 map_block (const char *name, domain_enum namespace, struct objfile *objfile,
1238 struct block *block,
1239 int (*callback) (struct block *, struct symbol *, void *),
1240 void *data, symbol_compare_ftype *match)
1242 struct block_iterator iter;
1245 for (sym = block_iter_match_first (block, name, match, &iter);
1246 sym != NULL; sym = block_iter_match_next (name, match, &iter))
1248 if (symbol_matches_domain (SYMBOL_LANGUAGE (sym),
1249 SYMBOL_DOMAIN (sym), namespace))
1251 if (callback (block, sym, data))
1259 /* Psymtab version of map_matching_symbols. See its definition in
1260 the definition of quick_symbol_functions in symfile.h. */
1263 map_matching_symbols_psymtab (const char *name, domain_enum namespace,
1264 struct objfile *objfile, int global,
1265 int (*callback) (struct block *,
1266 struct symbol *, void *),
1268 symbol_compare_ftype *match,
1269 symbol_compare_ftype *ordered_compare)
1271 const int block_kind = global ? GLOBAL_BLOCK : STATIC_BLOCK;
1272 struct partial_symtab *ps;
1274 ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps)
1278 || match_partial_symbol (objfile, ps, global, name, namespace, match,
1281 struct symtab *s = psymtab_to_symtab (objfile, ps);
1282 struct block *block;
1284 if (s == NULL || !s->primary)
1286 block = BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), block_kind);
1287 if (map_block (name, namespace, objfile, block,
1288 callback, data, match))
1290 if (callback (block, NULL, data))
1296 /* A helper for expand_symtabs_matching_via_partial that handles
1297 searching included psymtabs. This returns 1 if a symbol is found,
1298 and zero otherwise. It also updates the 'searched_flag' on the
1299 various psymtabs that it searches. */
1302 recursively_search_psymtabs (struct partial_symtab *ps,
1303 struct objfile *objfile,
1304 enum search_domain kind,
1305 int (*name_matcher) (const char *, void *),
1308 struct partial_symbol **psym;
1309 struct partial_symbol **bound, **gbound, **sbound;
1311 int result = PST_SEARCHED_AND_NOT_FOUND;
1314 if (ps->searched_flag != PST_NOT_SEARCHED)
1315 return ps->searched_flag == PST_SEARCHED_AND_FOUND;
1317 /* Recurse into shared psymtabs first, because they may have already
1318 been searched, and this could save some time. */
1319 for (i = 0; i < ps->number_of_dependencies; ++i)
1323 /* Skip non-shared dependencies, these are handled elsewhere. */
1324 if (ps->dependencies[i]->user == NULL)
1327 r = recursively_search_psymtabs (ps->dependencies[i],
1328 objfile, kind, name_matcher, data);
1331 ps->searched_flag = PST_SEARCHED_AND_FOUND;
1336 gbound = (objfile->global_psymbols.list
1337 + ps->globals_offset + ps->n_global_syms);
1338 sbound = (objfile->static_psymbols.list
1339 + ps->statics_offset + ps->n_static_syms);
1342 /* Go through all of the symbols stored in a partial
1343 symtab in one loop. */
1344 psym = objfile->global_psymbols.list + ps->globals_offset;
1349 if (bound == gbound && ps->n_static_syms != 0)
1351 psym = objfile->static_psymbols.list + ps->statics_offset;
1362 if ((kind == ALL_DOMAIN
1363 || (kind == VARIABLES_DOMAIN
1364 && SYMBOL_CLASS (*psym) != LOC_TYPEDEF
1365 && SYMBOL_CLASS (*psym) != LOC_BLOCK)
1366 || (kind == FUNCTIONS_DOMAIN
1367 && SYMBOL_CLASS (*psym) == LOC_BLOCK)
1368 || (kind == TYPES_DOMAIN
1369 && SYMBOL_CLASS (*psym) == LOC_TYPEDEF))
1370 && (*name_matcher) (SYMBOL_SEARCH_NAME (*psym), data))
1372 /* Found a match, so notify our caller. */
1373 result = PST_SEARCHED_AND_FOUND;
1380 ps->searched_flag = result;
1381 return result == PST_SEARCHED_AND_FOUND;
1385 expand_symtabs_matching_via_partial
1386 (struct objfile *objfile,
1387 int (*file_matcher) (const char *, void *),
1388 int (*name_matcher) (const char *, void *),
1389 enum search_domain kind,
1392 struct partial_symtab *ps;
1394 /* Clear the search flags. */
1395 ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps)
1397 ps->searched_flag = PST_NOT_SEARCHED;
1400 ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps)
1405 /* We skip shared psymtabs because file-matching doesn't apply
1406 to them; but we search them later in the loop. */
1407 if (ps->user != NULL)
1414 if (! (*file_matcher) (ps->filename, data))
1418 if (recursively_search_psymtabs (ps, objfile, kind, name_matcher, data))
1419 psymtab_to_symtab (objfile, ps);
1424 objfile_has_psyms (struct objfile *objfile)
1426 return objfile->psymtabs != NULL;
1429 const struct quick_symbol_functions psym_functions =
1432 find_last_source_symtab_from_partial,
1433 forget_cached_source_info_partial,
1434 partial_map_symtabs_matching_filename,
1435 lookup_symbol_aux_psymtabs,
1436 pre_expand_symtabs_matching_psymtabs,
1437 print_psymtab_stats_for_objfile,
1438 dump_psymtabs_for_objfile,
1440 read_symtabs_for_function,
1441 expand_partial_symbol_tables,
1442 read_psymtabs_with_filename,
1443 find_symbol_file_from_partial,
1444 map_matching_symbols_psymtab,
1445 expand_symtabs_matching_via_partial,
1446 find_pc_sect_symtab_from_partial,
1447 map_symbol_filenames_psymtab
1452 /* This compares two partial symbols by names, using strcmp_iw_ordered
1453 for the comparison. */
1456 compare_psymbols (const void *s1p, const void *s2p)
1458 struct partial_symbol *const *s1 = s1p;
1459 struct partial_symbol *const *s2 = s2p;
1461 return strcmp_iw_ordered (SYMBOL_SEARCH_NAME (*s1),
1462 SYMBOL_SEARCH_NAME (*s2));
1466 sort_pst_symbols (struct objfile *objfile, struct partial_symtab *pst)
1468 /* Sort the global list; don't sort the static list. */
1470 qsort (objfile->global_psymbols.list + pst->globals_offset,
1471 pst->n_global_syms, sizeof (struct partial_symbol *),
1475 /* Allocate and partially fill a partial symtab. It will be
1476 completely filled at the end of the symbol list.
1478 FILENAME is the name of the symbol-file we are reading from. */
1480 struct partial_symtab *
1481 start_psymtab_common (struct objfile *objfile,
1482 struct section_offsets *section_offsets,
1483 const char *filename,
1484 CORE_ADDR textlow, struct partial_symbol **global_syms,
1485 struct partial_symbol **static_syms)
1487 struct partial_symtab *psymtab;
1489 psymtab = allocate_psymtab (filename, objfile);
1490 psymtab->section_offsets = section_offsets;
1491 psymtab->textlow = textlow;
1492 psymtab->texthigh = psymtab->textlow; /* default */
1493 psymtab->globals_offset = global_syms - objfile->global_psymbols.list;
1494 psymtab->statics_offset = static_syms - objfile->static_psymbols.list;
1498 /* Calculate a hash code for the given partial symbol. The hash is
1499 calculated using the symbol's value, language, domain, class
1500 and name. These are the values which are set by
1501 add_psymbol_to_bcache. */
1503 static unsigned long
1504 psymbol_hash (const void *addr, int length)
1506 unsigned long h = 0;
1507 struct partial_symbol *psymbol = (struct partial_symbol *) addr;
1508 unsigned int lang = psymbol->ginfo.language;
1509 unsigned int domain = PSYMBOL_DOMAIN (psymbol);
1510 unsigned int class = PSYMBOL_CLASS (psymbol);
1512 h = hash_continue (&psymbol->ginfo.value, sizeof (psymbol->ginfo.value), h);
1513 h = hash_continue (&lang, sizeof (unsigned int), h);
1514 h = hash_continue (&domain, sizeof (unsigned int), h);
1515 h = hash_continue (&class, sizeof (unsigned int), h);
1516 h = hash_continue (psymbol->ginfo.name, strlen (psymbol->ginfo.name), h);
1521 /* Returns true if the symbol at addr1 equals the symbol at addr2.
1522 For the comparison this function uses a symbols value,
1523 language, domain, class and name. */
1526 psymbol_compare (const void *addr1, const void *addr2, int length)
1528 struct partial_symbol *sym1 = (struct partial_symbol *) addr1;
1529 struct partial_symbol *sym2 = (struct partial_symbol *) addr2;
1531 return (memcmp (&sym1->ginfo.value, &sym1->ginfo.value,
1532 sizeof (sym1->ginfo.value)) == 0
1533 && sym1->ginfo.language == sym2->ginfo.language
1534 && PSYMBOL_DOMAIN (sym1) == PSYMBOL_DOMAIN (sym2)
1535 && PSYMBOL_CLASS (sym1) == PSYMBOL_CLASS (sym2)
1536 && sym1->ginfo.name == sym2->ginfo.name);
1539 /* Initialize a partial symbol bcache. */
1541 struct psymbol_bcache *
1542 psymbol_bcache_init (void)
1544 struct psymbol_bcache *bcache = XCALLOC (1, struct psymbol_bcache);
1545 bcache->bcache = bcache_xmalloc (psymbol_hash, psymbol_compare);
1549 /* Free a partial symbol bcache. */
1551 psymbol_bcache_free (struct psymbol_bcache *bcache)
1556 bcache_xfree (bcache->bcache);
1560 /* Return the internal bcache of the psymbol_bcache BCACHE. */
1563 psymbol_bcache_get_bcache (struct psymbol_bcache *bcache)
1565 return bcache->bcache;
1568 /* Find a copy of the SYM in BCACHE. If BCACHE has never seen this
1569 symbol before, add a copy to BCACHE. In either case, return a pointer
1570 to BCACHE's copy of the symbol. If optional ADDED is not NULL, return
1571 1 in case of new entry or 0 if returning an old entry. */
1573 static const struct partial_symbol *
1574 psymbol_bcache_full (struct partial_symbol *sym,
1575 struct psymbol_bcache *bcache,
1578 return bcache_full (sym,
1579 sizeof (struct partial_symbol),
1584 /* Helper function, initialises partial symbol structure and stashes
1585 it into objfile's bcache. Note that our caching mechanism will
1586 use all fields of struct partial_symbol to determine hash value of the
1587 structure. In other words, having two symbols with the same name but
1588 different domain (or address) is possible and correct. */
1590 static const struct partial_symbol *
1591 add_psymbol_to_bcache (const char *name, int namelength, int copy_name,
1593 enum address_class class,
1594 long val, /* Value as a long */
1595 CORE_ADDR coreaddr, /* Value as a CORE_ADDR */
1596 enum language language, struct objfile *objfile,
1599 struct partial_symbol psymbol;
1601 /* We must ensure that the entire 'value' field has been zeroed
1602 before assigning to it, because an assignment may not write the
1604 memset (&psymbol.ginfo.value, 0, sizeof (psymbol.ginfo.value));
1606 /* val and coreaddr are mutually exclusive, one of them *will* be zero. */
1609 SYMBOL_VALUE (&psymbol) = val;
1613 SYMBOL_VALUE_ADDRESS (&psymbol) = coreaddr;
1615 SYMBOL_SECTION (&psymbol) = 0;
1616 SYMBOL_OBJ_SECTION (&psymbol) = NULL;
1617 SYMBOL_SET_LANGUAGE (&psymbol, language);
1618 PSYMBOL_DOMAIN (&psymbol) = domain;
1619 PSYMBOL_CLASS (&psymbol) = class;
1621 SYMBOL_SET_NAMES (&psymbol, name, namelength, copy_name, objfile);
1623 /* Stash the partial symbol away in the cache. */
1624 return psymbol_bcache_full (&psymbol,
1625 objfile->psymbol_cache,
1629 /* Increase the space allocated for LISTP, which is probably
1630 global_psymbols or static_psymbols. This space will eventually
1631 be freed in free_objfile(). */
1634 extend_psymbol_list (struct psymbol_allocation_list *listp,
1635 struct objfile *objfile)
1639 if (listp->size == 0)
1642 listp->list = (struct partial_symbol **)
1643 xmalloc (new_size * sizeof (struct partial_symbol *));
1647 new_size = listp->size * 2;
1648 listp->list = (struct partial_symbol **)
1649 xrealloc ((char *) listp->list,
1650 new_size * sizeof (struct partial_symbol *));
1652 /* Next assumes we only went one over. Should be good if
1653 program works correctly. */
1654 listp->next = listp->list + listp->size;
1655 listp->size = new_size;
1658 /* Helper function, adds partial symbol to the given partial symbol
1662 append_psymbol_to_list (struct psymbol_allocation_list *list,
1663 const struct partial_symbol *psym,
1664 struct objfile *objfile)
1666 if (list->next >= list->list + list->size)
1667 extend_psymbol_list (list, objfile);
1668 *list->next++ = (struct partial_symbol *) psym;
1669 OBJSTAT (objfile, n_psyms++);
1672 /* Add a symbol with a long value to a psymtab.
1673 Since one arg is a struct, we pass in a ptr and deref it (sigh).
1674 Return the partial symbol that has been added. */
1677 add_psymbol_to_list (const char *name, int namelength, int copy_name,
1679 enum address_class class,
1680 struct psymbol_allocation_list *list,
1681 long val, /* Value as a long */
1682 CORE_ADDR coreaddr, /* Value as a CORE_ADDR */
1683 enum language language, struct objfile *objfile)
1685 const struct partial_symbol *psym;
1689 /* Stash the partial symbol away in the cache. */
1690 psym = add_psymbol_to_bcache (name, namelength, copy_name, domain, class,
1691 val, coreaddr, language, objfile, &added);
1693 /* Do not duplicate global partial symbols. */
1694 if (list == &objfile->global_psymbols
1698 /* Save pointer to partial symbol in psymtab, growing symtab if needed. */
1699 append_psymbol_to_list (list, psym, objfile);
1702 /* Initialize storage for partial symbols. */
1705 init_psymbol_list (struct objfile *objfile, int total_symbols)
1707 /* Free any previously allocated psymbol lists. */
1709 if (objfile->global_psymbols.list)
1711 xfree (objfile->global_psymbols.list);
1713 if (objfile->static_psymbols.list)
1715 xfree (objfile->static_psymbols.list);
1718 /* Current best guess is that approximately a twentieth
1719 of the total symbols (in a debugging file) are global or static
1720 oriented symbols. */
1722 objfile->global_psymbols.size = total_symbols / 10;
1723 objfile->static_psymbols.size = total_symbols / 10;
1725 if (objfile->global_psymbols.size > 0)
1727 objfile->global_psymbols.next =
1728 objfile->global_psymbols.list = (struct partial_symbol **)
1729 xmalloc ((objfile->global_psymbols.size
1730 * sizeof (struct partial_symbol *)));
1732 if (objfile->static_psymbols.size > 0)
1734 objfile->static_psymbols.next =
1735 objfile->static_psymbols.list = (struct partial_symbol **)
1736 xmalloc ((objfile->static_psymbols.size
1737 * sizeof (struct partial_symbol *)));
1741 struct partial_symtab *
1742 allocate_psymtab (const char *filename, struct objfile *objfile)
1744 struct partial_symtab *psymtab;
1746 if (objfile->free_psymtabs)
1748 psymtab = objfile->free_psymtabs;
1749 objfile->free_psymtabs = psymtab->next;
1752 psymtab = (struct partial_symtab *)
1753 obstack_alloc (&objfile->objfile_obstack,
1754 sizeof (struct partial_symtab));
1756 memset (psymtab, 0, sizeof (struct partial_symtab));
1757 psymtab->filename = obsavestring (filename, strlen (filename),
1758 &objfile->objfile_obstack);
1759 psymtab->symtab = NULL;
1761 /* Prepend it to the psymtab list for the objfile it belongs to.
1762 Psymtabs are searched in most recent inserted -> least recent
1765 psymtab->next = objfile->psymtabs;
1766 objfile->psymtabs = psymtab;
1768 if (symtab_create_debug)
1770 /* Be a bit clever with debugging messages, and don't print objfile
1771 every time, only when it changes. */
1772 static char *last_objfile_name = NULL;
1774 if (last_objfile_name == NULL
1775 || strcmp (last_objfile_name, objfile->name) != 0)
1777 xfree (last_objfile_name);
1778 last_objfile_name = xstrdup (objfile->name);
1779 fprintf_unfiltered (gdb_stdlog,
1780 "Creating one or more psymtabs for objfile %s ...\n",
1783 fprintf_unfiltered (gdb_stdlog,
1784 "Created psymtab %s for module %s.\n",
1785 host_address_to_string (psymtab), filename);
1792 discard_psymtab (struct objfile *objfile, struct partial_symtab *pst)
1794 struct partial_symtab **prev_pst;
1797 Empty psymtabs happen as a result of header files which don't
1798 have any symbols in them. There can be a lot of them. But this
1799 check is wrong, in that a psymtab with N_SLINE entries but
1800 nothing else is not empty, but we don't realize that. Fixing
1801 that without slowing things down might be tricky. */
1803 /* First, snip it out of the psymtab chain. */
1805 prev_pst = &(objfile->psymtabs);
1806 while ((*prev_pst) != pst)
1807 prev_pst = &((*prev_pst)->next);
1808 (*prev_pst) = pst->next;
1810 /* Next, put it on a free list for recycling. */
1812 pst->next = objfile->free_psymtabs;
1813 objfile->free_psymtabs = pst;
1819 maintenance_print_psymbols (char *args, int from_tty)
1822 struct ui_file *outfile;
1823 struct cleanup *cleanups;
1824 char *symname = NULL;
1825 char *filename = DEV_TTY;
1826 struct objfile *objfile;
1827 struct partial_symtab *ps;
1834 print-psymbols takes an output file name and optional symbol file name"));
1836 argv = gdb_buildargv (args);
1837 cleanups = make_cleanup_freeargv (argv);
1839 if (argv[0] != NULL)
1842 /* If a second arg is supplied, it is a source file name to match on. */
1843 if (argv[1] != NULL)
1849 filename = tilde_expand (filename);
1850 make_cleanup (xfree, filename);
1852 outfile = gdb_fopen (filename, FOPEN_WT);
1854 perror_with_name (filename);
1855 make_cleanup_ui_file_delete (outfile);
1857 ALL_PSYMTABS (objfile, ps)
1860 if (symname == NULL || filename_cmp (symname, ps->filename) == 0)
1861 dump_psymtab (objfile, ps, outfile);
1863 do_cleanups (cleanups);
1866 /* List all the partial symbol tables whose names match REGEXP (optional). */
1868 maintenance_info_psymtabs (char *regexp, int from_tty)
1870 struct program_space *pspace;
1871 struct objfile *objfile;
1876 ALL_PSPACES (pspace)
1877 ALL_PSPACE_OBJFILES (pspace, objfile)
1879 struct gdbarch *gdbarch = get_objfile_arch (objfile);
1880 struct partial_symtab *psymtab;
1882 /* We don't want to print anything for this objfile until we
1883 actually find a symtab whose name matches. */
1884 int printed_objfile_start = 0;
1886 ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, psymtab)
1891 || re_exec (psymtab->filename))
1893 if (! printed_objfile_start)
1895 printf_filtered ("{ objfile %s ", objfile->name);
1897 printf_filtered ("((struct objfile *) %s)\n",
1898 host_address_to_string (objfile));
1899 printed_objfile_start = 1;
1902 printf_filtered (" { psymtab %s ", psymtab->filename);
1904 printf_filtered ("((struct partial_symtab *) %s)\n",
1905 host_address_to_string (psymtab));
1907 printf_filtered (" readin %s\n",
1908 psymtab->readin ? "yes" : "no");
1909 printf_filtered (" fullname %s\n",
1911 ? psymtab->fullname : "(null)");
1912 printf_filtered (" text addresses ");
1913 fputs_filtered (paddress (gdbarch, psymtab->textlow),
1915 printf_filtered (" -- ");
1916 fputs_filtered (paddress (gdbarch, psymtab->texthigh),
1918 printf_filtered ("\n");
1919 printf_filtered (" psymtabs_addrmap_supported %s\n",
1920 (psymtab->psymtabs_addrmap_supported
1922 printf_filtered (" globals ");
1923 if (psymtab->n_global_syms)
1925 printf_filtered ("(* (struct partial_symbol **) %s @ %d)\n",
1926 host_address_to_string (objfile->global_psymbols.list
1927 + psymtab->globals_offset),
1928 psymtab->n_global_syms);
1931 printf_filtered ("(none)\n");
1932 printf_filtered (" statics ");
1933 if (psymtab->n_static_syms)
1935 printf_filtered ("(* (struct partial_symbol **) %s @ %d)\n",
1936 host_address_to_string (objfile->static_psymbols.list
1937 + psymtab->statics_offset),
1938 psymtab->n_static_syms);
1941 printf_filtered ("(none)\n");
1942 printf_filtered (" dependencies ");
1943 if (psymtab->number_of_dependencies)
1947 printf_filtered ("{\n");
1948 for (i = 0; i < psymtab->number_of_dependencies; i++)
1950 struct partial_symtab *dep = psymtab->dependencies[i];
1952 /* Note the string concatenation there --- no comma. */
1953 printf_filtered (" psymtab %s "
1954 "((struct partial_symtab *) %s)\n",
1956 host_address_to_string (dep));
1958 printf_filtered (" }\n");
1961 printf_filtered ("(none)\n");
1962 printf_filtered (" }\n");
1966 if (printed_objfile_start)
1967 printf_filtered ("}\n");
1971 /* Check consistency of psymtabs and symtabs. */
1974 maintenance_check_symtabs (char *ignore, int from_tty)
1977 struct partial_symbol **psym;
1978 struct symtab *s = NULL;
1979 struct partial_symtab *ps;
1980 struct blockvector *bv;
1981 struct objfile *objfile;
1985 ALL_PSYMTABS (objfile, ps)
1987 struct gdbarch *gdbarch = get_objfile_arch (objfile);
1989 s = psymtab_to_symtab (objfile, ps);
1992 bv = BLOCKVECTOR (s);
1993 b = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
1994 psym = objfile->static_psymbols.list + ps->statics_offset;
1995 length = ps->n_static_syms;
1998 sym = lookup_block_symbol (b, SYMBOL_LINKAGE_NAME (*psym),
1999 SYMBOL_DOMAIN (*psym));
2002 printf_filtered ("Static symbol `");
2003 puts_filtered (SYMBOL_LINKAGE_NAME (*psym));
2004 printf_filtered ("' only found in ");
2005 puts_filtered (ps->filename);
2006 printf_filtered (" psymtab\n");
2010 b = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
2011 psym = objfile->global_psymbols.list + ps->globals_offset;
2012 length = ps->n_global_syms;
2015 sym = lookup_block_symbol (b, SYMBOL_LINKAGE_NAME (*psym),
2016 SYMBOL_DOMAIN (*psym));
2019 printf_filtered ("Global symbol `");
2020 puts_filtered (SYMBOL_LINKAGE_NAME (*psym));
2021 printf_filtered ("' only found in ");
2022 puts_filtered (ps->filename);
2023 printf_filtered (" psymtab\n");
2027 if (ps->texthigh < ps->textlow)
2029 printf_filtered ("Psymtab ");
2030 puts_filtered (ps->filename);
2031 printf_filtered (" covers bad range ");
2032 fputs_filtered (paddress (gdbarch, ps->textlow), gdb_stdout);
2033 printf_filtered (" - ");
2034 fputs_filtered (paddress (gdbarch, ps->texthigh), gdb_stdout);
2035 printf_filtered ("\n");
2038 if (ps->texthigh == 0)
2040 if (ps->textlow < BLOCK_START (b) || ps->texthigh > BLOCK_END (b))
2042 printf_filtered ("Psymtab ");
2043 puts_filtered (ps->filename);
2044 printf_filtered (" covers ");
2045 fputs_filtered (paddress (gdbarch, ps->textlow), gdb_stdout);
2046 printf_filtered (" - ");
2047 fputs_filtered (paddress (gdbarch, ps->texthigh), gdb_stdout);
2048 printf_filtered (" but symtab covers only ");
2049 fputs_filtered (paddress (gdbarch, BLOCK_START (b)), gdb_stdout);
2050 printf_filtered (" - ");
2051 fputs_filtered (paddress (gdbarch, BLOCK_END (b)), gdb_stdout);
2052 printf_filtered ("\n");
2060 expand_partial_symbol_names (int (*fun) (const char *, void *),
2063 struct objfile *objfile;
2065 ALL_OBJFILES (objfile)
2068 objfile->sf->qf->expand_symtabs_matching (objfile, NULL, fun,
2074 map_partial_symbol_filenames (symbol_filename_ftype *fun, void *data,
2077 struct objfile *objfile;
2079 ALL_OBJFILES (objfile)
2082 objfile->sf->qf->map_symbol_filenames (objfile, fun, data,