1 /* Partial symbol tables.
3 Copyright (C) 2009-2022 Free Software Foundation, Inc.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
25 #include "filenames.h"
31 #include "readline/tilde.h"
32 #include "gdbsupport/gdb_regex.h"
33 #include "dictionary.h"
35 #include "cp-support.h"
39 #include "gdbsupport/buildargv.h"
41 static struct partial_symbol
*lookup_partial_symbol (struct objfile
*,
42 struct partial_symtab
*,
43 const lookup_name_info
&,
47 static const char *psymtab_to_fullname (struct partial_symtab
*ps
);
49 static struct partial_symbol
*find_pc_sect_psymbol (struct objfile
*,
50 struct partial_symtab
*,
52 struct obj_section
*);
54 static struct compunit_symtab
*psymtab_to_symtab (struct objfile
*objfile
,
55 struct partial_symtab
*pst
);
57 psymtab_storage::~psymtab_storage ()
59 partial_symtab
*iter
= psymtabs
;
60 while (iter
!= nullptr)
62 partial_symtab
*next
= iter
->next
;
71 psymtab_storage::install_psymtab (partial_symtab
*pst
)
81 psymtab_storage::partial_symtab_range
82 psymbol_functions::partial_symbols (struct objfile
*objfile
)
84 gdb_assert ((objfile
->flags
& OBJF_PSYMTABS_READ
) != 0);
85 return m_partial_symtabs
->range ();
88 /* Find which partial symtab contains PC and SECTION starting at psymtab PST.
89 We may find a different psymtab than PST. See FIND_PC_SECT_PSYMTAB. */
91 static struct partial_symtab
*
92 find_pc_sect_psymtab_closer (struct objfile
*objfile
,
93 CORE_ADDR pc
, struct obj_section
*section
,
94 struct partial_symtab
*pst
,
95 struct bound_minimal_symbol msymbol
)
97 struct partial_symtab
*tpst
;
98 struct partial_symtab
*best_pst
= pst
;
99 CORE_ADDR best_addr
= pst
->text_low (objfile
);
101 gdb_assert (!pst
->psymtabs_addrmap_supported
);
103 /* An objfile that has its functions reordered might have
104 many partial symbol tables containing the PC, but
105 we want the partial symbol table that contains the
106 function containing the PC. */
107 if (!(objfile
->flags
& OBJF_REORDERED
)
108 && section
== NULL
) /* Can't validate section this way. */
111 if (msymbol
.minsym
== NULL
)
114 /* The code range of partial symtabs sometimes overlap, so, in
115 the loop below, we need to check all partial symtabs and
116 find the one that fits better for the given PC address. We
117 select the partial symtab that contains a symbol whose
118 address is closest to the PC address. By closest we mean
119 that find_pc_sect_symbol returns the symbol with address
120 that is closest and still less than the given PC. */
121 for (tpst
= pst
; tpst
!= NULL
; tpst
= tpst
->next
)
123 if (pc
>= tpst
->text_low (objfile
) && pc
< tpst
->text_high (objfile
))
125 struct partial_symbol
*p
;
128 /* NOTE: This assumes that every psymbol has a
129 corresponding msymbol, which is not necessarily
130 true; the debug info might be much richer than the
131 object's symbol table. */
132 p
= find_pc_sect_psymbol (objfile
, tpst
, pc
, section
);
134 && (p
->address (objfile
) == msymbol
.value_address ()))
137 /* Also accept the textlow value of a psymtab as a
138 "symbol", to provide some support for partial
139 symbol tables with line information but no debug
140 symbols (e.g. those produced by an assembler). */
142 this_addr
= p
->address (objfile
);
144 this_addr
= tpst
->text_low (objfile
);
146 /* Check whether it is closer than our current
147 BEST_ADDR. Since this symbol address is
148 necessarily lower or equal to PC, the symbol closer
149 to PC is the symbol which address is the highest.
150 This way we return the psymtab which contains such
151 best match symbol. This can help in cases where the
152 symbol information/debuginfo is not complete, like
153 for instance on IRIX6 with gcc, where no debug info
154 is emitted for statics. (See also the nodebug.exp
156 if (this_addr
> best_addr
)
158 best_addr
= this_addr
;
166 /* See psympriv.h. */
168 struct partial_symtab
*
169 psymbol_functions::find_pc_sect_psymtab (struct objfile
*objfile
,
171 struct obj_section
*section
,
172 struct bound_minimal_symbol msymbol
)
174 /* Try just the PSYMTABS_ADDRMAP mapping first as it has better
175 granularity than the later used TEXTLOW/TEXTHIGH one. However, we need
176 to take care as the PSYMTABS_ADDRMAP can hold things other than partial
177 symtabs in some cases.
179 This function should only be called for objfiles that are using partial
180 symtabs, not for objfiles that are using indexes (.gdb_index or
181 .debug_names), however 'maintenance print psymbols' calls this function
182 directly for all objfiles. If we assume that PSYMTABS_ADDRMAP contains
183 partial symtabs then we will end up returning a pointer to an object
184 that is not a partial_symtab, which doesn't end well. */
186 if (m_partial_symtabs
->psymtabs
!= NULL
187 && m_partial_symtabs
->psymtabs_addrmap
!= NULL
)
189 CORE_ADDR baseaddr
= objfile
->text_section_offset ();
191 struct partial_symtab
*pst
192 = ((struct partial_symtab
*)
193 addrmap_find (m_partial_symtabs
->psymtabs_addrmap
,
197 /* FIXME: addrmaps currently do not handle overlayed sections,
198 so fall back to the non-addrmap case if we're debugging
199 overlays and the addrmap returned the wrong section. */
200 if (overlay_debugging
&& msymbol
.minsym
!= NULL
&& section
!= NULL
)
202 struct partial_symbol
*p
;
204 /* NOTE: This assumes that every psymbol has a
205 corresponding msymbol, which is not necessarily
206 true; the debug info might be much richer than the
207 object's symbol table. */
208 p
= find_pc_sect_psymbol (objfile
, pst
, pc
, section
);
210 || (p
->address (objfile
)
211 != msymbol
.value_address ()))
215 /* We do not try to call FIND_PC_SECT_PSYMTAB_CLOSER as
216 PSYMTABS_ADDRMAP we used has already the best 1-byte
217 granularity and FIND_PC_SECT_PSYMTAB_CLOSER may mislead us into
218 a worse chosen section due to the TEXTLOW/TEXTHIGH ranges
227 /* Existing PSYMTABS_ADDRMAP mapping is present even for PARTIAL_SYMTABs
228 which still have no corresponding full SYMTABs read. But it is not
229 present for non-DWARF2 debug infos not supporting PSYMTABS_ADDRMAP in GDB
232 /* Check even OBJFILE with non-zero PSYMTABS_ADDRMAP as only several of
233 its CUs may be missing in PSYMTABS_ADDRMAP as they may be varying
234 debug info type in single OBJFILE. */
236 for (partial_symtab
*pst
: partial_symbols (objfile
))
237 if (!pst
->psymtabs_addrmap_supported
238 && pc
>= pst
->text_low (objfile
) && pc
< pst
->text_high (objfile
))
240 struct partial_symtab
*best_pst
;
242 best_pst
= find_pc_sect_psymtab_closer (objfile
, pc
, section
, pst
,
244 if (best_pst
!= NULL
)
251 /* Psymtab version of find_pc_sect_compunit_symtab. See its definition in
252 the definition of quick_symbol_functions in symfile.h. */
254 struct compunit_symtab
*
255 psymbol_functions::find_pc_sect_compunit_symtab
256 (struct objfile
*objfile
,
257 struct bound_minimal_symbol msymbol
,
259 struct obj_section
*section
,
262 struct partial_symtab
*ps
= find_pc_sect_psymtab (objfile
,
267 if (warn_if_readin
&& ps
->readin_p (objfile
))
268 /* Might want to error() here (in case symtab is corrupt and
269 will cause a core dump), but maybe we can successfully
270 continue, so let's not. */
272 (Internal error: pc %s in read in psymtab, but not in symtab.)\n"),
273 paddress (objfile
->arch (), pc
));
274 psymtab_to_symtab (objfile
, ps
);
275 return ps
->get_compunit_symtab (objfile
);
280 /* Find which partial symbol within a psymtab matches PC and SECTION.
281 Return NULL if none. */
283 static struct partial_symbol
*
284 find_pc_sect_psymbol (struct objfile
*objfile
,
285 struct partial_symtab
*psymtab
, CORE_ADDR pc
,
286 struct obj_section
*section
)
288 struct partial_symbol
*best
= NULL
;
290 const CORE_ADDR textlow
= psymtab
->text_low (objfile
);
292 gdb_assert (psymtab
!= NULL
);
294 /* Cope with programs that start at address 0. */
295 best_pc
= (textlow
!= 0) ? textlow
- 1 : 0;
297 /* Search the global symbols as well as the static symbols, so that
298 find_pc_partial_function doesn't use a minimal symbol and thus
299 cache a bad endaddr. */
300 for (partial_symbol
*p
: psymtab
->global_psymbols
)
302 if (p
->domain
== VAR_DOMAIN
303 && p
->aclass
== LOC_BLOCK
304 && pc
>= p
->address (objfile
)
305 && (p
->address (objfile
) > best_pc
306 || (psymtab
->text_low (objfile
) == 0
307 && best_pc
== 0 && p
->address (objfile
) == 0)))
309 if (section
!= NULL
) /* Match on a specific section. */
311 if (!matching_obj_sections (p
->obj_section (objfile
),
315 best_pc
= p
->address (objfile
);
320 for (partial_symbol
*p
: psymtab
->static_psymbols
)
322 if (p
->domain
== VAR_DOMAIN
323 && p
->aclass
== LOC_BLOCK
324 && pc
>= p
->address (objfile
)
325 && (p
->address (objfile
) > best_pc
326 || (psymtab
->text_low (objfile
) == 0
327 && best_pc
== 0 && p
->address (objfile
) == 0)))
329 if (section
!= NULL
) /* Match on a specific section. */
331 if (!matching_obj_sections (p
->obj_section (objfile
),
335 best_pc
= p
->address (objfile
);
343 /* Psymtab version of lookup_global_symbol_language. See its definition in
344 the definition of quick_symbol_functions in symfile.h. */
347 psymbol_functions::lookup_global_symbol_language (struct objfile
*objfile
,
350 bool *symbol_found_p
)
352 *symbol_found_p
= false;
353 if (objfile
->sf
== NULL
)
354 return language_unknown
;
356 lookup_name_info
lookup_name (name
, symbol_name_match_type::FULL
);
358 for (partial_symtab
*ps
: partial_symbols (objfile
))
360 struct partial_symbol
*psym
;
361 if (ps
->readin_p (objfile
))
364 psym
= lookup_partial_symbol (objfile
, ps
, lookup_name
, 1, domain
);
367 *symbol_found_p
= true;
368 return psym
->ginfo
.language ();
372 return language_unknown
;
375 /* Returns true if PSYM matches LOOKUP_NAME. */
378 psymbol_name_matches (partial_symbol
*psym
,
379 const lookup_name_info
&lookup_name
)
381 const language_defn
*lang
= language_def (psym
->ginfo
.language ());
382 symbol_name_matcher_ftype
*name_match
383 = lang
->get_symbol_name_matcher (lookup_name
);
384 return name_match (psym
->ginfo
.search_name (), lookup_name
, NULL
);
387 /* Look in PST for a symbol in DOMAIN whose name matches NAME. Search
388 the global block of PST if GLOBAL, and otherwise the static block.
389 MATCH is the comparison operation that returns true iff MATCH (s,
390 NAME), where s is a SYMBOL_SEARCH_NAME. If ORDERED_COMPARE is
391 non-null, the symbols in the block are assumed to be ordered
392 according to it (allowing binary search). It must be compatible
393 with MATCH. Returns the symbol, if found, and otherwise NULL. */
395 static struct partial_symbol
*
396 match_partial_symbol (struct objfile
*objfile
,
397 struct partial_symtab
*pst
, int global
,
398 const lookup_name_info
&name
, domain_enum domain
,
399 symbol_compare_ftype
*ordered_compare
)
401 struct partial_symbol
**start
, **psym
;
402 struct partial_symbol
**top
, **real_top
, **bottom
, **center
;
404 ? pst
->global_psymbols
.size ()
405 : pst
->static_psymbols
.size ());
406 int do_linear_search
= 1;
412 &pst
->global_psymbols
[0] :
413 &pst
->static_psymbols
[0]);
415 if (global
&& ordered_compare
) /* Can use a binary search. */
417 do_linear_search
= 0;
419 /* Binary search. This search is guaranteed to end with center
420 pointing at the earliest partial symbol whose name might be
421 correct. At that point *all* partial symbols with an
422 appropriate name will be checked against the correct
426 top
= start
+ length
- 1;
430 center
= bottom
+ (top
- bottom
) / 2;
431 gdb_assert (center
< top
);
433 enum language lang
= (*center
)->ginfo
.language ();
434 const char *lang_ln
= name
.language_lookup_name (lang
);
436 if (ordered_compare ((*center
)->ginfo
.search_name (),
442 gdb_assert (top
== bottom
);
444 while (top
<= real_top
445 && psymbol_name_matches (*top
, name
))
447 if (symbol_matches_domain ((*top
)->ginfo
.language (),
448 (*top
)->domain
, domain
))
454 /* Can't use a binary search or else we found during the binary search that
455 we should also do a linear search. */
457 if (do_linear_search
)
459 for (psym
= start
; psym
< start
+ length
; psym
++)
461 if (symbol_matches_domain ((*psym
)->ginfo
.language (),
462 (*psym
)->domain
, domain
)
463 && psymbol_name_matches (*psym
, name
))
471 /* Look, in partial_symtab PST, for symbol whose natural name is
472 LOOKUP_NAME. Check the global symbols if GLOBAL, the static
475 static struct partial_symbol
*
476 lookup_partial_symbol (struct objfile
*objfile
,
477 struct partial_symtab
*pst
,
478 const lookup_name_info
&lookup_name
,
479 int global
, domain_enum domain
)
481 struct partial_symbol
**start
, **psym
;
482 struct partial_symbol
**top
, **real_top
, **bottom
, **center
;
484 ? pst
->global_psymbols
.size ()
485 : pst
->static_psymbols
.size ());
486 int do_linear_search
= 1;
492 &pst
->global_psymbols
[0] :
493 &pst
->static_psymbols
[0]);
495 if (global
) /* This means we can use a binary search. */
497 do_linear_search
= 0;
499 /* Binary search. This search is guaranteed to end with center
500 pointing at the earliest partial symbol whose name might be
501 correct. At that point *all* partial symbols with an
502 appropriate name will be checked against the correct
506 top
= start
+ length
- 1;
510 center
= bottom
+ (top
- bottom
) / 2;
512 gdb_assert (center
< top
);
514 if (strcmp_iw_ordered ((*center
)->ginfo
.search_name (),
515 lookup_name
.c_str ()) >= 0)
525 gdb_assert (top
== bottom
);
527 /* For `case_sensitivity == case_sensitive_off' strcmp_iw_ordered will
528 search more exactly than what matches SYMBOL_MATCHES_SEARCH_NAME. */
529 while (top
>= start
&& symbol_matches_search_name (&(*top
)->ginfo
,
533 /* Fixup to have a symbol which matches SYMBOL_MATCHES_SEARCH_NAME. */
536 while (top
<= real_top
&& symbol_matches_search_name (&(*top
)->ginfo
,
539 if (symbol_matches_domain ((*top
)->ginfo
.language (),
540 (*top
)->domain
, domain
))
546 /* Can't use a binary search or else we found during the binary search that
547 we should also do a linear search. */
549 if (do_linear_search
)
551 for (psym
= start
; psym
< start
+ length
; psym
++)
553 if (symbol_matches_domain ((*psym
)->ginfo
.language (),
554 (*psym
)->domain
, domain
)
555 && symbol_matches_search_name (&(*psym
)->ginfo
, lookup_name
))
563 /* Get the symbol table that corresponds to a partial_symtab.
564 This is fast after the first time you do it.
565 The result will be NULL if the primary symtab has no symbols,
566 which can happen. Otherwise the result is the primary symtab
567 that contains PST. */
569 static struct compunit_symtab
*
570 psymtab_to_symtab (struct objfile
*objfile
, struct partial_symtab
*pst
)
572 /* If it is a shared psymtab, find an unshared psymtab that includes
573 it. Any such psymtab will do. */
574 while (pst
->user
!= NULL
)
577 /* If it's been looked up before, return it. */
578 if (pst
->get_compunit_symtab (objfile
))
579 return pst
->get_compunit_symtab (objfile
);
581 /* If it has not yet been read in, read it. */
582 if (!pst
->readin_p (objfile
))
584 scoped_restore decrementer
= increment_reading_symtab ();
588 gdb_printf (_("Reading in symbols for %s...\n"),
590 gdb_flush (gdb_stdout
);
593 pst
->read_symtab (objfile
);
596 return pst
->get_compunit_symtab (objfile
);
599 /* Psymtab version of find_last_source_symtab. See its definition in
600 the definition of quick_symbol_functions in symfile.h. */
603 psymbol_functions::find_last_source_symtab (struct objfile
*ofp
)
605 struct partial_symtab
*cs_pst
= NULL
;
607 for (partial_symtab
*ps
: partial_symbols (ofp
))
609 const char *name
= ps
->filename
;
610 int len
= strlen (name
);
612 if (!(len
> 2 && (strcmp (&name
[len
- 2], ".h") == 0
613 || strcmp (name
, "<<C++-namespaces>>") == 0)))
619 if (cs_pst
->readin_p (ofp
))
621 internal_error (__FILE__
, __LINE__
,
622 _("select_source_symtab: "
623 "readin pst found and no symtabs."));
627 struct compunit_symtab
*cust
= psymtab_to_symtab (ofp
, cs_pst
);
631 return cust
->primary_filetab ();
637 /* Psymtab version of forget_cached_source_info. See its definition in
638 the definition of quick_symbol_functions in symfile.h. */
641 psymbol_functions::forget_cached_source_info (struct objfile
*objfile
)
643 for (partial_symtab
*pst
: partial_symbols (objfile
))
645 if (pst
->fullname
!= NULL
)
647 xfree (pst
->fullname
);
648 pst
->fullname
= NULL
;
654 print_partial_symbols (struct gdbarch
*gdbarch
, struct objfile
*objfile
,
655 const std::vector
<partial_symbol
*> &symbols
,
656 const char *what
, struct ui_file
*outfile
)
658 gdb_printf (outfile
, " %s partial symbols:\n", what
);
659 for (partial_symbol
*p
: symbols
)
662 gdb_printf (outfile
, " `%s'", p
->ginfo
.linkage_name ());
663 if (p
->ginfo
.demangled_name () != NULL
)
665 gdb_printf (outfile
, " `%s'",
666 p
->ginfo
.demangled_name ());
668 gdb_puts (", ", outfile
);
672 gdb_puts ("undefined domain, ", outfile
);
675 /* This is the usual thing -- don't print it. */
678 gdb_puts ("struct domain, ", outfile
);
681 gdb_puts ("module domain, ", outfile
);
684 gdb_puts ("label domain, ", outfile
);
686 case COMMON_BLOCK_DOMAIN
:
687 gdb_puts ("common block domain, ", outfile
);
690 gdb_puts ("<invalid domain>, ", outfile
);
696 gdb_puts ("undefined", outfile
);
699 gdb_puts ("constant int", outfile
);
702 gdb_puts ("static", outfile
);
705 gdb_puts ("register", outfile
);
708 gdb_puts ("pass by value", outfile
);
711 gdb_puts ("pass by reference", outfile
);
713 case LOC_REGPARM_ADDR
:
714 gdb_puts ("register address parameter", outfile
);
717 gdb_puts ("stack parameter", outfile
);
720 gdb_puts ("type", outfile
);
723 gdb_puts ("label", outfile
);
726 gdb_puts ("function", outfile
);
728 case LOC_CONST_BYTES
:
729 gdb_puts ("constant bytes", outfile
);
732 gdb_puts ("unresolved", outfile
);
734 case LOC_OPTIMIZED_OUT
:
735 gdb_puts ("optimized out", outfile
);
738 gdb_puts ("computed at runtime", outfile
);
741 gdb_puts ("<invalid location>", outfile
);
744 gdb_puts (", ", outfile
);
745 gdb_puts (paddress (gdbarch
, p
->unrelocated_address ()), outfile
);
746 gdb_printf (outfile
, "\n");
751 dump_psymtab (struct objfile
*objfile
, struct partial_symtab
*psymtab
,
752 struct ui_file
*outfile
)
754 struct gdbarch
*gdbarch
= objfile
->arch ();
757 if (psymtab
->anonymous
)
759 gdb_printf (outfile
, "\nAnonymous partial symtab (%s) ",
764 gdb_printf (outfile
, "\nPartial symtab for source file %s ",
767 gdb_printf (outfile
, "(object %s)\n\n",
768 host_address_to_string (psymtab
));
769 gdb_printf (outfile
, " Read from object file %s (%s)\n",
770 objfile_name (objfile
),
771 host_address_to_string (objfile
));
773 if (psymtab
->readin_p (objfile
))
776 " Full symtab was read (at %s)\n",
777 host_address_to_string (psymtab
->get_compunit_symtab (objfile
)));
779 gdb_printf (outfile
, " Symbols cover text addresses ");
780 gdb_puts (paddress (gdbarch
, psymtab
->text_low (objfile
)), outfile
);
781 gdb_printf (outfile
, "-");
782 gdb_puts (paddress (gdbarch
, psymtab
->text_high (objfile
)), outfile
);
783 gdb_printf (outfile
, "\n");
784 gdb_printf (outfile
, " Address map supported - %s.\n",
785 psymtab
->psymtabs_addrmap_supported
? "yes" : "no");
786 gdb_printf (outfile
, " Depends on %d other partial symtabs.\n",
787 psymtab
->number_of_dependencies
);
788 for (i
= 0; i
< psymtab
->number_of_dependencies
; i
++)
789 gdb_printf (outfile
, " %d %s\n", i
,
790 host_address_to_string (psymtab
->dependencies
[i
]));
791 if (psymtab
->user
!= NULL
)
792 gdb_printf (outfile
, " Shared partial symtab with user %s\n",
793 host_address_to_string (psymtab
->user
));
794 if (!psymtab
->global_psymbols
.empty ())
796 print_partial_symbols
797 (gdbarch
, objfile
, psymtab
->global_psymbols
,
800 if (!psymtab
->static_psymbols
.empty ())
802 print_partial_symbols
803 (gdbarch
, objfile
, psymtab
->static_psymbols
,
806 gdb_printf (outfile
, "\n");
809 /* Count the number of partial symbols in OBJFILE. */
812 psymbol_functions::count_psyms ()
815 for (partial_symtab
*pst
: m_partial_symtabs
->range ())
817 count
+= pst
->global_psymbols
.size ();
818 count
+= pst
->static_psymbols
.size ();
823 /* Psymtab version of print_stats. See its definition in
824 the definition of quick_symbol_functions in symfile.h. */
827 psymbol_functions::print_stats (struct objfile
*objfile
, bool print_bcache
)
833 int n_psyms
= count_psyms ();
835 gdb_printf (_(" Number of \"partial\" symbols read: %d\n"),
839 for (partial_symtab
*ps
: partial_symbols (objfile
))
841 if (!ps
->readin_p (objfile
))
844 gdb_printf (_(" Number of psym tables (not yet expanded): %d\n"),
846 gdb_printf (_(" Total memory used for psymbol cache: %d\n"),
847 m_partial_symtabs
->psymbol_cache
.memory_used ());
851 gdb_printf (_("Psymbol byte cache statistics:\n"));
852 m_partial_symtabs
->psymbol_cache
.print_statistics
853 ("partial symbol cache");
857 /* Psymtab version of dump. See its definition in
858 the definition of quick_symbol_functions in symfile.h. */
861 psymbol_functions::dump (struct objfile
*objfile
)
863 struct partial_symtab
*psymtab
;
865 if (m_partial_symtabs
->psymtabs
)
867 gdb_printf ("Psymtabs:\n");
868 for (psymtab
= m_partial_symtabs
->psymtabs
;
870 psymtab
= psymtab
->next
)
871 gdb_printf ("%s at %s\n",
873 host_address_to_string (psymtab
));
878 /* Psymtab version of expand_all_symtabs. See its definition in
879 the definition of quick_symbol_functions in symfile.h. */
882 psymbol_functions::expand_all_symtabs (struct objfile
*objfile
)
884 for (partial_symtab
*psymtab
: partial_symbols (objfile
))
885 psymtab_to_symtab (objfile
, psymtab
);
888 /* Psymtab version of map_symbol_filenames. See its definition in
889 the definition of quick_symbol_functions in symfile.h. */
892 psymbol_functions::map_symbol_filenames
893 (struct objfile
*objfile
,
894 gdb::function_view
<symbol_filename_ftype
> fun
,
897 for (partial_symtab
*ps
: partial_symbols (objfile
))
899 const char *fullname
;
901 if (ps
->readin_p (objfile
))
904 /* We can skip shared psymtabs here, because any file name will be
905 attached to the unshared psymtab. */
906 if (ps
->user
!= NULL
)
909 /* Anonymous psymtabs don't have a file name. */
915 fullname
= psymtab_to_fullname (ps
);
918 fun (ps
->filename
, fullname
);
922 /* Finds the fullname that a partial_symtab represents.
924 If this functions finds the fullname, it will save it in ps->fullname
925 and it will also return the value.
927 If this function fails to find the file that this partial_symtab represents,
928 NULL will be returned and ps->fullname will be set to NULL. */
931 psymtab_to_fullname (struct partial_symtab
*ps
)
933 gdb_assert (!ps
->anonymous
);
935 /* Use cached copy if we have it.
936 We rely on forget_cached_source_info being called appropriately
937 to handle cases like the file being moved. */
938 if (ps
->fullname
== NULL
)
940 gdb::unique_xmalloc_ptr
<char> fullname
941 = find_source_or_rewrite (ps
->filename
, ps
->dirname
);
942 ps
->fullname
= fullname
.release ();
948 /* Psymtab version of expand_matching_symbols. See its definition in
949 the definition of quick_symbol_functions in symfile.h. */
952 psymbol_functions::expand_matching_symbols
953 (struct objfile
*objfile
,
954 const lookup_name_info
&name
, domain_enum domain
,
956 symbol_compare_ftype
*ordered_compare
)
958 for (partial_symtab
*ps
: partial_symbols (objfile
))
961 if (!ps
->readin_p (objfile
)
962 && match_partial_symbol (objfile
, ps
, global
, name
, domain
,
964 psymtab_to_symtab (objfile
, ps
);
968 /* A helper for psym_expand_symtabs_matching that handles searching
969 included psymtabs. This returns true if a symbol is found, and
970 false otherwise. It also updates the 'searched_flag' on the
971 various psymtabs that it searches. */
974 recursively_search_psymtabs
975 (struct partial_symtab
*ps
,
976 struct objfile
*objfile
,
977 block_search_flags search_flags
,
979 enum search_domain search
,
980 const lookup_name_info
&lookup_name
,
981 gdb::function_view
<expand_symtabs_symbol_matcher_ftype
> sym_matcher
)
984 enum psymtab_search_status result
= PST_SEARCHED_AND_NOT_FOUND
;
987 if (ps
->searched_flag
!= PST_NOT_SEARCHED
)
988 return ps
->searched_flag
== PST_SEARCHED_AND_FOUND
;
990 /* Recurse into shared psymtabs first, because they may have already
991 been searched, and this could save some time. */
992 for (i
= 0; i
< ps
->number_of_dependencies
; ++i
)
996 /* Skip non-shared dependencies, these are handled elsewhere. */
997 if (ps
->dependencies
[i
]->user
== NULL
)
1000 r
= recursively_search_psymtabs (ps
->dependencies
[i
],
1001 objfile
, search_flags
, domain
, search
,
1002 lookup_name
, sym_matcher
);
1005 ps
->searched_flag
= PST_SEARCHED_AND_FOUND
;
1010 partial_symbol
**gbound
= (ps
->global_psymbols
.data ()
1011 + ps
->global_psymbols
.size ());
1012 partial_symbol
**sbound
= (ps
->static_psymbols
.data ()
1013 + ps
->static_psymbols
.size ());
1014 partial_symbol
**bound
= gbound
;
1016 /* Go through all of the symbols stored in a partial
1017 symtab in one loop. */
1018 partial_symbol
**psym
= ps
->global_psymbols
.data ();
1020 if ((search_flags
& SEARCH_GLOBAL_BLOCK
) == 0)
1022 if (ps
->static_psymbols
.empty ())
1026 psym
= ps
->static_psymbols
.data ();
1035 if (bound
== gbound
&& !ps
->static_psymbols
.empty ()
1036 && (search_flags
& SEARCH_STATIC_BLOCK
) != 0)
1038 psym
= ps
->static_psymbols
.data ();
1049 if ((domain
== UNDEF_DOMAIN
1050 || symbol_matches_domain ((*psym
)->ginfo
.language (),
1051 (*psym
)->domain
, domain
))
1052 && (search
== ALL_DOMAIN
1053 || (search
== MODULES_DOMAIN
1054 && (*psym
)->domain
== MODULE_DOMAIN
)
1055 || (search
== VARIABLES_DOMAIN
1056 && (*psym
)->aclass
!= LOC_TYPEDEF
1057 && (*psym
)->aclass
!= LOC_BLOCK
)
1058 || (search
== FUNCTIONS_DOMAIN
1059 && (*psym
)->aclass
== LOC_BLOCK
)
1060 || (search
== TYPES_DOMAIN
1061 && (*psym
)->aclass
== LOC_TYPEDEF
))
1062 && psymbol_name_matches (*psym
, lookup_name
)
1063 && (sym_matcher
== NULL
1064 || sym_matcher ((*psym
)->ginfo
.search_name ())))
1066 /* Found a match, so notify our caller. */
1067 result
= PST_SEARCHED_AND_FOUND
;
1074 ps
->searched_flag
= result
;
1075 return result
== PST_SEARCHED_AND_FOUND
;
1078 /* Psymtab version of expand_symtabs_matching. See its definition in
1079 the definition of quick_symbol_functions in symfile.h. */
1082 psymbol_functions::expand_symtabs_matching
1083 (struct objfile
*objfile
,
1084 gdb::function_view
<expand_symtabs_file_matcher_ftype
> file_matcher
,
1085 const lookup_name_info
*lookup_name
,
1086 gdb::function_view
<expand_symtabs_symbol_matcher_ftype
> symbol_matcher
,
1087 gdb::function_view
<expand_symtabs_exp_notify_ftype
> expansion_notify
,
1088 block_search_flags search_flags
,
1090 enum search_domain search
)
1092 /* Clear the search flags. */
1093 for (partial_symtab
*ps
: partial_symbols (objfile
))
1094 ps
->searched_flag
= PST_NOT_SEARCHED
;
1096 gdb::optional
<lookup_name_info
> psym_lookup_name
;
1097 if (lookup_name
!= nullptr)
1098 psym_lookup_name
= lookup_name
->make_ignore_params ();
1100 /* This invariant is documented in quick-functions.h. */
1101 gdb_assert (lookup_name
!= nullptr || symbol_matcher
== nullptr);
1103 for (partial_symtab
*ps
: m_partial_symtabs
->range ())
1107 if (ps
->readin_p (objfile
))
1117 match
= file_matcher (ps
->filename
, false);
1120 /* Before we invoke realpath, which can get expensive when many
1121 files are involved, do a quick comparison of the basenames. */
1122 if (basenames_may_differ
1123 || file_matcher (lbasename (ps
->filename
), true))
1124 match
= file_matcher (psymtab_to_fullname (ps
), false);
1130 if (lookup_name
== nullptr
1131 || recursively_search_psymtabs (ps
, objfile
, search_flags
,
1136 compunit_symtab
*cust
= psymtab_to_symtab (objfile
, ps
);
1138 if (cust
!= nullptr && expansion_notify
!= nullptr)
1139 if (!expansion_notify (cust
))
1147 /* Psymtab version of has_symbols. See its definition in
1148 the definition of quick_symbol_functions in symfile.h. */
1151 psymbol_functions::has_symbols (struct objfile
*objfile
)
1153 return m_partial_symtabs
->psymtabs
!= NULL
;
1156 /* See quick_symbol_functions::has_unexpanded_symtabs in quick-symbol.h. */
1159 psymbol_functions::has_unexpanded_symtabs (struct objfile
*objfile
)
1161 for (partial_symtab
*psymtab
: partial_symbols (objfile
))
1163 /* Is this already expanded? */
1164 if (psymtab
->readin_p (objfile
))
1167 /* It has not yet been expanded. */
1174 /* Helper function for psym_find_compunit_symtab_by_address that fills
1175 in m_psymbol_map for a given range of psymbols. */
1178 psymbol_functions::fill_psymbol_map
1179 (struct objfile
*objfile
,
1180 struct partial_symtab
*psymtab
,
1181 std::set
<CORE_ADDR
> *seen_addrs
,
1182 const std::vector
<partial_symbol
*> &symbols
)
1184 for (partial_symbol
*psym
: symbols
)
1186 if (psym
->aclass
== LOC_STATIC
)
1188 CORE_ADDR addr
= psym
->address (objfile
);
1189 if (seen_addrs
->find (addr
) == seen_addrs
->end ())
1191 seen_addrs
->insert (addr
);
1192 m_psymbol_map
.emplace_back (addr
, psymtab
);
1198 /* See find_compunit_symtab_by_address in quick_symbol_functions, in
1202 psymbol_functions::find_compunit_symtab_by_address (struct objfile
*objfile
,
1205 if (m_psymbol_map
.empty ())
1207 std::set
<CORE_ADDR
> seen_addrs
;
1209 for (partial_symtab
*pst
: partial_symbols (objfile
))
1211 fill_psymbol_map (objfile
, pst
,
1213 pst
->global_psymbols
);
1214 fill_psymbol_map (objfile
, pst
,
1216 pst
->static_psymbols
);
1219 m_psymbol_map
.shrink_to_fit ();
1221 std::sort (m_psymbol_map
.begin (), m_psymbol_map
.end (),
1222 [] (const std::pair
<CORE_ADDR
, partial_symtab
*> &a
,
1223 const std::pair
<CORE_ADDR
, partial_symtab
*> &b
)
1225 return a
.first
< b
.first
;
1229 auto iter
= std::lower_bound
1230 (m_psymbol_map
.begin (), m_psymbol_map
.end (), address
,
1231 [] (const std::pair
<CORE_ADDR
, partial_symtab
*> &a
,
1237 if (iter
== m_psymbol_map
.end () || iter
->first
!= address
)
1240 return psymtab_to_symtab (objfile
, iter
->second
);
1245 /* Partially fill a partial symtab. It will be completely filled at
1246 the end of the symbol list. */
1248 partial_symtab::partial_symtab (const char *filename
,
1249 psymtab_storage
*partial_symtabs
,
1250 objfile_per_bfd_storage
*objfile_per_bfd
,
1252 : partial_symtab (filename
, partial_symtabs
, objfile_per_bfd
)
1254 set_text_low (textlow
);
1255 set_text_high (raw_text_low ()); /* default */
1258 /* Perform "finishing up" operations of a partial symtab. */
1261 partial_symtab::end ()
1263 global_psymbols
.shrink_to_fit ();
1264 static_psymbols
.shrink_to_fit ();
1266 /* Sort the global list; don't sort the static list. */
1267 std::sort (global_psymbols
.begin (),
1268 global_psymbols
.end (),
1269 [] (partial_symbol
*s1
, partial_symbol
*s2
)
1271 return strcmp_iw_ordered (s1
->ginfo
.search_name (),
1272 s2
->ginfo
.search_name ()) < 0;
1276 /* See psymtab.h. */
1279 psymbol_bcache::hash (const void *addr
, int length
)
1281 unsigned long h
= 0;
1282 struct partial_symbol
*psymbol
= (struct partial_symbol
*) addr
;
1283 unsigned int lang
= psymbol
->ginfo
.language ();
1284 unsigned int domain
= psymbol
->domain
;
1285 unsigned int theclass
= psymbol
->aclass
;
1287 h
= fast_hash (&psymbol
->ginfo
.m_value
, sizeof (psymbol
->ginfo
.m_value
), h
);
1288 h
= fast_hash (&lang
, sizeof (unsigned int), h
);
1289 h
= fast_hash (&domain
, sizeof (unsigned int), h
);
1290 h
= fast_hash (&theclass
, sizeof (unsigned int), h
);
1291 /* Note that psymbol names are interned via compute_and_set_names, so
1292 there's no need to hash the contents of the name here. */
1293 h
= fast_hash (&psymbol
->ginfo
.m_name
, sizeof (psymbol
->ginfo
.m_name
), h
);
1298 /* See psymtab.h. */
1301 psymbol_bcache::compare (const void *addr1
, const void *addr2
, int length
)
1303 struct partial_symbol
*sym1
= (struct partial_symbol
*) addr1
;
1304 struct partial_symbol
*sym2
= (struct partial_symbol
*) addr2
;
1306 return (memcmp (&sym1
->ginfo
.m_value
, &sym2
->ginfo
.m_value
,
1307 sizeof (sym1
->ginfo
.m_value
)) == 0
1308 && sym1
->ginfo
.language () == sym2
->ginfo
.language ()
1309 && sym1
->domain
== sym2
->domain
1310 && sym1
->aclass
== sym2
->aclass
1311 /* Note that psymbol names are interned via
1312 compute_and_set_names, so there's no need to compare the
1313 contents of the name here. */
1314 && sym1
->ginfo
.linkage_name () == sym2
->ginfo
.linkage_name ());
1317 /* See psympriv.h. */
1320 partial_symtab::add_psymbol (const partial_symbol
&psymbol
,
1321 psymbol_placement where
,
1322 psymtab_storage
*partial_symtabs
,
1323 struct objfile
*objfile
)
1327 /* Stash the partial symbol away in the cache. */
1328 partial_symbol
*psym
1329 = ((struct partial_symbol
*)
1330 partial_symtabs
->psymbol_cache
.insert
1331 (&psymbol
, sizeof (struct partial_symbol
), &added
));
1333 /* Do not duplicate global partial symbols. */
1334 if (where
== psymbol_placement::GLOBAL
&& !added
)
1337 /* Save pointer to partial symbol in psymtab, growing symtab if needed. */
1338 std::vector
<partial_symbol
*> &list
1339 = (where
== psymbol_placement::STATIC
1342 list
.push_back (psym
);
1345 /* See psympriv.h. */
1348 partial_symtab::add_psymbol (gdb::string_view name
, bool copy_name
,
1350 enum address_class theclass
,
1352 psymbol_placement where
,
1354 enum language language
,
1355 psymtab_storage
*partial_symtabs
,
1356 struct objfile
*objfile
)
1358 struct partial_symbol psymbol
;
1359 memset (&psymbol
, 0, sizeof (psymbol
));
1361 psymbol
.set_unrelocated_address (coreaddr
);
1362 psymbol
.ginfo
.set_section_index (section
);
1363 psymbol
.domain
= domain
;
1364 psymbol
.aclass
= theclass
;
1365 psymbol
.ginfo
.set_language (language
, partial_symtabs
->obstack ());
1366 psymbol
.ginfo
.compute_and_set_names (name
, copy_name
, objfile
->per_bfd
);
1368 add_psymbol (psymbol
, where
, partial_symtabs
, objfile
);
1371 /* See psympriv.h. */
1373 partial_symtab::partial_symtab (const char *filename_
,
1374 psymtab_storage
*partial_symtabs
,
1375 objfile_per_bfd_storage
*objfile_per_bfd
)
1376 : searched_flag (PST_NOT_SEARCHED
),
1380 partial_symtabs
->install_psymtab (this);
1382 filename
= objfile_per_bfd
->intern (filename_
);
1384 if (symtab_create_debug
)
1386 /* Be a bit clever with debugging messages, and don't print objfile
1387 every time, only when it changes. */
1388 static std::string last_bfd_name
;
1389 const char *this_bfd_name
1390 = bfd_get_filename (objfile_per_bfd
->get_bfd ());
1392 if (last_bfd_name
.empty () || last_bfd_name
!= this_bfd_name
)
1394 last_bfd_name
= this_bfd_name
;
1395 gdb_printf (gdb_stdlog
,
1396 "Creating one or more psymtabs for %s ...\n",
1399 gdb_printf (gdb_stdlog
,
1400 "Created psymtab %s for module %s.\n",
1401 host_address_to_string (this), filename
);
1405 /* See psympriv.h. */
1408 partial_symtab::expand_dependencies (struct objfile
*objfile
)
1410 for (int i
= 0; i
< number_of_dependencies
; ++i
)
1412 if (!dependencies
[i
]->readin_p (objfile
)
1413 && dependencies
[i
]->user
== NULL
)
1415 /* Inform about additional files to be read in. */
1419 gdb_stdout
->wrap_here (0);
1421 gdb_stdout
->wrap_here (0);
1422 gdb_printf ("%s...", dependencies
[i
]->filename
);
1423 gdb_flush (gdb_stdout
);
1425 dependencies
[i
]->expand_psymtab (objfile
);
1432 psymtab_storage::discard_psymtab (struct partial_symtab
*pst
)
1434 struct partial_symtab
**prev_pst
;
1437 Empty psymtabs happen as a result of header files which don't
1438 have any symbols in them. There can be a lot of them. But this
1439 check is wrong, in that a psymtab with N_SLINE entries but
1440 nothing else is not empty, but we don't realize that. Fixing
1441 that without slowing things down might be tricky. */
1443 /* First, snip it out of the psymtab chain. */
1445 prev_pst
= &psymtabs
;
1446 while ((*prev_pst
) != pst
)
1447 prev_pst
= &((*prev_pst
)->next
);
1448 (*prev_pst
) = pst
->next
;
1454 /* Helper function for maintenance_print_psymbols to print the addrmap
1455 of PSYMTAB. If PSYMTAB is NULL print the entire addrmap. */
1458 dump_psymtab_addrmap (struct objfile
*objfile
,
1459 psymtab_storage
*partial_symtabs
,
1460 struct partial_symtab
*psymtab
,
1461 struct ui_file
*outfile
)
1463 if ((psymtab
== NULL
1464 || psymtab
->psymtabs_addrmap_supported
)
1465 && partial_symtabs
->psymtabs_addrmap
!= NULL
)
1467 if (psymtab
== nullptr)
1468 gdb_printf (outfile
, _("Entire address map:\n"));
1470 gdb_printf (outfile
, _("Address map:\n"));
1471 addrmap_dump (partial_symtabs
->psymtabs_addrmap
, outfile
, psymtab
);
1476 maintenance_print_psymbols (const char *args
, int from_tty
)
1478 struct ui_file
*outfile
= gdb_stdout
;
1479 char *address_arg
= NULL
, *source_arg
= NULL
, *objfile_arg
= NULL
;
1480 int i
, outfile_idx
, found
;
1482 struct obj_section
*section
= NULL
;
1486 gdb_argv
argv (args
);
1488 for (i
= 0; argv
!= NULL
&& argv
[i
] != NULL
; ++i
)
1490 if (strcmp (argv
[i
], "-pc") == 0)
1492 if (argv
[i
+ 1] == NULL
)
1493 error (_("Missing pc value"));
1494 address_arg
= argv
[++i
];
1496 else if (strcmp (argv
[i
], "-source") == 0)
1498 if (argv
[i
+ 1] == NULL
)
1499 error (_("Missing source file"));
1500 source_arg
= argv
[++i
];
1502 else if (strcmp (argv
[i
], "-objfile") == 0)
1504 if (argv
[i
+ 1] == NULL
)
1505 error (_("Missing objfile name"));
1506 objfile_arg
= argv
[++i
];
1508 else if (strcmp (argv
[i
], "--") == 0)
1510 /* End of options. */
1514 else if (argv
[i
][0] == '-')
1516 /* Future proofing: Don't allow OUTFILE to begin with "-". */
1517 error (_("Unknown option: %s"), argv
[i
]);
1524 if (address_arg
!= NULL
&& source_arg
!= NULL
)
1525 error (_("Must specify at most one of -pc and -source"));
1527 stdio_file arg_outfile
;
1529 if (argv
!= NULL
&& argv
[outfile_idx
] != NULL
)
1531 if (argv
[outfile_idx
+ 1] != NULL
)
1532 error (_("Junk at end of command"));
1533 gdb::unique_xmalloc_ptr
<char> outfile_name
1534 (tilde_expand (argv
[outfile_idx
]));
1535 if (!arg_outfile
.open (outfile_name
.get (), FOPEN_WT
))
1536 perror_with_name (outfile_name
.get ());
1537 outfile
= &arg_outfile
;
1540 if (address_arg
!= NULL
)
1542 pc
= parse_and_eval_address (address_arg
);
1543 /* If we fail to find a section, that's ok, try the lookup anyway. */
1544 section
= find_pc_section (pc
);
1548 for (objfile
*objfile
: current_program_space
->objfiles ())
1550 int printed_objfile_header
= 0;
1551 int print_for_objfile
= 1;
1554 if (objfile_arg
!= NULL
)
1556 = compare_filenames_for_search (objfile_name (objfile
),
1558 if (!print_for_objfile
)
1561 for (const auto &iter
: objfile
->qf
)
1563 psymbol_functions
*psf
1564 = dynamic_cast<psymbol_functions
*> (iter
.get ());
1568 psymtab_storage
*partial_symtabs
1569 = psf
->get_partial_symtabs ().get ();
1571 if (address_arg
!= NULL
)
1573 struct bound_minimal_symbol msymbol
;
1575 /* We don't assume each pc has a unique objfile (this is for
1577 struct partial_symtab
*ps
1578 = psf
->find_pc_sect_psymtab (objfile
, pc
, section
, msymbol
);
1581 if (!printed_objfile_header
)
1583 outfile
->printf ("\nPartial symtabs for objfile %s\n",
1584 objfile_name (objfile
));
1585 printed_objfile_header
= 1;
1587 dump_psymtab (objfile
, ps
, outfile
);
1588 dump_psymtab_addrmap (objfile
, partial_symtabs
, ps
, outfile
);
1594 for (partial_symtab
*ps
: psf
->partial_symbols (objfile
))
1596 int print_for_source
= 0;
1599 if (source_arg
!= NULL
)
1602 = compare_filenames_for_search (ps
->filename
, source_arg
);
1605 if (source_arg
== NULL
1606 || print_for_source
)
1608 if (!printed_objfile_header
)
1610 outfile
->printf ("\nPartial symtabs for objfile %s\n",
1611 objfile_name (objfile
));
1612 printed_objfile_header
= 1;
1614 dump_psymtab (objfile
, ps
, outfile
);
1615 dump_psymtab_addrmap (objfile
, partial_symtabs
, ps
,
1621 /* If we're printing all the objfile's symbols dump the full addrmap. */
1623 if (address_arg
== NULL
1624 && source_arg
== NULL
1625 && partial_symtabs
->psymtabs_addrmap
!= NULL
)
1627 outfile
->puts ("\n");
1628 dump_psymtab_addrmap (objfile
, partial_symtabs
, NULL
, outfile
);
1635 if (address_arg
!= NULL
)
1636 error (_("No partial symtab for address: %s"), address_arg
);
1637 if (source_arg
!= NULL
)
1638 error (_("No partial symtab for source file: %s"), source_arg
);
1642 /* List all the partial symbol tables whose names match REGEXP (optional). */
1645 maintenance_info_psymtabs (const char *regexp
, int from_tty
)
1650 for (struct program_space
*pspace
: program_spaces
)
1651 for (objfile
*objfile
: pspace
->objfiles ())
1653 struct gdbarch
*gdbarch
= objfile
->arch ();
1655 /* We don't want to print anything for this objfile until we
1656 actually find a symtab whose name matches. */
1657 int printed_objfile_start
= 0;
1659 for (const auto &iter
: objfile
->qf
)
1661 psymbol_functions
*psf
1662 = dynamic_cast<psymbol_functions
*> (iter
.get ());
1665 for (partial_symtab
*psymtab
: psf
->partial_symbols (objfile
))
1670 || re_exec (psymtab
->filename
))
1672 if (! printed_objfile_start
)
1674 gdb_printf ("{ objfile %s ", objfile_name (objfile
));
1675 gdb_stdout
->wrap_here (2);
1676 gdb_printf ("((struct objfile *) %s)\n",
1677 host_address_to_string (objfile
));
1678 printed_objfile_start
= 1;
1681 gdb_printf (" { psymtab %s ", psymtab
->filename
);
1682 gdb_stdout
->wrap_here (4);
1683 gdb_printf ("((struct partial_symtab *) %s)\n",
1684 host_address_to_string (psymtab
));
1686 gdb_printf (" readin %s\n",
1687 psymtab
->readin_p (objfile
) ? "yes" : "no");
1688 gdb_printf (" fullname %s\n",
1690 ? psymtab
->fullname
: "(null)");
1691 gdb_printf (" text addresses ");
1692 gdb_puts (paddress (gdbarch
,
1693 psymtab
->text_low (objfile
)));
1694 gdb_printf (" -- ");
1695 gdb_puts (paddress (gdbarch
,
1696 psymtab
->text_high (objfile
)));
1698 gdb_printf (" psymtabs_addrmap_supported %s\n",
1699 (psymtab
->psymtabs_addrmap_supported
1701 gdb_printf (" globals ");
1702 if (!psymtab
->global_psymbols
.empty ())
1704 ("(* (struct partial_symbol **) %s @ %d)\n",
1705 host_address_to_string (psymtab
->global_psymbols
.data ()),
1706 (int) psymtab
->global_psymbols
.size ());
1708 gdb_printf ("(none)\n");
1709 gdb_printf (" statics ");
1710 if (!psymtab
->static_psymbols
.empty ())
1712 ("(* (struct partial_symbol **) %s @ %d)\n",
1713 host_address_to_string (psymtab
->static_psymbols
.data ()),
1714 (int) psymtab
->static_psymbols
.size ());
1716 gdb_printf ("(none)\n");
1718 gdb_printf (" user %s "
1719 "((struct partial_symtab *) %s)\n",
1720 psymtab
->user
->filename
,
1721 host_address_to_string (psymtab
->user
));
1722 gdb_printf (" dependencies ");
1723 if (psymtab
->number_of_dependencies
)
1728 for (i
= 0; i
< psymtab
->number_of_dependencies
; i
++)
1730 struct partial_symtab
*dep
= psymtab
->dependencies
[i
];
1732 /* Note the string concatenation there --- no
1734 gdb_printf (" psymtab %s "
1735 "((struct partial_symtab *) %s)\n",
1737 host_address_to_string (dep
));
1739 gdb_printf (" }\n");
1742 gdb_printf ("(none)\n");
1743 gdb_printf (" }\n");
1748 if (printed_objfile_start
)
1753 /* Check consistency of currently expanded psymtabs vs symtabs. */
1756 maintenance_check_psymtabs (const char *ignore
, int from_tty
)
1759 struct compunit_symtab
*cust
= NULL
;
1760 const struct blockvector
*bv
;
1761 const struct block
*b
;
1763 for (objfile
*objfile
: current_program_space
->objfiles ())
1765 for (const auto &iter
: objfile
->qf
)
1767 psymbol_functions
*psf
1768 = dynamic_cast<psymbol_functions
*> (iter
.get ());
1772 for (partial_symtab
*ps
: psf
->partial_symbols (objfile
))
1774 struct gdbarch
*gdbarch
= objfile
->arch ();
1776 /* We don't call psymtab_to_symtab here because that may cause symtab
1777 expansion. When debugging a problem it helps if checkers leave
1778 things unchanged. */
1779 cust
= ps
->get_compunit_symtab (objfile
);
1781 /* First do some checks that don't require the associated symtab. */
1782 if (ps
->text_high (objfile
) < ps
->text_low (objfile
))
1784 gdb_printf ("Psymtab ");
1785 gdb_puts (ps
->filename
);
1786 gdb_printf (" covers bad range ");
1787 gdb_puts (paddress (gdbarch
, ps
->text_low (objfile
)));
1789 gdb_puts (paddress (gdbarch
, ps
->text_high (objfile
)));
1794 /* Now do checks requiring the associated symtab. */
1797 bv
= cust
->blockvector ();
1798 b
= bv
->static_block ();
1799 for (partial_symbol
*psym
: ps
->static_psymbols
)
1801 /* Skip symbols for inlined functions without address. These may
1802 or may not have a match in the full symtab. */
1803 if (psym
->aclass
== LOC_BLOCK
1804 && psym
->ginfo
.value_address () == 0)
1807 sym
= block_lookup_symbol (b
, psym
->ginfo
.search_name (),
1808 symbol_name_match_type::SEARCH_NAME
,
1812 gdb_printf ("Static symbol `");
1813 gdb_puts (psym
->ginfo
.linkage_name ());
1814 gdb_printf ("' only found in ");
1815 gdb_puts (ps
->filename
);
1816 gdb_printf (" psymtab\n");
1819 b
= bv
->global_block ();
1820 for (partial_symbol
*psym
: ps
->global_psymbols
)
1822 sym
= block_lookup_symbol (b
, psym
->ginfo
.search_name (),
1823 symbol_name_match_type::SEARCH_NAME
,
1827 gdb_printf ("Global symbol `");
1828 gdb_puts (psym
->ginfo
.linkage_name ());
1829 gdb_printf ("' only found in ");
1830 gdb_puts (ps
->filename
);
1831 gdb_printf (" psymtab\n");
1834 if (ps
->raw_text_high () != 0
1835 && (ps
->text_low (objfile
) < b
->start ()
1836 || ps
->text_high (objfile
) > b
->end ()))
1838 gdb_printf ("Psymtab ");
1839 gdb_puts (ps
->filename
);
1840 gdb_printf (" covers ");
1841 gdb_puts (paddress (gdbarch
, ps
->text_low (objfile
)));
1843 gdb_puts (paddress (gdbarch
, ps
->text_high (objfile
)));
1844 gdb_printf (" but symtab covers only ");
1845 gdb_puts (paddress (gdbarch
, b
->start ()));
1847 gdb_puts (paddress (gdbarch
, b
->end ()));
1855 void _initialize_psymtab ();
1857 _initialize_psymtab ()
1859 add_cmd ("psymbols", class_maintenance
, maintenance_print_psymbols
, _("\
1860 Print dump of current partial symbol definitions.\n\
1861 Usage: mt print psymbols [-objfile OBJFILE] [-pc ADDRESS] [--] [OUTFILE]\n\
1862 mt print psymbols [-objfile OBJFILE] [-source SOURCE] [--] [OUTFILE]\n\
1863 Entries in the partial symbol table are dumped to file OUTFILE,\n\
1864 or the terminal if OUTFILE is unspecified.\n\
1865 If ADDRESS is provided, dump only the file for that address.\n\
1866 If SOURCE is provided, dump only that file's symbols.\n\
1867 If OBJFILE is provided, dump only that file's minimal symbols."),
1868 &maintenanceprintlist
);
1870 add_cmd ("psymtabs", class_maintenance
, maintenance_info_psymtabs
, _("\
1871 List the partial symbol tables for all object files.\n\
1872 This does not include information about individual partial symbols,\n\
1873 just the symbol table structures themselves."),
1874 &maintenanceinfolist
);
1876 add_cmd ("check-psymtabs", class_maintenance
, maintenance_check_psymtabs
,
1878 Check consistency of currently expanded psymtabs versus symtabs."),