1 /* Partial symbol tables.
3 Copyright (C) 2009, 2010 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"
37 #define DEV_TTY "/dev/tty"
40 /* A fast way to get from a psymtab to its symtab (after the first time). */
41 #define PSYMTAB_TO_SYMTAB(pst) \
42 ((pst) -> symtab != NULL ? (pst) -> symtab : psymtab_to_symtab (pst))
44 /* Lookup a partial symbol. */
45 static struct partial_symbol *lookup_partial_symbol (struct partial_symtab *,
49 static char *psymtab_to_fullname (struct partial_symtab *ps);
51 static struct partial_symbol *find_pc_sect_psymbol (struct partial_symtab *,
53 struct obj_section *);
55 static struct partial_symbol *fixup_psymbol_section (struct partial_symbol
57 struct objfile *objfile);
59 static struct symtab *psymtab_to_symtab (struct partial_symtab *pst);
61 /* Lookup the partial symbol table of a source file named NAME.
62 *If* there is no '/' in the name, a match after a '/'
63 in the psymtab filename will also work. */
65 static struct partial_symtab *
66 lookup_partial_symtab (struct objfile *objfile, const char *name,
67 const char *full_path, const char *real_path)
69 struct partial_symtab *pst;
71 ALL_OBJFILE_PSYMTABS (objfile, pst)
73 if (FILENAME_CMP (name, pst->filename) == 0)
78 /* If the user gave us an absolute path, try to find the file in
79 this symtab and use its absolute path. */
80 if (full_path != NULL)
82 psymtab_to_fullname (pst);
83 if (pst->fullname != NULL
84 && FILENAME_CMP (full_path, pst->fullname) == 0)
90 if (real_path != NULL)
93 psymtab_to_fullname (pst);
94 if (pst->fullname != NULL)
96 rp = gdb_realpath (pst->fullname);
97 make_cleanup (xfree, rp);
99 if (rp != NULL && FILENAME_CMP (real_path, rp) == 0)
106 /* Now, search for a matching tail (only if name doesn't have any dirs) */
108 if (lbasename (name) == name)
109 ALL_OBJFILE_PSYMTABS (objfile, pst)
111 if (FILENAME_CMP (lbasename (pst->filename), name) == 0)
119 lookup_symtab_via_partial_symtab (struct objfile *objfile, const char *name,
120 const char *full_path, const char *real_path,
121 struct symtab **result)
123 struct partial_symtab *ps;
125 ps = lookup_partial_symtab (objfile, name, full_path, real_path);
130 error (_("Internal: readin %s pst for `%s' found when no symtab found."),
133 *result = PSYMTAB_TO_SYMTAB (ps);
137 /* Find which partial symtab contains PC and SECTION starting at psymtab PST.
138 We may find a different psymtab than PST. See FIND_PC_SECT_PSYMTAB. */
140 static struct partial_symtab *
141 find_pc_sect_psymtab_closer (CORE_ADDR pc, struct obj_section *section,
142 struct partial_symtab *pst,
143 struct minimal_symbol *msymbol)
145 struct objfile *objfile = pst->objfile;
146 struct partial_symtab *tpst;
147 struct partial_symtab *best_pst = pst;
148 CORE_ADDR best_addr = pst->textlow;
150 /* An objfile that has its functions reordered might have
151 many partial symbol tables containing the PC, but
152 we want the partial symbol table that contains the
153 function containing the PC. */
154 if (!(objfile->flags & OBJF_REORDERED) &&
155 section == 0) /* can't validate section this way */
161 /* The code range of partial symtabs sometimes overlap, so, in
162 the loop below, we need to check all partial symtabs and
163 find the one that fits better for the given PC address. We
164 select the partial symtab that contains a symbol whose
165 address is closest to the PC address. By closest we mean
166 that find_pc_sect_symbol returns the symbol with address
167 that is closest and still less than the given PC. */
168 for (tpst = pst; tpst != NULL; tpst = tpst->next)
170 if (pc >= tpst->textlow && pc < tpst->texthigh)
172 struct partial_symbol *p;
175 /* NOTE: This assumes that every psymbol has a
176 corresponding msymbol, which is not necessarily
177 true; the debug info might be much richer than the
178 object's symbol table. */
179 p = find_pc_sect_psymbol (tpst, pc, section);
181 && SYMBOL_VALUE_ADDRESS (p)
182 == SYMBOL_VALUE_ADDRESS (msymbol))
185 /* Also accept the textlow value of a psymtab as a
186 "symbol", to provide some support for partial
187 symbol tables with line information but no debug
188 symbols (e.g. those produced by an assembler). */
190 this_addr = SYMBOL_VALUE_ADDRESS (p);
192 this_addr = tpst->textlow;
194 /* Check whether it is closer than our current
195 BEST_ADDR. Since this symbol address is
196 necessarily lower or equal to PC, the symbol closer
197 to PC is the symbol which address is the highest.
198 This way we return the psymtab which contains such
199 best match symbol. This can help in cases where the
200 symbol information/debuginfo is not complete, like
201 for instance on IRIX6 with gcc, where no debug info
202 is emitted for statics. (See also the nodebug.exp
204 if (this_addr > best_addr)
206 best_addr = this_addr;
214 /* Find which partial symtab contains PC and SECTION. Return 0 if
215 none. We return the psymtab that contains a symbol whose address
216 exactly matches PC, or, if we cannot find an exact match, the
217 psymtab that contains a symbol whose address is closest to PC. */
218 static struct partial_symtab *
219 find_pc_sect_psymtab (struct objfile *objfile, CORE_ADDR pc,
220 struct obj_section *section,
221 struct minimal_symbol *msymbol)
223 struct partial_symtab *pst;
225 /* Try just the PSYMTABS_ADDRMAP mapping first as it has better granularity
226 than the later used TEXTLOW/TEXTHIGH one. */
228 if (objfile->psymtabs_addrmap != NULL)
230 pst = addrmap_find (objfile->psymtabs_addrmap, pc);
233 /* FIXME: addrmaps currently do not handle overlayed sections,
234 so fall back to the non-addrmap case if we're debugging
235 overlays and the addrmap returned the wrong section. */
236 if (overlay_debugging && msymbol && section)
238 struct partial_symbol *p;
240 /* NOTE: This assumes that every psymbol has a
241 corresponding msymbol, which is not necessarily
242 true; the debug info might be much richer than the
243 object's symbol table. */
244 p = find_pc_sect_psymbol (pst, pc, section);
246 || SYMBOL_VALUE_ADDRESS (p)
247 != SYMBOL_VALUE_ADDRESS (msymbol))
251 /* We do not try to call FIND_PC_SECT_PSYMTAB_CLOSER as
252 PSYMTABS_ADDRMAP we used has already the best 1-byte
253 granularity and FIND_PC_SECT_PSYMTAB_CLOSER may mislead us into
254 a worse chosen section due to the TEXTLOW/TEXTHIGH ranges
263 /* Existing PSYMTABS_ADDRMAP mapping is present even for PARTIAL_SYMTABs
264 which still have no corresponding full SYMTABs read. But it is not
265 present for non-DWARF2 debug infos not supporting PSYMTABS_ADDRMAP in GDB
268 /* Check even OBJFILE with non-zero PSYMTABS_ADDRMAP as only several of
269 its CUs may be missing in PSYMTABS_ADDRMAP as they may be varying
270 debug info type in single OBJFILE. */
272 ALL_OBJFILE_PSYMTABS (objfile, pst)
273 if (pc >= pst->textlow && pc < pst->texthigh)
275 struct partial_symtab *best_pst;
277 best_pst = find_pc_sect_psymtab_closer (pc, section, pst, msymbol);
278 if (best_pst != NULL)
285 static struct symtab *
286 find_pc_sect_symtab_from_partial (struct objfile *objfile,
287 struct minimal_symbol *msymbol,
288 CORE_ADDR pc, struct obj_section *section,
291 struct partial_symtab *ps = find_pc_sect_psymtab (objfile, pc, section,
295 if (warn_if_readin && ps->readin)
296 /* Might want to error() here (in case symtab is corrupt and
297 will cause a core dump), but maybe we can successfully
298 continue, so let's not. */
300 (Internal error: pc %s in read in psymtab, but not in symtab.)\n"),
301 paddress (get_objfile_arch (ps->objfile), pc));
302 return PSYMTAB_TO_SYMTAB (ps);
307 /* Find which partial symbol within a psymtab matches PC and SECTION.
310 static struct partial_symbol *
311 find_pc_sect_psymbol (struct partial_symtab *psymtab, CORE_ADDR pc,
312 struct obj_section *section)
314 struct partial_symbol *best = NULL, *p, **pp;
317 gdb_assert (psymtab != NULL);
319 /* Cope with programs that start at address 0 */
320 best_pc = (psymtab->textlow != 0) ? psymtab->textlow - 1 : 0;
322 /* Search the global symbols as well as the static symbols, so that
323 find_pc_partial_function doesn't use a minimal symbol and thus
324 cache a bad endaddr. */
325 for (pp = psymtab->objfile->global_psymbols.list + psymtab->globals_offset;
326 (pp - (psymtab->objfile->global_psymbols.list + psymtab->globals_offset)
327 < psymtab->n_global_syms);
331 if (SYMBOL_DOMAIN (p) == VAR_DOMAIN
332 && SYMBOL_CLASS (p) == LOC_BLOCK
333 && pc >= SYMBOL_VALUE_ADDRESS (p)
334 && (SYMBOL_VALUE_ADDRESS (p) > best_pc
335 || (psymtab->textlow == 0
336 && best_pc == 0 && SYMBOL_VALUE_ADDRESS (p) == 0)))
338 if (section) /* match on a specific section */
340 fixup_psymbol_section (p, psymtab->objfile);
341 if (!matching_obj_sections (SYMBOL_OBJ_SECTION (p), section))
344 best_pc = SYMBOL_VALUE_ADDRESS (p);
349 for (pp = psymtab->objfile->static_psymbols.list + psymtab->statics_offset;
350 (pp - (psymtab->objfile->static_psymbols.list + psymtab->statics_offset)
351 < psymtab->n_static_syms);
355 if (SYMBOL_DOMAIN (p) == VAR_DOMAIN
356 && SYMBOL_CLASS (p) == LOC_BLOCK
357 && pc >= SYMBOL_VALUE_ADDRESS (p)
358 && (SYMBOL_VALUE_ADDRESS (p) > best_pc
359 || (psymtab->textlow == 0
360 && best_pc == 0 && SYMBOL_VALUE_ADDRESS (p) == 0)))
362 if (section) /* match on a specific section */
364 fixup_psymbol_section (p, psymtab->objfile);
365 if (!matching_obj_sections (SYMBOL_OBJ_SECTION (p), section))
368 best_pc = SYMBOL_VALUE_ADDRESS (p);
376 static struct partial_symbol *
377 fixup_psymbol_section (struct partial_symbol *psym, struct objfile *objfile)
384 if (SYMBOL_OBJ_SECTION (psym))
387 gdb_assert (objfile);
389 switch (SYMBOL_CLASS (psym))
394 addr = SYMBOL_VALUE_ADDRESS (psym);
397 /* Nothing else will be listed in the minsyms -- no use looking
402 fixup_section (&psym->ginfo, addr, objfile);
407 static struct symtab *
408 lookup_symbol_aux_psymtabs (struct objfile *objfile,
409 int block_index, const char *name,
410 const domain_enum domain)
412 struct partial_symtab *ps;
413 const int psymtab_index = (block_index == GLOBAL_BLOCK ? 1 : 0);
415 ALL_OBJFILE_PSYMTABS (objfile, ps)
417 if (!ps->readin && lookup_partial_symbol (ps, name, psymtab_index, domain))
418 return PSYMTAB_TO_SYMTAB (ps);
425 pre_expand_symtabs_matching_psymtabs (struct objfile *objfile,
426 int kind, const char *name,
432 /* Look, in partial_symtab PST, for symbol whose natural name is NAME.
433 Check the global symbols if GLOBAL, the static symbols if not. */
435 static struct partial_symbol *
436 lookup_partial_symbol (struct partial_symtab *pst, const char *name,
437 int global, domain_enum domain)
439 struct partial_symbol **start, **psym;
440 struct partial_symbol **top, **real_top, **bottom, **center;
441 int length = (global ? pst->n_global_syms : pst->n_static_syms);
442 int do_linear_search = 1;
449 pst->objfile->global_psymbols.list + pst->globals_offset :
450 pst->objfile->static_psymbols.list + pst->statics_offset);
452 if (global) /* This means we can use a binary search. */
454 do_linear_search = 0;
456 /* Binary search. This search is guaranteed to end with center
457 pointing at the earliest partial symbol whose name might be
458 correct. At that point *all* partial symbols with an
459 appropriate name will be checked against the correct
463 top = start + length - 1;
467 center = bottom + (top - bottom) / 2;
469 internal_error (__FILE__, __LINE__, _("failed internal consistency check"));
470 if (!do_linear_search
471 && (SYMBOL_LANGUAGE (*center) == language_java))
473 do_linear_search = 1;
475 if (strcmp_iw_ordered (SYMBOL_SEARCH_NAME (*center), name) >= 0)
484 if (!(top == bottom))
485 internal_error (__FILE__, __LINE__, _("failed internal consistency check"));
487 while (top <= real_top
488 && SYMBOL_MATCHES_SEARCH_NAME (*top, name))
490 if (symbol_matches_domain (SYMBOL_LANGUAGE (*top),
491 SYMBOL_DOMAIN (*top), domain))
497 /* Can't use a binary search or else we found during the binary search that
498 we should also do a linear search. */
500 if (do_linear_search)
502 for (psym = start; psym < start + length; psym++)
504 if (symbol_matches_domain (SYMBOL_LANGUAGE (*psym),
505 SYMBOL_DOMAIN (*psym), domain)
506 && SYMBOL_MATCHES_SEARCH_NAME (*psym, name))
514 /* Get the symbol table that corresponds to a partial_symtab.
515 This is fast after the first time you do it. In fact, there
516 is an even faster macro PSYMTAB_TO_SYMTAB that does the fast
519 static struct symtab *
520 psymtab_to_symtab (struct partial_symtab *pst)
522 /* If it's been looked up before, return it. */
526 /* If it has not yet been read in, read it. */
529 struct cleanup *back_to = increment_reading_symtab ();
531 (*pst->read_symtab) (pst);
532 do_cleanups (back_to);
539 relocate_psymtabs (struct objfile *objfile,
540 struct section_offsets *new_offsets,
541 struct section_offsets *delta)
543 struct partial_symbol **psym;
544 struct partial_symtab *p;
546 ALL_OBJFILE_PSYMTABS (objfile, p)
548 p->textlow += ANOFFSET (delta, SECT_OFF_TEXT (objfile));
549 p->texthigh += ANOFFSET (delta, SECT_OFF_TEXT (objfile));
552 for (psym = objfile->global_psymbols.list;
553 psym < objfile->global_psymbols.next;
556 fixup_psymbol_section (*psym, objfile);
557 if (SYMBOL_SECTION (*psym) >= 0)
558 SYMBOL_VALUE_ADDRESS (*psym) += ANOFFSET (delta,
559 SYMBOL_SECTION (*psym));
561 for (psym = objfile->static_psymbols.list;
562 psym < objfile->static_psymbols.next;
565 fixup_psymbol_section (*psym, objfile);
566 if (SYMBOL_SECTION (*psym) >= 0)
567 SYMBOL_VALUE_ADDRESS (*psym) += ANOFFSET (delta,
568 SYMBOL_SECTION (*psym));
572 static struct symtab *
573 find_last_source_symtab_from_partial (struct objfile *ofp)
575 struct partial_symtab *ps;
576 struct partial_symtab *cs_pst = 0;
578 ALL_OBJFILE_PSYMTABS (ofp, ps)
580 const char *name = ps->filename;
581 int len = strlen (name);
583 if (!(len > 2 && (strcmp (&name[len - 2], ".h") == 0
584 || strcmp (name, "<<C++-namespaces>>") == 0)))
592 internal_error (__FILE__, __LINE__,
593 _("select_source_symtab: "
594 "readin pst found and no symtabs."));
597 return PSYMTAB_TO_SYMTAB (cs_pst);
603 forget_cached_source_info_partial (struct objfile *objfile)
605 struct partial_symtab *pst;
607 ALL_OBJFILE_PSYMTABS (objfile, pst)
609 if (pst->fullname != NULL)
611 xfree (pst->fullname);
612 pst->fullname = NULL;
618 print_partial_symbols (struct gdbarch *gdbarch,
619 struct partial_symbol **p, int count, char *what,
620 struct ui_file *outfile)
622 fprintf_filtered (outfile, " %s partial symbols:\n", what);
625 fprintf_filtered (outfile, " `%s'", SYMBOL_LINKAGE_NAME (*p));
626 if (SYMBOL_DEMANGLED_NAME (*p) != NULL)
628 fprintf_filtered (outfile, " `%s'", SYMBOL_DEMANGLED_NAME (*p));
630 fputs_filtered (", ", outfile);
631 switch (SYMBOL_DOMAIN (*p))
634 fputs_filtered ("undefined domain, ", outfile);
637 /* This is the usual thing -- don't print it */
640 fputs_filtered ("struct domain, ", outfile);
643 fputs_filtered ("label domain, ", outfile);
646 fputs_filtered ("<invalid domain>, ", outfile);
649 switch (SYMBOL_CLASS (*p))
652 fputs_filtered ("undefined", outfile);
655 fputs_filtered ("constant int", outfile);
658 fputs_filtered ("static", outfile);
661 fputs_filtered ("register", outfile);
664 fputs_filtered ("pass by value", outfile);
667 fputs_filtered ("pass by reference", outfile);
669 case LOC_REGPARM_ADDR:
670 fputs_filtered ("register address parameter", outfile);
673 fputs_filtered ("stack parameter", outfile);
676 fputs_filtered ("type", outfile);
679 fputs_filtered ("label", outfile);
682 fputs_filtered ("function", outfile);
684 case LOC_CONST_BYTES:
685 fputs_filtered ("constant bytes", outfile);
688 fputs_filtered ("unresolved", outfile);
690 case LOC_OPTIMIZED_OUT:
691 fputs_filtered ("optimized out", outfile);
694 fputs_filtered ("computed at runtime", outfile);
697 fputs_filtered ("<invalid location>", outfile);
700 fputs_filtered (", ", outfile);
701 fputs_filtered (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (*p)), outfile);
702 fprintf_filtered (outfile, "\n");
708 dump_psymtab (struct objfile *objfile, struct partial_symtab *psymtab,
709 struct ui_file *outfile)
711 struct gdbarch *gdbarch = get_objfile_arch (objfile);
714 fprintf_filtered (outfile, "\nPartial symtab for source file %s ",
716 fprintf_filtered (outfile, "(object ");
717 gdb_print_host_address (psymtab, outfile);
718 fprintf_filtered (outfile, ")\n\n");
719 fprintf_unfiltered (outfile, " Read from object file %s (",
721 gdb_print_host_address (objfile, outfile);
722 fprintf_unfiltered (outfile, ")\n");
726 fprintf_filtered (outfile,
727 " Full symtab was read (at ");
728 gdb_print_host_address (psymtab->symtab, outfile);
729 fprintf_filtered (outfile, " by function at ");
730 gdb_print_host_address (psymtab->read_symtab, outfile);
731 fprintf_filtered (outfile, ")\n");
734 fprintf_filtered (outfile, " Relocate symbols by ");
735 for (i = 0; i < psymtab->objfile->num_sections; ++i)
738 fprintf_filtered (outfile, ", ");
740 fputs_filtered (paddress (gdbarch,
741 ANOFFSET (psymtab->section_offsets, i)),
744 fprintf_filtered (outfile, "\n");
746 fprintf_filtered (outfile, " Symbols cover text addresses ");
747 fputs_filtered (paddress (gdbarch, psymtab->textlow), outfile);
748 fprintf_filtered (outfile, "-");
749 fputs_filtered (paddress (gdbarch, psymtab->texthigh), outfile);
750 fprintf_filtered (outfile, "\n");
751 fprintf_filtered (outfile, " Depends on %d other partial symtabs.\n",
752 psymtab->number_of_dependencies);
753 for (i = 0; i < psymtab->number_of_dependencies; i++)
755 fprintf_filtered (outfile, " %d ", i);
756 gdb_print_host_address (psymtab->dependencies[i], outfile);
757 fprintf_filtered (outfile, " %s\n",
758 psymtab->dependencies[i]->filename);
760 if (psymtab->n_global_syms > 0)
762 print_partial_symbols (gdbarch,
763 objfile->global_psymbols.list
764 + psymtab->globals_offset,
765 psymtab->n_global_syms, "Global", outfile);
767 if (psymtab->n_static_syms > 0)
769 print_partial_symbols (gdbarch,
770 objfile->static_psymbols.list
771 + psymtab->statics_offset,
772 psymtab->n_static_syms, "Static", outfile);
774 fprintf_filtered (outfile, "\n");
778 print_psymtab_stats_for_objfile (struct objfile *objfile)
781 struct partial_symtab *ps;
784 ALL_OBJFILE_PSYMTABS (objfile, ps)
789 printf_filtered (_(" Number of psym tables (not yet expanded): %d\n"), i);
793 dump_psymtabs_for_objfile (struct objfile *objfile)
795 struct partial_symtab *psymtab;
797 if (objfile->psymtabs)
799 printf_filtered ("Psymtabs:\n");
800 for (psymtab = objfile->psymtabs;
802 psymtab = psymtab->next)
804 printf_filtered ("%s at ",
806 gdb_print_host_address (psymtab, gdb_stdout);
807 printf_filtered (", ");
808 if (psymtab->objfile != objfile)
810 printf_filtered ("NOT ON CHAIN! ");
814 printf_filtered ("\n\n");
818 /* Look through the partial symtabs for all symbols which begin
819 by matching FUNC_NAME. Make sure we read that symbol table in. */
822 read_symtabs_for_function (struct objfile *objfile, const char *func_name)
824 struct partial_symtab *ps;
826 ALL_OBJFILE_PSYMTABS (objfile, ps)
831 if ((lookup_partial_symbol (ps, func_name, 1, VAR_DOMAIN)
833 || (lookup_partial_symbol (ps, func_name, 0, VAR_DOMAIN)
835 psymtab_to_symtab (ps);
840 expand_partial_symbol_tables (struct objfile *objfile)
842 struct partial_symtab *psymtab;
844 for (psymtab = objfile->psymtabs;
846 psymtab = psymtab->next)
848 psymtab_to_symtab (psymtab);
853 read_psymtabs_with_filename (struct objfile *objfile, const char *filename)
855 struct partial_symtab *p;
857 ALL_OBJFILE_PSYMTABS (objfile, p)
859 if (strcmp (filename, p->filename) == 0)
860 PSYMTAB_TO_SYMTAB (p);
865 map_symbol_names_psymtab (struct objfile *objfile,
866 void (*fun) (const char *, void *), void *data)
868 struct partial_symtab *ps;
870 ALL_OBJFILE_PSYMTABS (objfile, ps)
872 struct partial_symbol **psym;
874 /* If the psymtab's been read in we'll get it when we search
875 through the blockvector. */
879 for (psym = objfile->global_psymbols.list + ps->globals_offset;
880 psym < (objfile->global_psymbols.list + ps->globals_offset
881 + ps->n_global_syms);
884 /* If interrupted, then quit. */
886 (*fun) (SYMBOL_NATURAL_NAME (*psym), data);
889 for (psym = objfile->static_psymbols.list + ps->statics_offset;
890 psym < (objfile->static_psymbols.list + ps->statics_offset
891 + ps->n_static_syms);
895 (*fun) (SYMBOL_NATURAL_NAME (*psym), data);
901 map_symbol_filenames_psymtab (struct objfile *objfile,
902 void (*fun) (const char *, const char *,
906 struct partial_symtab *ps;
908 ALL_OBJFILE_PSYMTABS (objfile, ps)
910 const char *fullname;
915 fullname = psymtab_to_fullname (ps);
916 (*fun) (fullname, ps->filename, data);
920 int find_and_open_source (const char *filename,
924 /* Finds the fullname that a partial_symtab represents.
926 If this functions finds the fullname, it will save it in ps->fullname
927 and it will also return the value.
929 If this function fails to find the file that this partial_symtab represents,
930 NULL will be returned and ps->fullname will be set to NULL. */
932 psymtab_to_fullname (struct partial_symtab *ps)
939 /* Don't check ps->fullname here, the file could have been
940 deleted/moved/..., look for it again */
941 r = find_and_open_source (ps->filename, ps->dirname, &ps->fullname);
953 find_symbol_file_from_partial (struct objfile *objfile, const char *name)
955 struct partial_symtab *pst;
957 ALL_OBJFILE_PSYMTABS (objfile, pst)
959 if (lookup_partial_symbol (pst, name, 1, VAR_DOMAIN))
960 return pst->filename;
965 /* Look, in partial_symtab PST, for symbol NAME in given namespace.
966 Check the global symbols if GLOBAL, the static symbols if not.
967 Do wild-card match if WILD. */
969 static struct partial_symbol *
970 ada_lookup_partial_symbol (struct partial_symtab *pst, const char *name,
971 int global, domain_enum namespace, int wild,
972 int (*wild_match) (const char *, int, const char *),
973 int (*is_name_suffix) (const char *))
975 struct partial_symbol **start;
976 int name_len = strlen (name);
977 int length = (global ? pst->n_global_syms : pst->n_static_syms);
986 pst->objfile->global_psymbols.list + pst->globals_offset :
987 pst->objfile->static_psymbols.list + pst->statics_offset);
991 for (i = 0; i < length; i += 1)
993 struct partial_symbol *psym = start[i];
995 if (symbol_matches_domain (SYMBOL_LANGUAGE (psym),
996 SYMBOL_DOMAIN (psym), namespace)
997 && (*wild_match) (name, name_len, SYMBOL_LINKAGE_NAME (psym)))
1012 int M = (U + i) >> 1;
1013 struct partial_symbol *psym = start[M];
1015 if (SYMBOL_LINKAGE_NAME (psym)[0] < name[0])
1017 else if (SYMBOL_LINKAGE_NAME (psym)[0] > name[0])
1019 else if (strcmp (SYMBOL_LINKAGE_NAME (psym), name) < 0)
1030 struct partial_symbol *psym = start[i];
1032 if (symbol_matches_domain (SYMBOL_LANGUAGE (psym),
1033 SYMBOL_DOMAIN (psym), namespace))
1035 int cmp = strncmp (name, SYMBOL_LINKAGE_NAME (psym), name_len);
1043 && (*is_name_suffix) (SYMBOL_LINKAGE_NAME (psym)
1058 int M = (U + i) >> 1;
1059 struct partial_symbol *psym = start[M];
1061 if (SYMBOL_LINKAGE_NAME (psym)[0] < '_')
1063 else if (SYMBOL_LINKAGE_NAME (psym)[0] > '_')
1065 else if (strcmp (SYMBOL_LINKAGE_NAME (psym), "_ada_") < 0)
1076 struct partial_symbol *psym = start[i];
1078 if (symbol_matches_domain (SYMBOL_LANGUAGE (psym),
1079 SYMBOL_DOMAIN (psym), namespace))
1083 cmp = (int) '_' - (int) SYMBOL_LINKAGE_NAME (psym)[0];
1086 cmp = strncmp ("_ada_", SYMBOL_LINKAGE_NAME (psym), 5);
1088 cmp = strncmp (name, SYMBOL_LINKAGE_NAME (psym) + 5,
1098 && (*is_name_suffix) (SYMBOL_LINKAGE_NAME (psym)
1109 map_ada_symtabs (struct objfile *objfile,
1110 int (*wild_match) (const char *, int, const char *),
1111 int (*is_name_suffix) (const char *),
1112 void (*callback) (struct objfile *, struct symtab *, void *),
1113 const char *name, int global, domain_enum namespace, int wild,
1116 struct partial_symtab *ps;
1118 ALL_OBJFILE_PSYMTABS (objfile, ps)
1122 || ada_lookup_partial_symbol (ps, name, global, namespace, wild,
1123 wild_match, is_name_suffix))
1125 struct symtab *s = PSYMTAB_TO_SYMTAB (ps);
1127 if (s == NULL || !s->primary)
1129 (*callback) (objfile, s, data);
1135 expand_symtabs_matching_via_partial (struct objfile *objfile,
1136 int (*file_matcher) (const char *, void *),
1137 int (*name_matcher) (const char *, void *),
1141 struct partial_symtab *ps;
1143 ALL_OBJFILE_PSYMTABS (objfile, ps)
1145 struct partial_symbol **psym;
1146 struct partial_symbol **bound, **gbound, **sbound;
1152 if (! (*file_matcher) (ps->filename, data))
1155 gbound = objfile->global_psymbols.list + ps->globals_offset + ps->n_global_syms;
1156 sbound = objfile->static_psymbols.list + ps->statics_offset + ps->n_static_syms;
1159 /* Go through all of the symbols stored in a partial
1160 symtab in one loop. */
1161 psym = objfile->global_psymbols.list + ps->globals_offset;
1166 if (bound == gbound && ps->n_static_syms != 0)
1168 psym = objfile->static_psymbols.list + ps->statics_offset;
1179 if ((*name_matcher) (SYMBOL_NATURAL_NAME (*psym), data)
1180 && ((kind == VARIABLES_DOMAIN
1181 && SYMBOL_CLASS (*psym) != LOC_TYPEDEF
1182 && SYMBOL_CLASS (*psym) != LOC_BLOCK)
1183 || (kind == FUNCTIONS_DOMAIN
1184 && SYMBOL_CLASS (*psym) == LOC_BLOCK)
1185 || (kind == TYPES_DOMAIN
1186 && SYMBOL_CLASS (*psym) == LOC_TYPEDEF)))
1188 PSYMTAB_TO_SYMTAB (ps);
1198 objfile_has_psyms (struct objfile *objfile)
1200 return objfile->psymtabs != NULL;
1203 const struct quick_symbol_functions psym_functions =
1206 find_last_source_symtab_from_partial,
1207 forget_cached_source_info_partial,
1208 lookup_symtab_via_partial_symtab,
1209 lookup_symbol_aux_psymtabs,
1210 pre_expand_symtabs_matching_psymtabs,
1211 print_psymtab_stats_for_objfile,
1212 dump_psymtabs_for_objfile,
1214 read_symtabs_for_function,
1215 expand_partial_symbol_tables,
1216 read_psymtabs_with_filename,
1217 find_symbol_file_from_partial,
1219 expand_symtabs_matching_via_partial,
1220 find_pc_sect_symtab_from_partial,
1221 map_symbol_names_psymtab,
1222 map_symbol_filenames_psymtab
1227 /* This compares two partial symbols by names, using strcmp_iw_ordered
1228 for the comparison. */
1231 compare_psymbols (const void *s1p, const void *s2p)
1233 struct partial_symbol *const *s1 = s1p;
1234 struct partial_symbol *const *s2 = s2p;
1236 return strcmp_iw_ordered (SYMBOL_SEARCH_NAME (*s1),
1237 SYMBOL_SEARCH_NAME (*s2));
1241 sort_pst_symbols (struct partial_symtab *pst)
1243 /* Sort the global list; don't sort the static list */
1245 qsort (pst->objfile->global_psymbols.list + pst->globals_offset,
1246 pst->n_global_syms, sizeof (struct partial_symbol *),
1250 /* Allocate and partially fill a partial symtab. It will be
1251 completely filled at the end of the symbol list.
1253 FILENAME is the name of the symbol-file we are reading from. */
1255 struct partial_symtab *
1256 start_psymtab_common (struct objfile *objfile,
1257 struct section_offsets *section_offsets,
1258 const char *filename,
1259 CORE_ADDR textlow, struct partial_symbol **global_syms,
1260 struct partial_symbol **static_syms)
1262 struct partial_symtab *psymtab;
1264 psymtab = allocate_psymtab (filename, objfile);
1265 psymtab->section_offsets = section_offsets;
1266 psymtab->textlow = textlow;
1267 psymtab->texthigh = psymtab->textlow; /* default */
1268 psymtab->globals_offset = global_syms - objfile->global_psymbols.list;
1269 psymtab->statics_offset = static_syms - objfile->static_psymbols.list;
1273 /* Helper function, initialises partial symbol structure and stashes
1274 it into objfile's bcache. Note that our caching mechanism will
1275 use all fields of struct partial_symbol to determine hash value of the
1276 structure. In other words, having two symbols with the same name but
1277 different domain (or address) is possible and correct. */
1279 static const struct partial_symbol *
1280 add_psymbol_to_bcache (char *name, int namelength, int copy_name,
1282 enum address_class class,
1283 long val, /* Value as a long */
1284 CORE_ADDR coreaddr, /* Value as a CORE_ADDR */
1285 enum language language, struct objfile *objfile,
1288 /* psymbol is static so that there will be no uninitialized gaps in the
1289 structure which might contain random data, causing cache misses in
1291 static struct partial_symbol psymbol;
1293 /* However, we must ensure that the entire 'value' field has been
1294 zeroed before assigning to it, because an assignment may not
1295 write the entire field. */
1296 memset (&psymbol.ginfo.value, 0, sizeof (psymbol.ginfo.value));
1297 /* val and coreaddr are mutually exclusive, one of them *will* be zero */
1300 SYMBOL_VALUE (&psymbol) = val;
1304 SYMBOL_VALUE_ADDRESS (&psymbol) = coreaddr;
1306 SYMBOL_SECTION (&psymbol) = 0;
1307 SYMBOL_LANGUAGE (&psymbol) = language;
1308 PSYMBOL_DOMAIN (&psymbol) = domain;
1309 PSYMBOL_CLASS (&psymbol) = class;
1311 SYMBOL_SET_NAMES (&psymbol, name, namelength, copy_name, objfile);
1313 /* Stash the partial symbol away in the cache */
1314 return bcache_full (&psymbol, sizeof (struct partial_symbol),
1315 objfile->psymbol_cache, added);
1318 /* Helper function, adds partial symbol to the given partial symbol
1322 append_psymbol_to_list (struct psymbol_allocation_list *list,
1323 const struct partial_symbol *psym,
1324 struct objfile *objfile)
1326 if (list->next >= list->list + list->size)
1327 extend_psymbol_list (list, objfile);
1328 *list->next++ = (struct partial_symbol *) psym;
1329 OBJSTAT (objfile, n_psyms++);
1332 /* Add a symbol with a long value to a psymtab.
1333 Since one arg is a struct, we pass in a ptr and deref it (sigh).
1334 Return the partial symbol that has been added. */
1336 /* NOTE: carlton/2003-09-11: The reason why we return the partial
1337 symbol is so that callers can get access to the symbol's demangled
1338 name, which they don't have any cheap way to determine otherwise.
1339 (Currenly, dwarf2read.c is the only file who uses that information,
1340 though it's possible that other readers might in the future.)
1341 Elena wasn't thrilled about that, and I don't blame her, but we
1342 couldn't come up with a better way to get that information. If
1343 it's needed in other situations, we could consider breaking up
1344 SYMBOL_SET_NAMES to provide access to the demangled name lookup
1347 const struct partial_symbol *
1348 add_psymbol_to_list (char *name, int namelength, int copy_name,
1350 enum address_class class,
1351 struct psymbol_allocation_list *list,
1352 long val, /* Value as a long */
1353 CORE_ADDR coreaddr, /* Value as a CORE_ADDR */
1354 enum language language, struct objfile *objfile)
1356 const struct partial_symbol *psym;
1360 /* Stash the partial symbol away in the cache */
1361 psym = add_psymbol_to_bcache (name, namelength, copy_name, domain, class,
1362 val, coreaddr, language, objfile, &added);
1364 /* Do not duplicate global partial symbols. */
1365 if (list == &objfile->global_psymbols
1369 /* Save pointer to partial symbol in psymtab, growing symtab if needed. */
1370 append_psymbol_to_list (list, psym, objfile);
1374 /* Initialize storage for partial symbols. */
1377 init_psymbol_list (struct objfile *objfile, int total_symbols)
1379 /* Free any previously allocated psymbol lists. */
1381 if (objfile->global_psymbols.list)
1383 xfree (objfile->global_psymbols.list);
1385 if (objfile->static_psymbols.list)
1387 xfree (objfile->static_psymbols.list);
1390 /* Current best guess is that approximately a twentieth
1391 of the total symbols (in a debugging file) are global or static
1394 objfile->global_psymbols.size = total_symbols / 10;
1395 objfile->static_psymbols.size = total_symbols / 10;
1397 if (objfile->global_psymbols.size > 0)
1399 objfile->global_psymbols.next =
1400 objfile->global_psymbols.list = (struct partial_symbol **)
1401 xmalloc ((objfile->global_psymbols.size
1402 * sizeof (struct partial_symbol *)));
1404 if (objfile->static_psymbols.size > 0)
1406 objfile->static_psymbols.next =
1407 objfile->static_psymbols.list = (struct partial_symbol **)
1408 xmalloc ((objfile->static_psymbols.size
1409 * sizeof (struct partial_symbol *)));
1413 struct partial_symtab *
1414 allocate_psymtab (const char *filename, struct objfile *objfile)
1416 struct partial_symtab *psymtab;
1418 if (objfile->free_psymtabs)
1420 psymtab = objfile->free_psymtabs;
1421 objfile->free_psymtabs = psymtab->next;
1424 psymtab = (struct partial_symtab *)
1425 obstack_alloc (&objfile->objfile_obstack,
1426 sizeof (struct partial_symtab));
1428 memset (psymtab, 0, sizeof (struct partial_symtab));
1429 psymtab->filename = obsavestring (filename, strlen (filename),
1430 &objfile->objfile_obstack);
1431 psymtab->symtab = NULL;
1433 /* Prepend it to the psymtab list for the objfile it belongs to.
1434 Psymtabs are searched in most recent inserted -> least recent
1437 psymtab->objfile = objfile;
1438 psymtab->next = objfile->psymtabs;
1439 objfile->psymtabs = psymtab;
1445 discard_psymtab (struct partial_symtab *pst)
1447 struct partial_symtab **prev_pst;
1450 Empty psymtabs happen as a result of header files which don't
1451 have any symbols in them. There can be a lot of them. But this
1452 check is wrong, in that a psymtab with N_SLINE entries but
1453 nothing else is not empty, but we don't realize that. Fixing
1454 that without slowing things down might be tricky. */
1456 /* First, snip it out of the psymtab chain */
1458 prev_pst = &(pst->objfile->psymtabs);
1459 while ((*prev_pst) != pst)
1460 prev_pst = &((*prev_pst)->next);
1461 (*prev_pst) = pst->next;
1463 /* Next, put it on a free list for recycling */
1465 pst->next = pst->objfile->free_psymtabs;
1466 pst->objfile->free_psymtabs = pst;
1469 /* Increase the space allocated for LISTP, which is probably
1470 global_psymbols or static_psymbols. This space will eventually
1471 be freed in free_objfile(). */
1474 extend_psymbol_list (struct psymbol_allocation_list *listp,
1475 struct objfile *objfile)
1479 if (listp->size == 0)
1482 listp->list = (struct partial_symbol **)
1483 xmalloc (new_size * sizeof (struct partial_symbol *));
1487 new_size = listp->size * 2;
1488 listp->list = (struct partial_symbol **)
1489 xrealloc ((char *) listp->list,
1490 new_size * sizeof (struct partial_symbol *));
1492 /* Next assumes we only went one over. Should be good if
1493 program works correctly */
1494 listp->next = listp->list + listp->size;
1495 listp->size = new_size;
1501 maintenance_print_psymbols (char *args, int from_tty)
1504 struct ui_file *outfile;
1505 struct cleanup *cleanups;
1506 char *symname = NULL;
1507 char *filename = DEV_TTY;
1508 struct objfile *objfile;
1509 struct partial_symtab *ps;
1515 error (_("print-psymbols takes an output file name and optional symbol file name"));
1517 argv = gdb_buildargv (args);
1518 cleanups = make_cleanup_freeargv (argv);
1520 if (argv[0] != NULL)
1523 /* If a second arg is supplied, it is a source file name to match on */
1524 if (argv[1] != NULL)
1530 filename = tilde_expand (filename);
1531 make_cleanup (xfree, filename);
1533 outfile = gdb_fopen (filename, FOPEN_WT);
1535 perror_with_name (filename);
1536 make_cleanup_ui_file_delete (outfile);
1539 ALL_PSYMTABS (objfile, ps)
1540 if (symname == NULL || strcmp (symname, ps->filename) == 0)
1541 dump_psymtab (objfile, ps, outfile);
1543 do_cleanups (cleanups);
1546 /* List all the partial symbol tables whose names match REGEXP (optional). */
1548 maintenance_info_psymtabs (char *regexp, int from_tty)
1550 struct program_space *pspace;
1551 struct objfile *objfile;
1556 ALL_PSPACES (pspace)
1557 ALL_PSPACE_OBJFILES (pspace, objfile)
1559 struct gdbarch *gdbarch = get_objfile_arch (objfile);
1560 struct partial_symtab *psymtab;
1562 /* We don't want to print anything for this objfile until we
1563 actually find a symtab whose name matches. */
1564 int printed_objfile_start = 0;
1566 ALL_OBJFILE_PSYMTABS (objfile, psymtab)
1571 || re_exec (psymtab->filename))
1573 if (! printed_objfile_start)
1575 printf_filtered ("{ objfile %s ", objfile->name);
1577 printf_filtered ("((struct objfile *) %s)\n",
1578 host_address_to_string (objfile));
1579 printed_objfile_start = 1;
1582 printf_filtered (" { psymtab %s ", psymtab->filename);
1584 printf_filtered ("((struct partial_symtab *) %s)\n",
1585 host_address_to_string (psymtab));
1587 printf_filtered (" readin %s\n",
1588 psymtab->readin ? "yes" : "no");
1589 printf_filtered (" fullname %s\n",
1590 psymtab->fullname ? psymtab->fullname : "(null)");
1591 printf_filtered (" text addresses ");
1592 fputs_filtered (paddress (gdbarch, psymtab->textlow),
1594 printf_filtered (" -- ");
1595 fputs_filtered (paddress (gdbarch, psymtab->texthigh),
1597 printf_filtered ("\n");
1598 printf_filtered (" globals ");
1599 if (psymtab->n_global_syms)
1601 printf_filtered ("(* (struct partial_symbol **) %s @ %d)\n",
1602 host_address_to_string (psymtab->objfile->global_psymbols.list
1603 + psymtab->globals_offset),
1604 psymtab->n_global_syms);
1607 printf_filtered ("(none)\n");
1608 printf_filtered (" statics ");
1609 if (psymtab->n_static_syms)
1611 printf_filtered ("(* (struct partial_symbol **) %s @ %d)\n",
1612 host_address_to_string (psymtab->objfile->static_psymbols.list
1613 + psymtab->statics_offset),
1614 psymtab->n_static_syms);
1617 printf_filtered ("(none)\n");
1618 printf_filtered (" dependencies ");
1619 if (psymtab->number_of_dependencies)
1623 printf_filtered ("{\n");
1624 for (i = 0; i < psymtab->number_of_dependencies; i++)
1626 struct partial_symtab *dep = psymtab->dependencies[i];
1628 /* Note the string concatenation there --- no comma. */
1629 printf_filtered (" psymtab %s "
1630 "((struct partial_symtab *) %s)\n",
1632 host_address_to_string (dep));
1634 printf_filtered (" }\n");
1637 printf_filtered ("(none)\n");
1638 printf_filtered (" }\n");
1642 if (printed_objfile_start)
1643 printf_filtered ("}\n");
1647 /* Check consistency of psymtabs and symtabs. */
1650 maintenance_check_symtabs (char *ignore, int from_tty)
1653 struct partial_symbol **psym;
1654 struct symtab *s = NULL;
1655 struct partial_symtab *ps;
1656 struct blockvector *bv;
1657 struct objfile *objfile;
1661 ALL_PSYMTABS (objfile, ps)
1663 struct gdbarch *gdbarch = get_objfile_arch (objfile);
1665 s = PSYMTAB_TO_SYMTAB (ps);
1668 bv = BLOCKVECTOR (s);
1669 b = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
1670 psym = ps->objfile->static_psymbols.list + ps->statics_offset;
1671 length = ps->n_static_syms;
1674 sym = lookup_block_symbol (b, SYMBOL_LINKAGE_NAME (*psym),
1675 SYMBOL_DOMAIN (*psym));
1678 printf_filtered ("Static symbol `");
1679 puts_filtered (SYMBOL_LINKAGE_NAME (*psym));
1680 printf_filtered ("' only found in ");
1681 puts_filtered (ps->filename);
1682 printf_filtered (" psymtab\n");
1686 b = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
1687 psym = ps->objfile->global_psymbols.list + ps->globals_offset;
1688 length = ps->n_global_syms;
1691 sym = lookup_block_symbol (b, SYMBOL_LINKAGE_NAME (*psym),
1692 SYMBOL_DOMAIN (*psym));
1695 printf_filtered ("Global symbol `");
1696 puts_filtered (SYMBOL_LINKAGE_NAME (*psym));
1697 printf_filtered ("' only found in ");
1698 puts_filtered (ps->filename);
1699 printf_filtered (" psymtab\n");
1703 if (ps->texthigh < ps->textlow)
1705 printf_filtered ("Psymtab ");
1706 puts_filtered (ps->filename);
1707 printf_filtered (" covers bad range ");
1708 fputs_filtered (paddress (gdbarch, ps->textlow), gdb_stdout);
1709 printf_filtered (" - ");
1710 fputs_filtered (paddress (gdbarch, ps->texthigh), gdb_stdout);
1711 printf_filtered ("\n");
1714 if (ps->texthigh == 0)
1716 if (ps->textlow < BLOCK_START (b) || ps->texthigh > BLOCK_END (b))
1718 printf_filtered ("Psymtab ");
1719 puts_filtered (ps->filename);
1720 printf_filtered (" covers ");
1721 fputs_filtered (paddress (gdbarch, ps->textlow), gdb_stdout);
1722 printf_filtered (" - ");
1723 fputs_filtered (paddress (gdbarch, ps->texthigh), gdb_stdout);
1724 printf_filtered (" but symtab covers only ");
1725 fputs_filtered (paddress (gdbarch, BLOCK_START (b)), gdb_stdout);
1726 printf_filtered (" - ");
1727 fputs_filtered (paddress (gdbarch, BLOCK_END (b)), gdb_stdout);
1728 printf_filtered ("\n");
1736 map_partial_symbol_names (void (*fun) (const char *, void *), void *data)
1738 struct objfile *objfile;
1740 ALL_OBJFILES (objfile)
1743 objfile->sf->qf->map_symbol_names (objfile, fun, data);
1748 map_partial_symbol_filenames (void (*fun) (const char *, const char *,
1752 struct objfile *objfile;
1754 ALL_OBJFILES (objfile)
1757 objfile->sf->qf->map_symbol_filenames (objfile, fun, data);