Change allocate_psymtab to be a constructor
[deliverable/binutils-gdb.git] / gdb / psymtab.c
1 /* Partial symbol tables.
2
3 Copyright (C) 2009-2020 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 char *, int,
43 domain_enum);
44
45 static const char *psymtab_to_fullname (struct partial_symtab *ps);
46
47 static struct partial_symbol *find_pc_sect_psymbol (struct objfile *,
48 struct partial_symtab *,
49 CORE_ADDR,
50 struct obj_section *);
51
52 static struct compunit_symtab *psymtab_to_symtab (struct objfile *objfile,
53 struct partial_symtab *pst);
54
55 \f
56
57 static unsigned long psymbol_hash (const void *addr, int length);
58 static int psymbol_compare (const void *addr1, const void *addr2, int length);
59
60 psymtab_storage::psymtab_storage ()
61 : psymbol_cache (psymbol_hash, psymbol_compare)
62 {
63 }
64
65 psymtab_storage::~psymtab_storage ()
66 {
67 partial_symtab *iter = psymtabs;
68 while (iter != nullptr)
69 {
70 partial_symtab *next = iter->next;
71 delete iter;
72 iter = next;
73 }
74 }
75
76 /* See psymtab.h. */
77
78 void
79 psymtab_storage::install_psymtab (partial_symtab *pst)
80 {
81 pst->next = psymtabs;
82 psymtabs = pst;
83 }
84
85 \f
86
87 /* See psymtab.h. */
88
89 psymtab_storage::partial_symtab_range
90 require_partial_symbols (struct objfile *objfile, bool verbose)
91 {
92 if ((objfile->flags & OBJF_PSYMTABS_READ) == 0)
93 {
94 objfile->flags |= OBJF_PSYMTABS_READ;
95
96 if (objfile->sf->sym_read_psymbols)
97 {
98 if (verbose)
99 printf_filtered (_("Reading symbols from %s...\n"),
100 objfile_name (objfile));
101 (*objfile->sf->sym_read_psymbols) (objfile);
102
103 /* Partial symbols list are not expected to changed after this
104 point. */
105 objfile->partial_symtabs->global_psymbols.shrink_to_fit ();
106 objfile->partial_symtabs->static_psymbols.shrink_to_fit ();
107
108 if (verbose && !objfile_has_symbols (objfile))
109 printf_filtered (_("(No debugging symbols found in %s)\n"),
110 objfile_name (objfile));
111 }
112 }
113
114 return objfile->psymtabs ();
115 }
116
117 /* Helper function for psym_map_symtabs_matching_filename that
118 expands the symtabs and calls the iterator. */
119
120 static bool
121 partial_map_expand_apply (struct objfile *objfile,
122 const char *name,
123 const char *real_path,
124 struct partial_symtab *pst,
125 gdb::function_view<bool (symtab *)> callback)
126 {
127 struct compunit_symtab *last_made = objfile->compunit_symtabs;
128
129 /* Shared psymtabs should never be seen here. Instead they should
130 be handled properly by the caller. */
131 gdb_assert (pst->user == NULL);
132
133 /* Don't visit already-expanded psymtabs. */
134 if (pst->readin)
135 return 0;
136
137 /* This may expand more than one symtab, and we want to iterate over
138 all of them. */
139 psymtab_to_symtab (objfile, pst);
140
141 return iterate_over_some_symtabs (name, real_path, objfile->compunit_symtabs,
142 last_made, callback);
143 }
144
145 /* Psymtab version of map_symtabs_matching_filename. See its definition in
146 the definition of quick_symbol_functions in symfile.h. */
147
148 static bool
149 psym_map_symtabs_matching_filename
150 (struct objfile *objfile,
151 const char *name,
152 const char *real_path,
153 gdb::function_view<bool (symtab *)> callback)
154 {
155 const char *name_basename = lbasename (name);
156
157 for (partial_symtab *pst : require_partial_symbols (objfile, true))
158 {
159 /* We can skip shared psymtabs here, because any file name will be
160 attached to the unshared psymtab. */
161 if (pst->user != NULL)
162 continue;
163
164 /* Anonymous psymtabs don't have a file name. */
165 if (pst->anonymous)
166 continue;
167
168 if (compare_filenames_for_search (pst->filename, name))
169 {
170 if (partial_map_expand_apply (objfile, name, real_path,
171 pst, callback))
172 return true;
173 continue;
174 }
175
176 /* Before we invoke realpath, which can get expensive when many
177 files are involved, do a quick comparison of the basenames. */
178 if (! basenames_may_differ
179 && FILENAME_CMP (name_basename, lbasename (pst->filename)) != 0)
180 continue;
181
182 if (compare_filenames_for_search (psymtab_to_fullname (pst), name))
183 {
184 if (partial_map_expand_apply (objfile, name, real_path,
185 pst, callback))
186 return true;
187 continue;
188 }
189
190 /* If the user gave us an absolute path, try to find the file in
191 this symtab and use its absolute path. */
192 if (real_path != NULL)
193 {
194 gdb_assert (IS_ABSOLUTE_PATH (real_path));
195 gdb_assert (IS_ABSOLUTE_PATH (name));
196 if (filename_cmp (psymtab_to_fullname (pst), real_path) == 0)
197 {
198 if (partial_map_expand_apply (objfile, name, real_path,
199 pst, callback))
200 return true;
201 continue;
202 }
203 }
204 }
205
206 return false;
207 }
208
209 /* Find which partial symtab contains PC and SECTION starting at psymtab PST.
210 We may find a different psymtab than PST. See FIND_PC_SECT_PSYMTAB. */
211
212 static struct partial_symtab *
213 find_pc_sect_psymtab_closer (struct objfile *objfile,
214 CORE_ADDR pc, struct obj_section *section,
215 struct partial_symtab *pst,
216 struct bound_minimal_symbol msymbol)
217 {
218 struct partial_symtab *tpst;
219 struct partial_symtab *best_pst = pst;
220 CORE_ADDR best_addr = pst->text_low (objfile);
221
222 gdb_assert (!pst->psymtabs_addrmap_supported);
223
224 /* An objfile that has its functions reordered might have
225 many partial symbol tables containing the PC, but
226 we want the partial symbol table that contains the
227 function containing the PC. */
228 if (!(objfile->flags & OBJF_REORDERED)
229 && section == NULL) /* Can't validate section this way. */
230 return pst;
231
232 if (msymbol.minsym == NULL)
233 return pst;
234
235 /* The code range of partial symtabs sometimes overlap, so, in
236 the loop below, we need to check all partial symtabs and
237 find the one that fits better for the given PC address. We
238 select the partial symtab that contains a symbol whose
239 address is closest to the PC address. By closest we mean
240 that find_pc_sect_symbol returns the symbol with address
241 that is closest and still less than the given PC. */
242 for (tpst = pst; tpst != NULL; tpst = tpst->next)
243 {
244 if (pc >= tpst->text_low (objfile) && pc < tpst->text_high (objfile))
245 {
246 struct partial_symbol *p;
247 CORE_ADDR this_addr;
248
249 /* NOTE: This assumes that every psymbol has a
250 corresponding msymbol, which is not necessarily
251 true; the debug info might be much richer than the
252 object's symbol table. */
253 p = find_pc_sect_psymbol (objfile, tpst, pc, section);
254 if (p != NULL
255 && (p->address (objfile) == BMSYMBOL_VALUE_ADDRESS (msymbol)))
256 return tpst;
257
258 /* Also accept the textlow value of a psymtab as a
259 "symbol", to provide some support for partial
260 symbol tables with line information but no debug
261 symbols (e.g. those produced by an assembler). */
262 if (p != NULL)
263 this_addr = p->address (objfile);
264 else
265 this_addr = tpst->text_low (objfile);
266
267 /* Check whether it is closer than our current
268 BEST_ADDR. Since this symbol address is
269 necessarily lower or equal to PC, the symbol closer
270 to PC is the symbol which address is the highest.
271 This way we return the psymtab which contains such
272 best match symbol. This can help in cases where the
273 symbol information/debuginfo is not complete, like
274 for instance on IRIX6 with gcc, where no debug info
275 is emitted for statics. (See also the nodebug.exp
276 testcase.) */
277 if (this_addr > best_addr)
278 {
279 best_addr = this_addr;
280 best_pst = tpst;
281 }
282 }
283 }
284 return best_pst;
285 }
286
287 /* Find which partial symtab contains PC and SECTION. Return NULL if
288 none. We return the psymtab that contains a symbol whose address
289 exactly matches PC, or, if we cannot find an exact match, the
290 psymtab that contains a symbol whose address is closest to PC. */
291
292 static struct partial_symtab *
293 find_pc_sect_psymtab (struct objfile *objfile, CORE_ADDR pc,
294 struct obj_section *section,
295 struct bound_minimal_symbol msymbol)
296 {
297 /* Try just the PSYMTABS_ADDRMAP mapping first as it has better
298 granularity than the later used TEXTLOW/TEXTHIGH one. However, we need
299 to take care as the PSYMTABS_ADDRMAP can hold things other than partial
300 symtabs in some cases.
301
302 This function should only be called for objfiles that are using partial
303 symtabs, not for objfiles that are using indexes (.gdb_index or
304 .debug_names), however 'maintenance print psymbols' calls this function
305 directly for all objfiles. If we assume that PSYMTABS_ADDRMAP contains
306 partial symtabs then we will end up returning a pointer to an object
307 that is not a partial_symtab, which doesn't end well. */
308
309 if (objfile->partial_symtabs->psymtabs != NULL
310 && objfile->partial_symtabs->psymtabs_addrmap != NULL)
311 {
312 CORE_ADDR baseaddr = objfile->text_section_offset ();
313
314 struct partial_symtab *pst
315 = ((struct partial_symtab *)
316 addrmap_find (objfile->partial_symtabs->psymtabs_addrmap,
317 pc - baseaddr));
318 if (pst != NULL)
319 {
320 /* FIXME: addrmaps currently do not handle overlayed sections,
321 so fall back to the non-addrmap case if we're debugging
322 overlays and the addrmap returned the wrong section. */
323 if (overlay_debugging && msymbol.minsym != NULL && section != NULL)
324 {
325 struct partial_symbol *p;
326
327 /* NOTE: This assumes that every psymbol has a
328 corresponding msymbol, which is not necessarily
329 true; the debug info might be much richer than the
330 object's symbol table. */
331 p = find_pc_sect_psymbol (objfile, pst, pc, section);
332 if (p == NULL
333 || (p->address (objfile)
334 != BMSYMBOL_VALUE_ADDRESS (msymbol)))
335 goto next;
336 }
337
338 /* We do not try to call FIND_PC_SECT_PSYMTAB_CLOSER as
339 PSYMTABS_ADDRMAP we used has already the best 1-byte
340 granularity and FIND_PC_SECT_PSYMTAB_CLOSER may mislead us into
341 a worse chosen section due to the TEXTLOW/TEXTHIGH ranges
342 overlap. */
343
344 return pst;
345 }
346 }
347
348 next:
349
350 /* Existing PSYMTABS_ADDRMAP mapping is present even for PARTIAL_SYMTABs
351 which still have no corresponding full SYMTABs read. But it is not
352 present for non-DWARF2 debug infos not supporting PSYMTABS_ADDRMAP in GDB
353 so far. */
354
355 /* Check even OBJFILE with non-zero PSYMTABS_ADDRMAP as only several of
356 its CUs may be missing in PSYMTABS_ADDRMAP as they may be varying
357 debug info type in single OBJFILE. */
358
359 for (partial_symtab *pst : require_partial_symbols (objfile, true))
360 if (!pst->psymtabs_addrmap_supported
361 && pc >= pst->text_low (objfile) && pc < pst->text_high (objfile))
362 {
363 struct partial_symtab *best_pst;
364
365 best_pst = find_pc_sect_psymtab_closer (objfile, pc, section, pst,
366 msymbol);
367 if (best_pst != NULL)
368 return best_pst;
369 }
370
371 return NULL;
372 }
373
374 /* Psymtab version of find_pc_sect_compunit_symtab. See its definition in
375 the definition of quick_symbol_functions in symfile.h. */
376
377 static struct compunit_symtab *
378 psym_find_pc_sect_compunit_symtab (struct objfile *objfile,
379 struct bound_minimal_symbol msymbol,
380 CORE_ADDR pc,
381 struct obj_section *section,
382 int warn_if_readin)
383 {
384 struct partial_symtab *ps = find_pc_sect_psymtab (objfile, pc, section,
385 msymbol);
386 if (ps != NULL)
387 {
388 if (warn_if_readin && ps->readin)
389 /* Might want to error() here (in case symtab is corrupt and
390 will cause a core dump), but maybe we can successfully
391 continue, so let's not. */
392 warning (_("\
393 (Internal error: pc %s in read in psymtab, but not in symtab.)\n"),
394 paddress (get_objfile_arch (objfile), pc));
395 psymtab_to_symtab (objfile, ps);
396 return ps->compunit_symtab;
397 }
398 return NULL;
399 }
400
401 /* Find which partial symbol within a psymtab matches PC and SECTION.
402 Return NULL if none. */
403
404 static struct partial_symbol *
405 find_pc_sect_psymbol (struct objfile *objfile,
406 struct partial_symtab *psymtab, CORE_ADDR pc,
407 struct obj_section *section)
408 {
409 struct partial_symbol *best = NULL;
410 CORE_ADDR best_pc;
411 const CORE_ADDR textlow = psymtab->text_low (objfile);
412
413 gdb_assert (psymtab != NULL);
414
415 /* Cope with programs that start at address 0. */
416 best_pc = (textlow != 0) ? textlow - 1 : 0;
417
418 /* Search the global symbols as well as the static symbols, so that
419 find_pc_partial_function doesn't use a minimal symbol and thus
420 cache a bad endaddr. */
421 for (int i = 0; i < psymtab->n_global_syms; i++)
422 {
423 partial_symbol *p
424 = objfile->partial_symtabs->global_psymbols[psymtab->globals_offset
425 + i];
426
427 if (p->domain == VAR_DOMAIN
428 && p->aclass == LOC_BLOCK
429 && pc >= p->address (objfile)
430 && (p->address (objfile) > best_pc
431 || (psymtab->text_low (objfile) == 0
432 && best_pc == 0 && p->address (objfile) == 0)))
433 {
434 if (section != NULL) /* Match on a specific section. */
435 {
436 if (!matching_obj_sections (p->obj_section (objfile),
437 section))
438 continue;
439 }
440 best_pc = p->address (objfile);
441 best = p;
442 }
443 }
444
445 for (int i = 0; i < psymtab->n_static_syms; i++)
446 {
447 partial_symbol *p
448 = objfile->partial_symtabs->static_psymbols[psymtab->statics_offset
449 + i];
450
451 if (p->domain == VAR_DOMAIN
452 && p->aclass == LOC_BLOCK
453 && pc >= p->address (objfile)
454 && (p->address (objfile) > best_pc
455 || (psymtab->text_low (objfile) == 0
456 && best_pc == 0 && p->address (objfile) == 0)))
457 {
458 if (section != NULL) /* Match on a specific section. */
459 {
460 if (!matching_obj_sections (p->obj_section (objfile),
461 section))
462 continue;
463 }
464 best_pc = p->address (objfile);
465 best = p;
466 }
467 }
468
469 return best;
470 }
471
472 /* Psymtab version of lookup_symbol. See its definition in
473 the definition of quick_symbol_functions in symfile.h. */
474
475 static struct compunit_symtab *
476 psym_lookup_symbol (struct objfile *objfile,
477 block_enum block_index, const char *name,
478 const domain_enum domain)
479 {
480 const int psymtab_index = (block_index == GLOBAL_BLOCK ? 1 : 0);
481 struct compunit_symtab *stab_best = NULL;
482
483 lookup_name_info lookup_name (name, symbol_name_match_type::FULL);
484
485 for (partial_symtab *ps : require_partial_symbols (objfile, true))
486 {
487 if (!ps->readin && lookup_partial_symbol (objfile, ps, name,
488 psymtab_index, domain))
489 {
490 struct symbol *sym, *with_opaque = NULL;
491 struct compunit_symtab *stab = psymtab_to_symtab (objfile, ps);
492 /* Note: While psymtab_to_symtab can return NULL if the
493 partial symtab is empty, we can assume it won't here
494 because lookup_partial_symbol succeeded. */
495 const struct blockvector *bv = COMPUNIT_BLOCKVECTOR (stab);
496 const struct block *block = BLOCKVECTOR_BLOCK (bv, block_index);
497
498 sym = block_find_symbol (block, name, domain,
499 block_find_non_opaque_type_preferred,
500 &with_opaque);
501
502 /* Some caution must be observed with overloaded functions
503 and methods, since the index will not contain any overload
504 information (but NAME might contain it). */
505
506 if (sym != NULL
507 && SYMBOL_MATCHES_SEARCH_NAME (sym, lookup_name))
508 return stab;
509 if (with_opaque != NULL
510 && SYMBOL_MATCHES_SEARCH_NAME (with_opaque, lookup_name))
511 stab_best = stab;
512
513 /* Keep looking through other psymtabs. */
514 }
515 }
516
517 return stab_best;
518 }
519
520 /* Returns true if PSYM matches LOOKUP_NAME. */
521
522 static bool
523 psymbol_name_matches (partial_symbol *psym,
524 const lookup_name_info &lookup_name)
525 {
526 const language_defn *lang = language_def (psym->ginfo.language ());
527 symbol_name_matcher_ftype *name_match
528 = get_symbol_name_matcher (lang, lookup_name);
529 return name_match (psym->ginfo.search_name (), lookup_name, NULL);
530 }
531
532 /* Look in PST for a symbol in DOMAIN whose name matches NAME. Search
533 the global block of PST if GLOBAL, and otherwise the static block.
534 MATCH is the comparison operation that returns true iff MATCH (s,
535 NAME), where s is a SYMBOL_SEARCH_NAME. If ORDERED_COMPARE is
536 non-null, the symbols in the block are assumed to be ordered
537 according to it (allowing binary search). It must be compatible
538 with MATCH. Returns the symbol, if found, and otherwise NULL. */
539
540 static struct partial_symbol *
541 match_partial_symbol (struct objfile *objfile,
542 struct partial_symtab *pst, int global,
543 const lookup_name_info &name, domain_enum domain,
544 symbol_compare_ftype *ordered_compare)
545 {
546 struct partial_symbol **start, **psym;
547 struct partial_symbol **top, **real_top, **bottom, **center;
548 int length = (global ? pst->n_global_syms : pst->n_static_syms);
549 int do_linear_search = 1;
550
551 if (length == 0)
552 return NULL;
553
554 start = (global ?
555 &objfile->partial_symtabs->global_psymbols[pst->globals_offset] :
556 &objfile->partial_symtabs->static_psymbols[pst->statics_offset]);
557
558 if (global && ordered_compare) /* Can use a binary search. */
559 {
560 do_linear_search = 0;
561
562 /* Binary search. This search is guaranteed to end with center
563 pointing at the earliest partial symbol whose name might be
564 correct. At that point *all* partial symbols with an
565 appropriate name will be checked against the correct
566 domain. */
567
568 bottom = start;
569 top = start + length - 1;
570 real_top = top;
571 while (top > bottom)
572 {
573 center = bottom + (top - bottom) / 2;
574 gdb_assert (center < top);
575
576 enum language lang = (*center)->ginfo.language ();
577 const char *lang_ln
578 = name.language_lookup_name (lang).c_str ();
579
580 if (ordered_compare ((*center)->ginfo.search_name (),
581 lang_ln) >= 0)
582 top = center;
583 else
584 bottom = center + 1;
585 }
586 gdb_assert (top == bottom);
587
588 while (top <= real_top
589 && psymbol_name_matches (*top, name))
590 {
591 if (symbol_matches_domain ((*top)->ginfo.language (),
592 (*top)->domain, domain))
593 return *top;
594 top++;
595 }
596 }
597
598 /* Can't use a binary search or else we found during the binary search that
599 we should also do a linear search. */
600
601 if (do_linear_search)
602 {
603 for (psym = start; psym < start + length; psym++)
604 {
605 if (symbol_matches_domain ((*psym)->ginfo.language (),
606 (*psym)->domain, domain)
607 && psymbol_name_matches (*psym, name))
608 return *psym;
609 }
610 }
611
612 return NULL;
613 }
614
615 /* Returns the name used to search psymtabs. Unlike symtabs, psymtabs do
616 not contain any method/function instance information (since this would
617 force reading type information while reading psymtabs). Therefore,
618 if NAME contains overload information, it must be stripped before searching
619 psymtabs. */
620
621 static gdb::unique_xmalloc_ptr<char>
622 psymtab_search_name (const char *name)
623 {
624 switch (current_language->la_language)
625 {
626 case language_cplus:
627 {
628 if (strchr (name, '('))
629 {
630 gdb::unique_xmalloc_ptr<char> ret = cp_remove_params (name);
631
632 if (ret)
633 return ret;
634 }
635 }
636 break;
637
638 default:
639 break;
640 }
641
642 return make_unique_xstrdup (name);
643 }
644
645 /* Look, in partial_symtab PST, for symbol whose natural name is NAME.
646 Check the global symbols if GLOBAL, the static symbols if not. */
647
648 static struct partial_symbol *
649 lookup_partial_symbol (struct objfile *objfile,
650 struct partial_symtab *pst, const char *name,
651 int global, domain_enum domain)
652 {
653 struct partial_symbol **start, **psym;
654 struct partial_symbol **top, **real_top, **bottom, **center;
655 int length = (global ? pst->n_global_syms : pst->n_static_syms);
656 int do_linear_search = 1;
657
658 if (length == 0)
659 return NULL;
660
661 gdb::unique_xmalloc_ptr<char> search_name = psymtab_search_name (name);
662
663 lookup_name_info lookup_name (search_name.get (), symbol_name_match_type::FULL);
664
665 start = (global ?
666 &objfile->partial_symtabs->global_psymbols[pst->globals_offset] :
667 &objfile->partial_symtabs->static_psymbols[pst->statics_offset]);
668
669 if (global) /* This means we can use a binary search. */
670 {
671 do_linear_search = 0;
672
673 /* Binary search. This search is guaranteed to end with center
674 pointing at the earliest partial symbol whose name might be
675 correct. At that point *all* partial symbols with an
676 appropriate name will be checked against the correct
677 domain. */
678
679 bottom = start;
680 top = start + length - 1;
681 real_top = top;
682 while (top > bottom)
683 {
684 center = bottom + (top - bottom) / 2;
685 if (!(center < top))
686 internal_error (__FILE__, __LINE__,
687 _("failed internal consistency check"));
688 if (strcmp_iw_ordered ((*center)->ginfo.search_name (),
689 search_name.get ()) >= 0)
690 {
691 top = center;
692 }
693 else
694 {
695 bottom = center + 1;
696 }
697 }
698 if (!(top == bottom))
699 internal_error (__FILE__, __LINE__,
700 _("failed internal consistency check"));
701
702 /* For `case_sensitivity == case_sensitive_off' strcmp_iw_ordered will
703 search more exactly than what matches SYMBOL_MATCHES_SEARCH_NAME. */
704 while (top >= start && symbol_matches_search_name (&(*top)->ginfo,
705 lookup_name))
706 top--;
707
708 /* Fixup to have a symbol which matches SYMBOL_MATCHES_SEARCH_NAME. */
709 top++;
710
711 while (top <= real_top && symbol_matches_search_name (&(*top)->ginfo,
712 lookup_name))
713 {
714 if (symbol_matches_domain ((*top)->ginfo.language (),
715 (*top)->domain, domain))
716 return *top;
717 top++;
718 }
719 }
720
721 /* Can't use a binary search or else we found during the binary search that
722 we should also do a linear search. */
723
724 if (do_linear_search)
725 {
726 for (psym = start; psym < start + length; psym++)
727 {
728 if (symbol_matches_domain ((*psym)->ginfo.language (),
729 (*psym)->domain, domain)
730 && symbol_matches_search_name (&(*psym)->ginfo, lookup_name))
731 return *psym;
732 }
733 }
734
735 return NULL;
736 }
737
738 /* Get the symbol table that corresponds to a partial_symtab.
739 This is fast after the first time you do it.
740 The result will be NULL if the primary symtab has no symbols,
741 which can happen. Otherwise the result is the primary symtab
742 that contains PST. */
743
744 static struct compunit_symtab *
745 psymtab_to_symtab (struct objfile *objfile, struct partial_symtab *pst)
746 {
747 /* If it is a shared psymtab, find an unshared psymtab that includes
748 it. Any such psymtab will do. */
749 while (pst->user != NULL)
750 pst = pst->user;
751
752 /* If it's been looked up before, return it. */
753 if (pst->compunit_symtab)
754 return pst->compunit_symtab;
755
756 /* If it has not yet been read in, read it. */
757 if (!pst->readin)
758 {
759 scoped_restore decrementer = increment_reading_symtab ();
760
761 (*pst->read_symtab) (pst, objfile);
762 }
763
764 return pst->compunit_symtab;
765 }
766
767 /* Psymtab version of find_last_source_symtab. See its definition in
768 the definition of quick_symbol_functions in symfile.h. */
769
770 static struct symtab *
771 psym_find_last_source_symtab (struct objfile *ofp)
772 {
773 struct partial_symtab *cs_pst = NULL;
774
775 for (partial_symtab *ps : require_partial_symbols (ofp, true))
776 {
777 const char *name = ps->filename;
778 int len = strlen (name);
779
780 if (!(len > 2 && (strcmp (&name[len - 2], ".h") == 0
781 || strcmp (name, "<<C++-namespaces>>") == 0)))
782 cs_pst = ps;
783 }
784
785 if (cs_pst)
786 {
787 if (cs_pst->readin)
788 {
789 internal_error (__FILE__, __LINE__,
790 _("select_source_symtab: "
791 "readin pst found and no symtabs."));
792 }
793 else
794 {
795 struct compunit_symtab *cust = psymtab_to_symtab (ofp, cs_pst);
796
797 if (cust == NULL)
798 return NULL;
799 return compunit_primary_filetab (cust);
800 }
801 }
802 return NULL;
803 }
804
805 /* Psymtab version of forget_cached_source_info. See its definition in
806 the definition of quick_symbol_functions in symfile.h. */
807
808 static void
809 psym_forget_cached_source_info (struct objfile *objfile)
810 {
811 for (partial_symtab *pst : require_partial_symbols (objfile, true))
812 {
813 if (pst->fullname != NULL)
814 {
815 xfree (pst->fullname);
816 pst->fullname = NULL;
817 }
818 }
819 }
820
821 static void
822 print_partial_symbols (struct gdbarch *gdbarch, struct objfile *objfile,
823 struct partial_symbol **p, int count, const char *what,
824 struct ui_file *outfile)
825 {
826 fprintf_filtered (outfile, " %s partial symbols:\n", what);
827 while (count-- > 0)
828 {
829 QUIT;
830 fprintf_filtered (outfile, " `%s'", (*p)->ginfo.linkage_name ());
831 if ((*p)->ginfo.demangled_name () != NULL)
832 {
833 fprintf_filtered (outfile, " `%s'",
834 (*p)->ginfo.demangled_name ());
835 }
836 fputs_filtered (", ", outfile);
837 switch ((*p)->domain)
838 {
839 case UNDEF_DOMAIN:
840 fputs_filtered ("undefined domain, ", outfile);
841 break;
842 case VAR_DOMAIN:
843 /* This is the usual thing -- don't print it. */
844 break;
845 case STRUCT_DOMAIN:
846 fputs_filtered ("struct domain, ", outfile);
847 break;
848 case MODULE_DOMAIN:
849 fputs_filtered ("module domain, ", outfile);
850 break;
851 case LABEL_DOMAIN:
852 fputs_filtered ("label domain, ", outfile);
853 break;
854 case COMMON_BLOCK_DOMAIN:
855 fputs_filtered ("common block domain, ", outfile);
856 break;
857 default:
858 fputs_filtered ("<invalid domain>, ", outfile);
859 break;
860 }
861 switch ((*p)->aclass)
862 {
863 case LOC_UNDEF:
864 fputs_filtered ("undefined", outfile);
865 break;
866 case LOC_CONST:
867 fputs_filtered ("constant int", outfile);
868 break;
869 case LOC_STATIC:
870 fputs_filtered ("static", outfile);
871 break;
872 case LOC_REGISTER:
873 fputs_filtered ("register", outfile);
874 break;
875 case LOC_ARG:
876 fputs_filtered ("pass by value", outfile);
877 break;
878 case LOC_REF_ARG:
879 fputs_filtered ("pass by reference", outfile);
880 break;
881 case LOC_REGPARM_ADDR:
882 fputs_filtered ("register address parameter", outfile);
883 break;
884 case LOC_LOCAL:
885 fputs_filtered ("stack parameter", outfile);
886 break;
887 case LOC_TYPEDEF:
888 fputs_filtered ("type", outfile);
889 break;
890 case LOC_LABEL:
891 fputs_filtered ("label", outfile);
892 break;
893 case LOC_BLOCK:
894 fputs_filtered ("function", outfile);
895 break;
896 case LOC_CONST_BYTES:
897 fputs_filtered ("constant bytes", outfile);
898 break;
899 case LOC_UNRESOLVED:
900 fputs_filtered ("unresolved", outfile);
901 break;
902 case LOC_OPTIMIZED_OUT:
903 fputs_filtered ("optimized out", outfile);
904 break;
905 case LOC_COMPUTED:
906 fputs_filtered ("computed at runtime", outfile);
907 break;
908 default:
909 fputs_filtered ("<invalid location>", outfile);
910 break;
911 }
912 fputs_filtered (", ", outfile);
913 fputs_filtered (paddress (gdbarch, (*p)->unrelocated_address ()), outfile);
914 fprintf_filtered (outfile, "\n");
915 p++;
916 }
917 }
918
919 static void
920 dump_psymtab (struct objfile *objfile, struct partial_symtab *psymtab,
921 struct ui_file *outfile)
922 {
923 struct gdbarch *gdbarch = get_objfile_arch (objfile);
924 int i;
925
926 if (psymtab->anonymous)
927 {
928 fprintf_filtered (outfile, "\nAnonymous partial symtab (%s) ",
929 psymtab->filename);
930 }
931 else
932 {
933 fprintf_filtered (outfile, "\nPartial symtab for source file %s ",
934 psymtab->filename);
935 }
936 fprintf_filtered (outfile, "(object ");
937 gdb_print_host_address (psymtab, outfile);
938 fprintf_filtered (outfile, ")\n\n");
939 fprintf_filtered (outfile, " Read from object file %s (",
940 objfile_name (objfile));
941 gdb_print_host_address (objfile, outfile);
942 fprintf_filtered (outfile, ")\n");
943
944 if (psymtab->readin)
945 {
946 fprintf_filtered (outfile,
947 " Full symtab was read (at ");
948 gdb_print_host_address (psymtab->compunit_symtab, outfile);
949 fprintf_filtered (outfile, " by function at ");
950 gdb_print_host_address (psymtab->read_symtab, outfile);
951 fprintf_filtered (outfile, ")\n");
952 }
953
954 fprintf_filtered (outfile, " Symbols cover text addresses ");
955 fputs_filtered (paddress (gdbarch, psymtab->text_low (objfile)), outfile);
956 fprintf_filtered (outfile, "-");
957 fputs_filtered (paddress (gdbarch, psymtab->text_high (objfile)), outfile);
958 fprintf_filtered (outfile, "\n");
959 fprintf_filtered (outfile, " Address map supported - %s.\n",
960 psymtab->psymtabs_addrmap_supported ? "yes" : "no");
961 fprintf_filtered (outfile, " Depends on %d other partial symtabs.\n",
962 psymtab->number_of_dependencies);
963 for (i = 0; i < psymtab->number_of_dependencies; i++)
964 {
965 fprintf_filtered (outfile, " %d ", i);
966 gdb_print_host_address (psymtab->dependencies[i], outfile);
967 fprintf_filtered (outfile, " %s\n",
968 psymtab->dependencies[i]->filename);
969 }
970 if (psymtab->user != NULL)
971 {
972 fprintf_filtered (outfile, " Shared partial symtab with user ");
973 gdb_print_host_address (psymtab->user, outfile);
974 fprintf_filtered (outfile, "\n");
975 }
976 if (psymtab->n_global_syms > 0)
977 {
978 print_partial_symbols
979 (gdbarch, objfile,
980 &objfile->partial_symtabs->global_psymbols[psymtab->globals_offset],
981 psymtab->n_global_syms, "Global", outfile);
982 }
983 if (psymtab->n_static_syms > 0)
984 {
985 print_partial_symbols
986 (gdbarch, objfile,
987 &objfile->partial_symtabs->static_psymbols[psymtab->statics_offset],
988 psymtab->n_static_syms, "Static", outfile);
989 }
990 fprintf_filtered (outfile, "\n");
991 }
992
993 /* Psymtab version of print_stats. See its definition in
994 the definition of quick_symbol_functions in symfile.h. */
995
996 static void
997 psym_print_stats (struct objfile *objfile)
998 {
999 int i;
1000
1001 i = 0;
1002 for (partial_symtab *ps : require_partial_symbols (objfile, true))
1003 {
1004 if (!ps->readin)
1005 i++;
1006 }
1007 printf_filtered (_(" Number of psym tables (not yet expanded): %d\n"), i);
1008 }
1009
1010 /* Psymtab version of dump. See its definition in
1011 the definition of quick_symbol_functions in symfile.h. */
1012
1013 static void
1014 psym_dump (struct objfile *objfile)
1015 {
1016 struct partial_symtab *psymtab;
1017
1018 if (objfile->partial_symtabs->psymtabs)
1019 {
1020 printf_filtered ("Psymtabs:\n");
1021 for (psymtab = objfile->partial_symtabs->psymtabs;
1022 psymtab != NULL;
1023 psymtab = psymtab->next)
1024 {
1025 printf_filtered ("%s at ",
1026 psymtab->filename);
1027 gdb_print_host_address (psymtab, gdb_stdout);
1028 printf_filtered (", ");
1029 wrap_here (" ");
1030 }
1031 printf_filtered ("\n\n");
1032 }
1033 }
1034
1035 /* Psymtab version of expand_symtabs_for_function. See its definition in
1036 the definition of quick_symbol_functions in symfile.h. */
1037
1038 static void
1039 psym_expand_symtabs_for_function (struct objfile *objfile,
1040 const char *func_name)
1041 {
1042 for (partial_symtab *ps : require_partial_symbols (objfile, true))
1043 {
1044 if (ps->readin)
1045 continue;
1046
1047 if ((lookup_partial_symbol (objfile, ps, func_name, 1, VAR_DOMAIN)
1048 != NULL)
1049 || (lookup_partial_symbol (objfile, ps, func_name, 0, VAR_DOMAIN)
1050 != NULL))
1051 psymtab_to_symtab (objfile, ps);
1052 }
1053 }
1054
1055 /* Psymtab version of expand_all_symtabs. See its definition in
1056 the definition of quick_symbol_functions in symfile.h. */
1057
1058 static void
1059 psym_expand_all_symtabs (struct objfile *objfile)
1060 {
1061 for (partial_symtab *psymtab : require_partial_symbols (objfile, true))
1062 psymtab_to_symtab (objfile, psymtab);
1063 }
1064
1065 /* Psymtab version of expand_symtabs_with_fullname. See its definition in
1066 the definition of quick_symbol_functions in symfile.h. */
1067
1068 static void
1069 psym_expand_symtabs_with_fullname (struct objfile *objfile,
1070 const char *fullname)
1071 {
1072 for (partial_symtab *p : require_partial_symbols (objfile, true))
1073 {
1074 /* Anonymous psymtabs don't have a name of a source file. */
1075 if (p->anonymous)
1076 continue;
1077
1078 /* psymtab_to_fullname tries to open the file which is slow.
1079 Don't call it if we know the basenames don't match. */
1080 if ((basenames_may_differ
1081 || filename_cmp (lbasename (fullname), lbasename (p->filename)) == 0)
1082 && filename_cmp (fullname, psymtab_to_fullname (p)) == 0)
1083 psymtab_to_symtab (objfile, p);
1084 }
1085 }
1086
1087 /* Psymtab version of map_symbol_filenames. See its definition in
1088 the definition of quick_symbol_functions in symfile.h. */
1089
1090 static void
1091 psym_map_symbol_filenames (struct objfile *objfile,
1092 symbol_filename_ftype *fun, void *data,
1093 int need_fullname)
1094 {
1095 for (partial_symtab *ps : require_partial_symbols (objfile, true))
1096 {
1097 const char *fullname;
1098
1099 if (ps->readin)
1100 continue;
1101
1102 /* We can skip shared psymtabs here, because any file name will be
1103 attached to the unshared psymtab. */
1104 if (ps->user != NULL)
1105 continue;
1106
1107 /* Anonymous psymtabs don't have a file name. */
1108 if (ps->anonymous)
1109 continue;
1110
1111 QUIT;
1112 if (need_fullname)
1113 fullname = psymtab_to_fullname (ps);
1114 else
1115 fullname = NULL;
1116 (*fun) (ps->filename, fullname, data);
1117 }
1118 }
1119
1120 /* Finds the fullname that a partial_symtab represents.
1121
1122 If this functions finds the fullname, it will save it in ps->fullname
1123 and it will also return the value.
1124
1125 If this function fails to find the file that this partial_symtab represents,
1126 NULL will be returned and ps->fullname will be set to NULL. */
1127
1128 static const char *
1129 psymtab_to_fullname (struct partial_symtab *ps)
1130 {
1131 gdb_assert (!ps->anonymous);
1132
1133 /* Use cached copy if we have it.
1134 We rely on forget_cached_source_info being called appropriately
1135 to handle cases like the file being moved. */
1136 if (ps->fullname == NULL)
1137 {
1138 gdb::unique_xmalloc_ptr<char> fullname;
1139 scoped_fd fd = find_and_open_source (ps->filename, ps->dirname,
1140 &fullname);
1141 ps->fullname = fullname.release ();
1142
1143 if (fd.get () < 0)
1144 {
1145 /* rewrite_source_path would be applied by find_and_open_source, we
1146 should report the pathname where GDB tried to find the file. */
1147
1148 if (ps->dirname == NULL || IS_ABSOLUTE_PATH (ps->filename))
1149 fullname.reset (xstrdup (ps->filename));
1150 else
1151 fullname.reset (concat (ps->dirname, SLASH_STRING,
1152 ps->filename, (char *) NULL));
1153
1154 ps->fullname = rewrite_source_path (fullname.get ()).release ();
1155 if (ps->fullname == NULL)
1156 ps->fullname = fullname.release ();
1157 }
1158 }
1159
1160 return ps->fullname;
1161 }
1162
1163 /* Psymtab version of map_matching_symbols. See its definition in
1164 the definition of quick_symbol_functions in symfile.h. */
1165
1166 static void
1167 psym_map_matching_symbols
1168 (struct objfile *objfile,
1169 const lookup_name_info &name, domain_enum domain,
1170 int global,
1171 gdb::function_view<symbol_found_callback_ftype> callback,
1172 symbol_compare_ftype *ordered_compare)
1173 {
1174 const int block_kind = global ? GLOBAL_BLOCK : STATIC_BLOCK;
1175
1176 for (partial_symtab *ps : require_partial_symbols (objfile, true))
1177 {
1178 QUIT;
1179 if (ps->readin
1180 || match_partial_symbol (objfile, ps, global, name, domain,
1181 ordered_compare))
1182 {
1183 struct compunit_symtab *cust = psymtab_to_symtab (objfile, ps);
1184 const struct block *block;
1185
1186 if (cust == NULL)
1187 continue;
1188 block = BLOCKVECTOR_BLOCK (COMPUNIT_BLOCKVECTOR (cust), block_kind);
1189 if (!iterate_over_symbols_terminated (block, name,
1190 domain, callback))
1191 return;
1192 }
1193 }
1194 }
1195
1196 /* A helper for psym_expand_symtabs_matching that handles searching
1197 included psymtabs. This returns true if a symbol is found, and
1198 false otherwise. It also updates the 'searched_flag' on the
1199 various psymtabs that it searches. */
1200
1201 static bool
1202 recursively_search_psymtabs
1203 (struct partial_symtab *ps,
1204 struct objfile *objfile,
1205 enum search_domain domain,
1206 const lookup_name_info &lookup_name,
1207 gdb::function_view<expand_symtabs_symbol_matcher_ftype> sym_matcher)
1208 {
1209 int keep_going = 1;
1210 enum psymtab_search_status result = PST_SEARCHED_AND_NOT_FOUND;
1211 int i;
1212
1213 if (ps->searched_flag != PST_NOT_SEARCHED)
1214 return ps->searched_flag == PST_SEARCHED_AND_FOUND;
1215
1216 /* Recurse into shared psymtabs first, because they may have already
1217 been searched, and this could save some time. */
1218 for (i = 0; i < ps->number_of_dependencies; ++i)
1219 {
1220 int r;
1221
1222 /* Skip non-shared dependencies, these are handled elsewhere. */
1223 if (ps->dependencies[i]->user == NULL)
1224 continue;
1225
1226 r = recursively_search_psymtabs (ps->dependencies[i],
1227 objfile, domain, lookup_name,
1228 sym_matcher);
1229 if (r != 0)
1230 {
1231 ps->searched_flag = PST_SEARCHED_AND_FOUND;
1232 return true;
1233 }
1234 }
1235
1236 partial_symbol **gbound
1237 = (objfile->partial_symtabs->global_psymbols.data ()
1238 + ps->globals_offset + ps->n_global_syms);
1239 partial_symbol **sbound
1240 = (objfile->partial_symtabs->static_psymbols.data ()
1241 + ps->statics_offset + ps->n_static_syms);
1242 partial_symbol **bound = gbound;
1243
1244 /* Go through all of the symbols stored in a partial
1245 symtab in one loop. */
1246 partial_symbol **psym = (objfile->partial_symtabs->global_psymbols.data ()
1247 + ps->globals_offset);
1248 while (keep_going)
1249 {
1250 if (psym >= bound)
1251 {
1252 if (bound == gbound && ps->n_static_syms != 0)
1253 {
1254 psym = (objfile->partial_symtabs->static_psymbols.data ()
1255 + ps->statics_offset);
1256 bound = sbound;
1257 }
1258 else
1259 keep_going = 0;
1260 continue;
1261 }
1262 else
1263 {
1264 QUIT;
1265
1266 if ((domain == ALL_DOMAIN
1267 || (domain == MODULES_DOMAIN
1268 && (*psym)->domain == MODULE_DOMAIN)
1269 || (domain == VARIABLES_DOMAIN
1270 && (*psym)->aclass != LOC_TYPEDEF
1271 && (*psym)->aclass != LOC_BLOCK)
1272 || (domain == FUNCTIONS_DOMAIN
1273 && (*psym)->aclass == LOC_BLOCK)
1274 || (domain == TYPES_DOMAIN
1275 && (*psym)->aclass == LOC_TYPEDEF))
1276 && psymbol_name_matches (*psym, lookup_name)
1277 && (sym_matcher == NULL
1278 || sym_matcher ((*psym)->ginfo.search_name ())))
1279 {
1280 /* Found a match, so notify our caller. */
1281 result = PST_SEARCHED_AND_FOUND;
1282 keep_going = 0;
1283 }
1284 }
1285 psym++;
1286 }
1287
1288 ps->searched_flag = result;
1289 return result == PST_SEARCHED_AND_FOUND;
1290 }
1291
1292 /* Psymtab version of expand_symtabs_matching. See its definition in
1293 the definition of quick_symbol_functions in symfile.h. */
1294
1295 static void
1296 psym_expand_symtabs_matching
1297 (struct objfile *objfile,
1298 gdb::function_view<expand_symtabs_file_matcher_ftype> file_matcher,
1299 const lookup_name_info &lookup_name_in,
1300 gdb::function_view<expand_symtabs_symbol_matcher_ftype> symbol_matcher,
1301 gdb::function_view<expand_symtabs_exp_notify_ftype> expansion_notify,
1302 enum search_domain domain)
1303 {
1304 lookup_name_info lookup_name = lookup_name_in.make_ignore_params ();
1305
1306 /* Clear the search flags. */
1307 for (partial_symtab *ps : require_partial_symbols (objfile, true))
1308 ps->searched_flag = PST_NOT_SEARCHED;
1309
1310 for (partial_symtab *ps : objfile->psymtabs ())
1311 {
1312 QUIT;
1313
1314 if (ps->readin)
1315 continue;
1316
1317 /* We skip shared psymtabs because file-matching doesn't apply
1318 to them; but we search them later in the loop. */
1319 if (ps->user != NULL)
1320 continue;
1321
1322 if (file_matcher)
1323 {
1324 bool match;
1325
1326 if (ps->anonymous)
1327 continue;
1328
1329 match = file_matcher (ps->filename, false);
1330 if (!match)
1331 {
1332 /* Before we invoke realpath, which can get expensive when many
1333 files are involved, do a quick comparison of the basenames. */
1334 if (basenames_may_differ
1335 || file_matcher (lbasename (ps->filename), true))
1336 match = file_matcher (psymtab_to_fullname (ps), false);
1337 }
1338 if (!match)
1339 continue;
1340 }
1341
1342 if (recursively_search_psymtabs (ps, objfile, domain,
1343 lookup_name, symbol_matcher))
1344 {
1345 struct compunit_symtab *symtab =
1346 psymtab_to_symtab (objfile, ps);
1347
1348 if (expansion_notify != NULL)
1349 expansion_notify (symtab);
1350 }
1351 }
1352 }
1353
1354 /* Psymtab version of has_symbols. See its definition in
1355 the definition of quick_symbol_functions in symfile.h. */
1356
1357 static int
1358 psym_has_symbols (struct objfile *objfile)
1359 {
1360 return objfile->partial_symtabs->psymtabs != NULL;
1361 }
1362
1363 /* Helper function for psym_find_compunit_symtab_by_address that fills
1364 in psymbol_map for a given range of psymbols. */
1365
1366 static void
1367 psym_fill_psymbol_map (struct objfile *objfile,
1368 struct partial_symtab *psymtab,
1369 std::set<CORE_ADDR> *seen_addrs,
1370 const std::vector<partial_symbol *> &symbols,
1371 int start,
1372 int length)
1373 {
1374 for (int i = 0; i < length; ++i)
1375 {
1376 struct partial_symbol *psym = symbols[start + i];
1377
1378 if (psym->aclass == LOC_STATIC)
1379 {
1380 CORE_ADDR addr = psym->address (objfile);
1381 if (seen_addrs->find (addr) == seen_addrs->end ())
1382 {
1383 seen_addrs->insert (addr);
1384 objfile->psymbol_map.emplace_back (addr, psymtab);
1385 }
1386 }
1387 }
1388 }
1389
1390 /* See find_compunit_symtab_by_address in quick_symbol_functions, in
1391 symfile.h. */
1392
1393 static compunit_symtab *
1394 psym_find_compunit_symtab_by_address (struct objfile *objfile,
1395 CORE_ADDR address)
1396 {
1397 if (objfile->psymbol_map.empty ())
1398 {
1399 std::set<CORE_ADDR> seen_addrs;
1400
1401 for (partial_symtab *pst : require_partial_symbols (objfile, true))
1402 {
1403 psym_fill_psymbol_map (objfile, pst,
1404 &seen_addrs,
1405 objfile->partial_symtabs->global_psymbols,
1406 pst->globals_offset,
1407 pst->n_global_syms);
1408 psym_fill_psymbol_map (objfile, pst,
1409 &seen_addrs,
1410 objfile->partial_symtabs->static_psymbols,
1411 pst->statics_offset,
1412 pst->n_static_syms);
1413 }
1414
1415 objfile->psymbol_map.shrink_to_fit ();
1416
1417 std::sort (objfile->psymbol_map.begin (), objfile->psymbol_map.end (),
1418 [] (const std::pair<CORE_ADDR, partial_symtab *> &a,
1419 const std::pair<CORE_ADDR, partial_symtab *> &b)
1420 {
1421 return a.first < b.first;
1422 });
1423 }
1424
1425 auto iter = std::lower_bound
1426 (objfile->psymbol_map.begin (), objfile->psymbol_map.end (), address,
1427 [] (const std::pair<CORE_ADDR, partial_symtab *> &a,
1428 CORE_ADDR b)
1429 {
1430 return a.first < b;
1431 });
1432
1433 if (iter == objfile->psymbol_map.end () || iter->first != address)
1434 return NULL;
1435
1436 return psymtab_to_symtab (objfile, iter->second);
1437 }
1438
1439 const struct quick_symbol_functions psym_functions =
1440 {
1441 psym_has_symbols,
1442 psym_find_last_source_symtab,
1443 psym_forget_cached_source_info,
1444 psym_map_symtabs_matching_filename,
1445 psym_lookup_symbol,
1446 psym_print_stats,
1447 psym_dump,
1448 psym_expand_symtabs_for_function,
1449 psym_expand_all_symtabs,
1450 psym_expand_symtabs_with_fullname,
1451 psym_map_matching_symbols,
1452 psym_expand_symtabs_matching,
1453 psym_find_pc_sect_compunit_symtab,
1454 psym_find_compunit_symtab_by_address,
1455 psym_map_symbol_filenames
1456 };
1457
1458 \f
1459
1460 static void
1461 sort_pst_symbols (struct objfile *objfile, struct partial_symtab *pst)
1462 {
1463 /* Sort the global list; don't sort the static list. */
1464 auto begin = objfile->partial_symtabs->global_psymbols.begin ();
1465 std::advance (begin, pst->globals_offset);
1466
1467 /* The psymbols for this partial_symtab are currently at the end of the
1468 vector. */
1469 auto end = objfile->partial_symtabs->global_psymbols.end ();
1470
1471 std::sort (begin, end, [] (partial_symbol *s1, partial_symbol *s2)
1472 {
1473 return strcmp_iw_ordered (s1->ginfo.search_name (),
1474 s2->ginfo.search_name ()) < 0;
1475 });
1476 }
1477
1478 /* Allocate and partially fill a partial symtab. It will be
1479 completely filled at the end of the symbol list.
1480
1481 FILENAME is the name of the symbol-file we are reading from. */
1482
1483 struct partial_symtab *
1484 start_psymtab_common (struct objfile *objfile,
1485 const char *filename,
1486 CORE_ADDR textlow)
1487 {
1488 struct partial_symtab *psymtab;
1489
1490 psymtab = new partial_symtab (filename, objfile);
1491 psymtab->set_text_low (textlow);
1492 psymtab->set_text_high (psymtab->raw_text_low ()); /* default */
1493 psymtab->globals_offset = objfile->partial_symtabs->global_psymbols.size ();
1494 psymtab->statics_offset = objfile->partial_symtabs->static_psymbols.size ();
1495 return psymtab;
1496 }
1497
1498 /* Perform "finishing up" operations of a partial symtab. */
1499
1500 void
1501 end_psymtab_common (struct objfile *objfile, struct partial_symtab *pst)
1502 {
1503 pst->n_global_syms = (objfile->partial_symtabs->global_psymbols.size ()
1504 - pst->globals_offset);
1505 pst->n_static_syms = (objfile->partial_symtabs->static_psymbols.size ()
1506 - pst->statics_offset);
1507
1508 sort_pst_symbols (objfile, pst);
1509 }
1510
1511 /* Calculate a hash code for the given partial symbol. The hash is
1512 calculated using the symbol's value, language, domain, class
1513 and name. These are the values which are set by
1514 add_psymbol_to_bcache. */
1515
1516 static unsigned long
1517 psymbol_hash (const void *addr, int length)
1518 {
1519 unsigned long h = 0;
1520 struct partial_symbol *psymbol = (struct partial_symbol *) addr;
1521 unsigned int lang = psymbol->ginfo.language ();
1522 unsigned int domain = psymbol->domain;
1523 unsigned int theclass = psymbol->aclass;
1524
1525 h = fast_hash (&psymbol->ginfo.value, sizeof (psymbol->ginfo.value), h);
1526 h = fast_hash (&lang, sizeof (unsigned int), h);
1527 h = fast_hash (&domain, sizeof (unsigned int), h);
1528 h = fast_hash (&theclass, sizeof (unsigned int), h);
1529 /* Note that psymbol names are interned via compute_and_set_names, so
1530 there's no need to hash the contents of the name here. */
1531 h = fast_hash (&psymbol->ginfo.m_name, sizeof (psymbol->ginfo.m_name), h);
1532
1533 return h;
1534 }
1535
1536 /* Returns true if the symbol at addr1 equals the symbol at addr2.
1537 For the comparison this function uses a symbols value,
1538 language, domain, class and name. */
1539
1540 static int
1541 psymbol_compare (const void *addr1, const void *addr2, int length)
1542 {
1543 struct partial_symbol *sym1 = (struct partial_symbol *) addr1;
1544 struct partial_symbol *sym2 = (struct partial_symbol *) addr2;
1545
1546 return (memcmp (&sym1->ginfo.value, &sym2->ginfo.value,
1547 sizeof (sym1->ginfo.value)) == 0
1548 && sym1->ginfo.language () == sym2->ginfo.language ()
1549 && sym1->domain == sym2->domain
1550 && sym1->aclass == sym2->aclass
1551 /* Note that psymbol names are interned via
1552 compute_and_set_names, so there's no need to compare the
1553 contents of the name here. */
1554 && sym1->ginfo.linkage_name () == sym2->ginfo.linkage_name ());
1555 }
1556
1557 /* Helper function, initialises partial symbol structure and stashes
1558 it into objfile's bcache. Note that our caching mechanism will
1559 use all fields of struct partial_symbol to determine hash value of the
1560 structure. In other words, having two symbols with the same name but
1561 different domain (or address) is possible and correct. */
1562
1563 static struct partial_symbol *
1564 add_psymbol_to_bcache (gdb::string_view name, bool copy_name,
1565 domain_enum domain,
1566 enum address_class theclass,
1567 short section,
1568 CORE_ADDR coreaddr,
1569 enum language language, struct objfile *objfile,
1570 int *added)
1571 {
1572 struct partial_symbol psymbol;
1573 memset (&psymbol, 0, sizeof (psymbol));
1574
1575 psymbol.set_unrelocated_address (coreaddr);
1576 psymbol.ginfo.section = section;
1577 psymbol.domain = domain;
1578 psymbol.aclass = theclass;
1579 psymbol.ginfo.set_language (language, objfile->partial_symtabs->obstack ());
1580 psymbol.ginfo.compute_and_set_names (name, copy_name, objfile->per_bfd);
1581
1582 /* Stash the partial symbol away in the cache. */
1583 return ((struct partial_symbol *)
1584 objfile->partial_symtabs->psymbol_cache.insert
1585 (&psymbol, sizeof (struct partial_symbol), added));
1586 }
1587
1588 /* Helper function, adds partial symbol to the given partial symbol list. */
1589
1590 static void
1591 append_psymbol_to_list (std::vector<partial_symbol *> *list,
1592 struct partial_symbol *psym,
1593 struct objfile *objfile)
1594 {
1595 list->push_back (psym);
1596 OBJSTAT (objfile, n_psyms++);
1597 }
1598
1599 /* See psympriv.h. */
1600
1601 void
1602 add_psymbol_to_list (gdb::string_view name, bool copy_name,
1603 domain_enum domain,
1604 enum address_class theclass,
1605 short section,
1606 psymbol_placement where,
1607 CORE_ADDR coreaddr,
1608 enum language language, struct objfile *objfile)
1609 {
1610 struct partial_symbol *psym;
1611
1612 int added;
1613
1614 /* Stash the partial symbol away in the cache. */
1615 psym = add_psymbol_to_bcache (name, copy_name, domain, theclass,
1616 section, coreaddr, language, objfile, &added);
1617
1618 /* Do not duplicate global partial symbols. */
1619 if (where == psymbol_placement::GLOBAL && !added)
1620 return;
1621
1622 /* Save pointer to partial symbol in psymtab, growing symtab if needed. */
1623 std::vector<partial_symbol *> *list
1624 = (where == psymbol_placement::STATIC
1625 ? &objfile->partial_symtabs->static_psymbols
1626 : &objfile->partial_symtabs->global_psymbols);
1627 append_psymbol_to_list (list, psym, objfile);
1628 }
1629
1630 /* See psympriv.h. */
1631
1632 void
1633 init_psymbol_list (struct objfile *objfile, int total_symbols)
1634 {
1635 if (objfile->partial_symtabs->global_psymbols.capacity () == 0
1636 && objfile->partial_symtabs->static_psymbols.capacity () == 0)
1637 {
1638 /* Current best guess is that approximately a twentieth of the
1639 total symbols (in a debugging file) are global or static
1640 oriented symbols, then multiply that by slop factor of
1641 two. */
1642 objfile->partial_symtabs->global_psymbols.reserve (total_symbols / 10);
1643 objfile->partial_symtabs->static_psymbols.reserve (total_symbols / 10);
1644 }
1645 }
1646
1647 /* See psympriv.h. */
1648
1649 partial_symtab::partial_symtab (const char *filename_, struct objfile *objfile)
1650 : searched_flag (PST_NOT_SEARCHED),
1651 text_low_valid (0),
1652 text_high_valid (0)
1653 {
1654 objfile->partial_symtabs->install_psymtab (this);
1655
1656 filename
1657 = ((const char *) objfile->per_bfd->filename_cache.insert
1658 (filename_, strlen (filename_) + 1));
1659 compunit_symtab = NULL;
1660
1661 if (symtab_create_debug)
1662 {
1663 /* Be a bit clever with debugging messages, and don't print objfile
1664 every time, only when it changes. */
1665 static char *last_objfile_name = NULL;
1666
1667 if (last_objfile_name == NULL
1668 || strcmp (last_objfile_name, objfile_name (objfile)) != 0)
1669 {
1670 xfree (last_objfile_name);
1671 last_objfile_name = xstrdup (objfile_name (objfile));
1672 fprintf_filtered (gdb_stdlog,
1673 "Creating one or more psymtabs for objfile %s ...\n",
1674 last_objfile_name);
1675 }
1676 fprintf_filtered (gdb_stdlog,
1677 "Created psymtab %s for module %s.\n",
1678 host_address_to_string (this), filename);
1679 }
1680 }
1681
1682 void
1683 psymtab_storage::discard_psymtab (struct partial_symtab *pst)
1684 {
1685 struct partial_symtab **prev_pst;
1686
1687 /* From dbxread.c:
1688 Empty psymtabs happen as a result of header files which don't
1689 have any symbols in them. There can be a lot of them. But this
1690 check is wrong, in that a psymtab with N_SLINE entries but
1691 nothing else is not empty, but we don't realize that. Fixing
1692 that without slowing things down might be tricky. */
1693
1694 /* First, snip it out of the psymtab chain. */
1695
1696 prev_pst = &psymtabs;
1697 while ((*prev_pst) != pst)
1698 prev_pst = &((*prev_pst)->next);
1699 (*prev_pst) = pst->next;
1700 delete pst;
1701 }
1702
1703 \f
1704
1705 /* We need to pass a couple of items to the addrmap_foreach function,
1706 so use a struct. */
1707
1708 struct dump_psymtab_addrmap_data
1709 {
1710 struct objfile *objfile;
1711 struct partial_symtab *psymtab;
1712 struct ui_file *outfile;
1713
1714 /* Non-zero if the previously printed addrmap entry was for PSYMTAB.
1715 If so, we want to print the next one as well (since the next addrmap
1716 entry defines the end of the range). */
1717 int previous_matched;
1718 };
1719
1720 /* Helper function for dump_psymtab_addrmap to print an addrmap entry. */
1721
1722 static int
1723 dump_psymtab_addrmap_1 (void *datap, CORE_ADDR start_addr, void *obj)
1724 {
1725 struct dump_psymtab_addrmap_data *data
1726 = (struct dump_psymtab_addrmap_data *) datap;
1727 struct gdbarch *gdbarch = get_objfile_arch (data->objfile);
1728 struct partial_symtab *addrmap_psymtab = (struct partial_symtab *) obj;
1729 const char *psymtab_address_or_end = NULL;
1730
1731 QUIT;
1732
1733 if (data->psymtab == NULL
1734 || data->psymtab == addrmap_psymtab)
1735 psymtab_address_or_end = host_address_to_string (addrmap_psymtab);
1736 else if (data->previous_matched)
1737 psymtab_address_or_end = "<ends here>";
1738
1739 if (data->psymtab == NULL
1740 || data->psymtab == addrmap_psymtab
1741 || data->previous_matched)
1742 {
1743 fprintf_filtered (data->outfile, " %s%s %s\n",
1744 data->psymtab != NULL ? " " : "",
1745 paddress (gdbarch, start_addr),
1746 psymtab_address_or_end);
1747 }
1748
1749 data->previous_matched = (data->psymtab == NULL
1750 || data->psymtab == addrmap_psymtab);
1751
1752 return 0;
1753 }
1754
1755 /* Helper function for maintenance_print_psymbols to print the addrmap
1756 of PSYMTAB. If PSYMTAB is NULL print the entire addrmap. */
1757
1758 static void
1759 dump_psymtab_addrmap (struct objfile *objfile, struct partial_symtab *psymtab,
1760 struct ui_file *outfile)
1761 {
1762 struct dump_psymtab_addrmap_data addrmap_dump_data;
1763
1764 if ((psymtab == NULL
1765 || psymtab->psymtabs_addrmap_supported)
1766 && objfile->partial_symtabs->psymtabs_addrmap != NULL)
1767 {
1768 addrmap_dump_data.objfile = objfile;
1769 addrmap_dump_data.psymtab = psymtab;
1770 addrmap_dump_data.outfile = outfile;
1771 addrmap_dump_data.previous_matched = 0;
1772 fprintf_filtered (outfile, "%sddress map:\n",
1773 psymtab == NULL ? "Entire a" : " A");
1774 addrmap_foreach (objfile->partial_symtabs->psymtabs_addrmap,
1775 dump_psymtab_addrmap_1, &addrmap_dump_data);
1776 }
1777 }
1778
1779 static void
1780 maintenance_print_psymbols (const char *args, int from_tty)
1781 {
1782 struct ui_file *outfile = gdb_stdout;
1783 char *address_arg = NULL, *source_arg = NULL, *objfile_arg = NULL;
1784 int i, outfile_idx, found;
1785 CORE_ADDR pc = 0;
1786 struct obj_section *section = NULL;
1787
1788 dont_repeat ();
1789
1790 gdb_argv argv (args);
1791
1792 for (i = 0; argv != NULL && argv[i] != NULL; ++i)
1793 {
1794 if (strcmp (argv[i], "-pc") == 0)
1795 {
1796 if (argv[i + 1] == NULL)
1797 error (_("Missing pc value"));
1798 address_arg = argv[++i];
1799 }
1800 else if (strcmp (argv[i], "-source") == 0)
1801 {
1802 if (argv[i + 1] == NULL)
1803 error (_("Missing source file"));
1804 source_arg = argv[++i];
1805 }
1806 else if (strcmp (argv[i], "-objfile") == 0)
1807 {
1808 if (argv[i + 1] == NULL)
1809 error (_("Missing objfile name"));
1810 objfile_arg = argv[++i];
1811 }
1812 else if (strcmp (argv[i], "--") == 0)
1813 {
1814 /* End of options. */
1815 ++i;
1816 break;
1817 }
1818 else if (argv[i][0] == '-')
1819 {
1820 /* Future proofing: Don't allow OUTFILE to begin with "-". */
1821 error (_("Unknown option: %s"), argv[i]);
1822 }
1823 else
1824 break;
1825 }
1826 outfile_idx = i;
1827
1828 if (address_arg != NULL && source_arg != NULL)
1829 error (_("Must specify at most one of -pc and -source"));
1830
1831 stdio_file arg_outfile;
1832
1833 if (argv != NULL && argv[outfile_idx] != NULL)
1834 {
1835 if (argv[outfile_idx + 1] != NULL)
1836 error (_("Junk at end of command"));
1837 gdb::unique_xmalloc_ptr<char> outfile_name
1838 (tilde_expand (argv[outfile_idx]));
1839 if (!arg_outfile.open (outfile_name.get (), FOPEN_WT))
1840 perror_with_name (outfile_name.get ());
1841 outfile = &arg_outfile;
1842 }
1843
1844 if (address_arg != NULL)
1845 {
1846 pc = parse_and_eval_address (address_arg);
1847 /* If we fail to find a section, that's ok, try the lookup anyway. */
1848 section = find_pc_section (pc);
1849 }
1850
1851 found = 0;
1852 for (objfile *objfile : current_program_space->objfiles ())
1853 {
1854 int printed_objfile_header = 0;
1855 int print_for_objfile = 1;
1856
1857 QUIT;
1858 if (objfile_arg != NULL)
1859 print_for_objfile
1860 = compare_filenames_for_search (objfile_name (objfile),
1861 objfile_arg);
1862 if (!print_for_objfile)
1863 continue;
1864
1865 if (address_arg != NULL)
1866 {
1867 struct bound_minimal_symbol msymbol = { NULL, NULL };
1868
1869 /* We don't assume each pc has a unique objfile (this is for
1870 debugging). */
1871 struct partial_symtab *ps = find_pc_sect_psymtab (objfile, pc,
1872 section, msymbol);
1873 if (ps != NULL)
1874 {
1875 if (!printed_objfile_header)
1876 {
1877 outfile->printf ("\nPartial symtabs for objfile %s\n",
1878 objfile_name (objfile));
1879 printed_objfile_header = 1;
1880 }
1881 dump_psymtab (objfile, ps, outfile);
1882 dump_psymtab_addrmap (objfile, ps, outfile);
1883 found = 1;
1884 }
1885 }
1886 else
1887 {
1888 for (partial_symtab *ps : require_partial_symbols (objfile, true))
1889 {
1890 int print_for_source = 0;
1891
1892 QUIT;
1893 if (source_arg != NULL)
1894 {
1895 print_for_source
1896 = compare_filenames_for_search (ps->filename, source_arg);
1897 found = 1;
1898 }
1899 if (source_arg == NULL
1900 || print_for_source)
1901 {
1902 if (!printed_objfile_header)
1903 {
1904 outfile->printf ("\nPartial symtabs for objfile %s\n",
1905 objfile_name (objfile));
1906 printed_objfile_header = 1;
1907 }
1908 dump_psymtab (objfile, ps, outfile);
1909 dump_psymtab_addrmap (objfile, ps, outfile);
1910 }
1911 }
1912 }
1913
1914 /* If we're printing all the objfile's symbols dump the full addrmap. */
1915
1916 if (address_arg == NULL
1917 && source_arg == NULL
1918 && objfile->partial_symtabs->psymtabs_addrmap != NULL)
1919 {
1920 outfile->puts ("\n");
1921 dump_psymtab_addrmap (objfile, NULL, outfile);
1922 }
1923 }
1924
1925 if (!found)
1926 {
1927 if (address_arg != NULL)
1928 error (_("No partial symtab for address: %s"), address_arg);
1929 if (source_arg != NULL)
1930 error (_("No partial symtab for source file: %s"), source_arg);
1931 }
1932 }
1933
1934 /* List all the partial symbol tables whose names match REGEXP (optional). */
1935
1936 static void
1937 maintenance_info_psymtabs (const char *regexp, int from_tty)
1938 {
1939 struct program_space *pspace;
1940
1941 if (regexp)
1942 re_comp (regexp);
1943
1944 ALL_PSPACES (pspace)
1945 for (objfile *objfile : pspace->objfiles ())
1946 {
1947 struct gdbarch *gdbarch = get_objfile_arch (objfile);
1948
1949 /* We don't want to print anything for this objfile until we
1950 actually find a symtab whose name matches. */
1951 int printed_objfile_start = 0;
1952
1953 for (partial_symtab *psymtab : require_partial_symbols (objfile, true))
1954 {
1955 QUIT;
1956
1957 if (! regexp
1958 || re_exec (psymtab->filename))
1959 {
1960 if (! printed_objfile_start)
1961 {
1962 printf_filtered ("{ objfile %s ", objfile_name (objfile));
1963 wrap_here (" ");
1964 printf_filtered ("((struct objfile *) %s)\n",
1965 host_address_to_string (objfile));
1966 printed_objfile_start = 1;
1967 }
1968
1969 printf_filtered (" { psymtab %s ", psymtab->filename);
1970 wrap_here (" ");
1971 printf_filtered ("((struct partial_symtab *) %s)\n",
1972 host_address_to_string (psymtab));
1973
1974 printf_filtered (" readin %s\n",
1975 psymtab->readin ? "yes" : "no");
1976 printf_filtered (" fullname %s\n",
1977 psymtab->fullname
1978 ? psymtab->fullname : "(null)");
1979 printf_filtered (" text addresses ");
1980 fputs_filtered (paddress (gdbarch,
1981 psymtab->text_low (objfile)),
1982 gdb_stdout);
1983 printf_filtered (" -- ");
1984 fputs_filtered (paddress (gdbarch,
1985 psymtab->text_high (objfile)),
1986 gdb_stdout);
1987 printf_filtered ("\n");
1988 printf_filtered (" psymtabs_addrmap_supported %s\n",
1989 (psymtab->psymtabs_addrmap_supported
1990 ? "yes" : "no"));
1991 printf_filtered (" globals ");
1992 if (psymtab->n_global_syms)
1993 {
1994 auto p = &(objfile->partial_symtabs
1995 ->global_psymbols[psymtab->globals_offset]);
1996
1997 printf_filtered
1998 ("(* (struct partial_symbol **) %s @ %d)\n",
1999 host_address_to_string (p),
2000 psymtab->n_global_syms);
2001 }
2002 else
2003 printf_filtered ("(none)\n");
2004 printf_filtered (" statics ");
2005 if (psymtab->n_static_syms)
2006 {
2007 auto p = &(objfile->partial_symtabs
2008 ->static_psymbols[psymtab->statics_offset]);
2009
2010 printf_filtered
2011 ("(* (struct partial_symbol **) %s @ %d)\n",
2012 host_address_to_string (p),
2013 psymtab->n_static_syms);
2014 }
2015 else
2016 printf_filtered ("(none)\n");
2017 printf_filtered (" dependencies ");
2018 if (psymtab->number_of_dependencies)
2019 {
2020 int i;
2021
2022 printf_filtered ("{\n");
2023 for (i = 0; i < psymtab->number_of_dependencies; i++)
2024 {
2025 struct partial_symtab *dep = psymtab->dependencies[i];
2026
2027 /* Note the string concatenation there --- no
2028 comma. */
2029 printf_filtered (" psymtab %s "
2030 "((struct partial_symtab *) %s)\n",
2031 dep->filename,
2032 host_address_to_string (dep));
2033 }
2034 printf_filtered (" }\n");
2035 }
2036 else
2037 printf_filtered ("(none)\n");
2038 printf_filtered (" }\n");
2039 }
2040 }
2041
2042 if (printed_objfile_start)
2043 printf_filtered ("}\n");
2044 }
2045 }
2046
2047 /* Check consistency of currently expanded psymtabs vs symtabs. */
2048
2049 static void
2050 maintenance_check_psymtabs (const char *ignore, int from_tty)
2051 {
2052 struct symbol *sym;
2053 struct compunit_symtab *cust = NULL;
2054 const struct blockvector *bv;
2055 const struct block *b;
2056 int length;
2057
2058 for (objfile *objfile : current_program_space->objfiles ())
2059 for (partial_symtab *ps : require_partial_symbols (objfile, true))
2060 {
2061 struct gdbarch *gdbarch = get_objfile_arch (objfile);
2062
2063 /* We don't call psymtab_to_symtab here because that may cause symtab
2064 expansion. When debugging a problem it helps if checkers leave
2065 things unchanged. */
2066 cust = ps->compunit_symtab;
2067
2068 /* First do some checks that don't require the associated symtab. */
2069 if (ps->text_high (objfile) < ps->text_low (objfile))
2070 {
2071 printf_filtered ("Psymtab ");
2072 puts_filtered (ps->filename);
2073 printf_filtered (" covers bad range ");
2074 fputs_filtered (paddress (gdbarch, ps->text_low (objfile)),
2075 gdb_stdout);
2076 printf_filtered (" - ");
2077 fputs_filtered (paddress (gdbarch, ps->text_high (objfile)),
2078 gdb_stdout);
2079 printf_filtered ("\n");
2080 continue;
2081 }
2082
2083 /* Now do checks requiring the associated symtab. */
2084 if (cust == NULL)
2085 continue;
2086 bv = COMPUNIT_BLOCKVECTOR (cust);
2087 b = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
2088 partial_symbol **psym
2089 = &objfile->partial_symtabs->static_psymbols[ps->statics_offset];
2090 length = ps->n_static_syms;
2091 while (length--)
2092 {
2093 sym = block_lookup_symbol (b, (*psym)->ginfo.search_name (),
2094 symbol_name_match_type::SEARCH_NAME,
2095 (*psym)->domain);
2096 if (!sym)
2097 {
2098 printf_filtered ("Static symbol `");
2099 puts_filtered ((*psym)->ginfo.linkage_name ());
2100 printf_filtered ("' only found in ");
2101 puts_filtered (ps->filename);
2102 printf_filtered (" psymtab\n");
2103 }
2104 psym++;
2105 }
2106 b = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
2107 psym = &objfile->partial_symtabs->global_psymbols[ps->globals_offset];
2108 length = ps->n_global_syms;
2109 while (length--)
2110 {
2111 sym = block_lookup_symbol (b, (*psym)->ginfo.search_name (),
2112 symbol_name_match_type::SEARCH_NAME,
2113 (*psym)->domain);
2114 if (!sym)
2115 {
2116 printf_filtered ("Global symbol `");
2117 puts_filtered ((*psym)->ginfo.linkage_name ());
2118 printf_filtered ("' only found in ");
2119 puts_filtered (ps->filename);
2120 printf_filtered (" psymtab\n");
2121 }
2122 psym++;
2123 }
2124 if (ps->raw_text_high () != 0
2125 && (ps->text_low (objfile) < BLOCK_START (b)
2126 || ps->text_high (objfile) > BLOCK_END (b)))
2127 {
2128 printf_filtered ("Psymtab ");
2129 puts_filtered (ps->filename);
2130 printf_filtered (" covers ");
2131 fputs_filtered (paddress (gdbarch, ps->text_low (objfile)),
2132 gdb_stdout);
2133 printf_filtered (" - ");
2134 fputs_filtered (paddress (gdbarch, ps->text_high (objfile)),
2135 gdb_stdout);
2136 printf_filtered (" but symtab covers only ");
2137 fputs_filtered (paddress (gdbarch, BLOCK_START (b)), gdb_stdout);
2138 printf_filtered (" - ");
2139 fputs_filtered (paddress (gdbarch, BLOCK_END (b)), gdb_stdout);
2140 printf_filtered ("\n");
2141 }
2142 }
2143 }
2144
2145 void _initialize_psymtab ();
2146 void
2147 _initialize_psymtab ()
2148 {
2149 add_cmd ("psymbols", class_maintenance, maintenance_print_psymbols, _("\
2150 Print dump of current partial symbol definitions.\n\
2151 Usage: mt print psymbols [-objfile OBJFILE] [-pc ADDRESS] [--] [OUTFILE]\n\
2152 mt print psymbols [-objfile OBJFILE] [-source SOURCE] [--] [OUTFILE]\n\
2153 Entries in the partial symbol table are dumped to file OUTFILE,\n\
2154 or the terminal if OUTFILE is unspecified.\n\
2155 If ADDRESS is provided, dump only the file for that address.\n\
2156 If SOURCE is provided, dump only that file's symbols.\n\
2157 If OBJFILE is provided, dump only that file's minimal symbols."),
2158 &maintenanceprintlist);
2159
2160 add_cmd ("psymtabs", class_maintenance, maintenance_info_psymtabs, _("\
2161 List the partial symbol tables for all object files.\n\
2162 This does not include information about individual partial symbols,\n\
2163 just the symbol table structures themselves."),
2164 &maintenanceinfolist);
2165
2166 add_cmd ("check-psymtabs", class_maintenance, maintenance_check_psymtabs,
2167 _("\
2168 Check consistency of currently expanded psymtabs versus symtabs."),
2169 &maintenancelist);
2170 }
This page took 0.07442 seconds and 4 git commands to generate.