RISC-V: update docs for -mpriv-spec/--with-priv-spec for 1.12
[binutils-gdb.git] / gdb / psymtab.c
1 /* Partial symbol tables.
2
3 Copyright (C) 2009-2022 Free Software Foundation, Inc.
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
19
20 #include "defs.h"
21 #include "symtab.h"
22 #include "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>
39
40 static struct partial_symbol *lookup_partial_symbol (struct objfile *,
41 struct partial_symtab *,
42 const lookup_name_info &,
43 int,
44 domain_enum);
45
46 static const char *psymtab_to_fullname (struct partial_symtab *ps);
47
48 static struct partial_symbol *find_pc_sect_psymbol (struct objfile *,
49 struct partial_symtab *,
50 CORE_ADDR,
51 struct obj_section *);
52
53 static struct compunit_symtab *psymtab_to_symtab (struct objfile *objfile,
54 struct partial_symtab *pst);
55
56 psymtab_storage::~psymtab_storage ()
57 {
58 partial_symtab *iter = psymtabs;
59 while (iter != nullptr)
60 {
61 partial_symtab *next = iter->next;
62 delete iter;
63 iter = next;
64 }
65 }
66
67 /* See psymtab.h. */
68
69 void
70 psymtab_storage::install_psymtab (partial_symtab *pst)
71 {
72 pst->next = psymtabs;
73 psymtabs = pst;
74 }
75
76 \f
77
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. */
82
83 psymtab_storage::partial_symtab_range
84 psymbol_functions::require_partial_symbols (struct objfile *objfile)
85 {
86 objfile->require_partial_symbols (true);
87 return m_partial_symtabs->range ();
88 }
89
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. */
92
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)
98 {
99 struct partial_symtab *tpst;
100 struct partial_symtab *best_pst = pst;
101 CORE_ADDR best_addr = pst->text_low (objfile);
102
103 gdb_assert (!pst->psymtabs_addrmap_supported);
104
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;
112
113 if (msymbol.minsym == NULL)
114 return pst;
115
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)
124 {
125 if (pc >= tpst->text_low (objfile) && pc < tpst->text_high (objfile))
126 {
127 struct partial_symbol *p;
128 CORE_ADDR this_addr;
129
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;
138
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);
147
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)
159 {
160 best_addr = this_addr;
161 best_pst = tpst;
162 }
163 }
164 }
165 return best_pst;
166 }
167
168 /* See psympriv.h. */
169
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)
175 {
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.
180
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. */
187
188 if (m_partial_symtabs->psymtabs != NULL
189 && m_partial_symtabs->psymtabs_addrmap != NULL)
190 {
191 CORE_ADDR baseaddr = objfile->text_section_offset ();
192
193 struct partial_symtab *pst
194 = ((struct partial_symtab *)
195 addrmap_find (m_partial_symtabs->psymtabs_addrmap,
196 pc - baseaddr));
197 if (pst != NULL)
198 {
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)
203 {
204 struct partial_symbol *p;
205
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;
215 }
216
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. */
222
223 return pst;
224 }
225 }
226
227 next:
228
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. */
233
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. */
237
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))
241 {
242 struct partial_symtab *best_pst;
243
244 best_pst = find_pc_sect_psymtab_closer (objfile, pc, section, pst,
245 msymbol);
246 if (best_pst != NULL)
247 return best_pst;
248 }
249
250 return NULL;
251 }
252
253 /* Psymtab version of find_pc_sect_compunit_symtab. See its definition in
254 the definition of quick_symbol_functions in symfile.h. */
255
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)
263 {
264 struct partial_symtab *ps = find_pc_sect_psymtab (objfile,
265 pc, section,
266 msymbol);
267 if (ps != NULL)
268 {
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);
278 }
279 return NULL;
280 }
281
282 /* Find which partial symbol within a psymtab matches PC and SECTION.
283 Return NULL if none. */
284
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)
289 {
290 struct partial_symbol *best = NULL;
291 CORE_ADDR best_pc;
292 const CORE_ADDR textlow = psymtab->text_low (objfile);
293
294 gdb_assert (psymtab != NULL);
295
296 /* Cope with programs that start at address 0. */
297 best_pc = (textlow != 0) ? textlow - 1 : 0;
298
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)
303 {
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)))
310 {
311 if (section != NULL) /* Match on a specific section. */
312 {
313 if (!matching_obj_sections (p->obj_section (objfile),
314 section))
315 continue;
316 }
317 best_pc = p->address (objfile);
318 best = p;
319 }
320 }
321
322 for (partial_symbol *p : psymtab->static_psymbols)
323 {
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)))
330 {
331 if (section != NULL) /* Match on a specific section. */
332 {
333 if (!matching_obj_sections (p->obj_section (objfile),
334 section))
335 continue;
336 }
337 best_pc = p->address (objfile);
338 best = p;
339 }
340 }
341
342 return best;
343 }
344
345 /* Psymtab version of lookup_global_symbol_language. See its definition in
346 the definition of quick_symbol_functions in symfile.h. */
347
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)
353 {
354 *symbol_found_p = false;
355 if (objfile->sf == NULL)
356 return language_unknown;
357
358 lookup_name_info lookup_name (name, symbol_name_match_type::FULL);
359
360 for (partial_symtab *ps : require_partial_symbols (objfile))
361 {
362 struct partial_symbol *psym;
363 if (ps->readin_p (objfile))
364 continue;
365
366 psym = lookup_partial_symbol (objfile, ps, lookup_name, 1, domain);
367 if (psym)
368 {
369 *symbol_found_p = true;
370 return psym->ginfo.language ();
371 }
372 }
373
374 return language_unknown;
375 }
376
377 /* Returns true if PSYM matches LOOKUP_NAME. */
378
379 static bool
380 psymbol_name_matches (partial_symbol *psym,
381 const lookup_name_info &lookup_name)
382 {
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);
387 }
388
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. */
396
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)
402 {
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;
409
410 if (length == 0)
411 return NULL;
412
413 start = (global ?
414 &pst->global_psymbols[0] :
415 &pst->static_psymbols[0]);
416
417 if (global && ordered_compare) /* Can use a binary search. */
418 {
419 do_linear_search = 0;
420
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. */
426
427 bottom = start;
428 top = start + length - 1;
429 real_top = top;
430 while (top > bottom)
431 {
432 center = bottom + (top - bottom) / 2;
433 gdb_assert (center < top);
434
435 enum language lang = (*center)->ginfo.language ();
436 const char *lang_ln = name.language_lookup_name (lang);
437
438 if (ordered_compare ((*center)->ginfo.search_name (),
439 lang_ln) >= 0)
440 top = center;
441 else
442 bottom = center + 1;
443 }
444 gdb_assert (top == bottom);
445
446 while (top <= real_top
447 && psymbol_name_matches (*top, name))
448 {
449 if (symbol_matches_domain ((*top)->ginfo.language (),
450 (*top)->domain, domain))
451 return *top;
452 top++;
453 }
454 }
455
456 /* Can't use a binary search or else we found during the binary search that
457 we should also do a linear search. */
458
459 if (do_linear_search)
460 {
461 for (psym = start; psym < start + length; psym++)
462 {
463 if (symbol_matches_domain ((*psym)->ginfo.language (),
464 (*psym)->domain, domain)
465 && psymbol_name_matches (*psym, name))
466 return *psym;
467 }
468 }
469
470 return NULL;
471 }
472
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. */
476
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)
482 {
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;
489
490 if (length == 0)
491 return NULL;
492
493 start = (global ?
494 &pst->global_psymbols[0] :
495 &pst->static_psymbols[0]);
496
497 if (global) /* This means we can use a binary search. */
498 {
499 do_linear_search = 0;
500
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. */
506
507 bottom = start;
508 top = start + length - 1;
509 real_top = top;
510 while (top > bottom)
511 {
512 center = bottom + (top - bottom) / 2;
513
514 gdb_assert (center < top);
515
516 if (strcmp_iw_ordered ((*center)->ginfo.search_name (),
517 lookup_name.c_str ()) >= 0)
518 {
519 top = center;
520 }
521 else
522 {
523 bottom = center + 1;
524 }
525 }
526
527 gdb_assert (top == bottom);
528
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--;
534
535 /* Fixup to have a symbol which matches SYMBOL_MATCHES_SEARCH_NAME. */
536 top++;
537
538 while (top <= real_top && symbol_matches_search_name (&(*top)->ginfo,
539 lookup_name))
540 {
541 if (symbol_matches_domain ((*top)->ginfo.language (),
542 (*top)->domain, domain))
543 return *top;
544 top++;
545 }
546 }
547
548 /* Can't use a binary search or else we found during the binary search that
549 we should also do a linear search. */
550
551 if (do_linear_search)
552 {
553 for (psym = start; psym < start + length; psym++)
554 {
555 if (symbol_matches_domain ((*psym)->ginfo.language (),
556 (*psym)->domain, domain)
557 && symbol_matches_search_name (&(*psym)->ginfo, lookup_name))
558 return *psym;
559 }
560 }
561
562 return NULL;
563 }
564
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. */
570
571 static struct compunit_symtab *
572 psymtab_to_symtab (struct objfile *objfile, struct partial_symtab *pst)
573 {
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;
578
579 /* If it's been looked up before, return it. */
580 if (pst->get_compunit_symtab (objfile))
581 return pst->get_compunit_symtab (objfile);
582
583 /* If it has not yet been read in, read it. */
584 if (!pst->readin_p (objfile))
585 {
586 scoped_restore decrementer = increment_reading_symtab ();
587
588 if (info_verbose)
589 {
590 printf_filtered (_("Reading in symbols for %s...\n"),
591 pst->filename);
592 gdb_flush (gdb_stdout);
593 }
594
595 pst->read_symtab (objfile);
596 }
597
598 return pst->get_compunit_symtab (objfile);
599 }
600
601 /* Psymtab version of find_last_source_symtab. See its definition in
602 the definition of quick_symbol_functions in symfile.h. */
603
604 struct symtab *
605 psymbol_functions::find_last_source_symtab (struct objfile *ofp)
606 {
607 struct partial_symtab *cs_pst = NULL;
608
609 for (partial_symtab *ps : require_partial_symbols (ofp))
610 {
611 const char *name = ps->filename;
612 int len = strlen (name);
613
614 if (!(len > 2 && (strcmp (&name[len - 2], ".h") == 0
615 || strcmp (name, "<<C++-namespaces>>") == 0)))
616 cs_pst = ps;
617 }
618
619 if (cs_pst)
620 {
621 if (cs_pst->readin_p (ofp))
622 {
623 internal_error (__FILE__, __LINE__,
624 _("select_source_symtab: "
625 "readin pst found and no symtabs."));
626 }
627 else
628 {
629 struct compunit_symtab *cust = psymtab_to_symtab (ofp, cs_pst);
630
631 if (cust == NULL)
632 return NULL;
633 return compunit_primary_filetab (cust);
634 }
635 }
636 return NULL;
637 }
638
639 /* Psymtab version of forget_cached_source_info. See its definition in
640 the definition of quick_symbol_functions in symfile.h. */
641
642 void
643 psymbol_functions::forget_cached_source_info (struct objfile *objfile)
644 {
645 for (partial_symtab *pst : require_partial_symbols (objfile))
646 {
647 if (pst->fullname != NULL)
648 {
649 xfree (pst->fullname);
650 pst->fullname = NULL;
651 }
652 }
653 }
654
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)
659 {
660 fprintf_filtered (outfile, " %s partial symbols:\n", what);
661 for (partial_symbol *p : symbols)
662 {
663 QUIT;
664 fprintf_filtered (outfile, " `%s'", p->ginfo.linkage_name ());
665 if (p->ginfo.demangled_name () != NULL)
666 {
667 fprintf_filtered (outfile, " `%s'",
668 p->ginfo.demangled_name ());
669 }
670 fputs_filtered (", ", outfile);
671 switch (p->domain)
672 {
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;
694 }
695 switch (p->aclass)
696 {
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;
745 }
746 fputs_filtered (", ", outfile);
747 fputs_filtered (paddress (gdbarch, p->unrelocated_address ()), outfile);
748 fprintf_filtered (outfile, "\n");
749 }
750 }
751
752 static void
753 dump_psymtab (struct objfile *objfile, struct partial_symtab *psymtab,
754 struct ui_file *outfile)
755 {
756 struct gdbarch *gdbarch = objfile->arch ();
757 int i;
758
759 if (psymtab->anonymous)
760 {
761 fprintf_filtered (outfile, "\nAnonymous partial symtab (%s) ",
762 psymtab->filename);
763 }
764 else
765 {
766 fprintf_filtered (outfile, "\nPartial symtab for source file %s ",
767 psymtab->filename);
768 }
769 fprintf_filtered (outfile, "(object %s)\n\n",
770 host_address_to_string (psymtab));
771 fprintf_filtered (outfile, " Read from object file %s (%s)\n",
772 objfile_name (objfile),
773 host_address_to_string (objfile));
774
775 if (psymtab->readin_p (objfile))
776 fprintf_filtered
777 (outfile,
778 " Full symtab was read (at %s)\n",
779 host_address_to_string (psymtab->get_compunit_symtab (objfile)));
780
781 fprintf_filtered (outfile, " Symbols cover text addresses ");
782 fputs_filtered (paddress (gdbarch, psymtab->text_low (objfile)), outfile);
783 fprintf_filtered (outfile, "-");
784 fputs_filtered (paddress (gdbarch, psymtab->text_high (objfile)), outfile);
785 fprintf_filtered (outfile, "\n");
786 fprintf_filtered (outfile, " Address map supported - %s.\n",
787 psymtab->psymtabs_addrmap_supported ? "yes" : "no");
788 fprintf_filtered (outfile, " Depends on %d other partial symtabs.\n",
789 psymtab->number_of_dependencies);
790 for (i = 0; i < psymtab->number_of_dependencies; i++)
791 fprintf_filtered (outfile, " %d %s\n", i,
792 host_address_to_string (psymtab->dependencies[i]));
793 if (psymtab->user != NULL)
794 fprintf_filtered (outfile, " Shared partial symtab with user %s\n",
795 host_address_to_string (psymtab->user));
796 if (!psymtab->global_psymbols.empty ())
797 {
798 print_partial_symbols
799 (gdbarch, objfile, psymtab->global_psymbols,
800 "Global", outfile);
801 }
802 if (!psymtab->static_psymbols.empty ())
803 {
804 print_partial_symbols
805 (gdbarch, objfile, psymtab->static_psymbols,
806 "Static", outfile);
807 }
808 fprintf_filtered (outfile, "\n");
809 }
810
811 /* Count the number of partial symbols in OBJFILE. */
812
813 int
814 psymbol_functions::count_psyms ()
815 {
816 int count = 0;
817 for (partial_symtab *pst : m_partial_symtabs->range ())
818 {
819 count += pst->global_psymbols.size ();
820 count += pst->static_psymbols.size ();
821 }
822 return count;
823 }
824
825 /* Psymtab version of print_stats. See its definition in
826 the definition of quick_symbol_functions in symfile.h. */
827
828 void
829 psymbol_functions::print_stats (struct objfile *objfile, bool print_bcache)
830 {
831 int i;
832
833 if (!print_bcache)
834 {
835 int n_psyms = count_psyms ();
836 if (n_psyms > 0)
837 printf_filtered (_(" Number of \"partial\" symbols read: %d\n"),
838 n_psyms);
839
840 i = 0;
841 for (partial_symtab *ps : require_partial_symbols (objfile))
842 {
843 if (!ps->readin_p (objfile))
844 i++;
845 }
846 printf_filtered (_(" Number of psym tables (not yet expanded): %d\n"),
847 i);
848 printf_filtered (_(" Total memory used for psymbol cache: %d\n"),
849 m_partial_symtabs->psymbol_cache.memory_used ());
850 }
851 else
852 {
853 printf_filtered (_("Psymbol byte cache statistics:\n"));
854 m_partial_symtabs->psymbol_cache.print_statistics
855 ("partial symbol cache");
856 }
857 }
858
859 /* Psymtab version of dump. See its definition in
860 the definition of quick_symbol_functions in symfile.h. */
861
862 void
863 psymbol_functions::dump (struct objfile *objfile)
864 {
865 struct partial_symtab *psymtab;
866
867 if (m_partial_symtabs->psymtabs)
868 {
869 printf_filtered ("Psymtabs:\n");
870 for (psymtab = m_partial_symtabs->psymtabs;
871 psymtab != NULL;
872 psymtab = psymtab->next)
873 printf_filtered ("%s at %s\n",
874 psymtab->filename,
875 host_address_to_string (psymtab));
876 printf_filtered ("\n\n");
877 }
878 }
879
880 /* Psymtab version of expand_all_symtabs. See its definition in
881 the definition of quick_symbol_functions in symfile.h. */
882
883 void
884 psymbol_functions::expand_all_symtabs (struct objfile *objfile)
885 {
886 for (partial_symtab *psymtab : require_partial_symbols (objfile))
887 psymtab_to_symtab (objfile, psymtab);
888 }
889
890 /* Psymtab version of map_symbol_filenames. See its definition in
891 the definition of quick_symbol_functions in symfile.h. */
892
893 void
894 psymbol_functions::map_symbol_filenames
895 (struct objfile *objfile,
896 gdb::function_view<symbol_filename_ftype> fun,
897 bool need_fullname)
898 {
899 for (partial_symtab *ps : require_partial_symbols (objfile))
900 {
901 const char *fullname;
902
903 if (ps->readin_p (objfile))
904 continue;
905
906 /* We can skip shared psymtabs here, because any file name will be
907 attached to the unshared psymtab. */
908 if (ps->user != NULL)
909 continue;
910
911 /* Anonymous psymtabs don't have a file name. */
912 if (ps->anonymous)
913 continue;
914
915 QUIT;
916 if (need_fullname)
917 fullname = psymtab_to_fullname (ps);
918 else
919 fullname = NULL;
920 fun (ps->filename, fullname);
921 }
922 }
923
924 /* Finds the fullname that a partial_symtab represents.
925
926 If this functions finds the fullname, it will save it in ps->fullname
927 and it will also return the value.
928
929 If this function fails to find the file that this partial_symtab represents,
930 NULL will be returned and ps->fullname will be set to NULL. */
931
932 static const char *
933 psymtab_to_fullname (struct partial_symtab *ps)
934 {
935 gdb_assert (!ps->anonymous);
936
937 /* Use cached copy if we have it.
938 We rely on forget_cached_source_info being called appropriately
939 to handle cases like the file being moved. */
940 if (ps->fullname == NULL)
941 {
942 gdb::unique_xmalloc_ptr<char> fullname
943 = find_source_or_rewrite (ps->filename, ps->dirname);
944 ps->fullname = fullname.release ();
945 }
946
947 return ps->fullname;
948 }
949
950 /* Psymtab version of expand_matching_symbols. See its definition in
951 the definition of quick_symbol_functions in symfile.h. */
952
953 void
954 psymbol_functions::expand_matching_symbols
955 (struct objfile *objfile,
956 const lookup_name_info &name, domain_enum domain,
957 int global,
958 symbol_compare_ftype *ordered_compare)
959 {
960 for (partial_symtab *ps : require_partial_symbols (objfile))
961 {
962 QUIT;
963 if (!ps->readin_p (objfile)
964 && match_partial_symbol (objfile, ps, global, name, domain,
965 ordered_compare))
966 psymtab_to_symtab (objfile, ps);
967 }
968 }
969
970 /* A helper for psym_expand_symtabs_matching that handles searching
971 included psymtabs. This returns true if a symbol is found, and
972 false otherwise. It also updates the 'searched_flag' on the
973 various psymtabs that it searches. */
974
975 static bool
976 recursively_search_psymtabs
977 (struct partial_symtab *ps,
978 struct objfile *objfile,
979 block_search_flags search_flags,
980 domain_enum domain,
981 enum search_domain search,
982 const lookup_name_info &lookup_name,
983 gdb::function_view<expand_symtabs_symbol_matcher_ftype> sym_matcher)
984 {
985 int keep_going = 1;
986 enum psymtab_search_status result = PST_SEARCHED_AND_NOT_FOUND;
987 int i;
988
989 if (ps->searched_flag != PST_NOT_SEARCHED)
990 return ps->searched_flag == PST_SEARCHED_AND_FOUND;
991
992 /* Recurse into shared psymtabs first, because they may have already
993 been searched, and this could save some time. */
994 for (i = 0; i < ps->number_of_dependencies; ++i)
995 {
996 int r;
997
998 /* Skip non-shared dependencies, these are handled elsewhere. */
999 if (ps->dependencies[i]->user == NULL)
1000 continue;
1001
1002 r = recursively_search_psymtabs (ps->dependencies[i],
1003 objfile, search_flags, domain, search,
1004 lookup_name, sym_matcher);
1005 if (r != 0)
1006 {
1007 ps->searched_flag = PST_SEARCHED_AND_FOUND;
1008 return true;
1009 }
1010 }
1011
1012 partial_symbol **gbound = (ps->global_psymbols.data ()
1013 + ps->global_psymbols.size ());
1014 partial_symbol **sbound = (ps->static_psymbols.data ()
1015 + ps->static_psymbols.size ());
1016 partial_symbol **bound = gbound;
1017
1018 /* Go through all of the symbols stored in a partial
1019 symtab in one loop. */
1020 partial_symbol **psym = ps->global_psymbols.data ();
1021
1022 if ((search_flags & SEARCH_GLOBAL_BLOCK) == 0)
1023 {
1024 if (ps->static_psymbols.empty ())
1025 keep_going = 0;
1026 else
1027 {
1028 psym = ps->static_psymbols.data ();
1029 bound = sbound;
1030 }
1031 }
1032
1033 while (keep_going)
1034 {
1035 if (psym >= bound)
1036 {
1037 if (bound == gbound && !ps->static_psymbols.empty ()
1038 && (search_flags & SEARCH_STATIC_BLOCK) != 0)
1039 {
1040 psym = ps->static_psymbols.data ();
1041 bound = sbound;
1042 }
1043 else
1044 keep_going = 0;
1045 continue;
1046 }
1047 else
1048 {
1049 QUIT;
1050
1051 if ((domain == UNDEF_DOMAIN
1052 || symbol_matches_domain ((*psym)->ginfo.language (),
1053 (*psym)->domain, domain))
1054 && (search == ALL_DOMAIN
1055 || (search == MODULES_DOMAIN
1056 && (*psym)->domain == MODULE_DOMAIN)
1057 || (search == VARIABLES_DOMAIN
1058 && (*psym)->aclass != LOC_TYPEDEF
1059 && (*psym)->aclass != LOC_BLOCK)
1060 || (search == FUNCTIONS_DOMAIN
1061 && (*psym)->aclass == LOC_BLOCK)
1062 || (search == TYPES_DOMAIN
1063 && (*psym)->aclass == LOC_TYPEDEF))
1064 && psymbol_name_matches (*psym, lookup_name)
1065 && (sym_matcher == NULL
1066 || sym_matcher ((*psym)->ginfo.search_name ())))
1067 {
1068 /* Found a match, so notify our caller. */
1069 result = PST_SEARCHED_AND_FOUND;
1070 keep_going = 0;
1071 }
1072 }
1073 psym++;
1074 }
1075
1076 ps->searched_flag = result;
1077 return result == PST_SEARCHED_AND_FOUND;
1078 }
1079
1080 /* Psymtab version of expand_symtabs_matching. See its definition in
1081 the definition of quick_symbol_functions in symfile.h. */
1082
1083 bool
1084 psymbol_functions::expand_symtabs_matching
1085 (struct objfile *objfile,
1086 gdb::function_view<expand_symtabs_file_matcher_ftype> file_matcher,
1087 const lookup_name_info *lookup_name,
1088 gdb::function_view<expand_symtabs_symbol_matcher_ftype> symbol_matcher,
1089 gdb::function_view<expand_symtabs_exp_notify_ftype> expansion_notify,
1090 block_search_flags search_flags,
1091 domain_enum domain,
1092 enum search_domain search)
1093 {
1094 /* Clear the search flags. */
1095 for (partial_symtab *ps : require_partial_symbols (objfile))
1096 ps->searched_flag = PST_NOT_SEARCHED;
1097
1098 gdb::optional<lookup_name_info> psym_lookup_name;
1099 if (lookup_name != nullptr)
1100 psym_lookup_name = lookup_name->make_ignore_params ();
1101
1102 /* This invariant is documented in quick-functions.h. */
1103 gdb_assert (lookup_name != nullptr || symbol_matcher == nullptr);
1104
1105 for (partial_symtab *ps : m_partial_symtabs->range ())
1106 {
1107 QUIT;
1108
1109 if (ps->readin_p (objfile))
1110 continue;
1111
1112 if (file_matcher)
1113 {
1114 bool match;
1115
1116 if (ps->anonymous)
1117 continue;
1118
1119 match = file_matcher (ps->filename, false);
1120 if (!match)
1121 {
1122 /* Before we invoke realpath, which can get expensive when many
1123 files are involved, do a quick comparison of the basenames. */
1124 if (basenames_may_differ
1125 || file_matcher (lbasename (ps->filename), true))
1126 match = file_matcher (psymtab_to_fullname (ps), false);
1127 }
1128 if (!match)
1129 continue;
1130 }
1131
1132 if (lookup_name == nullptr
1133 || recursively_search_psymtabs (ps, objfile, search_flags,
1134 domain, search,
1135 *psym_lookup_name,
1136 symbol_matcher))
1137 {
1138 struct compunit_symtab *symtab =
1139 psymtab_to_symtab (objfile, ps);
1140
1141 gdb_assert (symtab != nullptr);
1142
1143 if (expansion_notify != NULL)
1144 if (!expansion_notify (symtab))
1145 return false;
1146 }
1147 }
1148
1149 return true;
1150 }
1151
1152 /* Psymtab version of has_symbols. See its definition in
1153 the definition of quick_symbol_functions in symfile.h. */
1154
1155 bool
1156 psymbol_functions::has_symbols (struct objfile *objfile)
1157 {
1158 return m_partial_symtabs->psymtabs != NULL;
1159 }
1160
1161 /* See quick_symbol_functions::has_unexpanded_symtabs in quick-symbol.h. */
1162
1163 bool
1164 psymbol_functions::has_unexpanded_symtabs (struct objfile *objfile)
1165 {
1166 for (partial_symtab *psymtab : require_partial_symbols (objfile))
1167 {
1168 /* Is this already expanded? */
1169 if (psymtab->readin_p (objfile))
1170 continue;
1171
1172 /* It has not yet been expanded. */
1173 return true;
1174 }
1175
1176 return false;
1177 }
1178
1179 /* Helper function for psym_find_compunit_symtab_by_address that fills
1180 in m_psymbol_map for a given range of psymbols. */
1181
1182 void
1183 psymbol_functions::fill_psymbol_map
1184 (struct objfile *objfile,
1185 struct partial_symtab *psymtab,
1186 std::set<CORE_ADDR> *seen_addrs,
1187 const std::vector<partial_symbol *> &symbols)
1188 {
1189 for (partial_symbol *psym : symbols)
1190 {
1191 if (psym->aclass == LOC_STATIC)
1192 {
1193 CORE_ADDR addr = psym->address (objfile);
1194 if (seen_addrs->find (addr) == seen_addrs->end ())
1195 {
1196 seen_addrs->insert (addr);
1197 m_psymbol_map.emplace_back (addr, psymtab);
1198 }
1199 }
1200 }
1201 }
1202
1203 /* See find_compunit_symtab_by_address in quick_symbol_functions, in
1204 symfile.h. */
1205
1206 compunit_symtab *
1207 psymbol_functions::find_compunit_symtab_by_address (struct objfile *objfile,
1208 CORE_ADDR address)
1209 {
1210 if (m_psymbol_map.empty ())
1211 {
1212 std::set<CORE_ADDR> seen_addrs;
1213
1214 for (partial_symtab *pst : require_partial_symbols (objfile))
1215 {
1216 fill_psymbol_map (objfile, pst,
1217 &seen_addrs,
1218 pst->global_psymbols);
1219 fill_psymbol_map (objfile, pst,
1220 &seen_addrs,
1221 pst->static_psymbols);
1222 }
1223
1224 m_psymbol_map.shrink_to_fit ();
1225
1226 std::sort (m_psymbol_map.begin (), m_psymbol_map.end (),
1227 [] (const std::pair<CORE_ADDR, partial_symtab *> &a,
1228 const std::pair<CORE_ADDR, partial_symtab *> &b)
1229 {
1230 return a.first < b.first;
1231 });
1232 }
1233
1234 auto iter = std::lower_bound
1235 (m_psymbol_map.begin (), m_psymbol_map.end (), address,
1236 [] (const std::pair<CORE_ADDR, partial_symtab *> &a,
1237 CORE_ADDR b)
1238 {
1239 return a.first < b;
1240 });
1241
1242 if (iter == m_psymbol_map.end () || iter->first != address)
1243 return NULL;
1244
1245 return psymtab_to_symtab (objfile, iter->second);
1246 }
1247
1248 \f
1249
1250 /* Partially fill a partial symtab. It will be completely filled at
1251 the end of the symbol list. */
1252
1253 partial_symtab::partial_symtab (const char *filename,
1254 psymtab_storage *partial_symtabs,
1255 objfile_per_bfd_storage *objfile_per_bfd,
1256 CORE_ADDR textlow)
1257 : partial_symtab (filename, partial_symtabs, objfile_per_bfd)
1258 {
1259 set_text_low (textlow);
1260 set_text_high (raw_text_low ()); /* default */
1261 }
1262
1263 /* Perform "finishing up" operations of a partial symtab. */
1264
1265 void
1266 partial_symtab::end ()
1267 {
1268 global_psymbols.shrink_to_fit ();
1269 static_psymbols.shrink_to_fit ();
1270
1271 /* Sort the global list; don't sort the static list. */
1272 std::sort (global_psymbols.begin (),
1273 global_psymbols.end (),
1274 [] (partial_symbol *s1, partial_symbol *s2)
1275 {
1276 return strcmp_iw_ordered (s1->ginfo.search_name (),
1277 s2->ginfo.search_name ()) < 0;
1278 });
1279 }
1280
1281 /* See psymtab.h. */
1282
1283 unsigned long
1284 psymbol_bcache::hash (const void *addr, int length)
1285 {
1286 unsigned long h = 0;
1287 struct partial_symbol *psymbol = (struct partial_symbol *) addr;
1288 unsigned int lang = psymbol->ginfo.language ();
1289 unsigned int domain = psymbol->domain;
1290 unsigned int theclass = psymbol->aclass;
1291
1292 h = fast_hash (&psymbol->ginfo.value, sizeof (psymbol->ginfo.value), h);
1293 h = fast_hash (&lang, sizeof (unsigned int), h);
1294 h = fast_hash (&domain, sizeof (unsigned int), h);
1295 h = fast_hash (&theclass, sizeof (unsigned int), h);
1296 /* Note that psymbol names are interned via compute_and_set_names, so
1297 there's no need to hash the contents of the name here. */
1298 h = fast_hash (&psymbol->ginfo.m_name, sizeof (psymbol->ginfo.m_name), h);
1299
1300 return h;
1301 }
1302
1303 /* See psymtab.h. */
1304
1305 int
1306 psymbol_bcache::compare (const void *addr1, const void *addr2, int length)
1307 {
1308 struct partial_symbol *sym1 = (struct partial_symbol *) addr1;
1309 struct partial_symbol *sym2 = (struct partial_symbol *) addr2;
1310
1311 return (memcmp (&sym1->ginfo.value, &sym2->ginfo.value,
1312 sizeof (sym1->ginfo.value)) == 0
1313 && sym1->ginfo.language () == sym2->ginfo.language ()
1314 && sym1->domain == sym2->domain
1315 && sym1->aclass == sym2->aclass
1316 /* Note that psymbol names are interned via
1317 compute_and_set_names, so there's no need to compare the
1318 contents of the name here. */
1319 && sym1->ginfo.linkage_name () == sym2->ginfo.linkage_name ());
1320 }
1321
1322 /* See psympriv.h. */
1323
1324 void
1325 partial_symtab::add_psymbol (const partial_symbol &psymbol,
1326 psymbol_placement where,
1327 psymtab_storage *partial_symtabs,
1328 struct objfile *objfile)
1329 {
1330 bool added;
1331
1332 /* Stash the partial symbol away in the cache. */
1333 partial_symbol *psym
1334 = ((struct partial_symbol *)
1335 partial_symtabs->psymbol_cache.insert
1336 (&psymbol, sizeof (struct partial_symbol), &added));
1337
1338 /* Do not duplicate global partial symbols. */
1339 if (where == psymbol_placement::GLOBAL && !added)
1340 return;
1341
1342 /* Save pointer to partial symbol in psymtab, growing symtab if needed. */
1343 std::vector<partial_symbol *> &list
1344 = (where == psymbol_placement::STATIC
1345 ? static_psymbols
1346 : global_psymbols);
1347 list.push_back (psym);
1348 }
1349
1350 /* See psympriv.h. */
1351
1352 void
1353 partial_symtab::add_psymbol (gdb::string_view name, bool copy_name,
1354 domain_enum domain,
1355 enum address_class theclass,
1356 short section,
1357 psymbol_placement where,
1358 CORE_ADDR coreaddr,
1359 enum language language,
1360 psymtab_storage *partial_symtabs,
1361 struct objfile *objfile)
1362 {
1363 struct partial_symbol psymbol;
1364 memset (&psymbol, 0, sizeof (psymbol));
1365
1366 psymbol.set_unrelocated_address (coreaddr);
1367 psymbol.ginfo.set_section_index (section);
1368 psymbol.domain = domain;
1369 psymbol.aclass = theclass;
1370 psymbol.ginfo.set_language (language, partial_symtabs->obstack ());
1371 psymbol.ginfo.compute_and_set_names (name, copy_name, objfile->per_bfd);
1372
1373 add_psymbol (psymbol, where, partial_symtabs, objfile);
1374 }
1375
1376 /* See psympriv.h. */
1377
1378 partial_symtab::partial_symtab (const char *filename_,
1379 psymtab_storage *partial_symtabs,
1380 objfile_per_bfd_storage *objfile_per_bfd)
1381 : searched_flag (PST_NOT_SEARCHED),
1382 text_low_valid (0),
1383 text_high_valid (0)
1384 {
1385 partial_symtabs->install_psymtab (this);
1386
1387 filename = objfile_per_bfd->intern (filename_);
1388
1389 if (symtab_create_debug)
1390 {
1391 /* Be a bit clever with debugging messages, and don't print objfile
1392 every time, only when it changes. */
1393 static std::string last_bfd_name;
1394 const char *this_bfd_name
1395 = bfd_get_filename (objfile_per_bfd->get_bfd ());
1396
1397 if (last_bfd_name.empty () || last_bfd_name != this_bfd_name)
1398 {
1399 last_bfd_name = this_bfd_name;
1400 fprintf_filtered (gdb_stdlog,
1401 "Creating one or more psymtabs for %s ...\n",
1402 this_bfd_name);
1403 }
1404 fprintf_filtered (gdb_stdlog,
1405 "Created psymtab %s for module %s.\n",
1406 host_address_to_string (this), filename);
1407 }
1408 }
1409
1410 /* See psympriv.h. */
1411
1412 void
1413 partial_symtab::expand_dependencies (struct objfile *objfile)
1414 {
1415 for (int i = 0; i < number_of_dependencies; ++i)
1416 {
1417 if (!dependencies[i]->readin_p (objfile)
1418 && dependencies[i]->user == NULL)
1419 {
1420 /* Inform about additional files to be read in. */
1421 if (info_verbose)
1422 {
1423 fputs_filtered (" ", gdb_stdout);
1424 wrap_here ("");
1425 fputs_filtered ("and ", gdb_stdout);
1426 wrap_here ("");
1427 printf_filtered ("%s...", dependencies[i]->filename);
1428 wrap_here (""); /* Flush output */
1429 gdb_flush (gdb_stdout);
1430 }
1431 dependencies[i]->expand_psymtab (objfile);
1432 }
1433 }
1434 }
1435
1436
1437 void
1438 psymtab_storage::discard_psymtab (struct partial_symtab *pst)
1439 {
1440 struct partial_symtab **prev_pst;
1441
1442 /* From dbxread.c:
1443 Empty psymtabs happen as a result of header files which don't
1444 have any symbols in them. There can be a lot of them. But this
1445 check is wrong, in that a psymtab with N_SLINE entries but
1446 nothing else is not empty, but we don't realize that. Fixing
1447 that without slowing things down might be tricky. */
1448
1449 /* First, snip it out of the psymtab chain. */
1450
1451 prev_pst = &psymtabs;
1452 while ((*prev_pst) != pst)
1453 prev_pst = &((*prev_pst)->next);
1454 (*prev_pst) = pst->next;
1455 delete pst;
1456 }
1457
1458 \f
1459
1460 /* Helper function for maintenance_print_psymbols to print the addrmap
1461 of PSYMTAB. If PSYMTAB is NULL print the entire addrmap. */
1462
1463 static void
1464 dump_psymtab_addrmap (struct objfile *objfile,
1465 psymtab_storage *partial_symtabs,
1466 struct partial_symtab *psymtab,
1467 struct ui_file *outfile)
1468 {
1469 if ((psymtab == NULL
1470 || psymtab->psymtabs_addrmap_supported)
1471 && partial_symtabs->psymtabs_addrmap != NULL)
1472 {
1473 if (psymtab == nullptr)
1474 fprintf_filtered (outfile, _("Entire address map:\n"));
1475 else
1476 fprintf_filtered (outfile, _("Address map:\n"));
1477 addrmap_dump (partial_symtabs->psymtabs_addrmap, outfile, psymtab);
1478 }
1479 }
1480
1481 static void
1482 maintenance_print_psymbols (const char *args, int from_tty)
1483 {
1484 struct ui_file *outfile = gdb_stdout;
1485 char *address_arg = NULL, *source_arg = NULL, *objfile_arg = NULL;
1486 int i, outfile_idx, found;
1487 CORE_ADDR pc = 0;
1488 struct obj_section *section = NULL;
1489
1490 dont_repeat ();
1491
1492 gdb_argv argv (args);
1493
1494 for (i = 0; argv != NULL && argv[i] != NULL; ++i)
1495 {
1496 if (strcmp (argv[i], "-pc") == 0)
1497 {
1498 if (argv[i + 1] == NULL)
1499 error (_("Missing pc value"));
1500 address_arg = argv[++i];
1501 }
1502 else if (strcmp (argv[i], "-source") == 0)
1503 {
1504 if (argv[i + 1] == NULL)
1505 error (_("Missing source file"));
1506 source_arg = argv[++i];
1507 }
1508 else if (strcmp (argv[i], "-objfile") == 0)
1509 {
1510 if (argv[i + 1] == NULL)
1511 error (_("Missing objfile name"));
1512 objfile_arg = argv[++i];
1513 }
1514 else if (strcmp (argv[i], "--") == 0)
1515 {
1516 /* End of options. */
1517 ++i;
1518 break;
1519 }
1520 else if (argv[i][0] == '-')
1521 {
1522 /* Future proofing: Don't allow OUTFILE to begin with "-". */
1523 error (_("Unknown option: %s"), argv[i]);
1524 }
1525 else
1526 break;
1527 }
1528 outfile_idx = i;
1529
1530 if (address_arg != NULL && source_arg != NULL)
1531 error (_("Must specify at most one of -pc and -source"));
1532
1533 stdio_file arg_outfile;
1534
1535 if (argv != NULL && argv[outfile_idx] != NULL)
1536 {
1537 if (argv[outfile_idx + 1] != NULL)
1538 error (_("Junk at end of command"));
1539 gdb::unique_xmalloc_ptr<char> outfile_name
1540 (tilde_expand (argv[outfile_idx]));
1541 if (!arg_outfile.open (outfile_name.get (), FOPEN_WT))
1542 perror_with_name (outfile_name.get ());
1543 outfile = &arg_outfile;
1544 }
1545
1546 if (address_arg != NULL)
1547 {
1548 pc = parse_and_eval_address (address_arg);
1549 /* If we fail to find a section, that's ok, try the lookup anyway. */
1550 section = find_pc_section (pc);
1551 }
1552
1553 found = 0;
1554 for (objfile *objfile : current_program_space->objfiles ())
1555 {
1556 int printed_objfile_header = 0;
1557 int print_for_objfile = 1;
1558
1559 QUIT;
1560 if (objfile_arg != NULL)
1561 print_for_objfile
1562 = compare_filenames_for_search (objfile_name (objfile),
1563 objfile_arg);
1564 if (!print_for_objfile)
1565 continue;
1566
1567 for (const auto &iter : objfile->qf)
1568 {
1569 psymbol_functions *psf
1570 = dynamic_cast<psymbol_functions *> (iter.get ());
1571 if (psf == nullptr)
1572 continue;
1573
1574 psymtab_storage *partial_symtabs
1575 = psf->get_partial_symtabs ().get ();
1576
1577 if (address_arg != NULL)
1578 {
1579 struct bound_minimal_symbol msymbol = { NULL, NULL };
1580
1581 /* We don't assume each pc has a unique objfile (this is for
1582 debugging). */
1583 struct partial_symtab *ps
1584 = psf->find_pc_sect_psymtab (objfile, pc, section, msymbol);
1585 if (ps != NULL)
1586 {
1587 if (!printed_objfile_header)
1588 {
1589 outfile->printf ("\nPartial symtabs for objfile %s\n",
1590 objfile_name (objfile));
1591 printed_objfile_header = 1;
1592 }
1593 dump_psymtab (objfile, ps, outfile);
1594 dump_psymtab_addrmap (objfile, partial_symtabs, ps, outfile);
1595 found = 1;
1596 }
1597 }
1598 else
1599 {
1600 for (partial_symtab *ps : psf->require_partial_symbols (objfile))
1601 {
1602 int print_for_source = 0;
1603
1604 QUIT;
1605 if (source_arg != NULL)
1606 {
1607 print_for_source
1608 = compare_filenames_for_search (ps->filename, source_arg);
1609 found = 1;
1610 }
1611 if (source_arg == NULL
1612 || print_for_source)
1613 {
1614 if (!printed_objfile_header)
1615 {
1616 outfile->printf ("\nPartial symtabs for objfile %s\n",
1617 objfile_name (objfile));
1618 printed_objfile_header = 1;
1619 }
1620 dump_psymtab (objfile, ps, outfile);
1621 dump_psymtab_addrmap (objfile, partial_symtabs, ps,
1622 outfile);
1623 }
1624 }
1625 }
1626
1627 /* If we're printing all the objfile's symbols dump the full addrmap. */
1628
1629 if (address_arg == NULL
1630 && source_arg == NULL
1631 && partial_symtabs->psymtabs_addrmap != NULL)
1632 {
1633 outfile->puts ("\n");
1634 dump_psymtab_addrmap (objfile, partial_symtabs, NULL, outfile);
1635 }
1636 }
1637 }
1638
1639 if (!found)
1640 {
1641 if (address_arg != NULL)
1642 error (_("No partial symtab for address: %s"), address_arg);
1643 if (source_arg != NULL)
1644 error (_("No partial symtab for source file: %s"), source_arg);
1645 }
1646 }
1647
1648 /* List all the partial symbol tables whose names match REGEXP (optional). */
1649
1650 static void
1651 maintenance_info_psymtabs (const char *regexp, int from_tty)
1652 {
1653 if (regexp)
1654 re_comp (regexp);
1655
1656 for (struct program_space *pspace : program_spaces)
1657 for (objfile *objfile : pspace->objfiles ())
1658 {
1659 struct gdbarch *gdbarch = objfile->arch ();
1660
1661 /* We don't want to print anything for this objfile until we
1662 actually find a symtab whose name matches. */
1663 int printed_objfile_start = 0;
1664
1665 for (const auto &iter : objfile->qf)
1666 {
1667 psymbol_functions *psf
1668 = dynamic_cast<psymbol_functions *> (iter.get ());
1669 if (psf == nullptr)
1670 continue;
1671 for (partial_symtab *psymtab : psf->require_partial_symbols (objfile))
1672 {
1673 QUIT;
1674
1675 if (! regexp
1676 || re_exec (psymtab->filename))
1677 {
1678 if (! printed_objfile_start)
1679 {
1680 printf_filtered ("{ objfile %s ", objfile_name (objfile));
1681 wrap_here (" ");
1682 printf_filtered ("((struct objfile *) %s)\n",
1683 host_address_to_string (objfile));
1684 printed_objfile_start = 1;
1685 }
1686
1687 printf_filtered (" { psymtab %s ", psymtab->filename);
1688 wrap_here (" ");
1689 printf_filtered ("((struct partial_symtab *) %s)\n",
1690 host_address_to_string (psymtab));
1691
1692 printf_filtered (" readin %s\n",
1693 psymtab->readin_p (objfile) ? "yes" : "no");
1694 printf_filtered (" fullname %s\n",
1695 psymtab->fullname
1696 ? psymtab->fullname : "(null)");
1697 printf_filtered (" text addresses ");
1698 fputs_filtered (paddress (gdbarch,
1699 psymtab->text_low (objfile)),
1700 gdb_stdout);
1701 printf_filtered (" -- ");
1702 fputs_filtered (paddress (gdbarch,
1703 psymtab->text_high (objfile)),
1704 gdb_stdout);
1705 printf_filtered ("\n");
1706 printf_filtered (" psymtabs_addrmap_supported %s\n",
1707 (psymtab->psymtabs_addrmap_supported
1708 ? "yes" : "no"));
1709 printf_filtered (" globals ");
1710 if (!psymtab->global_psymbols.empty ())
1711 printf_filtered
1712 ("(* (struct partial_symbol **) %s @ %d)\n",
1713 host_address_to_string (psymtab->global_psymbols.data ()),
1714 (int) psymtab->global_psymbols.size ());
1715 else
1716 printf_filtered ("(none)\n");
1717 printf_filtered (" statics ");
1718 if (!psymtab->static_psymbols.empty ())
1719 printf_filtered
1720 ("(* (struct partial_symbol **) %s @ %d)\n",
1721 host_address_to_string (psymtab->static_psymbols.data ()),
1722 (int) psymtab->static_psymbols.size ());
1723 else
1724 printf_filtered ("(none)\n");
1725 if (psymtab->user)
1726 printf_filtered (" user %s "
1727 "((struct partial_symtab *) %s)\n",
1728 psymtab->user->filename,
1729 host_address_to_string (psymtab->user));
1730 printf_filtered (" dependencies ");
1731 if (psymtab->number_of_dependencies)
1732 {
1733 int i;
1734
1735 printf_filtered ("{\n");
1736 for (i = 0; i < psymtab->number_of_dependencies; i++)
1737 {
1738 struct partial_symtab *dep = psymtab->dependencies[i];
1739
1740 /* Note the string concatenation there --- no
1741 comma. */
1742 printf_filtered (" psymtab %s "
1743 "((struct partial_symtab *) %s)\n",
1744 dep->filename,
1745 host_address_to_string (dep));
1746 }
1747 printf_filtered (" }\n");
1748 }
1749 else
1750 printf_filtered ("(none)\n");
1751 printf_filtered (" }\n");
1752 }
1753 }
1754 }
1755
1756 if (printed_objfile_start)
1757 printf_filtered ("}\n");
1758 }
1759 }
1760
1761 /* Check consistency of currently expanded psymtabs vs symtabs. */
1762
1763 static void
1764 maintenance_check_psymtabs (const char *ignore, int from_tty)
1765 {
1766 struct symbol *sym;
1767 struct compunit_symtab *cust = NULL;
1768 const struct blockvector *bv;
1769 const struct block *b;
1770
1771 for (objfile *objfile : current_program_space->objfiles ())
1772 {
1773 for (const auto &iter : objfile->qf)
1774 {
1775 psymbol_functions *psf
1776 = dynamic_cast<psymbol_functions *> (iter.get ());
1777 if (psf == nullptr)
1778 continue;
1779
1780 for (partial_symtab *ps : psf->require_partial_symbols (objfile))
1781 {
1782 struct gdbarch *gdbarch = objfile->arch ();
1783
1784 /* We don't call psymtab_to_symtab here because that may cause symtab
1785 expansion. When debugging a problem it helps if checkers leave
1786 things unchanged. */
1787 cust = ps->get_compunit_symtab (objfile);
1788
1789 /* First do some checks that don't require the associated symtab. */
1790 if (ps->text_high (objfile) < ps->text_low (objfile))
1791 {
1792 printf_filtered ("Psymtab ");
1793 puts_filtered (ps->filename);
1794 printf_filtered (" covers bad range ");
1795 fputs_filtered (paddress (gdbarch, ps->text_low (objfile)),
1796 gdb_stdout);
1797 printf_filtered (" - ");
1798 fputs_filtered (paddress (gdbarch, ps->text_high (objfile)),
1799 gdb_stdout);
1800 printf_filtered ("\n");
1801 continue;
1802 }
1803
1804 /* Now do checks requiring the associated symtab. */
1805 if (cust == NULL)
1806 continue;
1807 bv = COMPUNIT_BLOCKVECTOR (cust);
1808 b = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
1809 for (partial_symbol *psym : ps->static_psymbols)
1810 {
1811 /* Skip symbols for inlined functions without address. These may
1812 or may not have a match in the full symtab. */
1813 if (psym->aclass == LOC_BLOCK
1814 && psym->ginfo.value.address == 0)
1815 continue;
1816
1817 sym = block_lookup_symbol (b, psym->ginfo.search_name (),
1818 symbol_name_match_type::SEARCH_NAME,
1819 psym->domain);
1820 if (!sym)
1821 {
1822 printf_filtered ("Static symbol `");
1823 puts_filtered (psym->ginfo.linkage_name ());
1824 printf_filtered ("' only found in ");
1825 puts_filtered (ps->filename);
1826 printf_filtered (" psymtab\n");
1827 }
1828 }
1829 b = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
1830 for (partial_symbol *psym : ps->global_psymbols)
1831 {
1832 sym = block_lookup_symbol (b, psym->ginfo.search_name (),
1833 symbol_name_match_type::SEARCH_NAME,
1834 psym->domain);
1835 if (!sym)
1836 {
1837 printf_filtered ("Global symbol `");
1838 puts_filtered (psym->ginfo.linkage_name ());
1839 printf_filtered ("' only found in ");
1840 puts_filtered (ps->filename);
1841 printf_filtered (" psymtab\n");
1842 }
1843 }
1844 if (ps->raw_text_high () != 0
1845 && (ps->text_low (objfile) < BLOCK_START (b)
1846 || ps->text_high (objfile) > BLOCK_END (b)))
1847 {
1848 printf_filtered ("Psymtab ");
1849 puts_filtered (ps->filename);
1850 printf_filtered (" covers ");
1851 fputs_filtered (paddress (gdbarch, ps->text_low (objfile)),
1852 gdb_stdout);
1853 printf_filtered (" - ");
1854 fputs_filtered (paddress (gdbarch, ps->text_high (objfile)),
1855 gdb_stdout);
1856 printf_filtered (" but symtab covers only ");
1857 fputs_filtered (paddress (gdbarch, BLOCK_START (b)), gdb_stdout);
1858 printf_filtered (" - ");
1859 fputs_filtered (paddress (gdbarch, BLOCK_END (b)), gdb_stdout);
1860 printf_filtered ("\n");
1861 }
1862 }
1863 }
1864 }
1865 }
1866
1867 void _initialize_psymtab ();
1868 void
1869 _initialize_psymtab ()
1870 {
1871 add_cmd ("psymbols", class_maintenance, maintenance_print_psymbols, _("\
1872 Print dump of current partial symbol definitions.\n\
1873 Usage: mt print psymbols [-objfile OBJFILE] [-pc ADDRESS] [--] [OUTFILE]\n\
1874 mt print psymbols [-objfile OBJFILE] [-source SOURCE] [--] [OUTFILE]\n\
1875 Entries in the partial symbol table are dumped to file OUTFILE,\n\
1876 or the terminal if OUTFILE is unspecified.\n\
1877 If ADDRESS is provided, dump only the file for that address.\n\
1878 If SOURCE is provided, dump only that file's symbols.\n\
1879 If OBJFILE is provided, dump only that file's minimal symbols."),
1880 &maintenanceprintlist);
1881
1882 add_cmd ("psymtabs", class_maintenance, maintenance_info_psymtabs, _("\
1883 List the partial symbol tables for all object files.\n\
1884 This does not include information about individual partial symbols,\n\
1885 just the symbol table structures themselves."),
1886 &maintenanceinfolist);
1887
1888 add_cmd ("check-psymtabs", class_maintenance, maintenance_check_psymtabs,
1889 _("\
1890 Check consistency of currently expanded psymtabs versus symtabs."),
1891 &maintenancelist);
1892 }