1 /* Partial symbol tables.
3 Copyright (C) 2009-2022 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/>. */
25 #include "filenames.h"
31 #include "readline/tilde.h"
32 #include "gdbsupport/gdb_regex.h"
33 #include "dictionary.h"
35 #include "cp-support.h"
39 #include "gdbsupport/buildargv.h"
41 static struct partial_symbol *lookup_partial_symbol (struct objfile *,
42 struct partial_symtab *,
43 const lookup_name_info &,
47 static const char *psymtab_to_fullname (struct partial_symtab *ps);
49 static struct partial_symbol *find_pc_sect_psymbol (struct objfile *,
50 struct partial_symtab *,
52 struct obj_section *);
54 static struct compunit_symtab *psymtab_to_symtab (struct objfile *objfile,
55 struct partial_symtab *pst);
57 psymtab_storage::~psymtab_storage ()
59 partial_symtab *iter = psymtabs;
60 while (iter != nullptr)
62 partial_symtab *next = iter->next;
71 psymtab_storage::install_psymtab (partial_symtab *pst)
81 psymtab_storage::partial_symtab_range
82 psymbol_functions::partial_symbols (struct objfile *objfile)
84 gdb_assert ((objfile->flags & OBJF_PSYMTABS_READ) != 0);
85 return m_partial_symtabs->range ();
88 /* Find which partial symtab contains PC and SECTION starting at psymtab PST.
89 We may find a different psymtab than PST. See FIND_PC_SECT_PSYMTAB. */
91 static struct partial_symtab *
92 find_pc_sect_psymtab_closer (struct objfile *objfile,
93 CORE_ADDR pc, struct obj_section *section,
94 struct partial_symtab *pst,
95 struct bound_minimal_symbol msymbol)
97 struct partial_symtab *tpst;
98 struct partial_symtab *best_pst = pst;
99 CORE_ADDR best_addr = pst->text_low (objfile);
101 /* An objfile that has its functions reordered might have
102 many partial symbol tables containing the PC, but
103 we want the partial symbol table that contains the
104 function containing the PC. */
105 if (!(objfile->flags & OBJF_REORDERED)
106 && section == NULL) /* Can't validate section this way. */
109 if (msymbol.minsym == NULL)
112 /* The code range of partial symtabs sometimes overlap, so, in
113 the loop below, we need to check all partial symtabs and
114 find the one that fits better for the given PC address. We
115 select the partial symtab that contains a symbol whose
116 address is closest to the PC address. By closest we mean
117 that find_pc_sect_symbol returns the symbol with address
118 that is closest and still less than the given PC. */
119 for (tpst = pst; tpst != NULL; tpst = tpst->next)
121 if (pc >= tpst->text_low (objfile) && pc < tpst->text_high (objfile))
123 struct partial_symbol *p;
126 /* NOTE: This assumes that every psymbol has a
127 corresponding msymbol, which is not necessarily
128 true; the debug info might be much richer than the
129 object's symbol table. */
130 p = find_pc_sect_psymbol (objfile, tpst, pc, section);
132 && (p->address (objfile) == msymbol.value_address ()))
135 /* Also accept the textlow value of a psymtab as a
136 "symbol", to provide some support for partial
137 symbol tables with line information but no debug
138 symbols (e.g. those produced by an assembler). */
140 this_addr = p->address (objfile);
142 this_addr = tpst->text_low (objfile);
144 /* Check whether it is closer than our current
145 BEST_ADDR. Since this symbol address is
146 necessarily lower or equal to PC, the symbol closer
147 to PC is the symbol which address is the highest.
148 This way we return the psymtab which contains such
149 best match symbol. This can help in cases where the
150 symbol information/debuginfo is not complete, like
151 for instance on IRIX6 with gcc, where no debug info
152 is emitted for statics. (See also the nodebug.exp
154 if (this_addr > best_addr)
156 best_addr = this_addr;
164 /* See psympriv.h. */
166 struct partial_symtab *
167 psymbol_functions::find_pc_sect_psymtab (struct objfile *objfile,
169 struct obj_section *section,
170 struct bound_minimal_symbol msymbol)
172 for (partial_symtab *pst : partial_symbols (objfile))
173 if (pc >= pst->text_low (objfile) && pc < pst->text_high (objfile))
175 struct partial_symtab *best_pst;
177 best_pst = find_pc_sect_psymtab_closer (objfile, pc, section, pst,
179 if (best_pst != NULL)
186 /* Psymtab version of find_pc_sect_compunit_symtab. See its definition in
187 the definition of quick_symbol_functions in symfile.h. */
189 struct compunit_symtab *
190 psymbol_functions::find_pc_sect_compunit_symtab
191 (struct objfile *objfile,
192 struct bound_minimal_symbol msymbol,
194 struct obj_section *section,
197 struct partial_symtab *ps = find_pc_sect_psymtab (objfile,
202 if (warn_if_readin && ps->readin_p (objfile))
203 /* Might want to error() here (in case symtab is corrupt and
204 will cause a core dump), but maybe we can successfully
205 continue, so let's not. */
207 (Internal error: pc %s in read in psymtab, but not in symtab.)\n"),
208 paddress (objfile->arch (), pc));
209 psymtab_to_symtab (objfile, ps);
210 return ps->get_compunit_symtab (objfile);
215 /* Find which partial symbol within a psymtab matches PC and SECTION.
216 Return NULL if none. */
218 static struct partial_symbol *
219 find_pc_sect_psymbol (struct objfile *objfile,
220 struct partial_symtab *psymtab, CORE_ADDR pc,
221 struct obj_section *section)
223 struct partial_symbol *best = NULL;
225 const CORE_ADDR textlow = psymtab->text_low (objfile);
227 gdb_assert (psymtab != NULL);
229 /* Cope with programs that start at address 0. */
230 best_pc = (textlow != 0) ? textlow - 1 : 0;
232 /* Search the global symbols as well as the static symbols, so that
233 find_pc_partial_function doesn't use a minimal symbol and thus
234 cache a bad endaddr. */
235 for (partial_symbol *p : psymtab->global_psymbols)
237 if (p->domain == VAR_DOMAIN
238 && p->aclass == LOC_BLOCK
239 && pc >= p->address (objfile)
240 && (p->address (objfile) > best_pc
241 || (psymtab->text_low (objfile) == 0
242 && best_pc == 0 && p->address (objfile) == 0)))
244 if (section != NULL) /* Match on a specific section. */
246 if (!matching_obj_sections (p->obj_section (objfile),
250 best_pc = p->address (objfile);
255 for (partial_symbol *p : psymtab->static_psymbols)
257 if (p->domain == VAR_DOMAIN
258 && p->aclass == LOC_BLOCK
259 && pc >= p->address (objfile)
260 && (p->address (objfile) > best_pc
261 || (psymtab->text_low (objfile) == 0
262 && best_pc == 0 && p->address (objfile) == 0)))
264 if (section != NULL) /* Match on a specific section. */
266 if (!matching_obj_sections (p->obj_section (objfile),
270 best_pc = p->address (objfile);
278 /* Psymtab version of lookup_global_symbol_language. See its definition in
279 the definition of quick_symbol_functions in symfile.h. */
282 psymbol_functions::lookup_global_symbol_language (struct objfile *objfile,
285 bool *symbol_found_p)
287 *symbol_found_p = false;
288 if (objfile->sf == NULL)
289 return language_unknown;
291 lookup_name_info lookup_name (name, symbol_name_match_type::FULL);
293 for (partial_symtab *ps : partial_symbols (objfile))
295 struct partial_symbol *psym;
296 if (ps->readin_p (objfile))
299 psym = lookup_partial_symbol (objfile, ps, lookup_name, 1, domain);
302 *symbol_found_p = true;
303 return psym->ginfo.language ();
307 return language_unknown;
310 /* Returns true if PSYM matches LOOKUP_NAME. */
313 psymbol_name_matches (partial_symbol *psym,
314 const lookup_name_info &lookup_name)
316 const language_defn *lang = language_def (psym->ginfo.language ());
317 symbol_name_matcher_ftype *name_match
318 = lang->get_symbol_name_matcher (lookup_name);
319 return name_match (psym->ginfo.search_name (), lookup_name, NULL);
322 /* Look in PST for a symbol in DOMAIN whose name matches NAME. Search
323 the global block of PST if GLOBAL, and otherwise the static block.
324 MATCH is the comparison operation that returns true iff MATCH (s,
325 NAME), where s is a SYMBOL_SEARCH_NAME. If ORDERED_COMPARE is
326 non-null, the symbols in the block are assumed to be ordered
327 according to it (allowing binary search). It must be compatible
328 with MATCH. Returns the symbol, if found, and otherwise NULL. */
330 static struct partial_symbol *
331 match_partial_symbol (struct objfile *objfile,
332 struct partial_symtab *pst, int global,
333 const lookup_name_info &name, domain_enum domain,
334 symbol_compare_ftype *ordered_compare)
336 struct partial_symbol **start, **psym;
337 struct partial_symbol **top, **real_top, **bottom, **center;
339 ? pst->global_psymbols.size ()
340 : pst->static_psymbols.size ());
341 int do_linear_search = 1;
347 &pst->global_psymbols[0] :
348 &pst->static_psymbols[0]);
350 if (global && ordered_compare) /* Can use a binary search. */
352 do_linear_search = 0;
354 /* Binary search. This search is guaranteed to end with center
355 pointing at the earliest partial symbol whose name might be
356 correct. At that point *all* partial symbols with an
357 appropriate name will be checked against the correct
361 top = start + length - 1;
365 center = bottom + (top - bottom) / 2;
366 gdb_assert (center < top);
368 enum language lang = (*center)->ginfo.language ();
369 const char *lang_ln = name.language_lookup_name (lang);
371 if (ordered_compare ((*center)->ginfo.search_name (),
377 gdb_assert (top == bottom);
379 while (top <= real_top
380 && psymbol_name_matches (*top, name))
382 if (symbol_matches_domain ((*top)->ginfo.language (),
383 (*top)->domain, domain))
389 /* Can't use a binary search or else we found during the binary search that
390 we should also do a linear search. */
392 if (do_linear_search)
394 for (psym = start; psym < start + length; psym++)
396 if (symbol_matches_domain ((*psym)->ginfo.language (),
397 (*psym)->domain, domain)
398 && psymbol_name_matches (*psym, name))
406 /* Look, in partial_symtab PST, for symbol whose natural name is
407 LOOKUP_NAME. Check the global symbols if GLOBAL, the static
410 static struct partial_symbol *
411 lookup_partial_symbol (struct objfile *objfile,
412 struct partial_symtab *pst,
413 const lookup_name_info &lookup_name,
414 int global, domain_enum domain)
416 struct partial_symbol **start, **psym;
417 struct partial_symbol **top, **real_top, **bottom, **center;
419 ? pst->global_psymbols.size ()
420 : pst->static_psymbols.size ());
421 int do_linear_search = 1;
427 &pst->global_psymbols[0] :
428 &pst->static_psymbols[0]);
430 if (global) /* This means we can use a binary search. */
432 do_linear_search = 0;
434 /* Binary search. This search is guaranteed to end with center
435 pointing at the earliest partial symbol whose name might be
436 correct. At that point *all* partial symbols with an
437 appropriate name will be checked against the correct
441 top = start + length - 1;
445 center = bottom + (top - bottom) / 2;
447 gdb_assert (center < top);
449 if (strcmp_iw_ordered ((*center)->ginfo.search_name (),
450 lookup_name.c_str ()) >= 0)
460 gdb_assert (top == bottom);
462 /* For `case_sensitivity == case_sensitive_off' strcmp_iw_ordered will
463 search more exactly than what matches SYMBOL_MATCHES_SEARCH_NAME. */
464 while (top >= start && symbol_matches_search_name (&(*top)->ginfo,
468 /* Fixup to have a symbol which matches SYMBOL_MATCHES_SEARCH_NAME. */
471 while (top <= real_top && symbol_matches_search_name (&(*top)->ginfo,
474 if (symbol_matches_domain ((*top)->ginfo.language (),
475 (*top)->domain, domain))
481 /* Can't use a binary search or else we found during the binary search that
482 we should also do a linear search. */
484 if (do_linear_search)
486 for (psym = start; psym < start + length; psym++)
488 if (symbol_matches_domain ((*psym)->ginfo.language (),
489 (*psym)->domain, domain)
490 && symbol_matches_search_name (&(*psym)->ginfo, lookup_name))
498 /* Get the symbol table that corresponds to a partial_symtab.
499 This is fast after the first time you do it.
500 The result will be NULL if the primary symtab has no symbols,
501 which can happen. Otherwise the result is the primary symtab
502 that contains PST. */
504 static struct compunit_symtab *
505 psymtab_to_symtab (struct objfile *objfile, struct partial_symtab *pst)
507 /* If it is a shared psymtab, find an unshared psymtab that includes
508 it. Any such psymtab will do. */
509 while (pst->user != NULL)
512 /* If it's been looked up before, return it. */
513 if (pst->get_compunit_symtab (objfile))
514 return pst->get_compunit_symtab (objfile);
516 /* If it has not yet been read in, read it. */
517 if (!pst->readin_p (objfile))
519 scoped_restore decrementer = increment_reading_symtab ();
523 gdb_printf (_("Reading in symbols for %s...\n"),
525 gdb_flush (gdb_stdout);
528 pst->read_symtab (objfile);
531 return pst->get_compunit_symtab (objfile);
534 /* Psymtab version of find_last_source_symtab. See its definition in
535 the definition of quick_symbol_functions in symfile.h. */
538 psymbol_functions::find_last_source_symtab (struct objfile *ofp)
540 struct partial_symtab *cs_pst = NULL;
542 for (partial_symtab *ps : partial_symbols (ofp))
544 const char *name = ps->filename;
545 int len = strlen (name);
547 if (!(len > 2 && (strcmp (&name[len - 2], ".h") == 0
548 || strcmp (name, "<<C++-namespaces>>") == 0)))
554 if (cs_pst->readin_p (ofp))
556 internal_error (_("select_source_symtab: "
557 "readin pst found and no symtabs."));
561 struct compunit_symtab *cust = psymtab_to_symtab (ofp, cs_pst);
565 return cust->primary_filetab ();
571 /* Psymtab version of forget_cached_source_info. See its definition in
572 the definition of quick_symbol_functions in symfile.h. */
575 psymbol_functions::forget_cached_source_info (struct objfile *objfile)
577 for (partial_symtab *pst : partial_symbols (objfile))
579 if (pst->fullname != NULL)
581 xfree (pst->fullname);
582 pst->fullname = NULL;
588 print_partial_symbols (struct gdbarch *gdbarch, struct objfile *objfile,
589 const std::vector<partial_symbol *> &symbols,
590 const char *what, struct ui_file *outfile)
592 gdb_printf (outfile, " %s partial symbols:\n", what);
593 for (partial_symbol *p : symbols)
596 gdb_printf (outfile, " `%s'", p->ginfo.linkage_name ());
597 if (p->ginfo.demangled_name () != NULL)
599 gdb_printf (outfile, " `%s'",
600 p->ginfo.demangled_name ());
602 gdb_puts (", ", outfile);
606 gdb_puts ("undefined domain, ", outfile);
609 /* This is the usual thing -- don't print it. */
612 gdb_puts ("struct domain, ", outfile);
615 gdb_puts ("module domain, ", outfile);
618 gdb_puts ("label domain, ", outfile);
620 case COMMON_BLOCK_DOMAIN:
621 gdb_puts ("common block domain, ", outfile);
624 gdb_puts ("<invalid domain>, ", outfile);
630 gdb_puts ("undefined", outfile);
633 gdb_puts ("constant int", outfile);
636 gdb_puts ("static", outfile);
639 gdb_puts ("register", outfile);
642 gdb_puts ("pass by value", outfile);
645 gdb_puts ("pass by reference", outfile);
647 case LOC_REGPARM_ADDR:
648 gdb_puts ("register address parameter", outfile);
651 gdb_puts ("stack parameter", outfile);
654 gdb_puts ("type", outfile);
657 gdb_puts ("label", outfile);
660 gdb_puts ("function", outfile);
662 case LOC_CONST_BYTES:
663 gdb_puts ("constant bytes", outfile);
666 gdb_puts ("unresolved", outfile);
668 case LOC_OPTIMIZED_OUT:
669 gdb_puts ("optimized out", outfile);
672 gdb_puts ("computed at runtime", outfile);
675 gdb_puts ("<invalid location>", outfile);
678 gdb_puts (", ", outfile);
679 gdb_puts (paddress (gdbarch, p->unrelocated_address ()), outfile);
680 gdb_printf (outfile, "\n");
685 dump_psymtab (struct objfile *objfile, struct partial_symtab *psymtab,
686 struct ui_file *outfile)
688 struct gdbarch *gdbarch = objfile->arch ();
691 if (psymtab->anonymous)
693 gdb_printf (outfile, "\nAnonymous partial symtab (%s) ",
698 gdb_printf (outfile, "\nPartial symtab for source file %s ",
701 gdb_printf (outfile, "(object %s)\n\n",
702 host_address_to_string (psymtab));
703 gdb_printf (outfile, " Read from object file %s (%s)\n",
704 objfile_name (objfile),
705 host_address_to_string (objfile));
707 if (psymtab->readin_p (objfile))
710 " Full symtab was read (at %s)\n",
711 host_address_to_string (psymtab->get_compunit_symtab (objfile)));
713 gdb_printf (outfile, " Symbols cover text addresses ");
714 gdb_puts (paddress (gdbarch, psymtab->text_low (objfile)), outfile);
715 gdb_printf (outfile, "-");
716 gdb_puts (paddress (gdbarch, psymtab->text_high (objfile)), outfile);
717 gdb_printf (outfile, "\n");
718 gdb_printf (outfile, " Depends on %d other partial symtabs.\n",
719 psymtab->number_of_dependencies);
720 for (i = 0; i < psymtab->number_of_dependencies; i++)
721 gdb_printf (outfile, " %d %s\n", i,
722 host_address_to_string (psymtab->dependencies[i]));
723 if (psymtab->user != NULL)
724 gdb_printf (outfile, " Shared partial symtab with user %s\n",
725 host_address_to_string (psymtab->user));
726 if (!psymtab->global_psymbols.empty ())
728 print_partial_symbols
729 (gdbarch, objfile, psymtab->global_psymbols,
732 if (!psymtab->static_psymbols.empty ())
734 print_partial_symbols
735 (gdbarch, objfile, psymtab->static_psymbols,
738 gdb_printf (outfile, "\n");
741 /* Count the number of partial symbols in OBJFILE. */
744 psymbol_functions::count_psyms ()
747 for (partial_symtab *pst : m_partial_symtabs->range ())
749 count += pst->global_psymbols.size ();
750 count += pst->static_psymbols.size ();
755 /* Psymtab version of print_stats. See its definition in
756 the definition of quick_symbol_functions in symfile.h. */
759 psymbol_functions::print_stats (struct objfile *objfile, bool print_bcache)
765 int n_psyms = count_psyms ();
767 gdb_printf (_(" Number of \"partial\" symbols read: %d\n"),
771 for (partial_symtab *ps : partial_symbols (objfile))
773 if (!ps->readin_p (objfile))
776 gdb_printf (_(" Number of psym tables (not yet expanded): %d\n"),
778 gdb_printf (_(" Total memory used for psymbol cache: %d\n"),
779 m_partial_symtabs->psymbol_cache.memory_used ());
783 gdb_printf (_("Psymbol byte cache statistics:\n"));
784 m_partial_symtabs->psymbol_cache.print_statistics
785 ("partial symbol cache");
789 /* Psymtab version of dump. See its definition in
790 the definition of quick_symbol_functions in symfile.h. */
793 psymbol_functions::dump (struct objfile *objfile)
795 struct partial_symtab *psymtab;
797 if (m_partial_symtabs->psymtabs)
799 gdb_printf ("Psymtabs:\n");
800 for (psymtab = m_partial_symtabs->psymtabs;
802 psymtab = psymtab->next)
803 gdb_printf ("%s at %s\n",
805 host_address_to_string (psymtab));
810 /* Psymtab version of expand_all_symtabs. See its definition in
811 the definition of quick_symbol_functions in symfile.h. */
814 psymbol_functions::expand_all_symtabs (struct objfile *objfile)
816 for (partial_symtab *psymtab : partial_symbols (objfile))
817 psymtab_to_symtab (objfile, psymtab);
820 /* Psymtab version of map_symbol_filenames. See its definition in
821 the definition of quick_symbol_functions in symfile.h. */
824 psymbol_functions::map_symbol_filenames
825 (struct objfile *objfile,
826 gdb::function_view<symbol_filename_ftype> fun,
829 for (partial_symtab *ps : partial_symbols (objfile))
831 const char *fullname;
833 if (ps->readin_p (objfile))
836 /* We can skip shared psymtabs here, because any file name will be
837 attached to the unshared psymtab. */
838 if (ps->user != NULL)
841 /* Anonymous psymtabs don't have a file name. */
847 fullname = psymtab_to_fullname (ps);
850 fun (ps->filename, fullname);
854 /* Finds the fullname that a partial_symtab represents.
856 If this functions finds the fullname, it will save it in ps->fullname
857 and it will also return the value.
859 If this function fails to find the file that this partial_symtab represents,
860 NULL will be returned and ps->fullname will be set to NULL. */
863 psymtab_to_fullname (struct partial_symtab *ps)
865 gdb_assert (!ps->anonymous);
867 /* Use cached copy if we have it.
868 We rely on forget_cached_source_info being called appropriately
869 to handle cases like the file being moved. */
870 if (ps->fullname == NULL)
872 gdb::unique_xmalloc_ptr<char> fullname
873 = find_source_or_rewrite (ps->filename, ps->dirname);
874 ps->fullname = fullname.release ();
880 /* Psymtab version of expand_matching_symbols. See its definition in
881 the definition of quick_symbol_functions in symfile.h. */
884 psymbol_functions::expand_matching_symbols
885 (struct objfile *objfile,
886 const lookup_name_info &name, domain_enum domain,
888 symbol_compare_ftype *ordered_compare)
890 for (partial_symtab *ps : partial_symbols (objfile))
893 if (!ps->readin_p (objfile)
894 && match_partial_symbol (objfile, ps, global, name, domain,
896 psymtab_to_symtab (objfile, ps);
900 /* A helper for psym_expand_symtabs_matching that handles searching
901 included psymtabs. This returns true if a symbol is found, and
902 false otherwise. It also updates the 'searched_flag' on the
903 various psymtabs that it searches. */
906 recursively_search_psymtabs
907 (struct partial_symtab *ps,
908 struct objfile *objfile,
909 block_search_flags search_flags,
911 enum search_domain search,
912 const lookup_name_info &lookup_name,
913 gdb::function_view<expand_symtabs_symbol_matcher_ftype> sym_matcher)
916 enum psymtab_search_status result = PST_SEARCHED_AND_NOT_FOUND;
919 if (ps->searched_flag != PST_NOT_SEARCHED)
920 return ps->searched_flag == PST_SEARCHED_AND_FOUND;
922 /* Recurse into shared psymtabs first, because they may have already
923 been searched, and this could save some time. */
924 for (i = 0; i < ps->number_of_dependencies; ++i)
928 /* Skip non-shared dependencies, these are handled elsewhere. */
929 if (ps->dependencies[i]->user == NULL)
932 r = recursively_search_psymtabs (ps->dependencies[i],
933 objfile, search_flags, domain, search,
934 lookup_name, sym_matcher);
937 ps->searched_flag = PST_SEARCHED_AND_FOUND;
942 partial_symbol **gbound = (ps->global_psymbols.data ()
943 + ps->global_psymbols.size ());
944 partial_symbol **sbound = (ps->static_psymbols.data ()
945 + ps->static_psymbols.size ());
946 partial_symbol **bound = gbound;
948 /* Go through all of the symbols stored in a partial
949 symtab in one loop. */
950 partial_symbol **psym = ps->global_psymbols.data ();
952 if ((search_flags & SEARCH_GLOBAL_BLOCK) == 0)
954 if (ps->static_psymbols.empty ())
958 psym = ps->static_psymbols.data ();
967 if (bound == gbound && !ps->static_psymbols.empty ()
968 && (search_flags & SEARCH_STATIC_BLOCK) != 0)
970 psym = ps->static_psymbols.data ();
981 if ((domain == UNDEF_DOMAIN
982 || symbol_matches_domain ((*psym)->ginfo.language (),
983 (*psym)->domain, domain))
984 && (search == ALL_DOMAIN
985 || (search == MODULES_DOMAIN
986 && (*psym)->domain == MODULE_DOMAIN)
987 || (search == VARIABLES_DOMAIN
988 && (*psym)->aclass != LOC_TYPEDEF
989 && (*psym)->aclass != LOC_BLOCK)
990 || (search == FUNCTIONS_DOMAIN
991 && (*psym)->aclass == LOC_BLOCK)
992 || (search == TYPES_DOMAIN
993 && (*psym)->aclass == LOC_TYPEDEF))
994 && psymbol_name_matches (*psym, lookup_name)
995 && (sym_matcher == NULL
996 || sym_matcher ((*psym)->ginfo.search_name ())))
998 /* Found a match, so notify our caller. */
999 result = PST_SEARCHED_AND_FOUND;
1006 ps->searched_flag = result;
1007 return result == PST_SEARCHED_AND_FOUND;
1010 /* Psymtab version of expand_symtabs_matching. See its definition in
1011 the definition of quick_symbol_functions in symfile.h. */
1014 psymbol_functions::expand_symtabs_matching
1015 (struct objfile *objfile,
1016 gdb::function_view<expand_symtabs_file_matcher_ftype> file_matcher,
1017 const lookup_name_info *lookup_name,
1018 gdb::function_view<expand_symtabs_symbol_matcher_ftype> symbol_matcher,
1019 gdb::function_view<expand_symtabs_exp_notify_ftype> expansion_notify,
1020 block_search_flags search_flags,
1022 enum search_domain search)
1024 /* Clear the search flags. */
1025 for (partial_symtab *ps : partial_symbols (objfile))
1026 ps->searched_flag = PST_NOT_SEARCHED;
1028 gdb::optional<lookup_name_info> psym_lookup_name;
1029 if (lookup_name != nullptr)
1030 psym_lookup_name = lookup_name->make_ignore_params ();
1032 /* This invariant is documented in quick-functions.h. */
1033 gdb_assert (lookup_name != nullptr || symbol_matcher == nullptr);
1035 for (partial_symtab *ps : m_partial_symtabs->range ())
1039 if (ps->readin_p (objfile))
1049 match = file_matcher (ps->filename, false);
1052 /* Before we invoke realpath, which can get expensive when many
1053 files are involved, do a quick comparison of the basenames. */
1054 if (basenames_may_differ
1055 || file_matcher (lbasename (ps->filename), true))
1056 match = file_matcher (psymtab_to_fullname (ps), false);
1062 if (lookup_name == nullptr
1063 || recursively_search_psymtabs (ps, objfile, search_flags,
1068 compunit_symtab *cust = psymtab_to_symtab (objfile, ps);
1070 if (cust != nullptr && expansion_notify != nullptr)
1071 if (!expansion_notify (cust))
1079 /* Psymtab version of has_symbols. See its definition in
1080 the definition of quick_symbol_functions in symfile.h. */
1083 psymbol_functions::has_symbols (struct objfile *objfile)
1085 return m_partial_symtabs->psymtabs != NULL;
1088 /* See quick_symbol_functions::has_unexpanded_symtabs in quick-symbol.h. */
1091 psymbol_functions::has_unexpanded_symtabs (struct objfile *objfile)
1093 for (partial_symtab *psymtab : partial_symbols (objfile))
1095 /* Is this already expanded? */
1096 if (psymtab->readin_p (objfile))
1099 /* It has not yet been expanded. */
1106 /* Helper function for psym_find_compunit_symtab_by_address that fills
1107 in m_psymbol_map for a given range of psymbols. */
1110 psymbol_functions::fill_psymbol_map
1111 (struct objfile *objfile,
1112 struct partial_symtab *psymtab,
1113 std::set<CORE_ADDR> *seen_addrs,
1114 const std::vector<partial_symbol *> &symbols)
1116 for (partial_symbol *psym : symbols)
1118 if (psym->aclass == LOC_STATIC)
1120 CORE_ADDR addr = psym->address (objfile);
1121 if (seen_addrs->find (addr) == seen_addrs->end ())
1123 seen_addrs->insert (addr);
1124 m_psymbol_map.emplace_back (addr, psymtab);
1130 /* See find_compunit_symtab_by_address in quick_symbol_functions, in
1134 psymbol_functions::find_compunit_symtab_by_address (struct objfile *objfile,
1137 if (m_psymbol_map.empty ())
1139 std::set<CORE_ADDR> seen_addrs;
1141 for (partial_symtab *pst : partial_symbols (objfile))
1143 fill_psymbol_map (objfile, pst,
1145 pst->global_psymbols);
1146 fill_psymbol_map (objfile, pst,
1148 pst->static_psymbols);
1151 m_psymbol_map.shrink_to_fit ();
1153 std::sort (m_psymbol_map.begin (), m_psymbol_map.end (),
1154 [] (const std::pair<CORE_ADDR, partial_symtab *> &a,
1155 const std::pair<CORE_ADDR, partial_symtab *> &b)
1157 return a.first < b.first;
1161 auto iter = std::lower_bound
1162 (m_psymbol_map.begin (), m_psymbol_map.end (), address,
1163 [] (const std::pair<CORE_ADDR, partial_symtab *> &a,
1169 if (iter == m_psymbol_map.end () || iter->first != address)
1172 return psymtab_to_symtab (objfile, iter->second);
1177 /* Partially fill a partial symtab. It will be completely filled at
1178 the end of the symbol list. */
1180 partial_symtab::partial_symtab (const char *filename,
1181 psymtab_storage *partial_symtabs,
1182 objfile_per_bfd_storage *objfile_per_bfd,
1184 : partial_symtab (filename, partial_symtabs, objfile_per_bfd)
1186 set_text_low (textlow);
1187 set_text_high (raw_text_low ()); /* default */
1190 /* Perform "finishing up" operations of a partial symtab. */
1193 partial_symtab::end ()
1195 global_psymbols.shrink_to_fit ();
1196 static_psymbols.shrink_to_fit ();
1198 /* Sort the global list; don't sort the static list. */
1199 std::sort (global_psymbols.begin (),
1200 global_psymbols.end (),
1201 [] (partial_symbol *s1, partial_symbol *s2)
1203 return strcmp_iw_ordered (s1->ginfo.search_name (),
1204 s2->ginfo.search_name ()) < 0;
1208 /* See psymtab.h. */
1211 psymbol_bcache::hash (const void *addr, int length)
1213 unsigned long h = 0;
1214 struct partial_symbol *psymbol = (struct partial_symbol *) addr;
1215 unsigned int lang = psymbol->ginfo.language ();
1216 unsigned int domain = psymbol->domain;
1217 unsigned int theclass = psymbol->aclass;
1219 h = fast_hash (&psymbol->ginfo.m_value, sizeof (psymbol->ginfo.m_value), h);
1220 h = fast_hash (&lang, sizeof (unsigned int), h);
1221 h = fast_hash (&domain, sizeof (unsigned int), h);
1222 h = fast_hash (&theclass, sizeof (unsigned int), h);
1223 /* Note that psymbol names are interned via compute_and_set_names, so
1224 there's no need to hash the contents of the name here. */
1225 h = fast_hash (&psymbol->ginfo.m_name, sizeof (psymbol->ginfo.m_name), h);
1230 /* See psymtab.h. */
1233 psymbol_bcache::compare (const void *addr1, const void *addr2, int length)
1235 struct partial_symbol *sym1 = (struct partial_symbol *) addr1;
1236 struct partial_symbol *sym2 = (struct partial_symbol *) addr2;
1238 return (memcmp (&sym1->ginfo.m_value, &sym2->ginfo.m_value,
1239 sizeof (sym1->ginfo.m_value)) == 0
1240 && sym1->ginfo.language () == sym2->ginfo.language ()
1241 && sym1->domain == sym2->domain
1242 && sym1->aclass == sym2->aclass
1243 /* Note that psymbol names are interned via
1244 compute_and_set_names, so there's no need to compare the
1245 contents of the name here. */
1246 && sym1->ginfo.linkage_name () == sym2->ginfo.linkage_name ());
1249 /* See psympriv.h. */
1252 partial_symtab::add_psymbol (const partial_symbol &psymbol,
1253 psymbol_placement where,
1254 psymtab_storage *partial_symtabs,
1255 struct objfile *objfile)
1259 /* Stash the partial symbol away in the cache. */
1260 partial_symbol *psym
1261 = ((struct partial_symbol *)
1262 partial_symtabs->psymbol_cache.insert
1263 (&psymbol, sizeof (struct partial_symbol), &added));
1265 /* Do not duplicate global partial symbols. */
1266 if (where == psymbol_placement::GLOBAL && !added)
1269 /* Save pointer to partial symbol in psymtab, growing symtab if needed. */
1270 std::vector<partial_symbol *> &list
1271 = (where == psymbol_placement::STATIC
1274 list.push_back (psym);
1277 /* See psympriv.h. */
1280 partial_symtab::add_psymbol (gdb::string_view name, bool copy_name,
1282 enum address_class theclass,
1284 psymbol_placement where,
1286 enum language language,
1287 psymtab_storage *partial_symtabs,
1288 struct objfile *objfile)
1290 struct partial_symbol psymbol;
1291 memset (&psymbol, 0, sizeof (psymbol));
1293 psymbol.set_unrelocated_address (coreaddr);
1294 psymbol.ginfo.set_section_index (section);
1295 psymbol.domain = domain;
1296 psymbol.aclass = theclass;
1297 psymbol.ginfo.set_language (language, partial_symtabs->obstack ());
1298 psymbol.ginfo.compute_and_set_names (name, copy_name, objfile->per_bfd);
1300 add_psymbol (psymbol, where, partial_symtabs, objfile);
1303 /* See psympriv.h. */
1305 partial_symtab::partial_symtab (const char *filename_,
1306 psymtab_storage *partial_symtabs,
1307 objfile_per_bfd_storage *objfile_per_bfd)
1308 : searched_flag (PST_NOT_SEARCHED),
1312 partial_symtabs->install_psymtab (this);
1314 filename = objfile_per_bfd->intern (filename_);
1316 if (symtab_create_debug >= 1)
1318 /* Be a bit clever with debugging messages, and don't print objfile
1319 every time, only when it changes. */
1320 static std::string last_bfd_name;
1321 const char *this_bfd_name
1322 = bfd_get_filename (objfile_per_bfd->get_bfd ());
1324 if (last_bfd_name.empty () || last_bfd_name != this_bfd_name)
1326 last_bfd_name = this_bfd_name;
1328 symtab_create_debug_printf ("creating one or more psymtabs for %s",
1332 symtab_create_debug_printf ("created psymtab %s for module %s",
1333 host_address_to_string (this), filename);
1337 /* See psympriv.h. */
1340 partial_symtab::expand_dependencies (struct objfile *objfile)
1342 for (int i = 0; i < number_of_dependencies; ++i)
1344 if (!dependencies[i]->readin_p (objfile)
1345 && dependencies[i]->user == NULL)
1347 /* Inform about additional files to be read in. */
1351 gdb_stdout->wrap_here (0);
1353 gdb_stdout->wrap_here (0);
1354 gdb_printf ("%s...", dependencies[i]->filename);
1355 gdb_flush (gdb_stdout);
1357 dependencies[i]->expand_psymtab (objfile);
1364 psymtab_storage::discard_psymtab (struct partial_symtab *pst)
1366 struct partial_symtab **prev_pst;
1369 Empty psymtabs happen as a result of header files which don't
1370 have any symbols in them. There can be a lot of them. But this
1371 check is wrong, in that a psymtab with N_SLINE entries but
1372 nothing else is not empty, but we don't realize that. Fixing
1373 that without slowing things down might be tricky. */
1375 /* First, snip it out of the psymtab chain. */
1377 prev_pst = &psymtabs;
1378 while ((*prev_pst) != pst)
1379 prev_pst = &((*prev_pst)->next);
1380 (*prev_pst) = pst->next;
1387 maintenance_print_psymbols (const char *args, int from_tty)
1389 struct ui_file *outfile = gdb_stdout;
1390 char *address_arg = NULL, *source_arg = NULL, *objfile_arg = NULL;
1391 int i, outfile_idx, found;
1393 struct obj_section *section = NULL;
1397 gdb_argv argv (args);
1399 for (i = 0; argv != NULL && argv[i] != NULL; ++i)
1401 if (strcmp (argv[i], "-pc") == 0)
1403 if (argv[i + 1] == NULL)
1404 error (_("Missing pc value"));
1405 address_arg = argv[++i];
1407 else if (strcmp (argv[i], "-source") == 0)
1409 if (argv[i + 1] == NULL)
1410 error (_("Missing source file"));
1411 source_arg = argv[++i];
1413 else if (strcmp (argv[i], "-objfile") == 0)
1415 if (argv[i + 1] == NULL)
1416 error (_("Missing objfile name"));
1417 objfile_arg = argv[++i];
1419 else if (strcmp (argv[i], "--") == 0)
1421 /* End of options. */
1425 else if (argv[i][0] == '-')
1427 /* Future proofing: Don't allow OUTFILE to begin with "-". */
1428 error (_("Unknown option: %s"), argv[i]);
1435 if (address_arg != NULL && source_arg != NULL)
1436 error (_("Must specify at most one of -pc and -source"));
1438 stdio_file arg_outfile;
1440 if (argv != NULL && argv[outfile_idx] != NULL)
1442 if (argv[outfile_idx + 1] != NULL)
1443 error (_("Junk at end of command"));
1444 gdb::unique_xmalloc_ptr<char> outfile_name
1445 (tilde_expand (argv[outfile_idx]));
1446 if (!arg_outfile.open (outfile_name.get (), FOPEN_WT))
1447 perror_with_name (outfile_name.get ());
1448 outfile = &arg_outfile;
1451 if (address_arg != NULL)
1453 pc = parse_and_eval_address (address_arg);
1454 /* If we fail to find a section, that's ok, try the lookup anyway. */
1455 section = find_pc_section (pc);
1459 for (objfile *objfile : current_program_space->objfiles ())
1461 int printed_objfile_header = 0;
1462 int print_for_objfile = 1;
1465 if (objfile_arg != NULL)
1467 = compare_filenames_for_search (objfile_name (objfile),
1469 if (!print_for_objfile)
1472 for (const auto &iter : objfile->qf)
1474 psymbol_functions *psf
1475 = dynamic_cast<psymbol_functions *> (iter.get ());
1479 if (address_arg != NULL)
1481 struct bound_minimal_symbol msymbol;
1483 /* We don't assume each pc has a unique objfile (this is for
1485 struct partial_symtab *ps
1486 = psf->find_pc_sect_psymtab (objfile, pc, section, msymbol);
1489 if (!printed_objfile_header)
1491 outfile->printf ("\nPartial symtabs for objfile %s\n",
1492 objfile_name (objfile));
1493 printed_objfile_header = 1;
1495 dump_psymtab (objfile, ps, outfile);
1501 for (partial_symtab *ps : psf->partial_symbols (objfile))
1503 int print_for_source = 0;
1506 if (source_arg != NULL)
1509 = compare_filenames_for_search (ps->filename, source_arg);
1512 if (source_arg == NULL
1513 || print_for_source)
1515 if (!printed_objfile_header)
1517 outfile->printf ("\nPartial symtabs for objfile %s\n",
1518 objfile_name (objfile));
1519 printed_objfile_header = 1;
1521 dump_psymtab (objfile, ps, outfile);
1530 if (address_arg != NULL)
1531 error (_("No partial symtab for address: %s"), address_arg);
1532 if (source_arg != NULL)
1533 error (_("No partial symtab for source file: %s"), source_arg);
1537 /* List all the partial symbol tables whose names match REGEXP (optional). */
1540 maintenance_info_psymtabs (const char *regexp, int from_tty)
1545 for (struct program_space *pspace : program_spaces)
1546 for (objfile *objfile : pspace->objfiles ())
1548 struct gdbarch *gdbarch = objfile->arch ();
1550 /* We don't want to print anything for this objfile until we
1551 actually find a symtab whose name matches. */
1552 int printed_objfile_start = 0;
1554 for (const auto &iter : objfile->qf)
1556 psymbol_functions *psf
1557 = dynamic_cast<psymbol_functions *> (iter.get ());
1560 for (partial_symtab *psymtab : psf->partial_symbols (objfile))
1565 || re_exec (psymtab->filename))
1567 if (! printed_objfile_start)
1569 gdb_printf ("{ objfile %s ", objfile_name (objfile));
1570 gdb_stdout->wrap_here (2);
1571 gdb_printf ("((struct objfile *) %s)\n",
1572 host_address_to_string (objfile));
1573 printed_objfile_start = 1;
1576 gdb_printf (" { psymtab %s ", psymtab->filename);
1577 gdb_stdout->wrap_here (4);
1578 gdb_printf ("((struct partial_symtab *) %s)\n",
1579 host_address_to_string (psymtab));
1581 gdb_printf (" readin %s\n",
1582 psymtab->readin_p (objfile) ? "yes" : "no");
1583 gdb_printf (" fullname %s\n",
1585 ? psymtab->fullname : "(null)");
1586 gdb_printf (" text addresses ");
1587 gdb_puts (paddress (gdbarch,
1588 psymtab->text_low (objfile)));
1589 gdb_printf (" -- ");
1590 gdb_puts (paddress (gdbarch,
1591 psymtab->text_high (objfile)));
1593 gdb_printf (" globals ");
1594 if (!psymtab->global_psymbols.empty ())
1596 ("(* (struct partial_symbol **) %s @ %d)\n",
1597 host_address_to_string (psymtab->global_psymbols.data ()),
1598 (int) psymtab->global_psymbols.size ());
1600 gdb_printf ("(none)\n");
1601 gdb_printf (" statics ");
1602 if (!psymtab->static_psymbols.empty ())
1604 ("(* (struct partial_symbol **) %s @ %d)\n",
1605 host_address_to_string (psymtab->static_psymbols.data ()),
1606 (int) psymtab->static_psymbols.size ());
1608 gdb_printf ("(none)\n");
1610 gdb_printf (" user %s "
1611 "((struct partial_symtab *) %s)\n",
1612 psymtab->user->filename,
1613 host_address_to_string (psymtab->user));
1614 gdb_printf (" dependencies ");
1615 if (psymtab->number_of_dependencies)
1620 for (i = 0; i < psymtab->number_of_dependencies; i++)
1622 struct partial_symtab *dep = psymtab->dependencies[i];
1624 /* Note the string concatenation there --- no
1626 gdb_printf (" psymtab %s "
1627 "((struct partial_symtab *) %s)\n",
1629 host_address_to_string (dep));
1631 gdb_printf (" }\n");
1634 gdb_printf ("(none)\n");
1635 gdb_printf (" }\n");
1640 if (printed_objfile_start)
1645 /* Check consistency of currently expanded psymtabs vs symtabs. */
1648 maintenance_check_psymtabs (const char *ignore, int from_tty)
1651 struct compunit_symtab *cust = NULL;
1652 const struct blockvector *bv;
1653 const struct block *b;
1655 for (objfile *objfile : current_program_space->objfiles ())
1657 for (const auto &iter : objfile->qf)
1659 psymbol_functions *psf
1660 = dynamic_cast<psymbol_functions *> (iter.get ());
1664 for (partial_symtab *ps : psf->partial_symbols (objfile))
1666 struct gdbarch *gdbarch = objfile->arch ();
1668 /* We don't call psymtab_to_symtab here because that may cause symtab
1669 expansion. When debugging a problem it helps if checkers leave
1670 things unchanged. */
1671 cust = ps->get_compunit_symtab (objfile);
1673 /* First do some checks that don't require the associated symtab. */
1674 if (ps->text_high (objfile) < ps->text_low (objfile))
1676 gdb_printf ("Psymtab ");
1677 gdb_puts (ps->filename);
1678 gdb_printf (" covers bad range ");
1679 gdb_puts (paddress (gdbarch, ps->text_low (objfile)));
1681 gdb_puts (paddress (gdbarch, ps->text_high (objfile)));
1686 /* Now do checks requiring the associated symtab. */
1689 bv = cust->blockvector ();
1690 b = bv->static_block ();
1691 for (partial_symbol *psym : ps->static_psymbols)
1693 /* Skip symbols for inlined functions without address. These may
1694 or may not have a match in the full symtab. */
1695 if (psym->aclass == LOC_BLOCK
1696 && psym->ginfo.value_address () == 0)
1699 sym = block_lookup_symbol (b, psym->ginfo.search_name (),
1700 symbol_name_match_type::SEARCH_NAME,
1704 gdb_printf ("Static symbol `");
1705 gdb_puts (psym->ginfo.linkage_name ());
1706 gdb_printf ("' only found in ");
1707 gdb_puts (ps->filename);
1708 gdb_printf (" psymtab\n");
1711 b = bv->global_block ();
1712 for (partial_symbol *psym : ps->global_psymbols)
1714 sym = block_lookup_symbol (b, psym->ginfo.search_name (),
1715 symbol_name_match_type::SEARCH_NAME,
1719 gdb_printf ("Global symbol `");
1720 gdb_puts (psym->ginfo.linkage_name ());
1721 gdb_printf ("' only found in ");
1722 gdb_puts (ps->filename);
1723 gdb_printf (" psymtab\n");
1726 if (ps->raw_text_high () != 0
1727 && (ps->text_low (objfile) < b->start ()
1728 || ps->text_high (objfile) > b->end ()))
1730 gdb_printf ("Psymtab ");
1731 gdb_puts (ps->filename);
1732 gdb_printf (" covers ");
1733 gdb_puts (paddress (gdbarch, ps->text_low (objfile)));
1735 gdb_puts (paddress (gdbarch, ps->text_high (objfile)));
1736 gdb_printf (" but symtab covers only ");
1737 gdb_puts (paddress (gdbarch, b->start ()));
1739 gdb_puts (paddress (gdbarch, b->end ()));
1747 void _initialize_psymtab ();
1749 _initialize_psymtab ()
1751 add_cmd ("psymbols", class_maintenance, maintenance_print_psymbols, _("\
1752 Print dump of current partial symbol definitions.\n\
1753 Usage: mt print psymbols [-objfile OBJFILE] [-pc ADDRESS] [--] [OUTFILE]\n\
1754 mt print psymbols [-objfile OBJFILE] [-source SOURCE] [--] [OUTFILE]\n\
1755 Entries in the partial symbol table are dumped to file OUTFILE,\n\
1756 or the terminal if OUTFILE is unspecified.\n\
1757 If ADDRESS is provided, dump only the file for that address.\n\
1758 If SOURCE is provided, dump only that file's symbols.\n\
1759 If OBJFILE is provided, dump only that file's minimal symbols."),
1760 &maintenanceprintlist);
1762 add_cmd ("psymtabs", class_maintenance, maintenance_info_psymtabs, _("\
1763 List the partial symbol tables for all object files.\n\
1764 This does not include information about individual partial symbols,\n\
1765 just the symbol table structures themselves."),
1766 &maintenanceinfolist);
1768 add_cmd ("check-psymtabs", class_maintenance, maintenance_check_psymtabs,
1770 Check consistency of currently expanded psymtabs versus symtabs."),