[gdb/testsuite] xfail gdb.ada/O2_float_param.exp for aarch64 and gcc 7.5.0
[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 "gdbsupport/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 #include "gdbsupport/buildargv.h"
40
41 static struct partial_symbol *lookup_partial_symbol (struct objfile *,
42 struct partial_symtab *,
43 const lookup_name_info &,
44 int,
45 domain_enum);
46
47 static const char *psymtab_to_fullname (struct partial_symtab *ps);
48
49 static struct partial_symbol *find_pc_sect_psymbol (struct objfile *,
50 struct partial_symtab *,
51 CORE_ADDR,
52 struct obj_section *);
53
54 static struct compunit_symtab *psymtab_to_symtab (struct objfile *objfile,
55 struct partial_symtab *pst);
56
57 psymtab_storage::~psymtab_storage ()
58 {
59 partial_symtab *iter = psymtabs;
60 while (iter != nullptr)
61 {
62 partial_symtab *next = iter->next;
63 delete iter;
64 iter = next;
65 }
66 }
67
68 /* See psymtab.h. */
69
70 void
71 psymtab_storage::install_psymtab (partial_symtab *pst)
72 {
73 pst->next = psymtabs;
74 psymtabs = pst;
75 }
76
77 \f
78
79 /* See psympriv.h. */
80
81 psymtab_storage::partial_symtab_range
82 psymbol_functions::partial_symbols (struct objfile *objfile)
83 {
84 gdb_assert ((objfile->flags & OBJF_PSYMTABS_READ) != 0);
85 return m_partial_symtabs->range ();
86 }
87
88 /* Find which partial symtab contains PC and SECTION starting at psymtab PST.
89 We may find a different psymtab than PST. See FIND_PC_SECT_PSYMTAB. */
90
91 static struct partial_symtab *
92 find_pc_sect_psymtab_closer (struct objfile *objfile,
93 CORE_ADDR pc, struct obj_section *section,
94 struct partial_symtab *pst,
95 struct bound_minimal_symbol msymbol)
96 {
97 struct partial_symtab *tpst;
98 struct partial_symtab *best_pst = pst;
99 CORE_ADDR best_addr = pst->text_low (objfile);
100
101 /* An objfile that has its functions reordered might have
102 many partial symbol tables containing the PC, but
103 we want the partial symbol table that contains the
104 function containing the PC. */
105 if (!(objfile->flags & OBJF_REORDERED)
106 && section == NULL) /* Can't validate section this way. */
107 return pst;
108
109 if (msymbol.minsym == NULL)
110 return pst;
111
112 /* The code range of partial symtabs sometimes overlap, so, in
113 the loop below, we need to check all partial symtabs and
114 find the one that fits better for the given PC address. We
115 select the partial symtab that contains a symbol whose
116 address is closest to the PC address. By closest we mean
117 that find_pc_sect_symbol returns the symbol with address
118 that is closest and still less than the given PC. */
119 for (tpst = pst; tpst != NULL; tpst = tpst->next)
120 {
121 if (pc >= tpst->text_low (objfile) && pc < tpst->text_high (objfile))
122 {
123 struct partial_symbol *p;
124 CORE_ADDR this_addr;
125
126 /* NOTE: This assumes that every psymbol has a
127 corresponding msymbol, which is not necessarily
128 true; the debug info might be much richer than the
129 object's symbol table. */
130 p = find_pc_sect_psymbol (objfile, tpst, pc, section);
131 if (p != NULL
132 && (p->address (objfile) == msymbol.value_address ()))
133 return tpst;
134
135 /* Also accept the textlow value of a psymtab as a
136 "symbol", to provide some support for partial
137 symbol tables with line information but no debug
138 symbols (e.g. those produced by an assembler). */
139 if (p != NULL)
140 this_addr = p->address (objfile);
141 else
142 this_addr = tpst->text_low (objfile);
143
144 /* Check whether it is closer than our current
145 BEST_ADDR. Since this symbol address is
146 necessarily lower or equal to PC, the symbol closer
147 to PC is the symbol which address is the highest.
148 This way we return the psymtab which contains such
149 best match symbol. This can help in cases where the
150 symbol information/debuginfo is not complete, like
151 for instance on IRIX6 with gcc, where no debug info
152 is emitted for statics. (See also the nodebug.exp
153 testcase.) */
154 if (this_addr > best_addr)
155 {
156 best_addr = this_addr;
157 best_pst = tpst;
158 }
159 }
160 }
161 return best_pst;
162 }
163
164 /* See psympriv.h. */
165
166 struct partial_symtab *
167 psymbol_functions::find_pc_sect_psymtab (struct objfile *objfile,
168 CORE_ADDR pc,
169 struct obj_section *section,
170 struct bound_minimal_symbol msymbol)
171 {
172 for (partial_symtab *pst : partial_symbols (objfile))
173 if (pc >= pst->text_low (objfile) && pc < pst->text_high (objfile))
174 {
175 struct partial_symtab *best_pst;
176
177 best_pst = find_pc_sect_psymtab_closer (objfile, pc, section, pst,
178 msymbol);
179 if (best_pst != NULL)
180 return best_pst;
181 }
182
183 return NULL;
184 }
185
186 /* Psymtab version of find_pc_sect_compunit_symtab. See its definition in
187 the definition of quick_symbol_functions in symfile.h. */
188
189 struct compunit_symtab *
190 psymbol_functions::find_pc_sect_compunit_symtab
191 (struct objfile *objfile,
192 struct bound_minimal_symbol msymbol,
193 CORE_ADDR pc,
194 struct obj_section *section,
195 int warn_if_readin)
196 {
197 struct partial_symtab *ps = find_pc_sect_psymtab (objfile,
198 pc, section,
199 msymbol);
200 if (ps != NULL)
201 {
202 if (warn_if_readin && ps->readin_p (objfile))
203 /* Might want to error() here (in case symtab is corrupt and
204 will cause a core dump), but maybe we can successfully
205 continue, so let's not. */
206 warning (_("\
207 (Internal error: pc %s in read in psymtab, but not in symtab.)\n"),
208 paddress (objfile->arch (), pc));
209 psymtab_to_symtab (objfile, ps);
210 return ps->get_compunit_symtab (objfile);
211 }
212 return NULL;
213 }
214
215 /* Find which partial symbol within a psymtab matches PC and SECTION.
216 Return NULL if none. */
217
218 static struct partial_symbol *
219 find_pc_sect_psymbol (struct objfile *objfile,
220 struct partial_symtab *psymtab, CORE_ADDR pc,
221 struct obj_section *section)
222 {
223 struct partial_symbol *best = NULL;
224 CORE_ADDR best_pc;
225 const CORE_ADDR textlow = psymtab->text_low (objfile);
226
227 gdb_assert (psymtab != NULL);
228
229 /* Cope with programs that start at address 0. */
230 best_pc = (textlow != 0) ? textlow - 1 : 0;
231
232 /* Search the global symbols as well as the static symbols, so that
233 find_pc_partial_function doesn't use a minimal symbol and thus
234 cache a bad endaddr. */
235 for (partial_symbol *p : psymtab->global_psymbols)
236 {
237 if (p->domain == VAR_DOMAIN
238 && p->aclass == LOC_BLOCK
239 && pc >= p->address (objfile)
240 && (p->address (objfile) > best_pc
241 || (psymtab->text_low (objfile) == 0
242 && best_pc == 0 && p->address (objfile) == 0)))
243 {
244 if (section != NULL) /* Match on a specific section. */
245 {
246 if (!matching_obj_sections (p->obj_section (objfile),
247 section))
248 continue;
249 }
250 best_pc = p->address (objfile);
251 best = p;
252 }
253 }
254
255 for (partial_symbol *p : psymtab->static_psymbols)
256 {
257 if (p->domain == VAR_DOMAIN
258 && p->aclass == LOC_BLOCK
259 && pc >= p->address (objfile)
260 && (p->address (objfile) > best_pc
261 || (psymtab->text_low (objfile) == 0
262 && best_pc == 0 && p->address (objfile) == 0)))
263 {
264 if (section != NULL) /* Match on a specific section. */
265 {
266 if (!matching_obj_sections (p->obj_section (objfile),
267 section))
268 continue;
269 }
270 best_pc = p->address (objfile);
271 best = p;
272 }
273 }
274
275 return best;
276 }
277
278 /* Psymtab version of lookup_global_symbol_language. See its definition in
279 the definition of quick_symbol_functions in symfile.h. */
280
281 enum language
282 psymbol_functions::lookup_global_symbol_language (struct objfile *objfile,
283 const char *name,
284 domain_enum domain,
285 bool *symbol_found_p)
286 {
287 *symbol_found_p = false;
288 if (objfile->sf == NULL)
289 return language_unknown;
290
291 lookup_name_info lookup_name (name, symbol_name_match_type::FULL);
292
293 for (partial_symtab *ps : partial_symbols (objfile))
294 {
295 struct partial_symbol *psym;
296 if (ps->readin_p (objfile))
297 continue;
298
299 psym = lookup_partial_symbol (objfile, ps, lookup_name, 1, domain);
300 if (psym)
301 {
302 *symbol_found_p = true;
303 return psym->ginfo.language ();
304 }
305 }
306
307 return language_unknown;
308 }
309
310 /* Returns true if PSYM matches LOOKUP_NAME. */
311
312 static bool
313 psymbol_name_matches (partial_symbol *psym,
314 const lookup_name_info &lookup_name)
315 {
316 const language_defn *lang = language_def (psym->ginfo.language ());
317 symbol_name_matcher_ftype *name_match
318 = lang->get_symbol_name_matcher (lookup_name);
319 return name_match (psym->ginfo.search_name (), lookup_name, NULL);
320 }
321
322 /* Look in PST for a symbol in DOMAIN whose name matches NAME. Search
323 the global block of PST if GLOBAL, and otherwise the static block.
324 MATCH is the comparison operation that returns true iff MATCH (s,
325 NAME), where s is a SYMBOL_SEARCH_NAME. If ORDERED_COMPARE is
326 non-null, the symbols in the block are assumed to be ordered
327 according to it (allowing binary search). It must be compatible
328 with MATCH. Returns the symbol, if found, and otherwise NULL. */
329
330 static struct partial_symbol *
331 match_partial_symbol (struct objfile *objfile,
332 struct partial_symtab *pst, int global,
333 const lookup_name_info &name, domain_enum domain,
334 symbol_compare_ftype *ordered_compare)
335 {
336 struct partial_symbol **start, **psym;
337 struct partial_symbol **top, **real_top, **bottom, **center;
338 int length = (global
339 ? pst->global_psymbols.size ()
340 : pst->static_psymbols.size ());
341 int do_linear_search = 1;
342
343 if (length == 0)
344 return NULL;
345
346 start = (global ?
347 &pst->global_psymbols[0] :
348 &pst->static_psymbols[0]);
349
350 if (global && ordered_compare) /* Can use a binary search. */
351 {
352 do_linear_search = 0;
353
354 /* Binary search. This search is guaranteed to end with center
355 pointing at the earliest partial symbol whose name might be
356 correct. At that point *all* partial symbols with an
357 appropriate name will be checked against the correct
358 domain. */
359
360 bottom = start;
361 top = start + length - 1;
362 real_top = top;
363 while (top > bottom)
364 {
365 center = bottom + (top - bottom) / 2;
366 gdb_assert (center < top);
367
368 enum language lang = (*center)->ginfo.language ();
369 const char *lang_ln = name.language_lookup_name (lang);
370
371 if (ordered_compare ((*center)->ginfo.search_name (),
372 lang_ln) >= 0)
373 top = center;
374 else
375 bottom = center + 1;
376 }
377 gdb_assert (top == bottom);
378
379 while (top <= real_top
380 && psymbol_name_matches (*top, name))
381 {
382 if (symbol_matches_domain ((*top)->ginfo.language (),
383 (*top)->domain, domain))
384 return *top;
385 top++;
386 }
387 }
388
389 /* Can't use a binary search or else we found during the binary search that
390 we should also do a linear search. */
391
392 if (do_linear_search)
393 {
394 for (psym = start; psym < start + length; psym++)
395 {
396 if (symbol_matches_domain ((*psym)->ginfo.language (),
397 (*psym)->domain, domain)
398 && psymbol_name_matches (*psym, name))
399 return *psym;
400 }
401 }
402
403 return NULL;
404 }
405
406 /* Look, in partial_symtab PST, for symbol whose natural name is
407 LOOKUP_NAME. Check the global symbols if GLOBAL, the static
408 symbols if not. */
409
410 static struct partial_symbol *
411 lookup_partial_symbol (struct objfile *objfile,
412 struct partial_symtab *pst,
413 const lookup_name_info &lookup_name,
414 int global, domain_enum domain)
415 {
416 struct partial_symbol **start, **psym;
417 struct partial_symbol **top, **real_top, **bottom, **center;
418 int length = (global
419 ? pst->global_psymbols.size ()
420 : pst->static_psymbols.size ());
421 int do_linear_search = 1;
422
423 if (length == 0)
424 return NULL;
425
426 start = (global ?
427 &pst->global_psymbols[0] :
428 &pst->static_psymbols[0]);
429
430 if (global) /* This means we can use a binary search. */
431 {
432 do_linear_search = 0;
433
434 /* Binary search. This search is guaranteed to end with center
435 pointing at the earliest partial symbol whose name might be
436 correct. At that point *all* partial symbols with an
437 appropriate name will be checked against the correct
438 domain. */
439
440 bottom = start;
441 top = start + length - 1;
442 real_top = top;
443 while (top > bottom)
444 {
445 center = bottom + (top - bottom) / 2;
446
447 gdb_assert (center < top);
448
449 if (strcmp_iw_ordered ((*center)->ginfo.search_name (),
450 lookup_name.c_str ()) >= 0)
451 {
452 top = center;
453 }
454 else
455 {
456 bottom = center + 1;
457 }
458 }
459
460 gdb_assert (top == bottom);
461
462 /* For `case_sensitivity == case_sensitive_off' strcmp_iw_ordered will
463 search more exactly than what matches SYMBOL_MATCHES_SEARCH_NAME. */
464 while (top >= start && symbol_matches_search_name (&(*top)->ginfo,
465 lookup_name))
466 top--;
467
468 /* Fixup to have a symbol which matches SYMBOL_MATCHES_SEARCH_NAME. */
469 top++;
470
471 while (top <= real_top && symbol_matches_search_name (&(*top)->ginfo,
472 lookup_name))
473 {
474 if (symbol_matches_domain ((*top)->ginfo.language (),
475 (*top)->domain, domain))
476 return *top;
477 top++;
478 }
479 }
480
481 /* Can't use a binary search or else we found during the binary search that
482 we should also do a linear search. */
483
484 if (do_linear_search)
485 {
486 for (psym = start; psym < start + length; psym++)
487 {
488 if (symbol_matches_domain ((*psym)->ginfo.language (),
489 (*psym)->domain, domain)
490 && symbol_matches_search_name (&(*psym)->ginfo, lookup_name))
491 return *psym;
492 }
493 }
494
495 return NULL;
496 }
497
498 /* Get the symbol table that corresponds to a partial_symtab.
499 This is fast after the first time you do it.
500 The result will be NULL if the primary symtab has no symbols,
501 which can happen. Otherwise the result is the primary symtab
502 that contains PST. */
503
504 static struct compunit_symtab *
505 psymtab_to_symtab (struct objfile *objfile, struct partial_symtab *pst)
506 {
507 /* If it is a shared psymtab, find an unshared psymtab that includes
508 it. Any such psymtab will do. */
509 while (pst->user != NULL)
510 pst = pst->user;
511
512 /* If it's been looked up before, return it. */
513 if (pst->get_compunit_symtab (objfile))
514 return pst->get_compunit_symtab (objfile);
515
516 /* If it has not yet been read in, read it. */
517 if (!pst->readin_p (objfile))
518 {
519 scoped_restore decrementer = increment_reading_symtab ();
520
521 if (info_verbose)
522 {
523 gdb_printf (_("Reading in symbols for %s...\n"),
524 pst->filename);
525 gdb_flush (gdb_stdout);
526 }
527
528 pst->read_symtab (objfile);
529 }
530
531 return pst->get_compunit_symtab (objfile);
532 }
533
534 /* Psymtab version of find_last_source_symtab. See its definition in
535 the definition of quick_symbol_functions in symfile.h. */
536
537 struct symtab *
538 psymbol_functions::find_last_source_symtab (struct objfile *ofp)
539 {
540 struct partial_symtab *cs_pst = NULL;
541
542 for (partial_symtab *ps : partial_symbols (ofp))
543 {
544 const char *name = ps->filename;
545 int len = strlen (name);
546
547 if (!(len > 2 && (strcmp (&name[len - 2], ".h") == 0
548 || strcmp (name, "<<C++-namespaces>>") == 0)))
549 cs_pst = ps;
550 }
551
552 if (cs_pst)
553 {
554 if (cs_pst->readin_p (ofp))
555 {
556 internal_error (__FILE__, __LINE__,
557 _("select_source_symtab: "
558 "readin pst found and no symtabs."));
559 }
560 else
561 {
562 struct compunit_symtab *cust = psymtab_to_symtab (ofp, cs_pst);
563
564 if (cust == NULL)
565 return NULL;
566 return cust->primary_filetab ();
567 }
568 }
569 return NULL;
570 }
571
572 /* Psymtab version of forget_cached_source_info. See its definition in
573 the definition of quick_symbol_functions in symfile.h. */
574
575 void
576 psymbol_functions::forget_cached_source_info (struct objfile *objfile)
577 {
578 for (partial_symtab *pst : partial_symbols (objfile))
579 {
580 if (pst->fullname != NULL)
581 {
582 xfree (pst->fullname);
583 pst->fullname = NULL;
584 }
585 }
586 }
587
588 static void
589 print_partial_symbols (struct gdbarch *gdbarch, struct objfile *objfile,
590 const std::vector<partial_symbol *> &symbols,
591 const char *what, struct ui_file *outfile)
592 {
593 gdb_printf (outfile, " %s partial symbols:\n", what);
594 for (partial_symbol *p : symbols)
595 {
596 QUIT;
597 gdb_printf (outfile, " `%s'", p->ginfo.linkage_name ());
598 if (p->ginfo.demangled_name () != NULL)
599 {
600 gdb_printf (outfile, " `%s'",
601 p->ginfo.demangled_name ());
602 }
603 gdb_puts (", ", outfile);
604 switch (p->domain)
605 {
606 case UNDEF_DOMAIN:
607 gdb_puts ("undefined domain, ", outfile);
608 break;
609 case VAR_DOMAIN:
610 /* This is the usual thing -- don't print it. */
611 break;
612 case STRUCT_DOMAIN:
613 gdb_puts ("struct domain, ", outfile);
614 break;
615 case MODULE_DOMAIN:
616 gdb_puts ("module domain, ", outfile);
617 break;
618 case LABEL_DOMAIN:
619 gdb_puts ("label domain, ", outfile);
620 break;
621 case COMMON_BLOCK_DOMAIN:
622 gdb_puts ("common block domain, ", outfile);
623 break;
624 default:
625 gdb_puts ("<invalid domain>, ", outfile);
626 break;
627 }
628 switch (p->aclass)
629 {
630 case LOC_UNDEF:
631 gdb_puts ("undefined", outfile);
632 break;
633 case LOC_CONST:
634 gdb_puts ("constant int", outfile);
635 break;
636 case LOC_STATIC:
637 gdb_puts ("static", outfile);
638 break;
639 case LOC_REGISTER:
640 gdb_puts ("register", outfile);
641 break;
642 case LOC_ARG:
643 gdb_puts ("pass by value", outfile);
644 break;
645 case LOC_REF_ARG:
646 gdb_puts ("pass by reference", outfile);
647 break;
648 case LOC_REGPARM_ADDR:
649 gdb_puts ("register address parameter", outfile);
650 break;
651 case LOC_LOCAL:
652 gdb_puts ("stack parameter", outfile);
653 break;
654 case LOC_TYPEDEF:
655 gdb_puts ("type", outfile);
656 break;
657 case LOC_LABEL:
658 gdb_puts ("label", outfile);
659 break;
660 case LOC_BLOCK:
661 gdb_puts ("function", outfile);
662 break;
663 case LOC_CONST_BYTES:
664 gdb_puts ("constant bytes", outfile);
665 break;
666 case LOC_UNRESOLVED:
667 gdb_puts ("unresolved", outfile);
668 break;
669 case LOC_OPTIMIZED_OUT:
670 gdb_puts ("optimized out", outfile);
671 break;
672 case LOC_COMPUTED:
673 gdb_puts ("computed at runtime", outfile);
674 break;
675 default:
676 gdb_puts ("<invalid location>", outfile);
677 break;
678 }
679 gdb_puts (", ", outfile);
680 gdb_puts (paddress (gdbarch, p->unrelocated_address ()), outfile);
681 gdb_printf (outfile, "\n");
682 }
683 }
684
685 static void
686 dump_psymtab (struct objfile *objfile, struct partial_symtab *psymtab,
687 struct ui_file *outfile)
688 {
689 struct gdbarch *gdbarch = objfile->arch ();
690 int i;
691
692 if (psymtab->anonymous)
693 {
694 gdb_printf (outfile, "\nAnonymous partial symtab (%s) ",
695 psymtab->filename);
696 }
697 else
698 {
699 gdb_printf (outfile, "\nPartial symtab for source file %s ",
700 psymtab->filename);
701 }
702 gdb_printf (outfile, "(object %s)\n\n",
703 host_address_to_string (psymtab));
704 gdb_printf (outfile, " Read from object file %s (%s)\n",
705 objfile_name (objfile),
706 host_address_to_string (objfile));
707
708 if (psymtab->readin_p (objfile))
709 gdb_printf
710 (outfile,
711 " Full symtab was read (at %s)\n",
712 host_address_to_string (psymtab->get_compunit_symtab (objfile)));
713
714 gdb_printf (outfile, " Symbols cover text addresses ");
715 gdb_puts (paddress (gdbarch, psymtab->text_low (objfile)), outfile);
716 gdb_printf (outfile, "-");
717 gdb_puts (paddress (gdbarch, psymtab->text_high (objfile)), outfile);
718 gdb_printf (outfile, "\n");
719 gdb_printf (outfile, " Depends on %d other partial symtabs.\n",
720 psymtab->number_of_dependencies);
721 for (i = 0; i < psymtab->number_of_dependencies; i++)
722 gdb_printf (outfile, " %d %s\n", i,
723 host_address_to_string (psymtab->dependencies[i]));
724 if (psymtab->user != NULL)
725 gdb_printf (outfile, " Shared partial symtab with user %s\n",
726 host_address_to_string (psymtab->user));
727 if (!psymtab->global_psymbols.empty ())
728 {
729 print_partial_symbols
730 (gdbarch, objfile, psymtab->global_psymbols,
731 "Global", outfile);
732 }
733 if (!psymtab->static_psymbols.empty ())
734 {
735 print_partial_symbols
736 (gdbarch, objfile, psymtab->static_psymbols,
737 "Static", outfile);
738 }
739 gdb_printf (outfile, "\n");
740 }
741
742 /* Count the number of partial symbols in OBJFILE. */
743
744 int
745 psymbol_functions::count_psyms ()
746 {
747 int count = 0;
748 for (partial_symtab *pst : m_partial_symtabs->range ())
749 {
750 count += pst->global_psymbols.size ();
751 count += pst->static_psymbols.size ();
752 }
753 return count;
754 }
755
756 /* Psymtab version of print_stats. See its definition in
757 the definition of quick_symbol_functions in symfile.h. */
758
759 void
760 psymbol_functions::print_stats (struct objfile *objfile, bool print_bcache)
761 {
762 int i;
763
764 if (!print_bcache)
765 {
766 int n_psyms = count_psyms ();
767 if (n_psyms > 0)
768 gdb_printf (_(" Number of \"partial\" symbols read: %d\n"),
769 n_psyms);
770
771 i = 0;
772 for (partial_symtab *ps : partial_symbols (objfile))
773 {
774 if (!ps->readin_p (objfile))
775 i++;
776 }
777 gdb_printf (_(" Number of psym tables (not yet expanded): %d\n"),
778 i);
779 gdb_printf (_(" Total memory used for psymbol cache: %d\n"),
780 m_partial_symtabs->psymbol_cache.memory_used ());
781 }
782 else
783 {
784 gdb_printf (_("Psymbol byte cache statistics:\n"));
785 m_partial_symtabs->psymbol_cache.print_statistics
786 ("partial symbol cache");
787 }
788 }
789
790 /* Psymtab version of dump. See its definition in
791 the definition of quick_symbol_functions in symfile.h. */
792
793 void
794 psymbol_functions::dump (struct objfile *objfile)
795 {
796 struct partial_symtab *psymtab;
797
798 if (m_partial_symtabs->psymtabs)
799 {
800 gdb_printf ("Psymtabs:\n");
801 for (psymtab = m_partial_symtabs->psymtabs;
802 psymtab != NULL;
803 psymtab = psymtab->next)
804 gdb_printf ("%s at %s\n",
805 psymtab->filename,
806 host_address_to_string (psymtab));
807 gdb_printf ("\n\n");
808 }
809 }
810
811 /* Psymtab version of expand_all_symtabs. See its definition in
812 the definition of quick_symbol_functions in symfile.h. */
813
814 void
815 psymbol_functions::expand_all_symtabs (struct objfile *objfile)
816 {
817 for (partial_symtab *psymtab : partial_symbols (objfile))
818 psymtab_to_symtab (objfile, psymtab);
819 }
820
821 /* Psymtab version of map_symbol_filenames. See its definition in
822 the definition of quick_symbol_functions in symfile.h. */
823
824 void
825 psymbol_functions::map_symbol_filenames
826 (struct objfile *objfile,
827 gdb::function_view<symbol_filename_ftype> fun,
828 bool need_fullname)
829 {
830 for (partial_symtab *ps : partial_symbols (objfile))
831 {
832 const char *fullname;
833
834 if (ps->readin_p (objfile))
835 continue;
836
837 /* We can skip shared psymtabs here, because any file name will be
838 attached to the unshared psymtab. */
839 if (ps->user != NULL)
840 continue;
841
842 /* Anonymous psymtabs don't have a file name. */
843 if (ps->anonymous)
844 continue;
845
846 QUIT;
847 if (need_fullname)
848 fullname = psymtab_to_fullname (ps);
849 else
850 fullname = NULL;
851 fun (ps->filename, fullname);
852 }
853 }
854
855 /* Finds the fullname that a partial_symtab represents.
856
857 If this functions finds the fullname, it will save it in ps->fullname
858 and it will also return the value.
859
860 If this function fails to find the file that this partial_symtab represents,
861 NULL will be returned and ps->fullname will be set to NULL. */
862
863 static const char *
864 psymtab_to_fullname (struct partial_symtab *ps)
865 {
866 gdb_assert (!ps->anonymous);
867
868 /* Use cached copy if we have it.
869 We rely on forget_cached_source_info being called appropriately
870 to handle cases like the file being moved. */
871 if (ps->fullname == NULL)
872 {
873 gdb::unique_xmalloc_ptr<char> fullname
874 = find_source_or_rewrite (ps->filename, ps->dirname);
875 ps->fullname = fullname.release ();
876 }
877
878 return ps->fullname;
879 }
880
881 /* Psymtab version of expand_matching_symbols. See its definition in
882 the definition of quick_symbol_functions in symfile.h. */
883
884 void
885 psymbol_functions::expand_matching_symbols
886 (struct objfile *objfile,
887 const lookup_name_info &name, domain_enum domain,
888 int global,
889 symbol_compare_ftype *ordered_compare)
890 {
891 for (partial_symtab *ps : partial_symbols (objfile))
892 {
893 QUIT;
894 if (!ps->readin_p (objfile)
895 && match_partial_symbol (objfile, ps, global, name, domain,
896 ordered_compare))
897 psymtab_to_symtab (objfile, ps);
898 }
899 }
900
901 /* A helper for psym_expand_symtabs_matching that handles searching
902 included psymtabs. This returns true if a symbol is found, and
903 false otherwise. It also updates the 'searched_flag' on the
904 various psymtabs that it searches. */
905
906 static bool
907 recursively_search_psymtabs
908 (struct partial_symtab *ps,
909 struct objfile *objfile,
910 block_search_flags search_flags,
911 domain_enum domain,
912 enum search_domain search,
913 const lookup_name_info &lookup_name,
914 gdb::function_view<expand_symtabs_symbol_matcher_ftype> sym_matcher)
915 {
916 int keep_going = 1;
917 enum psymtab_search_status result = PST_SEARCHED_AND_NOT_FOUND;
918 int i;
919
920 if (ps->searched_flag != PST_NOT_SEARCHED)
921 return ps->searched_flag == PST_SEARCHED_AND_FOUND;
922
923 /* Recurse into shared psymtabs first, because they may have already
924 been searched, and this could save some time. */
925 for (i = 0; i < ps->number_of_dependencies; ++i)
926 {
927 int r;
928
929 /* Skip non-shared dependencies, these are handled elsewhere. */
930 if (ps->dependencies[i]->user == NULL)
931 continue;
932
933 r = recursively_search_psymtabs (ps->dependencies[i],
934 objfile, search_flags, domain, search,
935 lookup_name, sym_matcher);
936 if (r != 0)
937 {
938 ps->searched_flag = PST_SEARCHED_AND_FOUND;
939 return true;
940 }
941 }
942
943 partial_symbol **gbound = (ps->global_psymbols.data ()
944 + ps->global_psymbols.size ());
945 partial_symbol **sbound = (ps->static_psymbols.data ()
946 + ps->static_psymbols.size ());
947 partial_symbol **bound = gbound;
948
949 /* Go through all of the symbols stored in a partial
950 symtab in one loop. */
951 partial_symbol **psym = ps->global_psymbols.data ();
952
953 if ((search_flags & SEARCH_GLOBAL_BLOCK) == 0)
954 {
955 if (ps->static_psymbols.empty ())
956 keep_going = 0;
957 else
958 {
959 psym = ps->static_psymbols.data ();
960 bound = sbound;
961 }
962 }
963
964 while (keep_going)
965 {
966 if (psym >= bound)
967 {
968 if (bound == gbound && !ps->static_psymbols.empty ()
969 && (search_flags & SEARCH_STATIC_BLOCK) != 0)
970 {
971 psym = ps->static_psymbols.data ();
972 bound = sbound;
973 }
974 else
975 keep_going = 0;
976 continue;
977 }
978 else
979 {
980 QUIT;
981
982 if ((domain == UNDEF_DOMAIN
983 || symbol_matches_domain ((*psym)->ginfo.language (),
984 (*psym)->domain, domain))
985 && (search == ALL_DOMAIN
986 || (search == MODULES_DOMAIN
987 && (*psym)->domain == MODULE_DOMAIN)
988 || (search == VARIABLES_DOMAIN
989 && (*psym)->aclass != LOC_TYPEDEF
990 && (*psym)->aclass != LOC_BLOCK)
991 || (search == FUNCTIONS_DOMAIN
992 && (*psym)->aclass == LOC_BLOCK)
993 || (search == TYPES_DOMAIN
994 && (*psym)->aclass == LOC_TYPEDEF))
995 && psymbol_name_matches (*psym, lookup_name)
996 && (sym_matcher == NULL
997 || sym_matcher ((*psym)->ginfo.search_name ())))
998 {
999 /* Found a match, so notify our caller. */
1000 result = PST_SEARCHED_AND_FOUND;
1001 keep_going = 0;
1002 }
1003 }
1004 psym++;
1005 }
1006
1007 ps->searched_flag = result;
1008 return result == PST_SEARCHED_AND_FOUND;
1009 }
1010
1011 /* Psymtab version of expand_symtabs_matching. See its definition in
1012 the definition of quick_symbol_functions in symfile.h. */
1013
1014 bool
1015 psymbol_functions::expand_symtabs_matching
1016 (struct objfile *objfile,
1017 gdb::function_view<expand_symtabs_file_matcher_ftype> file_matcher,
1018 const lookup_name_info *lookup_name,
1019 gdb::function_view<expand_symtabs_symbol_matcher_ftype> symbol_matcher,
1020 gdb::function_view<expand_symtabs_exp_notify_ftype> expansion_notify,
1021 block_search_flags search_flags,
1022 domain_enum domain,
1023 enum search_domain search)
1024 {
1025 /* Clear the search flags. */
1026 for (partial_symtab *ps : partial_symbols (objfile))
1027 ps->searched_flag = PST_NOT_SEARCHED;
1028
1029 gdb::optional<lookup_name_info> psym_lookup_name;
1030 if (lookup_name != nullptr)
1031 psym_lookup_name = lookup_name->make_ignore_params ();
1032
1033 /* This invariant is documented in quick-functions.h. */
1034 gdb_assert (lookup_name != nullptr || symbol_matcher == nullptr);
1035
1036 for (partial_symtab *ps : m_partial_symtabs->range ())
1037 {
1038 QUIT;
1039
1040 if (ps->readin_p (objfile))
1041 continue;
1042
1043 if (file_matcher)
1044 {
1045 bool match;
1046
1047 if (ps->anonymous)
1048 continue;
1049
1050 match = file_matcher (ps->filename, false);
1051 if (!match)
1052 {
1053 /* Before we invoke realpath, which can get expensive when many
1054 files are involved, do a quick comparison of the basenames. */
1055 if (basenames_may_differ
1056 || file_matcher (lbasename (ps->filename), true))
1057 match = file_matcher (psymtab_to_fullname (ps), false);
1058 }
1059 if (!match)
1060 continue;
1061 }
1062
1063 if (lookup_name == nullptr
1064 || recursively_search_psymtabs (ps, objfile, search_flags,
1065 domain, search,
1066 *psym_lookup_name,
1067 symbol_matcher))
1068 {
1069 compunit_symtab *cust = psymtab_to_symtab (objfile, ps);
1070
1071 if (cust != nullptr && expansion_notify != nullptr)
1072 if (!expansion_notify (cust))
1073 return false;
1074 }
1075 }
1076
1077 return true;
1078 }
1079
1080 /* Psymtab version of has_symbols. See its definition in
1081 the definition of quick_symbol_functions in symfile.h. */
1082
1083 bool
1084 psymbol_functions::has_symbols (struct objfile *objfile)
1085 {
1086 return m_partial_symtabs->psymtabs != NULL;
1087 }
1088
1089 /* See quick_symbol_functions::has_unexpanded_symtabs in quick-symbol.h. */
1090
1091 bool
1092 psymbol_functions::has_unexpanded_symtabs (struct objfile *objfile)
1093 {
1094 for (partial_symtab *psymtab : partial_symbols (objfile))
1095 {
1096 /* Is this already expanded? */
1097 if (psymtab->readin_p (objfile))
1098 continue;
1099
1100 /* It has not yet been expanded. */
1101 return true;
1102 }
1103
1104 return false;
1105 }
1106
1107 /* Helper function for psym_find_compunit_symtab_by_address that fills
1108 in m_psymbol_map for a given range of psymbols. */
1109
1110 void
1111 psymbol_functions::fill_psymbol_map
1112 (struct objfile *objfile,
1113 struct partial_symtab *psymtab,
1114 std::set<CORE_ADDR> *seen_addrs,
1115 const std::vector<partial_symbol *> &symbols)
1116 {
1117 for (partial_symbol *psym : symbols)
1118 {
1119 if (psym->aclass == LOC_STATIC)
1120 {
1121 CORE_ADDR addr = psym->address (objfile);
1122 if (seen_addrs->find (addr) == seen_addrs->end ())
1123 {
1124 seen_addrs->insert (addr);
1125 m_psymbol_map.emplace_back (addr, psymtab);
1126 }
1127 }
1128 }
1129 }
1130
1131 /* See find_compunit_symtab_by_address in quick_symbol_functions, in
1132 symfile.h. */
1133
1134 compunit_symtab *
1135 psymbol_functions::find_compunit_symtab_by_address (struct objfile *objfile,
1136 CORE_ADDR address)
1137 {
1138 if (m_psymbol_map.empty ())
1139 {
1140 std::set<CORE_ADDR> seen_addrs;
1141
1142 for (partial_symtab *pst : partial_symbols (objfile))
1143 {
1144 fill_psymbol_map (objfile, pst,
1145 &seen_addrs,
1146 pst->global_psymbols);
1147 fill_psymbol_map (objfile, pst,
1148 &seen_addrs,
1149 pst->static_psymbols);
1150 }
1151
1152 m_psymbol_map.shrink_to_fit ();
1153
1154 std::sort (m_psymbol_map.begin (), m_psymbol_map.end (),
1155 [] (const std::pair<CORE_ADDR, partial_symtab *> &a,
1156 const std::pair<CORE_ADDR, partial_symtab *> &b)
1157 {
1158 return a.first < b.first;
1159 });
1160 }
1161
1162 auto iter = std::lower_bound
1163 (m_psymbol_map.begin (), m_psymbol_map.end (), address,
1164 [] (const std::pair<CORE_ADDR, partial_symtab *> &a,
1165 CORE_ADDR b)
1166 {
1167 return a.first < b;
1168 });
1169
1170 if (iter == m_psymbol_map.end () || iter->first != address)
1171 return NULL;
1172
1173 return psymtab_to_symtab (objfile, iter->second);
1174 }
1175
1176 \f
1177
1178 /* Partially fill a partial symtab. It will be completely filled at
1179 the end of the symbol list. */
1180
1181 partial_symtab::partial_symtab (const char *filename,
1182 psymtab_storage *partial_symtabs,
1183 objfile_per_bfd_storage *objfile_per_bfd,
1184 CORE_ADDR textlow)
1185 : partial_symtab (filename, partial_symtabs, objfile_per_bfd)
1186 {
1187 set_text_low (textlow);
1188 set_text_high (raw_text_low ()); /* default */
1189 }
1190
1191 /* Perform "finishing up" operations of a partial symtab. */
1192
1193 void
1194 partial_symtab::end ()
1195 {
1196 global_psymbols.shrink_to_fit ();
1197 static_psymbols.shrink_to_fit ();
1198
1199 /* Sort the global list; don't sort the static list. */
1200 std::sort (global_psymbols.begin (),
1201 global_psymbols.end (),
1202 [] (partial_symbol *s1, partial_symbol *s2)
1203 {
1204 return strcmp_iw_ordered (s1->ginfo.search_name (),
1205 s2->ginfo.search_name ()) < 0;
1206 });
1207 }
1208
1209 /* See psymtab.h. */
1210
1211 unsigned long
1212 psymbol_bcache::hash (const void *addr, int length)
1213 {
1214 unsigned long h = 0;
1215 struct partial_symbol *psymbol = (struct partial_symbol *) addr;
1216 unsigned int lang = psymbol->ginfo.language ();
1217 unsigned int domain = psymbol->domain;
1218 unsigned int theclass = psymbol->aclass;
1219
1220 h = fast_hash (&psymbol->ginfo.m_value, sizeof (psymbol->ginfo.m_value), h);
1221 h = fast_hash (&lang, sizeof (unsigned int), h);
1222 h = fast_hash (&domain, sizeof (unsigned int), h);
1223 h = fast_hash (&theclass, sizeof (unsigned int), h);
1224 /* Note that psymbol names are interned via compute_and_set_names, so
1225 there's no need to hash the contents of the name here. */
1226 h = fast_hash (&psymbol->ginfo.m_name, sizeof (psymbol->ginfo.m_name), h);
1227
1228 return h;
1229 }
1230
1231 /* See psymtab.h. */
1232
1233 int
1234 psymbol_bcache::compare (const void *addr1, const void *addr2, int length)
1235 {
1236 struct partial_symbol *sym1 = (struct partial_symbol *) addr1;
1237 struct partial_symbol *sym2 = (struct partial_symbol *) addr2;
1238
1239 return (memcmp (&sym1->ginfo.m_value, &sym2->ginfo.m_value,
1240 sizeof (sym1->ginfo.m_value)) == 0
1241 && sym1->ginfo.language () == sym2->ginfo.language ()
1242 && sym1->domain == sym2->domain
1243 && sym1->aclass == sym2->aclass
1244 /* Note that psymbol names are interned via
1245 compute_and_set_names, so there's no need to compare the
1246 contents of the name here. */
1247 && sym1->ginfo.linkage_name () == sym2->ginfo.linkage_name ());
1248 }
1249
1250 /* See psympriv.h. */
1251
1252 void
1253 partial_symtab::add_psymbol (const partial_symbol &psymbol,
1254 psymbol_placement where,
1255 psymtab_storage *partial_symtabs,
1256 struct objfile *objfile)
1257 {
1258 bool added;
1259
1260 /* Stash the partial symbol away in the cache. */
1261 partial_symbol *psym
1262 = ((struct partial_symbol *)
1263 partial_symtabs->psymbol_cache.insert
1264 (&psymbol, sizeof (struct partial_symbol), &added));
1265
1266 /* Do not duplicate global partial symbols. */
1267 if (where == psymbol_placement::GLOBAL && !added)
1268 return;
1269
1270 /* Save pointer to partial symbol in psymtab, growing symtab if needed. */
1271 std::vector<partial_symbol *> &list
1272 = (where == psymbol_placement::STATIC
1273 ? static_psymbols
1274 : global_psymbols);
1275 list.push_back (psym);
1276 }
1277
1278 /* See psympriv.h. */
1279
1280 void
1281 partial_symtab::add_psymbol (gdb::string_view name, bool copy_name,
1282 domain_enum domain,
1283 enum address_class theclass,
1284 short section,
1285 psymbol_placement where,
1286 CORE_ADDR coreaddr,
1287 enum language language,
1288 psymtab_storage *partial_symtabs,
1289 struct objfile *objfile)
1290 {
1291 struct partial_symbol psymbol;
1292 memset (&psymbol, 0, sizeof (psymbol));
1293
1294 psymbol.set_unrelocated_address (coreaddr);
1295 psymbol.ginfo.set_section_index (section);
1296 psymbol.domain = domain;
1297 psymbol.aclass = theclass;
1298 psymbol.ginfo.set_language (language, partial_symtabs->obstack ());
1299 psymbol.ginfo.compute_and_set_names (name, copy_name, objfile->per_bfd);
1300
1301 add_psymbol (psymbol, where, partial_symtabs, objfile);
1302 }
1303
1304 /* See psympriv.h. */
1305
1306 partial_symtab::partial_symtab (const char *filename_,
1307 psymtab_storage *partial_symtabs,
1308 objfile_per_bfd_storage *objfile_per_bfd)
1309 : searched_flag (PST_NOT_SEARCHED),
1310 text_low_valid (0),
1311 text_high_valid (0)
1312 {
1313 partial_symtabs->install_psymtab (this);
1314
1315 filename = objfile_per_bfd->intern (filename_);
1316
1317 if (symtab_create_debug >= 1)
1318 {
1319 /* Be a bit clever with debugging messages, and don't print objfile
1320 every time, only when it changes. */
1321 static std::string last_bfd_name;
1322 const char *this_bfd_name
1323 = bfd_get_filename (objfile_per_bfd->get_bfd ());
1324
1325 if (last_bfd_name.empty () || last_bfd_name != this_bfd_name)
1326 {
1327 last_bfd_name = this_bfd_name;
1328
1329 symtab_create_debug_printf ("creating one or more psymtabs for %s",
1330 this_bfd_name);
1331 }
1332
1333 symtab_create_debug_printf ("created psymtab %s for module %s",
1334 host_address_to_string (this), filename);
1335 }
1336 }
1337
1338 /* See psympriv.h. */
1339
1340 void
1341 partial_symtab::expand_dependencies (struct objfile *objfile)
1342 {
1343 for (int i = 0; i < number_of_dependencies; ++i)
1344 {
1345 if (!dependencies[i]->readin_p (objfile)
1346 && dependencies[i]->user == NULL)
1347 {
1348 /* Inform about additional files to be read in. */
1349 if (info_verbose)
1350 {
1351 gdb_puts (" ");
1352 gdb_stdout->wrap_here (0);
1353 gdb_puts ("and ");
1354 gdb_stdout->wrap_here (0);
1355 gdb_printf ("%s...", dependencies[i]->filename);
1356 gdb_flush (gdb_stdout);
1357 }
1358 dependencies[i]->expand_psymtab (objfile);
1359 }
1360 }
1361 }
1362
1363
1364 void
1365 psymtab_storage::discard_psymtab (struct partial_symtab *pst)
1366 {
1367 struct partial_symtab **prev_pst;
1368
1369 /* From dbxread.c:
1370 Empty psymtabs happen as a result of header files which don't
1371 have any symbols in them. There can be a lot of them. But this
1372 check is wrong, in that a psymtab with N_SLINE entries but
1373 nothing else is not empty, but we don't realize that. Fixing
1374 that without slowing things down might be tricky. */
1375
1376 /* First, snip it out of the psymtab chain. */
1377
1378 prev_pst = &psymtabs;
1379 while ((*prev_pst) != pst)
1380 prev_pst = &((*prev_pst)->next);
1381 (*prev_pst) = pst->next;
1382 delete pst;
1383 }
1384
1385 \f
1386
1387 static void
1388 maintenance_print_psymbols (const char *args, int from_tty)
1389 {
1390 struct ui_file *outfile = gdb_stdout;
1391 char *address_arg = NULL, *source_arg = NULL, *objfile_arg = NULL;
1392 int i, outfile_idx, found;
1393 CORE_ADDR pc = 0;
1394 struct obj_section *section = NULL;
1395
1396 dont_repeat ();
1397
1398 gdb_argv argv (args);
1399
1400 for (i = 0; argv != NULL && argv[i] != NULL; ++i)
1401 {
1402 if (strcmp (argv[i], "-pc") == 0)
1403 {
1404 if (argv[i + 1] == NULL)
1405 error (_("Missing pc value"));
1406 address_arg = argv[++i];
1407 }
1408 else if (strcmp (argv[i], "-source") == 0)
1409 {
1410 if (argv[i + 1] == NULL)
1411 error (_("Missing source file"));
1412 source_arg = argv[++i];
1413 }
1414 else if (strcmp (argv[i], "-objfile") == 0)
1415 {
1416 if (argv[i + 1] == NULL)
1417 error (_("Missing objfile name"));
1418 objfile_arg = argv[++i];
1419 }
1420 else if (strcmp (argv[i], "--") == 0)
1421 {
1422 /* End of options. */
1423 ++i;
1424 break;
1425 }
1426 else if (argv[i][0] == '-')
1427 {
1428 /* Future proofing: Don't allow OUTFILE to begin with "-". */
1429 error (_("Unknown option: %s"), argv[i]);
1430 }
1431 else
1432 break;
1433 }
1434 outfile_idx = i;
1435
1436 if (address_arg != NULL && source_arg != NULL)
1437 error (_("Must specify at most one of -pc and -source"));
1438
1439 stdio_file arg_outfile;
1440
1441 if (argv != NULL && argv[outfile_idx] != NULL)
1442 {
1443 if (argv[outfile_idx + 1] != NULL)
1444 error (_("Junk at end of command"));
1445 gdb::unique_xmalloc_ptr<char> outfile_name
1446 (tilde_expand (argv[outfile_idx]));
1447 if (!arg_outfile.open (outfile_name.get (), FOPEN_WT))
1448 perror_with_name (outfile_name.get ());
1449 outfile = &arg_outfile;
1450 }
1451
1452 if (address_arg != NULL)
1453 {
1454 pc = parse_and_eval_address (address_arg);
1455 /* If we fail to find a section, that's ok, try the lookup anyway. */
1456 section = find_pc_section (pc);
1457 }
1458
1459 found = 0;
1460 for (objfile *objfile : current_program_space->objfiles ())
1461 {
1462 int printed_objfile_header = 0;
1463 int print_for_objfile = 1;
1464
1465 QUIT;
1466 if (objfile_arg != NULL)
1467 print_for_objfile
1468 = compare_filenames_for_search (objfile_name (objfile),
1469 objfile_arg);
1470 if (!print_for_objfile)
1471 continue;
1472
1473 for (const auto &iter : objfile->qf)
1474 {
1475 psymbol_functions *psf
1476 = dynamic_cast<psymbol_functions *> (iter.get ());
1477 if (psf == nullptr)
1478 continue;
1479
1480 if (address_arg != NULL)
1481 {
1482 struct bound_minimal_symbol msymbol;
1483
1484 /* We don't assume each pc has a unique objfile (this is for
1485 debugging). */
1486 struct partial_symtab *ps
1487 = psf->find_pc_sect_psymtab (objfile, pc, section, msymbol);
1488 if (ps != NULL)
1489 {
1490 if (!printed_objfile_header)
1491 {
1492 outfile->printf ("\nPartial symtabs for objfile %s\n",
1493 objfile_name (objfile));
1494 printed_objfile_header = 1;
1495 }
1496 dump_psymtab (objfile, ps, outfile);
1497 found = 1;
1498 }
1499 }
1500 else
1501 {
1502 for (partial_symtab *ps : psf->partial_symbols (objfile))
1503 {
1504 int print_for_source = 0;
1505
1506 QUIT;
1507 if (source_arg != NULL)
1508 {
1509 print_for_source
1510 = compare_filenames_for_search (ps->filename, source_arg);
1511 found = 1;
1512 }
1513 if (source_arg == NULL
1514 || print_for_source)
1515 {
1516 if (!printed_objfile_header)
1517 {
1518 outfile->printf ("\nPartial symtabs for objfile %s\n",
1519 objfile_name (objfile));
1520 printed_objfile_header = 1;
1521 }
1522 dump_psymtab (objfile, ps, outfile);
1523 }
1524 }
1525 }
1526 }
1527 }
1528
1529 if (!found)
1530 {
1531 if (address_arg != NULL)
1532 error (_("No partial symtab for address: %s"), address_arg);
1533 if (source_arg != NULL)
1534 error (_("No partial symtab for source file: %s"), source_arg);
1535 }
1536 }
1537
1538 /* List all the partial symbol tables whose names match REGEXP (optional). */
1539
1540 static void
1541 maintenance_info_psymtabs (const char *regexp, int from_tty)
1542 {
1543 if (regexp)
1544 re_comp (regexp);
1545
1546 for (struct program_space *pspace : program_spaces)
1547 for (objfile *objfile : pspace->objfiles ())
1548 {
1549 struct gdbarch *gdbarch = objfile->arch ();
1550
1551 /* We don't want to print anything for this objfile until we
1552 actually find a symtab whose name matches. */
1553 int printed_objfile_start = 0;
1554
1555 for (const auto &iter : objfile->qf)
1556 {
1557 psymbol_functions *psf
1558 = dynamic_cast<psymbol_functions *> (iter.get ());
1559 if (psf == nullptr)
1560 continue;
1561 for (partial_symtab *psymtab : psf->partial_symbols (objfile))
1562 {
1563 QUIT;
1564
1565 if (! regexp
1566 || re_exec (psymtab->filename))
1567 {
1568 if (! printed_objfile_start)
1569 {
1570 gdb_printf ("{ objfile %s ", objfile_name (objfile));
1571 gdb_stdout->wrap_here (2);
1572 gdb_printf ("((struct objfile *) %s)\n",
1573 host_address_to_string (objfile));
1574 printed_objfile_start = 1;
1575 }
1576
1577 gdb_printf (" { psymtab %s ", psymtab->filename);
1578 gdb_stdout->wrap_here (4);
1579 gdb_printf ("((struct partial_symtab *) %s)\n",
1580 host_address_to_string (psymtab));
1581
1582 gdb_printf (" readin %s\n",
1583 psymtab->readin_p (objfile) ? "yes" : "no");
1584 gdb_printf (" fullname %s\n",
1585 psymtab->fullname
1586 ? psymtab->fullname : "(null)");
1587 gdb_printf (" text addresses ");
1588 gdb_puts (paddress (gdbarch,
1589 psymtab->text_low (objfile)));
1590 gdb_printf (" -- ");
1591 gdb_puts (paddress (gdbarch,
1592 psymtab->text_high (objfile)));
1593 gdb_printf ("\n");
1594 gdb_printf (" globals ");
1595 if (!psymtab->global_psymbols.empty ())
1596 gdb_printf
1597 ("(* (struct partial_symbol **) %s @ %d)\n",
1598 host_address_to_string (psymtab->global_psymbols.data ()),
1599 (int) psymtab->global_psymbols.size ());
1600 else
1601 gdb_printf ("(none)\n");
1602 gdb_printf (" statics ");
1603 if (!psymtab->static_psymbols.empty ())
1604 gdb_printf
1605 ("(* (struct partial_symbol **) %s @ %d)\n",
1606 host_address_to_string (psymtab->static_psymbols.data ()),
1607 (int) psymtab->static_psymbols.size ());
1608 else
1609 gdb_printf ("(none)\n");
1610 if (psymtab->user)
1611 gdb_printf (" user %s "
1612 "((struct partial_symtab *) %s)\n",
1613 psymtab->user->filename,
1614 host_address_to_string (psymtab->user));
1615 gdb_printf (" dependencies ");
1616 if (psymtab->number_of_dependencies)
1617 {
1618 int i;
1619
1620 gdb_printf ("{\n");
1621 for (i = 0; i < psymtab->number_of_dependencies; i++)
1622 {
1623 struct partial_symtab *dep = psymtab->dependencies[i];
1624
1625 /* Note the string concatenation there --- no
1626 comma. */
1627 gdb_printf (" psymtab %s "
1628 "((struct partial_symtab *) %s)\n",
1629 dep->filename,
1630 host_address_to_string (dep));
1631 }
1632 gdb_printf (" }\n");
1633 }
1634 else
1635 gdb_printf ("(none)\n");
1636 gdb_printf (" }\n");
1637 }
1638 }
1639 }
1640
1641 if (printed_objfile_start)
1642 gdb_printf ("}\n");
1643 }
1644 }
1645
1646 /* Check consistency of currently expanded psymtabs vs symtabs. */
1647
1648 static void
1649 maintenance_check_psymtabs (const char *ignore, int from_tty)
1650 {
1651 struct symbol *sym;
1652 struct compunit_symtab *cust = NULL;
1653 const struct blockvector *bv;
1654 const struct block *b;
1655
1656 for (objfile *objfile : current_program_space->objfiles ())
1657 {
1658 for (const auto &iter : objfile->qf)
1659 {
1660 psymbol_functions *psf
1661 = dynamic_cast<psymbol_functions *> (iter.get ());
1662 if (psf == nullptr)
1663 continue;
1664
1665 for (partial_symtab *ps : psf->partial_symbols (objfile))
1666 {
1667 struct gdbarch *gdbarch = objfile->arch ();
1668
1669 /* We don't call psymtab_to_symtab here because that may cause symtab
1670 expansion. When debugging a problem it helps if checkers leave
1671 things unchanged. */
1672 cust = ps->get_compunit_symtab (objfile);
1673
1674 /* First do some checks that don't require the associated symtab. */
1675 if (ps->text_high (objfile) < ps->text_low (objfile))
1676 {
1677 gdb_printf ("Psymtab ");
1678 gdb_puts (ps->filename);
1679 gdb_printf (" covers bad range ");
1680 gdb_puts (paddress (gdbarch, ps->text_low (objfile)));
1681 gdb_printf (" - ");
1682 gdb_puts (paddress (gdbarch, ps->text_high (objfile)));
1683 gdb_printf ("\n");
1684 continue;
1685 }
1686
1687 /* Now do checks requiring the associated symtab. */
1688 if (cust == NULL)
1689 continue;
1690 bv = cust->blockvector ();
1691 b = bv->static_block ();
1692 for (partial_symbol *psym : ps->static_psymbols)
1693 {
1694 /* Skip symbols for inlined functions without address. These may
1695 or may not have a match in the full symtab. */
1696 if (psym->aclass == LOC_BLOCK
1697 && psym->ginfo.value_address () == 0)
1698 continue;
1699
1700 sym = block_lookup_symbol (b, psym->ginfo.search_name (),
1701 symbol_name_match_type::SEARCH_NAME,
1702 psym->domain);
1703 if (!sym)
1704 {
1705 gdb_printf ("Static symbol `");
1706 gdb_puts (psym->ginfo.linkage_name ());
1707 gdb_printf ("' only found in ");
1708 gdb_puts (ps->filename);
1709 gdb_printf (" psymtab\n");
1710 }
1711 }
1712 b = bv->global_block ();
1713 for (partial_symbol *psym : ps->global_psymbols)
1714 {
1715 sym = block_lookup_symbol (b, psym->ginfo.search_name (),
1716 symbol_name_match_type::SEARCH_NAME,
1717 psym->domain);
1718 if (!sym)
1719 {
1720 gdb_printf ("Global symbol `");
1721 gdb_puts (psym->ginfo.linkage_name ());
1722 gdb_printf ("' only found in ");
1723 gdb_puts (ps->filename);
1724 gdb_printf (" psymtab\n");
1725 }
1726 }
1727 if (ps->raw_text_high () != 0
1728 && (ps->text_low (objfile) < b->start ()
1729 || ps->text_high (objfile) > b->end ()))
1730 {
1731 gdb_printf ("Psymtab ");
1732 gdb_puts (ps->filename);
1733 gdb_printf (" covers ");
1734 gdb_puts (paddress (gdbarch, ps->text_low (objfile)));
1735 gdb_printf (" - ");
1736 gdb_puts (paddress (gdbarch, ps->text_high (objfile)));
1737 gdb_printf (" but symtab covers only ");
1738 gdb_puts (paddress (gdbarch, b->start ()));
1739 gdb_printf (" - ");
1740 gdb_puts (paddress (gdbarch, b->end ()));
1741 gdb_printf ("\n");
1742 }
1743 }
1744 }
1745 }
1746 }
1747
1748 void _initialize_psymtab ();
1749 void
1750 _initialize_psymtab ()
1751 {
1752 add_cmd ("psymbols", class_maintenance, maintenance_print_psymbols, _("\
1753 Print dump of current partial symbol definitions.\n\
1754 Usage: mt print psymbols [-objfile OBJFILE] [-pc ADDRESS] [--] [OUTFILE]\n\
1755 mt print psymbols [-objfile OBJFILE] [-source SOURCE] [--] [OUTFILE]\n\
1756 Entries in the partial symbol table are dumped to file OUTFILE,\n\
1757 or the terminal if OUTFILE is unspecified.\n\
1758 If ADDRESS is provided, dump only the file for that address.\n\
1759 If SOURCE is provided, dump only that file's symbols.\n\
1760 If OBJFILE is provided, dump only that file's minimal symbols."),
1761 &maintenanceprintlist);
1762
1763 add_cmd ("psymtabs", class_maintenance, maintenance_info_psymtabs, _("\
1764 List the partial symbol tables for all object files.\n\
1765 This does not include information about individual partial symbols,\n\
1766 just the symbol table structures themselves."),
1767 &maintenanceinfolist);
1768
1769 add_cmd ("check-psymtabs", class_maintenance, maintenance_check_psymtabs,
1770 _("\
1771 Check consistency of currently expanded psymtabs versus symtabs."),
1772 &maintenancelist);
1773 }