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