Document the GDB 10.2 release in gdb/ChangeLog
[binutils-gdb.git] / gdb / psymtab.c
blob75a307c89aa31c93f950589b7f249e3718c4a2c1
1 /* Partial symbol tables.
3 Copyright (C) 2009-2021 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/>. */
20 #include "defs.h"
21 #include "symtab.h"
22 #include "objfiles.h"
23 #include "psympriv.h"
24 #include "block.h"
25 #include "filenames.h"
26 #include "source.h"
27 #include "addrmap.h"
28 #include "gdbtypes.h"
29 #include "ui-out.h"
30 #include "command.h"
31 #include "readline/tilde.h"
32 #include "gdb_regex.h"
33 #include "dictionary.h"
34 #include "language.h"
35 #include "cp-support.h"
36 #include "gdbcmd.h"
37 #include <algorithm>
38 #include <set>
40 static struct partial_symbol *lookup_partial_symbol (struct objfile *,
41 struct partial_symtab *,
42 const lookup_name_info &,
43 int,
44 domain_enum);
46 static const char *psymtab_to_fullname (struct partial_symtab *ps);
48 static struct partial_symbol *find_pc_sect_psymbol (struct objfile *,
49 struct partial_symtab *,
50 CORE_ADDR,
51 struct obj_section *);
53 static struct compunit_symtab *psymtab_to_symtab (struct objfile *objfile,
54 struct partial_symtab *pst);
56 psymtab_storage::~psymtab_storage ()
58 partial_symtab *iter = psymtabs;
59 while (iter != nullptr)
61 partial_symtab *next = iter->next;
62 delete iter;
63 iter = next;
67 /* See psymtab.h. */
69 void
70 psymtab_storage::install_psymtab (partial_symtab *pst)
72 pst->next = psymtabs;
73 psymtabs = pst;
78 /* Ensure that the partial symbols for OBJFILE have been loaded. This
79 will print a message when symbols are loaded. This function
80 returns a range adapter suitable for iterating over the psymtabs of
81 OBJFILE. */
83 psymtab_storage::partial_symtab_range
84 psymbol_functions::require_partial_symbols (struct objfile *objfile)
86 objfile->require_partial_symbols (true);
87 return m_partial_symtabs->range ();
90 /* Find which partial symtab contains PC and SECTION starting at psymtab PST.
91 We may find a different psymtab than PST. See FIND_PC_SECT_PSYMTAB. */
93 static struct partial_symtab *
94 find_pc_sect_psymtab_closer (struct objfile *objfile,
95 CORE_ADDR pc, struct obj_section *section,
96 struct partial_symtab *pst,
97 struct bound_minimal_symbol msymbol)
99 struct partial_symtab *tpst;
100 struct partial_symtab *best_pst = pst;
101 CORE_ADDR best_addr = pst->text_low (objfile);
103 gdb_assert (!pst->psymtabs_addrmap_supported);
105 /* An objfile that has its functions reordered might have
106 many partial symbol tables containing the PC, but
107 we want the partial symbol table that contains the
108 function containing the PC. */
109 if (!(objfile->flags & OBJF_REORDERED)
110 && section == NULL) /* Can't validate section this way. */
111 return pst;
113 if (msymbol.minsym == NULL)
114 return pst;
116 /* The code range of partial symtabs sometimes overlap, so, in
117 the loop below, we need to check all partial symtabs and
118 find the one that fits better for the given PC address. We
119 select the partial symtab that contains a symbol whose
120 address is closest to the PC address. By closest we mean
121 that find_pc_sect_symbol returns the symbol with address
122 that is closest and still less than the given PC. */
123 for (tpst = pst; tpst != NULL; tpst = tpst->next)
125 if (pc >= tpst->text_low (objfile) && pc < tpst->text_high (objfile))
127 struct partial_symbol *p;
128 CORE_ADDR this_addr;
130 /* NOTE: This assumes that every psymbol has a
131 corresponding msymbol, which is not necessarily
132 true; the debug info might be much richer than the
133 object's symbol table. */
134 p = find_pc_sect_psymbol (objfile, tpst, pc, section);
135 if (p != NULL
136 && (p->address (objfile) == BMSYMBOL_VALUE_ADDRESS (msymbol)))
137 return tpst;
139 /* Also accept the textlow value of a psymtab as a
140 "symbol", to provide some support for partial
141 symbol tables with line information but no debug
142 symbols (e.g. those produced by an assembler). */
143 if (p != NULL)
144 this_addr = p->address (objfile);
145 else
146 this_addr = tpst->text_low (objfile);
148 /* Check whether it is closer than our current
149 BEST_ADDR. Since this symbol address is
150 necessarily lower or equal to PC, the symbol closer
151 to PC is the symbol which address is the highest.
152 This way we return the psymtab which contains such
153 best match symbol. This can help in cases where the
154 symbol information/debuginfo is not complete, like
155 for instance on IRIX6 with gcc, where no debug info
156 is emitted for statics. (See also the nodebug.exp
157 testcase.) */
158 if (this_addr > best_addr)
160 best_addr = this_addr;
161 best_pst = tpst;
165 return best_pst;
168 /* See psympriv.h. */
170 struct partial_symtab *
171 psymbol_functions::find_pc_sect_psymtab (struct objfile *objfile,
172 CORE_ADDR pc,
173 struct obj_section *section,
174 struct bound_minimal_symbol msymbol)
176 /* Try just the PSYMTABS_ADDRMAP mapping first as it has better
177 granularity than the later used TEXTLOW/TEXTHIGH one. However, we need
178 to take care as the PSYMTABS_ADDRMAP can hold things other than partial
179 symtabs in some cases.
181 This function should only be called for objfiles that are using partial
182 symtabs, not for objfiles that are using indexes (.gdb_index or
183 .debug_names), however 'maintenance print psymbols' calls this function
184 directly for all objfiles. If we assume that PSYMTABS_ADDRMAP contains
185 partial symtabs then we will end up returning a pointer to an object
186 that is not a partial_symtab, which doesn't end well. */
188 if (m_partial_symtabs->psymtabs != NULL
189 && m_partial_symtabs->psymtabs_addrmap != NULL)
191 CORE_ADDR baseaddr = objfile->text_section_offset ();
193 struct partial_symtab *pst
194 = ((struct partial_symtab *)
195 addrmap_find (m_partial_symtabs->psymtabs_addrmap,
196 pc - baseaddr));
197 if (pst != NULL)
199 /* FIXME: addrmaps currently do not handle overlayed sections,
200 so fall back to the non-addrmap case if we're debugging
201 overlays and the addrmap returned the wrong section. */
202 if (overlay_debugging && msymbol.minsym != NULL && section != NULL)
204 struct partial_symbol *p;
206 /* NOTE: This assumes that every psymbol has a
207 corresponding msymbol, which is not necessarily
208 true; the debug info might be much richer than the
209 object's symbol table. */
210 p = find_pc_sect_psymbol (objfile, pst, pc, section);
211 if (p == NULL
212 || (p->address (objfile)
213 != BMSYMBOL_VALUE_ADDRESS (msymbol)))
214 goto next;
217 /* We do not try to call FIND_PC_SECT_PSYMTAB_CLOSER as
218 PSYMTABS_ADDRMAP we used has already the best 1-byte
219 granularity and FIND_PC_SECT_PSYMTAB_CLOSER may mislead us into
220 a worse chosen section due to the TEXTLOW/TEXTHIGH ranges
221 overlap. */
223 return pst;
227 next:
229 /* Existing PSYMTABS_ADDRMAP mapping is present even for PARTIAL_SYMTABs
230 which still have no corresponding full SYMTABs read. But it is not
231 present for non-DWARF2 debug infos not supporting PSYMTABS_ADDRMAP in GDB
232 so far. */
234 /* Check even OBJFILE with non-zero PSYMTABS_ADDRMAP as only several of
235 its CUs may be missing in PSYMTABS_ADDRMAP as they may be varying
236 debug info type in single OBJFILE. */
238 for (partial_symtab *pst : require_partial_symbols (objfile))
239 if (!pst->psymtabs_addrmap_supported
240 && pc >= pst->text_low (objfile) && pc < pst->text_high (objfile))
242 struct partial_symtab *best_pst;
244 best_pst = find_pc_sect_psymtab_closer (objfile, pc, section, pst,
245 msymbol);
246 if (best_pst != NULL)
247 return best_pst;
250 return NULL;
253 /* Psymtab version of find_pc_sect_compunit_symtab. See its definition in
254 the definition of quick_symbol_functions in symfile.h. */
256 struct compunit_symtab *
257 psymbol_functions::find_pc_sect_compunit_symtab
258 (struct objfile *objfile,
259 struct bound_minimal_symbol msymbol,
260 CORE_ADDR pc,
261 struct obj_section *section,
262 int warn_if_readin)
264 struct partial_symtab *ps = find_pc_sect_psymtab (objfile,
265 pc, section,
266 msymbol);
267 if (ps != NULL)
269 if (warn_if_readin && ps->readin_p (objfile))
270 /* Might want to error() here (in case symtab is corrupt and
271 will cause a core dump), but maybe we can successfully
272 continue, so let's not. */
273 warning (_("\
274 (Internal error: pc %s in read in psymtab, but not in symtab.)\n"),
275 paddress (objfile->arch (), pc));
276 psymtab_to_symtab (objfile, ps);
277 return ps->get_compunit_symtab (objfile);
279 return NULL;
282 /* Find which partial symbol within a psymtab matches PC and SECTION.
283 Return NULL if none. */
285 static struct partial_symbol *
286 find_pc_sect_psymbol (struct objfile *objfile,
287 struct partial_symtab *psymtab, CORE_ADDR pc,
288 struct obj_section *section)
290 struct partial_symbol *best = NULL;
291 CORE_ADDR best_pc;
292 const CORE_ADDR textlow = psymtab->text_low (objfile);
294 gdb_assert (psymtab != NULL);
296 /* Cope with programs that start at address 0. */
297 best_pc = (textlow != 0) ? textlow - 1 : 0;
299 /* Search the global symbols as well as the static symbols, so that
300 find_pc_partial_function doesn't use a minimal symbol and thus
301 cache a bad endaddr. */
302 for (partial_symbol *p : psymtab->global_psymbols)
304 if (p->domain == VAR_DOMAIN
305 && p->aclass == LOC_BLOCK
306 && pc >= p->address (objfile)
307 && (p->address (objfile) > best_pc
308 || (psymtab->text_low (objfile) == 0
309 && best_pc == 0 && p->address (objfile) == 0)))
311 if (section != NULL) /* Match on a specific section. */
313 if (!matching_obj_sections (p->obj_section (objfile),
314 section))
315 continue;
317 best_pc = p->address (objfile);
318 best = p;
322 for (partial_symbol *p : psymtab->static_psymbols)
324 if (p->domain == VAR_DOMAIN
325 && p->aclass == LOC_BLOCK
326 && pc >= p->address (objfile)
327 && (p->address (objfile) > best_pc
328 || (psymtab->text_low (objfile) == 0
329 && best_pc == 0 && p->address (objfile) == 0)))
331 if (section != NULL) /* Match on a specific section. */
333 if (!matching_obj_sections (p->obj_section (objfile),
334 section))
335 continue;
337 best_pc = p->address (objfile);
338 best = p;
342 return best;
345 /* Psymtab version of lookup_global_symbol_language. See its definition in
346 the definition of quick_symbol_functions in symfile.h. */
348 enum language
349 psymbol_functions::lookup_global_symbol_language (struct objfile *objfile,
350 const char *name,
351 domain_enum domain,
352 bool *symbol_found_p)
354 *symbol_found_p = false;
355 if (objfile->sf == NULL)
356 return language_unknown;
358 lookup_name_info lookup_name (name, symbol_name_match_type::FULL);
360 for (partial_symtab *ps : require_partial_symbols (objfile))
362 struct partial_symbol *psym;
363 if (ps->readin_p (objfile))
364 continue;
366 psym = lookup_partial_symbol (objfile, ps, lookup_name, 1, domain);
367 if (psym)
369 *symbol_found_p = true;
370 return psym->ginfo.language ();
374 return language_unknown;
377 /* Returns true if PSYM matches LOOKUP_NAME. */
379 static bool
380 psymbol_name_matches (partial_symbol *psym,
381 const lookup_name_info &lookup_name)
383 const language_defn *lang = language_def (psym->ginfo.language ());
384 symbol_name_matcher_ftype *name_match
385 = lang->get_symbol_name_matcher (lookup_name);
386 return name_match (psym->ginfo.search_name (), lookup_name, NULL);
389 /* Look in PST for a symbol in DOMAIN whose name matches NAME. Search
390 the global block of PST if GLOBAL, and otherwise the static block.
391 MATCH is the comparison operation that returns true iff MATCH (s,
392 NAME), where s is a SYMBOL_SEARCH_NAME. If ORDERED_COMPARE is
393 non-null, the symbols in the block are assumed to be ordered
394 according to it (allowing binary search). It must be compatible
395 with MATCH. Returns the symbol, if found, and otherwise NULL. */
397 static struct partial_symbol *
398 match_partial_symbol (struct objfile *objfile,
399 struct partial_symtab *pst, int global,
400 const lookup_name_info &name, domain_enum domain,
401 symbol_compare_ftype *ordered_compare)
403 struct partial_symbol **start, **psym;
404 struct partial_symbol **top, **real_top, **bottom, **center;
405 int length = (global
406 ? pst->global_psymbols.size ()
407 : pst->static_psymbols.size ());
408 int do_linear_search = 1;
410 if (length == 0)
411 return NULL;
413 start = (global ?
414 &pst->global_psymbols[0] :
415 &pst->static_psymbols[0]);
417 if (global && ordered_compare) /* Can use a binary search. */
419 do_linear_search = 0;
421 /* Binary search. This search is guaranteed to end with center
422 pointing at the earliest partial symbol whose name might be
423 correct. At that point *all* partial symbols with an
424 appropriate name will be checked against the correct
425 domain. */
427 bottom = start;
428 top = start + length - 1;
429 real_top = top;
430 while (top > bottom)
432 center = bottom + (top - bottom) / 2;
433 gdb_assert (center < top);
435 enum language lang = (*center)->ginfo.language ();
436 const char *lang_ln = name.language_lookup_name (lang);
438 if (ordered_compare ((*center)->ginfo.search_name (),
439 lang_ln) >= 0)
440 top = center;
441 else
442 bottom = center + 1;
444 gdb_assert (top == bottom);
446 while (top <= real_top
447 && psymbol_name_matches (*top, name))
449 if (symbol_matches_domain ((*top)->ginfo.language (),
450 (*top)->domain, domain))
451 return *top;
452 top++;
456 /* Can't use a binary search or else we found during the binary search that
457 we should also do a linear search. */
459 if (do_linear_search)
461 for (psym = start; psym < start + length; psym++)
463 if (symbol_matches_domain ((*psym)->ginfo.language (),
464 (*psym)->domain, domain)
465 && psymbol_name_matches (*psym, name))
466 return *psym;
470 return NULL;
473 /* Look, in partial_symtab PST, for symbol whose natural name is
474 LOOKUP_NAME. Check the global symbols if GLOBAL, the static
475 symbols if not. */
477 static struct partial_symbol *
478 lookup_partial_symbol (struct objfile *objfile,
479 struct partial_symtab *pst,
480 const lookup_name_info &lookup_name,
481 int global, domain_enum domain)
483 struct partial_symbol **start, **psym;
484 struct partial_symbol **top, **real_top, **bottom, **center;
485 int length = (global
486 ? pst->global_psymbols.size ()
487 : pst->static_psymbols.size ());
488 int do_linear_search = 1;
490 if (length == 0)
491 return NULL;
493 start = (global ?
494 &pst->global_psymbols[0] :
495 &pst->static_psymbols[0]);
497 if (global) /* This means we can use a binary search. */
499 do_linear_search = 0;
501 /* Binary search. This search is guaranteed to end with center
502 pointing at the earliest partial symbol whose name might be
503 correct. At that point *all* partial symbols with an
504 appropriate name will be checked against the correct
505 domain. */
507 bottom = start;
508 top = start + length - 1;
509 real_top = top;
510 while (top > bottom)
512 center = bottom + (top - bottom) / 2;
514 gdb_assert (center < top);
516 if (strcmp_iw_ordered ((*center)->ginfo.search_name (),
517 lookup_name.c_str ()) >= 0)
519 top = center;
521 else
523 bottom = center + 1;
527 gdb_assert (top == bottom);
529 /* For `case_sensitivity == case_sensitive_off' strcmp_iw_ordered will
530 search more exactly than what matches SYMBOL_MATCHES_SEARCH_NAME. */
531 while (top >= start && symbol_matches_search_name (&(*top)->ginfo,
532 lookup_name))
533 top--;
535 /* Fixup to have a symbol which matches SYMBOL_MATCHES_SEARCH_NAME. */
536 top++;
538 while (top <= real_top && symbol_matches_search_name (&(*top)->ginfo,
539 lookup_name))
541 if (symbol_matches_domain ((*top)->ginfo.language (),
542 (*top)->domain, domain))
543 return *top;
544 top++;
548 /* Can't use a binary search or else we found during the binary search that
549 we should also do a linear search. */
551 if (do_linear_search)
553 for (psym = start; psym < start + length; psym++)
555 if (symbol_matches_domain ((*psym)->ginfo.language (),
556 (*psym)->domain, domain)
557 && symbol_matches_search_name (&(*psym)->ginfo, lookup_name))
558 return *psym;
562 return NULL;
565 /* Get the symbol table that corresponds to a partial_symtab.
566 This is fast after the first time you do it.
567 The result will be NULL if the primary symtab has no symbols,
568 which can happen. Otherwise the result is the primary symtab
569 that contains PST. */
571 static struct compunit_symtab *
572 psymtab_to_symtab (struct objfile *objfile, struct partial_symtab *pst)
574 /* If it is a shared psymtab, find an unshared psymtab that includes
575 it. Any such psymtab will do. */
576 while (pst->user != NULL)
577 pst = pst->user;
579 /* If it's been looked up before, return it. */
580 if (pst->get_compunit_symtab (objfile))
581 return pst->get_compunit_symtab (objfile);
583 /* If it has not yet been read in, read it. */
584 if (!pst->readin_p (objfile))
586 scoped_restore decrementer = increment_reading_symtab ();
588 if (info_verbose)
590 printf_filtered (_("Reading in symbols for %s...\n"),
591 pst->filename);
592 gdb_flush (gdb_stdout);
595 pst->read_symtab (objfile);
598 return pst->get_compunit_symtab (objfile);
601 /* Psymtab version of find_last_source_symtab. See its definition in
602 the definition of quick_symbol_functions in symfile.h. */
604 struct symtab *
605 psymbol_functions::find_last_source_symtab (struct objfile *ofp)
607 struct partial_symtab *cs_pst = NULL;
609 for (partial_symtab *ps : require_partial_symbols (ofp))
611 const char *name = ps->filename;
612 int len = strlen (name);
614 if (!(len > 2 && (strcmp (&name[len - 2], ".h") == 0
615 || strcmp (name, "<<C++-namespaces>>") == 0)))
616 cs_pst = ps;
619 if (cs_pst)
621 if (cs_pst->readin_p (ofp))
623 internal_error (__FILE__, __LINE__,
624 _("select_source_symtab: "
625 "readin pst found and no symtabs."));
627 else
629 struct compunit_symtab *cust = psymtab_to_symtab (ofp, cs_pst);
631 if (cust == NULL)
632 return NULL;
633 return compunit_primary_filetab (cust);
636 return NULL;
639 /* Psymtab version of forget_cached_source_info. See its definition in
640 the definition of quick_symbol_functions in symfile.h. */
642 void
643 psymbol_functions::forget_cached_source_info (struct objfile *objfile)
645 for (partial_symtab *pst : require_partial_symbols (objfile))
647 if (pst->fullname != NULL)
649 xfree (pst->fullname);
650 pst->fullname = NULL;
655 static void
656 print_partial_symbols (struct gdbarch *gdbarch, struct objfile *objfile,
657 const std::vector<partial_symbol *> &symbols,
658 const char *what, struct ui_file *outfile)
660 fprintf_filtered (outfile, " %s partial symbols:\n", what);
661 for (partial_symbol *p : symbols)
663 QUIT;
664 fprintf_filtered (outfile, " `%s'", p->ginfo.linkage_name ());
665 if (p->ginfo.demangled_name () != NULL)
667 fprintf_filtered (outfile, " `%s'",
668 p->ginfo.demangled_name ());
670 fputs_filtered (", ", outfile);
671 switch (p->domain)
673 case UNDEF_DOMAIN:
674 fputs_filtered ("undefined domain, ", outfile);
675 break;
676 case VAR_DOMAIN:
677 /* This is the usual thing -- don't print it. */
678 break;
679 case STRUCT_DOMAIN:
680 fputs_filtered ("struct domain, ", outfile);
681 break;
682 case MODULE_DOMAIN:
683 fputs_filtered ("module domain, ", outfile);
684 break;
685 case LABEL_DOMAIN:
686 fputs_filtered ("label domain, ", outfile);
687 break;
688 case COMMON_BLOCK_DOMAIN:
689 fputs_filtered ("common block domain, ", outfile);
690 break;
691 default:
692 fputs_filtered ("<invalid domain>, ", outfile);
693 break;
695 switch (p->aclass)
697 case LOC_UNDEF:
698 fputs_filtered ("undefined", outfile);
699 break;
700 case LOC_CONST:
701 fputs_filtered ("constant int", outfile);
702 break;
703 case LOC_STATIC:
704 fputs_filtered ("static", outfile);
705 break;
706 case LOC_REGISTER:
707 fputs_filtered ("register", outfile);
708 break;
709 case LOC_ARG:
710 fputs_filtered ("pass by value", outfile);
711 break;
712 case LOC_REF_ARG:
713 fputs_filtered ("pass by reference", outfile);
714 break;
715 case LOC_REGPARM_ADDR:
716 fputs_filtered ("register address parameter", outfile);
717 break;
718 case LOC_LOCAL:
719 fputs_filtered ("stack parameter", outfile);
720 break;
721 case LOC_TYPEDEF:
722 fputs_filtered ("type", outfile);
723 break;
724 case LOC_LABEL:
725 fputs_filtered ("label", outfile);
726 break;
727 case LOC_BLOCK:
728 fputs_filtered ("function", outfile);
729 break;
730 case LOC_CONST_BYTES:
731 fputs_filtered ("constant bytes", outfile);
732 break;
733 case LOC_UNRESOLVED:
734 fputs_filtered ("unresolved", outfile);
735 break;
736 case LOC_OPTIMIZED_OUT:
737 fputs_filtered ("optimized out", outfile);
738 break;
739 case LOC_COMPUTED:
740 fputs_filtered ("computed at runtime", outfile);
741 break;
742 default:
743 fputs_filtered ("<invalid location>", outfile);
744 break;
746 fputs_filtered (", ", outfile);
747 fputs_filtered (paddress (gdbarch, p->unrelocated_address ()), outfile);
748 fprintf_filtered (outfile, "\n");
752 static void
753 dump_psymtab (struct objfile *objfile, struct partial_symtab *psymtab,
754 struct ui_file *outfile)
756 struct gdbarch *gdbarch = objfile->arch ();
757 int i;
759 if (psymtab->anonymous)
761 fprintf_filtered (outfile, "\nAnonymous partial symtab (%s) ",
762 psymtab->filename);
764 else
766 fprintf_filtered (outfile, "\nPartial symtab for source file %s ",
767 psymtab->filename);
769 fprintf_filtered (outfile, "(object ");
770 gdb_print_host_address (psymtab, outfile);
771 fprintf_filtered (outfile, ")\n\n");
772 fprintf_filtered (outfile, " Read from object file %s (",
773 objfile_name (objfile));
774 gdb_print_host_address (objfile, outfile);
775 fprintf_filtered (outfile, ")\n");
777 if (psymtab->readin_p (objfile))
779 fprintf_filtered (outfile,
780 " Full symtab was read (at ");
781 gdb_print_host_address (psymtab->get_compunit_symtab (objfile), outfile);
782 fprintf_filtered (outfile, ")\n");
785 fprintf_filtered (outfile, " Symbols cover text addresses ");
786 fputs_filtered (paddress (gdbarch, psymtab->text_low (objfile)), outfile);
787 fprintf_filtered (outfile, "-");
788 fputs_filtered (paddress (gdbarch, psymtab->text_high (objfile)), outfile);
789 fprintf_filtered (outfile, "\n");
790 fprintf_filtered (outfile, " Address map supported - %s.\n",
791 psymtab->psymtabs_addrmap_supported ? "yes" : "no");
792 fprintf_filtered (outfile, " Depends on %d other partial symtabs.\n",
793 psymtab->number_of_dependencies);
794 for (i = 0; i < psymtab->number_of_dependencies; i++)
796 fprintf_filtered (outfile, " %d ", i);
797 gdb_print_host_address (psymtab->dependencies[i], outfile);
798 fprintf_filtered (outfile, " %s\n",
799 psymtab->dependencies[i]->filename);
801 if (psymtab->user != NULL)
803 fprintf_filtered (outfile, " Shared partial symtab with user ");
804 gdb_print_host_address (psymtab->user, outfile);
805 fprintf_filtered (outfile, "\n");
807 if (!psymtab->global_psymbols.empty ())
809 print_partial_symbols
810 (gdbarch, objfile, psymtab->global_psymbols,
811 "Global", outfile);
813 if (!psymtab->static_psymbols.empty ())
815 print_partial_symbols
816 (gdbarch, objfile, psymtab->static_psymbols,
817 "Static", outfile);
819 fprintf_filtered (outfile, "\n");
822 /* Count the number of partial symbols in OBJFILE. */
825 psymbol_functions::count_psyms ()
827 int count = 0;
828 for (partial_symtab *pst : m_partial_symtabs->range ())
830 count += pst->global_psymbols.size ();
831 count += pst->static_psymbols.size ();
833 return count;
836 /* Psymtab version of print_stats. See its definition in
837 the definition of quick_symbol_functions in symfile.h. */
839 void
840 psymbol_functions::print_stats (struct objfile *objfile, bool print_bcache)
842 int i;
844 if (!print_bcache)
846 int n_psyms = count_psyms ();
847 if (n_psyms > 0)
848 printf_filtered (_(" Number of \"partial\" symbols read: %d\n"),
849 n_psyms);
851 i = 0;
852 for (partial_symtab *ps : require_partial_symbols (objfile))
854 if (!ps->readin_p (objfile))
855 i++;
857 printf_filtered (_(" Number of psym tables (not yet expanded): %d\n"),
859 printf_filtered (_(" Total memory used for psymbol cache: %d\n"),
860 m_partial_symtabs->psymbol_cache.memory_used ());
862 else
864 printf_filtered (_("Psymbol byte cache statistics:\n"));
865 m_partial_symtabs->psymbol_cache.print_statistics
866 ("partial symbol cache");
870 /* Psymtab version of dump. See its definition in
871 the definition of quick_symbol_functions in symfile.h. */
873 void
874 psymbol_functions::dump (struct objfile *objfile)
876 struct partial_symtab *psymtab;
878 if (m_partial_symtabs->psymtabs)
880 printf_filtered ("Psymtabs:\n");
881 for (psymtab = m_partial_symtabs->psymtabs;
882 psymtab != NULL;
883 psymtab = psymtab->next)
885 printf_filtered ("%s at ",
886 psymtab->filename);
887 gdb_print_host_address (psymtab, gdb_stdout);
888 printf_filtered (", ");
889 wrap_here (" ");
891 printf_filtered ("\n\n");
895 /* Psymtab version of expand_all_symtabs. See its definition in
896 the definition of quick_symbol_functions in symfile.h. */
898 void
899 psymbol_functions::expand_all_symtabs (struct objfile *objfile)
901 for (partial_symtab *psymtab : require_partial_symbols (objfile))
902 psymtab_to_symtab (objfile, psymtab);
905 /* Psymtab version of map_symbol_filenames. See its definition in
906 the definition of quick_symbol_functions in symfile.h. */
908 void
909 psymbol_functions::map_symbol_filenames
910 (struct objfile *objfile,
911 gdb::function_view<symbol_filename_ftype> fun,
912 bool need_fullname)
914 for (partial_symtab *ps : require_partial_symbols (objfile))
916 const char *fullname;
918 if (ps->readin_p (objfile))
919 continue;
921 /* We can skip shared psymtabs here, because any file name will be
922 attached to the unshared psymtab. */
923 if (ps->user != NULL)
924 continue;
926 /* Anonymous psymtabs don't have a file name. */
927 if (ps->anonymous)
928 continue;
930 QUIT;
931 if (need_fullname)
932 fullname = psymtab_to_fullname (ps);
933 else
934 fullname = NULL;
935 fun (ps->filename, fullname);
939 /* Finds the fullname that a partial_symtab represents.
941 If this functions finds the fullname, it will save it in ps->fullname
942 and it will also return the value.
944 If this function fails to find the file that this partial_symtab represents,
945 NULL will be returned and ps->fullname will be set to NULL. */
947 static const char *
948 psymtab_to_fullname (struct partial_symtab *ps)
950 gdb_assert (!ps->anonymous);
952 /* Use cached copy if we have it.
953 We rely on forget_cached_source_info being called appropriately
954 to handle cases like the file being moved. */
955 if (ps->fullname == NULL)
957 gdb::unique_xmalloc_ptr<char> fullname;
958 scoped_fd fd = find_and_open_source (ps->filename, ps->dirname,
959 &fullname);
960 ps->fullname = fullname.release ();
962 if (fd.get () < 0)
964 /* rewrite_source_path would be applied by find_and_open_source, we
965 should report the pathname where GDB tried to find the file. */
967 if (ps->dirname == NULL || IS_ABSOLUTE_PATH (ps->filename))
968 fullname.reset (xstrdup (ps->filename));
969 else
970 fullname.reset (concat (ps->dirname, SLASH_STRING,
971 ps->filename, (char *) NULL));
973 ps->fullname = rewrite_source_path (fullname.get ()).release ();
974 if (ps->fullname == NULL)
975 ps->fullname = fullname.release ();
979 return ps->fullname;
982 /* Psymtab version of expand_matching_symbols. See its definition in
983 the definition of quick_symbol_functions in symfile.h. */
985 void
986 psymbol_functions::expand_matching_symbols
987 (struct objfile *objfile,
988 const lookup_name_info &name, domain_enum domain,
989 int global,
990 symbol_compare_ftype *ordered_compare)
992 for (partial_symtab *ps : require_partial_symbols (objfile))
994 QUIT;
995 if (!ps->readin_p (objfile)
996 && match_partial_symbol (objfile, ps, global, name, domain,
997 ordered_compare))
998 psymtab_to_symtab (objfile, ps);
1002 /* A helper for psym_expand_symtabs_matching that handles searching
1003 included psymtabs. This returns true if a symbol is found, and
1004 false otherwise. It also updates the 'searched_flag' on the
1005 various psymtabs that it searches. */
1007 static bool
1008 recursively_search_psymtabs
1009 (struct partial_symtab *ps,
1010 struct objfile *objfile,
1011 block_search_flags search_flags,
1012 domain_enum domain,
1013 enum search_domain search,
1014 const lookup_name_info &lookup_name,
1015 gdb::function_view<expand_symtabs_symbol_matcher_ftype> sym_matcher)
1017 int keep_going = 1;
1018 enum psymtab_search_status result = PST_SEARCHED_AND_NOT_FOUND;
1019 int i;
1021 if (ps->searched_flag != PST_NOT_SEARCHED)
1022 return ps->searched_flag == PST_SEARCHED_AND_FOUND;
1024 /* Recurse into shared psymtabs first, because they may have already
1025 been searched, and this could save some time. */
1026 for (i = 0; i < ps->number_of_dependencies; ++i)
1028 int r;
1030 /* Skip non-shared dependencies, these are handled elsewhere. */
1031 if (ps->dependencies[i]->user == NULL)
1032 continue;
1034 r = recursively_search_psymtabs (ps->dependencies[i],
1035 objfile, search_flags, domain, search,
1036 lookup_name, sym_matcher);
1037 if (r != 0)
1039 ps->searched_flag = PST_SEARCHED_AND_FOUND;
1040 return true;
1044 partial_symbol **gbound = (ps->global_psymbols.data ()
1045 + ps->global_psymbols.size ());
1046 partial_symbol **sbound = (ps->static_psymbols.data ()
1047 + ps->static_psymbols.size ());
1048 partial_symbol **bound = gbound;
1050 /* Go through all of the symbols stored in a partial
1051 symtab in one loop. */
1052 partial_symbol **psym = ps->global_psymbols.data ();
1054 if ((search_flags & SEARCH_GLOBAL_BLOCK) == 0)
1056 if (ps->static_psymbols.empty ())
1057 keep_going = 0;
1058 else
1060 psym = ps->static_psymbols.data ();
1061 bound = sbound;
1065 while (keep_going)
1067 if (psym >= bound)
1069 if (bound == gbound && !ps->static_psymbols.empty ()
1070 && (search_flags & SEARCH_STATIC_BLOCK) != 0)
1072 psym = ps->static_psymbols.data ();
1073 bound = sbound;
1075 else
1076 keep_going = 0;
1077 continue;
1079 else
1081 QUIT;
1083 if ((domain == UNDEF_DOMAIN
1084 || symbol_matches_domain ((*psym)->ginfo.language (),
1085 (*psym)->domain, domain))
1086 && (search == ALL_DOMAIN
1087 || (search == MODULES_DOMAIN
1088 && (*psym)->domain == MODULE_DOMAIN)
1089 || (search == VARIABLES_DOMAIN
1090 && (*psym)->aclass != LOC_TYPEDEF
1091 && (*psym)->aclass != LOC_BLOCK)
1092 || (search == FUNCTIONS_DOMAIN
1093 && (*psym)->aclass == LOC_BLOCK)
1094 || (search == TYPES_DOMAIN
1095 && (*psym)->aclass == LOC_TYPEDEF))
1096 && psymbol_name_matches (*psym, lookup_name)
1097 && (sym_matcher == NULL
1098 || sym_matcher ((*psym)->ginfo.search_name ())))
1100 /* Found a match, so notify our caller. */
1101 result = PST_SEARCHED_AND_FOUND;
1102 keep_going = 0;
1105 psym++;
1108 ps->searched_flag = result;
1109 return result == PST_SEARCHED_AND_FOUND;
1112 /* Psymtab version of expand_symtabs_matching. See its definition in
1113 the definition of quick_symbol_functions in symfile.h. */
1115 bool
1116 psymbol_functions::expand_symtabs_matching
1117 (struct objfile *objfile,
1118 gdb::function_view<expand_symtabs_file_matcher_ftype> file_matcher,
1119 const lookup_name_info *lookup_name,
1120 gdb::function_view<expand_symtabs_symbol_matcher_ftype> symbol_matcher,
1121 gdb::function_view<expand_symtabs_exp_notify_ftype> expansion_notify,
1122 block_search_flags search_flags,
1123 domain_enum domain,
1124 enum search_domain search)
1126 /* Clear the search flags. */
1127 for (partial_symtab *ps : require_partial_symbols (objfile))
1128 ps->searched_flag = PST_NOT_SEARCHED;
1130 gdb::optional<lookup_name_info> psym_lookup_name;
1131 if (lookup_name != nullptr)
1132 psym_lookup_name = lookup_name->make_ignore_params ();
1134 for (partial_symtab *ps : m_partial_symtabs->range ())
1136 QUIT;
1138 if (ps->readin_p (objfile))
1139 continue;
1141 if (file_matcher)
1143 bool match;
1145 if (ps->anonymous)
1146 continue;
1148 match = file_matcher (ps->filename, false);
1149 if (!match)
1151 /* Before we invoke realpath, which can get expensive when many
1152 files are involved, do a quick comparison of the basenames. */
1153 if (basenames_may_differ
1154 || file_matcher (lbasename (ps->filename), true))
1155 match = file_matcher (psymtab_to_fullname (ps), false);
1157 if (!match)
1158 continue;
1161 if ((symbol_matcher == NULL && lookup_name == NULL)
1162 || recursively_search_psymtabs (ps, objfile, search_flags,
1163 domain, search,
1164 *psym_lookup_name,
1165 symbol_matcher))
1167 struct compunit_symtab *symtab =
1168 psymtab_to_symtab (objfile, ps);
1170 if (expansion_notify != NULL)
1171 if (!expansion_notify (symtab))
1172 return false;
1176 return true;
1179 /* Psymtab version of has_symbols. See its definition in
1180 the definition of quick_symbol_functions in symfile.h. */
1182 bool
1183 psymbol_functions::has_symbols (struct objfile *objfile)
1185 return m_partial_symtabs->psymtabs != NULL;
1188 /* Helper function for psym_find_compunit_symtab_by_address that fills
1189 in m_psymbol_map for a given range of psymbols. */
1191 void
1192 psymbol_functions::fill_psymbol_map
1193 (struct objfile *objfile,
1194 struct partial_symtab *psymtab,
1195 std::set<CORE_ADDR> *seen_addrs,
1196 const std::vector<partial_symbol *> &symbols)
1198 for (partial_symbol *psym : symbols)
1200 if (psym->aclass == LOC_STATIC)
1202 CORE_ADDR addr = psym->address (objfile);
1203 if (seen_addrs->find (addr) == seen_addrs->end ())
1205 seen_addrs->insert (addr);
1206 m_psymbol_map.emplace_back (addr, psymtab);
1212 /* See find_compunit_symtab_by_address in quick_symbol_functions, in
1213 symfile.h. */
1215 compunit_symtab *
1216 psymbol_functions::find_compunit_symtab_by_address (struct objfile *objfile,
1217 CORE_ADDR address)
1219 if (m_psymbol_map.empty ())
1221 std::set<CORE_ADDR> seen_addrs;
1223 for (partial_symtab *pst : require_partial_symbols (objfile))
1225 fill_psymbol_map (objfile, pst,
1226 &seen_addrs,
1227 pst->global_psymbols);
1228 fill_psymbol_map (objfile, pst,
1229 &seen_addrs,
1230 pst->static_psymbols);
1233 m_psymbol_map.shrink_to_fit ();
1235 std::sort (m_psymbol_map.begin (), m_psymbol_map.end (),
1236 [] (const std::pair<CORE_ADDR, partial_symtab *> &a,
1237 const std::pair<CORE_ADDR, partial_symtab *> &b)
1239 return a.first < b.first;
1243 auto iter = std::lower_bound
1244 (m_psymbol_map.begin (), m_psymbol_map.end (), address,
1245 [] (const std::pair<CORE_ADDR, partial_symtab *> &a,
1246 CORE_ADDR b)
1248 return a.first < b;
1251 if (iter == m_psymbol_map.end () || iter->first != address)
1252 return NULL;
1254 return psymtab_to_symtab (objfile, iter->second);
1259 /* Partially fill a partial symtab. It will be completely filled at
1260 the end of the symbol list. */
1262 partial_symtab::partial_symtab (const char *filename,
1263 psymtab_storage *partial_symtabs,
1264 objfile_per_bfd_storage *objfile_per_bfd,
1265 CORE_ADDR textlow)
1266 : partial_symtab (filename, partial_symtabs, objfile_per_bfd)
1268 set_text_low (textlow);
1269 set_text_high (raw_text_low ()); /* default */
1272 /* Perform "finishing up" operations of a partial symtab. */
1274 void
1275 partial_symtab::end ()
1277 global_psymbols.shrink_to_fit ();
1278 static_psymbols.shrink_to_fit ();
1280 /* Sort the global list; don't sort the static list. */
1281 std::sort (global_psymbols.begin (),
1282 global_psymbols.end (),
1283 [] (partial_symbol *s1, partial_symbol *s2)
1285 return strcmp_iw_ordered (s1->ginfo.search_name (),
1286 s2->ginfo.search_name ()) < 0;
1290 /* See psymtab.h. */
1292 unsigned long
1293 psymbol_bcache::hash (const void *addr, int length)
1295 unsigned long h = 0;
1296 struct partial_symbol *psymbol = (struct partial_symbol *) addr;
1297 unsigned int lang = psymbol->ginfo.language ();
1298 unsigned int domain = psymbol->domain;
1299 unsigned int theclass = psymbol->aclass;
1301 h = fast_hash (&psymbol->ginfo.value, sizeof (psymbol->ginfo.value), h);
1302 h = fast_hash (&lang, sizeof (unsigned int), h);
1303 h = fast_hash (&domain, sizeof (unsigned int), h);
1304 h = fast_hash (&theclass, sizeof (unsigned int), h);
1305 /* Note that psymbol names are interned via compute_and_set_names, so
1306 there's no need to hash the contents of the name here. */
1307 h = fast_hash (&psymbol->ginfo.m_name, sizeof (psymbol->ginfo.m_name), h);
1309 return h;
1312 /* See psymtab.h. */
1315 psymbol_bcache::compare (const void *addr1, const void *addr2, int length)
1317 struct partial_symbol *sym1 = (struct partial_symbol *) addr1;
1318 struct partial_symbol *sym2 = (struct partial_symbol *) addr2;
1320 return (memcmp (&sym1->ginfo.value, &sym2->ginfo.value,
1321 sizeof (sym1->ginfo.value)) == 0
1322 && sym1->ginfo.language () == sym2->ginfo.language ()
1323 && sym1->domain == sym2->domain
1324 && sym1->aclass == sym2->aclass
1325 /* Note that psymbol names are interned via
1326 compute_and_set_names, so there's no need to compare the
1327 contents of the name here. */
1328 && sym1->ginfo.linkage_name () == sym2->ginfo.linkage_name ());
1331 /* See psympriv.h. */
1333 void
1334 partial_symtab::add_psymbol (const partial_symbol &psymbol,
1335 psymbol_placement where,
1336 psymtab_storage *partial_symtabs,
1337 struct objfile *objfile)
1339 bool added;
1341 /* Stash the partial symbol away in the cache. */
1342 partial_symbol *psym
1343 = ((struct partial_symbol *)
1344 partial_symtabs->psymbol_cache.insert
1345 (&psymbol, sizeof (struct partial_symbol), &added));
1347 /* Do not duplicate global partial symbols. */
1348 if (where == psymbol_placement::GLOBAL && !added)
1349 return;
1351 /* Save pointer to partial symbol in psymtab, growing symtab if needed. */
1352 std::vector<partial_symbol *> &list
1353 = (where == psymbol_placement::STATIC
1354 ? static_psymbols
1355 : global_psymbols);
1356 list.push_back (psym);
1359 /* See psympriv.h. */
1361 void
1362 partial_symtab::add_psymbol (gdb::string_view name, bool copy_name,
1363 domain_enum domain,
1364 enum address_class theclass,
1365 short section,
1366 psymbol_placement where,
1367 CORE_ADDR coreaddr,
1368 enum language language,
1369 psymtab_storage *partial_symtabs,
1370 struct objfile *objfile)
1372 struct partial_symbol psymbol;
1373 memset (&psymbol, 0, sizeof (psymbol));
1375 psymbol.set_unrelocated_address (coreaddr);
1376 psymbol.ginfo.set_section_index (section);
1377 psymbol.domain = domain;
1378 psymbol.aclass = theclass;
1379 psymbol.ginfo.set_language (language, partial_symtabs->obstack ());
1380 psymbol.ginfo.compute_and_set_names (name, copy_name, objfile->per_bfd);
1382 add_psymbol (psymbol, where, partial_symtabs, objfile);
1385 /* See psympriv.h. */
1387 partial_symtab::partial_symtab (const char *filename_,
1388 psymtab_storage *partial_symtabs,
1389 objfile_per_bfd_storage *objfile_per_bfd)
1390 : searched_flag (PST_NOT_SEARCHED),
1391 text_low_valid (0),
1392 text_high_valid (0)
1394 partial_symtabs->install_psymtab (this);
1396 filename = objfile_per_bfd->intern (filename_);
1398 if (symtab_create_debug)
1400 /* Be a bit clever with debugging messages, and don't print objfile
1401 every time, only when it changes. */
1402 static std::string last_bfd_name;
1403 const char *this_bfd_name
1404 = bfd_get_filename (objfile_per_bfd->get_bfd ());
1406 if (last_bfd_name.empty () || last_bfd_name != this_bfd_name)
1408 last_bfd_name = this_bfd_name;
1409 fprintf_filtered (gdb_stdlog,
1410 "Creating one or more psymtabs for %s ...\n",
1411 this_bfd_name);
1413 fprintf_filtered (gdb_stdlog,
1414 "Created psymtab %s for module %s.\n",
1415 host_address_to_string (this), filename);
1419 /* See psympriv.h. */
1421 void
1422 partial_symtab::expand_dependencies (struct objfile *objfile)
1424 for (int i = 0; i < number_of_dependencies; ++i)
1426 if (!dependencies[i]->readin_p (objfile)
1427 && dependencies[i]->user == NULL)
1429 /* Inform about additional files to be read in. */
1430 if (info_verbose)
1432 fputs_filtered (" ", gdb_stdout);
1433 wrap_here ("");
1434 fputs_filtered ("and ", gdb_stdout);
1435 wrap_here ("");
1436 printf_filtered ("%s...", dependencies[i]->filename);
1437 wrap_here (""); /* Flush output */
1438 gdb_flush (gdb_stdout);
1440 dependencies[i]->expand_psymtab (objfile);
1446 void
1447 psymtab_storage::discard_psymtab (struct partial_symtab *pst)
1449 struct partial_symtab **prev_pst;
1451 /* From dbxread.c:
1452 Empty psymtabs happen as a result of header files which don't
1453 have any symbols in them. There can be a lot of them. But this
1454 check is wrong, in that a psymtab with N_SLINE entries but
1455 nothing else is not empty, but we don't realize that. Fixing
1456 that without slowing things down might be tricky. */
1458 /* First, snip it out of the psymtab chain. */
1460 prev_pst = &psymtabs;
1461 while ((*prev_pst) != pst)
1462 prev_pst = &((*prev_pst)->next);
1463 (*prev_pst) = pst->next;
1464 delete pst;
1469 /* We need to pass a couple of items to the addrmap_foreach function,
1470 so use a struct. */
1472 struct dump_psymtab_addrmap_data
1474 struct objfile *objfile;
1475 struct partial_symtab *psymtab;
1476 struct ui_file *outfile;
1478 /* Non-zero if the previously printed addrmap entry was for PSYMTAB.
1479 If so, we want to print the next one as well (since the next addrmap
1480 entry defines the end of the range). */
1481 int previous_matched;
1484 /* Helper function for dump_psymtab_addrmap to print an addrmap entry. */
1486 static int
1487 dump_psymtab_addrmap_1 (void *datap, CORE_ADDR start_addr, void *obj)
1489 struct dump_psymtab_addrmap_data *data
1490 = (struct dump_psymtab_addrmap_data *) datap;
1491 struct gdbarch *gdbarch = data->objfile->arch ();
1492 struct partial_symtab *addrmap_psymtab = (struct partial_symtab *) obj;
1493 const char *psymtab_address_or_end = NULL;
1495 QUIT;
1497 if (data->psymtab == NULL
1498 || data->psymtab == addrmap_psymtab)
1499 psymtab_address_or_end = host_address_to_string (addrmap_psymtab);
1500 else if (data->previous_matched)
1501 psymtab_address_or_end = "<ends here>";
1503 if (data->psymtab == NULL
1504 || data->psymtab == addrmap_psymtab
1505 || data->previous_matched)
1507 fprintf_filtered (data->outfile, " %s%s %s\n",
1508 data->psymtab != NULL ? " " : "",
1509 paddress (gdbarch, start_addr),
1510 psymtab_address_or_end);
1513 data->previous_matched = (data->psymtab == NULL
1514 || data->psymtab == addrmap_psymtab);
1516 return 0;
1519 /* Helper function for maintenance_print_psymbols to print the addrmap
1520 of PSYMTAB. If PSYMTAB is NULL print the entire addrmap. */
1522 static void
1523 dump_psymtab_addrmap (struct objfile *objfile,
1524 psymtab_storage *partial_symtabs,
1525 struct partial_symtab *psymtab,
1526 struct ui_file *outfile)
1528 struct dump_psymtab_addrmap_data addrmap_dump_data;
1530 if ((psymtab == NULL
1531 || psymtab->psymtabs_addrmap_supported)
1532 && partial_symtabs->psymtabs_addrmap != NULL)
1534 addrmap_dump_data.objfile = objfile;
1535 addrmap_dump_data.psymtab = psymtab;
1536 addrmap_dump_data.outfile = outfile;
1537 addrmap_dump_data.previous_matched = 0;
1538 fprintf_filtered (outfile, "%sddress map:\n",
1539 psymtab == NULL ? "Entire a" : " A");
1540 addrmap_foreach (partial_symtabs->psymtabs_addrmap,
1541 dump_psymtab_addrmap_1, &addrmap_dump_data);
1545 static void
1546 maintenance_print_psymbols (const char *args, int from_tty)
1548 struct ui_file *outfile = gdb_stdout;
1549 char *address_arg = NULL, *source_arg = NULL, *objfile_arg = NULL;
1550 int i, outfile_idx, found;
1551 CORE_ADDR pc = 0;
1552 struct obj_section *section = NULL;
1554 dont_repeat ();
1556 gdb_argv argv (args);
1558 for (i = 0; argv != NULL && argv[i] != NULL; ++i)
1560 if (strcmp (argv[i], "-pc") == 0)
1562 if (argv[i + 1] == NULL)
1563 error (_("Missing pc value"));
1564 address_arg = argv[++i];
1566 else if (strcmp (argv[i], "-source") == 0)
1568 if (argv[i + 1] == NULL)
1569 error (_("Missing source file"));
1570 source_arg = argv[++i];
1572 else if (strcmp (argv[i], "-objfile") == 0)
1574 if (argv[i + 1] == NULL)
1575 error (_("Missing objfile name"));
1576 objfile_arg = argv[++i];
1578 else if (strcmp (argv[i], "--") == 0)
1580 /* End of options. */
1581 ++i;
1582 break;
1584 else if (argv[i][0] == '-')
1586 /* Future proofing: Don't allow OUTFILE to begin with "-". */
1587 error (_("Unknown option: %s"), argv[i]);
1589 else
1590 break;
1592 outfile_idx = i;
1594 if (address_arg != NULL && source_arg != NULL)
1595 error (_("Must specify at most one of -pc and -source"));
1597 stdio_file arg_outfile;
1599 if (argv != NULL && argv[outfile_idx] != NULL)
1601 if (argv[outfile_idx + 1] != NULL)
1602 error (_("Junk at end of command"));
1603 gdb::unique_xmalloc_ptr<char> outfile_name
1604 (tilde_expand (argv[outfile_idx]));
1605 if (!arg_outfile.open (outfile_name.get (), FOPEN_WT))
1606 perror_with_name (outfile_name.get ());
1607 outfile = &arg_outfile;
1610 if (address_arg != NULL)
1612 pc = parse_and_eval_address (address_arg);
1613 /* If we fail to find a section, that's ok, try the lookup anyway. */
1614 section = find_pc_section (pc);
1617 found = 0;
1618 for (objfile *objfile : current_program_space->objfiles ())
1620 int printed_objfile_header = 0;
1621 int print_for_objfile = 1;
1623 QUIT;
1624 if (objfile_arg != NULL)
1625 print_for_objfile
1626 = compare_filenames_for_search (objfile_name (objfile),
1627 objfile_arg);
1628 if (!print_for_objfile)
1629 continue;
1631 for (const auto &iter : objfile->qf)
1633 psymbol_functions *psf
1634 = dynamic_cast<psymbol_functions *> (iter.get ());
1635 if (psf == nullptr)
1636 continue;
1638 psymtab_storage *partial_symtabs
1639 = psf->get_partial_symtabs ().get ();
1641 if (address_arg != NULL)
1643 struct bound_minimal_symbol msymbol = { NULL, NULL };
1645 /* We don't assume each pc has a unique objfile (this is for
1646 debugging). */
1647 struct partial_symtab *ps
1648 = psf->find_pc_sect_psymtab (objfile, pc, section, msymbol);
1649 if (ps != NULL)
1651 if (!printed_objfile_header)
1653 outfile->printf ("\nPartial symtabs for objfile %s\n",
1654 objfile_name (objfile));
1655 printed_objfile_header = 1;
1657 dump_psymtab (objfile, ps, outfile);
1658 dump_psymtab_addrmap (objfile, partial_symtabs, ps, outfile);
1659 found = 1;
1662 else
1664 for (partial_symtab *ps : psf->require_partial_symbols (objfile))
1666 int print_for_source = 0;
1668 QUIT;
1669 if (source_arg != NULL)
1671 print_for_source
1672 = compare_filenames_for_search (ps->filename, source_arg);
1673 found = 1;
1675 if (source_arg == NULL
1676 || print_for_source)
1678 if (!printed_objfile_header)
1680 outfile->printf ("\nPartial symtabs for objfile %s\n",
1681 objfile_name (objfile));
1682 printed_objfile_header = 1;
1684 dump_psymtab (objfile, ps, outfile);
1685 dump_psymtab_addrmap (objfile, partial_symtabs, ps,
1686 outfile);
1691 /* If we're printing all the objfile's symbols dump the full addrmap. */
1693 if (address_arg == NULL
1694 && source_arg == NULL
1695 && partial_symtabs->psymtabs_addrmap != NULL)
1697 outfile->puts ("\n");
1698 dump_psymtab_addrmap (objfile, partial_symtabs, NULL, outfile);
1703 if (!found)
1705 if (address_arg != NULL)
1706 error (_("No partial symtab for address: %s"), address_arg);
1707 if (source_arg != NULL)
1708 error (_("No partial symtab for source file: %s"), source_arg);
1712 /* List all the partial symbol tables whose names match REGEXP (optional). */
1714 static void
1715 maintenance_info_psymtabs (const char *regexp, int from_tty)
1717 if (regexp)
1718 re_comp (regexp);
1720 for (struct program_space *pspace : program_spaces)
1721 for (objfile *objfile : pspace->objfiles ())
1723 struct gdbarch *gdbarch = objfile->arch ();
1725 /* We don't want to print anything for this objfile until we
1726 actually find a symtab whose name matches. */
1727 int printed_objfile_start = 0;
1729 for (const auto &iter : objfile->qf)
1731 psymbol_functions *psf
1732 = dynamic_cast<psymbol_functions *> (iter.get ());
1733 if (psf == nullptr)
1734 continue;
1735 for (partial_symtab *psymtab : psf->require_partial_symbols (objfile))
1737 QUIT;
1739 if (! regexp
1740 || re_exec (psymtab->filename))
1742 if (! printed_objfile_start)
1744 printf_filtered ("{ objfile %s ", objfile_name (objfile));
1745 wrap_here (" ");
1746 printf_filtered ("((struct objfile *) %s)\n",
1747 host_address_to_string (objfile));
1748 printed_objfile_start = 1;
1751 printf_filtered (" { psymtab %s ", psymtab->filename);
1752 wrap_here (" ");
1753 printf_filtered ("((struct partial_symtab *) %s)\n",
1754 host_address_to_string (psymtab));
1756 printf_filtered (" readin %s\n",
1757 psymtab->readin_p (objfile) ? "yes" : "no");
1758 printf_filtered (" fullname %s\n",
1759 psymtab->fullname
1760 ? psymtab->fullname : "(null)");
1761 printf_filtered (" text addresses ");
1762 fputs_filtered (paddress (gdbarch,
1763 psymtab->text_low (objfile)),
1764 gdb_stdout);
1765 printf_filtered (" -- ");
1766 fputs_filtered (paddress (gdbarch,
1767 psymtab->text_high (objfile)),
1768 gdb_stdout);
1769 printf_filtered ("\n");
1770 printf_filtered (" psymtabs_addrmap_supported %s\n",
1771 (psymtab->psymtabs_addrmap_supported
1772 ? "yes" : "no"));
1773 printf_filtered (" globals ");
1774 if (!psymtab->global_psymbols.empty ())
1775 printf_filtered
1776 ("(* (struct partial_symbol **) %s @ %d)\n",
1777 host_address_to_string (psymtab->global_psymbols.data ()),
1778 (int) psymtab->global_psymbols.size ());
1779 else
1780 printf_filtered ("(none)\n");
1781 printf_filtered (" statics ");
1782 if (!psymtab->static_psymbols.empty ())
1783 printf_filtered
1784 ("(* (struct partial_symbol **) %s @ %d)\n",
1785 host_address_to_string (psymtab->static_psymbols.data ()),
1786 (int) psymtab->static_psymbols.size ());
1787 else
1788 printf_filtered ("(none)\n");
1789 if (psymtab->user)
1790 printf_filtered (" user %s "
1791 "((struct partial_symtab *) %s)\n",
1792 psymtab->user->filename,
1793 host_address_to_string (psymtab->user));
1794 printf_filtered (" dependencies ");
1795 if (psymtab->number_of_dependencies)
1797 int i;
1799 printf_filtered ("{\n");
1800 for (i = 0; i < psymtab->number_of_dependencies; i++)
1802 struct partial_symtab *dep = psymtab->dependencies[i];
1804 /* Note the string concatenation there --- no
1805 comma. */
1806 printf_filtered (" psymtab %s "
1807 "((struct partial_symtab *) %s)\n",
1808 dep->filename,
1809 host_address_to_string (dep));
1811 printf_filtered (" }\n");
1813 else
1814 printf_filtered ("(none)\n");
1815 printf_filtered (" }\n");
1820 if (printed_objfile_start)
1821 printf_filtered ("}\n");
1825 /* Check consistency of currently expanded psymtabs vs symtabs. */
1827 static void
1828 maintenance_check_psymtabs (const char *ignore, int from_tty)
1830 struct symbol *sym;
1831 struct compunit_symtab *cust = NULL;
1832 const struct blockvector *bv;
1833 const struct block *b;
1835 for (objfile *objfile : current_program_space->objfiles ())
1837 for (const auto &iter : objfile->qf)
1839 psymbol_functions *psf
1840 = dynamic_cast<psymbol_functions *> (iter.get ());
1841 if (psf == nullptr)
1842 continue;
1844 for (partial_symtab *ps : psf->require_partial_symbols (objfile))
1846 struct gdbarch *gdbarch = objfile->arch ();
1848 /* We don't call psymtab_to_symtab here because that may cause symtab
1849 expansion. When debugging a problem it helps if checkers leave
1850 things unchanged. */
1851 cust = ps->get_compunit_symtab (objfile);
1853 /* First do some checks that don't require the associated symtab. */
1854 if (ps->text_high (objfile) < ps->text_low (objfile))
1856 printf_filtered ("Psymtab ");
1857 puts_filtered (ps->filename);
1858 printf_filtered (" covers bad range ");
1859 fputs_filtered (paddress (gdbarch, ps->text_low (objfile)),
1860 gdb_stdout);
1861 printf_filtered (" - ");
1862 fputs_filtered (paddress (gdbarch, ps->text_high (objfile)),
1863 gdb_stdout);
1864 printf_filtered ("\n");
1865 continue;
1868 /* Now do checks requiring the associated symtab. */
1869 if (cust == NULL)
1870 continue;
1871 bv = COMPUNIT_BLOCKVECTOR (cust);
1872 b = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
1873 for (partial_symbol *psym : ps->static_psymbols)
1875 /* Skip symbols for inlined functions without address. These may
1876 or may not have a match in the full symtab. */
1877 if (psym->aclass == LOC_BLOCK
1878 && psym->ginfo.value.address == 0)
1879 continue;
1881 sym = block_lookup_symbol (b, psym->ginfo.search_name (),
1882 symbol_name_match_type::SEARCH_NAME,
1883 psym->domain);
1884 if (!sym)
1886 printf_filtered ("Static symbol `");
1887 puts_filtered (psym->ginfo.linkage_name ());
1888 printf_filtered ("' only found in ");
1889 puts_filtered (ps->filename);
1890 printf_filtered (" psymtab\n");
1893 b = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
1894 for (partial_symbol *psym : ps->global_psymbols)
1896 sym = block_lookup_symbol (b, psym->ginfo.search_name (),
1897 symbol_name_match_type::SEARCH_NAME,
1898 psym->domain);
1899 if (!sym)
1901 printf_filtered ("Global symbol `");
1902 puts_filtered (psym->ginfo.linkage_name ());
1903 printf_filtered ("' only found in ");
1904 puts_filtered (ps->filename);
1905 printf_filtered (" psymtab\n");
1908 if (ps->raw_text_high () != 0
1909 && (ps->text_low (objfile) < BLOCK_START (b)
1910 || ps->text_high (objfile) > BLOCK_END (b)))
1912 printf_filtered ("Psymtab ");
1913 puts_filtered (ps->filename);
1914 printf_filtered (" covers ");
1915 fputs_filtered (paddress (gdbarch, ps->text_low (objfile)),
1916 gdb_stdout);
1917 printf_filtered (" - ");
1918 fputs_filtered (paddress (gdbarch, ps->text_high (objfile)),
1919 gdb_stdout);
1920 printf_filtered (" but symtab covers only ");
1921 fputs_filtered (paddress (gdbarch, BLOCK_START (b)), gdb_stdout);
1922 printf_filtered (" - ");
1923 fputs_filtered (paddress (gdbarch, BLOCK_END (b)), gdb_stdout);
1924 printf_filtered ("\n");
1931 void _initialize_psymtab ();
1932 void
1933 _initialize_psymtab ()
1935 add_cmd ("psymbols", class_maintenance, maintenance_print_psymbols, _("\
1936 Print dump of current partial symbol definitions.\n\
1937 Usage: mt print psymbols [-objfile OBJFILE] [-pc ADDRESS] [--] [OUTFILE]\n\
1938 mt print psymbols [-objfile OBJFILE] [-source SOURCE] [--] [OUTFILE]\n\
1939 Entries in the partial symbol table are dumped to file OUTFILE,\n\
1940 or the terminal if OUTFILE is unspecified.\n\
1941 If ADDRESS is provided, dump only the file for that address.\n\
1942 If SOURCE is provided, dump only that file's symbols.\n\
1943 If OBJFILE is provided, dump only that file's minimal symbols."),
1944 &maintenanceprintlist);
1946 add_cmd ("psymtabs", class_maintenance, maintenance_info_psymtabs, _("\
1947 List the partial symbol tables for all object files.\n\
1948 This does not include information about individual partial symbols,\n\
1949 just the symbol table structures themselves."),
1950 &maintenanceinfolist);
1952 add_cmd ("check-psymtabs", class_maintenance, maintenance_check_psymtabs,
1953 _("\
1954 Check consistency of currently expanded psymtabs versus symtabs."),
1955 &maintenancelist);