1 /* Partial symbol tables.
3 Copyright (C) 2009-2019 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/readline.h"
32 #include "gdb_regex.h"
33 #include "dictionary.h"
35 #include "cp-support.h"
40 static struct partial_symbol
*match_partial_symbol (struct objfile
*,
41 struct partial_symtab
*,
43 const char *, domain_enum
,
44 symbol_name_match_type
,
45 symbol_compare_ftype
*);
47 static struct partial_symbol
*lookup_partial_symbol (struct objfile
*,
48 struct partial_symtab
*,
52 static const char *psymtab_to_fullname (struct partial_symtab
*ps
);
54 static struct partial_symbol
*find_pc_sect_psymbol (struct objfile
*,
55 struct partial_symtab
*,
57 struct obj_section
*);
59 static struct compunit_symtab
*psymtab_to_symtab (struct objfile
*objfile
,
60 struct partial_symtab
*pst
);
64 static unsigned long psymbol_hash (const void *addr
, int length
);
65 static int psymbol_compare (const void *addr1
, const void *addr2
, int length
);
67 psymtab_storage::psymtab_storage ()
68 : psymbol_cache (psymbol_hash
, psymbol_compare
)
72 psymtab_storage::~psymtab_storage ()
78 struct partial_symtab
*
79 psymtab_storage::allocate_psymtab ()
81 struct partial_symtab
*psymtab
;
83 if (free_psymtabs
!= nullptr)
85 psymtab
= free_psymtabs
;
86 free_psymtabs
= psymtab
->next
;
89 psymtab
= XOBNEW (obstack (), struct partial_symtab
);
91 memset (psymtab
, 0, sizeof (struct partial_symtab
));
93 psymtab
->next
= psymtabs
;
103 psymtab_storage::partial_symtab_range
104 require_partial_symbols (struct objfile
*objfile
, int verbose
)
106 if ((objfile
->flags
& OBJF_PSYMTABS_READ
) == 0)
108 objfile
->flags
|= OBJF_PSYMTABS_READ
;
110 if (objfile
->sf
->sym_read_psymbols
)
113 printf_filtered (_("Reading symbols from %s...\n"),
114 objfile_name (objfile
));
115 (*objfile
->sf
->sym_read_psymbols
) (objfile
);
117 /* Partial symbols list are not expected to changed after this
119 objfile
->partial_symtabs
->global_psymbols
.shrink_to_fit ();
120 objfile
->partial_symtabs
->static_psymbols
.shrink_to_fit ();
122 if (verbose
&& !objfile_has_symbols (objfile
))
123 printf_filtered (_("(No debugging symbols found in %s)\n"),
124 objfile_name (objfile
));
128 return objfile
->psymtabs ();
131 /* Helper function for psym_map_symtabs_matching_filename that
132 expands the symtabs and calls the iterator. */
135 partial_map_expand_apply (struct objfile
*objfile
,
137 const char *real_path
,
138 struct partial_symtab
*pst
,
139 gdb::function_view
<bool (symtab
*)> callback
)
141 struct compunit_symtab
*last_made
= objfile
->compunit_symtabs
;
143 /* Shared psymtabs should never be seen here. Instead they should
144 be handled properly by the caller. */
145 gdb_assert (pst
->user
== NULL
);
147 /* Don't visit already-expanded psymtabs. */
151 /* This may expand more than one symtab, and we want to iterate over
153 psymtab_to_symtab (objfile
, pst
);
155 return iterate_over_some_symtabs (name
, real_path
, objfile
->compunit_symtabs
,
156 last_made
, callback
);
159 /* Psymtab version of map_symtabs_matching_filename. See its definition in
160 the definition of quick_symbol_functions in symfile.h. */
163 psym_map_symtabs_matching_filename
164 (struct objfile
*objfile
,
166 const char *real_path
,
167 gdb::function_view
<bool (symtab
*)> callback
)
169 const char *name_basename
= lbasename (name
);
171 for (partial_symtab
*pst
: require_partial_symbols (objfile
, 1))
173 /* We can skip shared psymtabs here, because any file name will be
174 attached to the unshared psymtab. */
175 if (pst
->user
!= NULL
)
178 /* Anonymous psymtabs don't have a file name. */
182 if (compare_filenames_for_search (pst
->filename
, name
))
184 if (partial_map_expand_apply (objfile
, name
, real_path
,
190 /* Before we invoke realpath, which can get expensive when many
191 files are involved, do a quick comparison of the basenames. */
192 if (! basenames_may_differ
193 && FILENAME_CMP (name_basename
, lbasename (pst
->filename
)) != 0)
196 if (compare_filenames_for_search (psymtab_to_fullname (pst
), name
))
198 if (partial_map_expand_apply (objfile
, name
, real_path
,
204 /* If the user gave us an absolute path, try to find the file in
205 this symtab and use its absolute path. */
206 if (real_path
!= NULL
)
208 gdb_assert (IS_ABSOLUTE_PATH (real_path
));
209 gdb_assert (IS_ABSOLUTE_PATH (name
));
210 if (filename_cmp (psymtab_to_fullname (pst
), real_path
) == 0)
212 if (partial_map_expand_apply (objfile
, name
, real_path
,
223 /* Find which partial symtab contains PC and SECTION starting at psymtab PST.
224 We may find a different psymtab than PST. See FIND_PC_SECT_PSYMTAB. */
226 static struct partial_symtab
*
227 find_pc_sect_psymtab_closer (struct objfile
*objfile
,
228 CORE_ADDR pc
, struct obj_section
*section
,
229 struct partial_symtab
*pst
,
230 struct bound_minimal_symbol msymbol
)
232 struct partial_symtab
*tpst
;
233 struct partial_symtab
*best_pst
= pst
;
234 CORE_ADDR best_addr
= pst
->text_low (objfile
);
236 gdb_assert (!pst
->psymtabs_addrmap_supported
);
238 /* An objfile that has its functions reordered might have
239 many partial symbol tables containing the PC, but
240 we want the partial symbol table that contains the
241 function containing the PC. */
242 if (!(objfile
->flags
& OBJF_REORDERED
)
243 && section
== NULL
) /* Can't validate section this way. */
246 if (msymbol
.minsym
== NULL
)
249 /* The code range of partial symtabs sometimes overlap, so, in
250 the loop below, we need to check all partial symtabs and
251 find the one that fits better for the given PC address. We
252 select the partial symtab that contains a symbol whose
253 address is closest to the PC address. By closest we mean
254 that find_pc_sect_symbol returns the symbol with address
255 that is closest and still less than the given PC. */
256 for (tpst
= pst
; tpst
!= NULL
; tpst
= tpst
->next
)
258 if (pc
>= tpst
->text_low (objfile
) && pc
< tpst
->text_high (objfile
))
260 struct partial_symbol
*p
;
263 /* NOTE: This assumes that every psymbol has a
264 corresponding msymbol, which is not necessarily
265 true; the debug info might be much richer than the
266 object's symbol table. */
267 p
= find_pc_sect_psymbol (objfile
, tpst
, pc
, section
);
269 && (p
->address (objfile
) == BMSYMBOL_VALUE_ADDRESS (msymbol
)))
272 /* Also accept the textlow value of a psymtab as a
273 "symbol", to provide some support for partial
274 symbol tables with line information but no debug
275 symbols (e.g. those produced by an assembler). */
277 this_addr
= p
->address (objfile
);
279 this_addr
= tpst
->text_low (objfile
);
281 /* Check whether it is closer than our current
282 BEST_ADDR. Since this symbol address is
283 necessarily lower or equal to PC, the symbol closer
284 to PC is the symbol which address is the highest.
285 This way we return the psymtab which contains such
286 best match symbol. This can help in cases where the
287 symbol information/debuginfo is not complete, like
288 for instance on IRIX6 with gcc, where no debug info
289 is emitted for statics. (See also the nodebug.exp
291 if (this_addr
> best_addr
)
293 best_addr
= this_addr
;
301 /* Find which partial symtab contains PC and SECTION. Return NULL if
302 none. We return the psymtab that contains a symbol whose address
303 exactly matches PC, or, if we cannot find an exact match, the
304 psymtab that contains a symbol whose address is closest to PC. */
306 static struct partial_symtab
*
307 find_pc_sect_psymtab (struct objfile
*objfile
, CORE_ADDR pc
,
308 struct obj_section
*section
,
309 struct bound_minimal_symbol msymbol
)
311 CORE_ADDR baseaddr
= ANOFFSET (objfile
->section_offsets
,
312 SECT_OFF_TEXT (objfile
));
314 /* Try just the PSYMTABS_ADDRMAP mapping first as it has better granularity
315 than the later used TEXTLOW/TEXTHIGH one. */
317 if (objfile
->partial_symtabs
->psymtabs_addrmap
!= NULL
)
319 struct partial_symtab
*pst
320 = ((struct partial_symtab
*)
321 addrmap_find (objfile
->partial_symtabs
->psymtabs_addrmap
,
325 /* FIXME: addrmaps currently do not handle overlayed sections,
326 so fall back to the non-addrmap case if we're debugging
327 overlays and the addrmap returned the wrong section. */
328 if (overlay_debugging
&& msymbol
.minsym
!= NULL
&& section
!= NULL
)
330 struct partial_symbol
*p
;
332 /* NOTE: This assumes that every psymbol has a
333 corresponding msymbol, which is not necessarily
334 true; the debug info might be much richer than the
335 object's symbol table. */
336 p
= find_pc_sect_psymbol (objfile
, pst
, pc
, section
);
338 || (p
->address (objfile
)
339 != BMSYMBOL_VALUE_ADDRESS (msymbol
)))
343 /* We do not try to call FIND_PC_SECT_PSYMTAB_CLOSER as
344 PSYMTABS_ADDRMAP we used has already the best 1-byte
345 granularity and FIND_PC_SECT_PSYMTAB_CLOSER may mislead us into
346 a worse chosen section due to the TEXTLOW/TEXTHIGH ranges
355 /* Existing PSYMTABS_ADDRMAP mapping is present even for PARTIAL_SYMTABs
356 which still have no corresponding full SYMTABs read. But it is not
357 present for non-DWARF2 debug infos not supporting PSYMTABS_ADDRMAP in GDB
360 /* Check even OBJFILE with non-zero PSYMTABS_ADDRMAP as only several of
361 its CUs may be missing in PSYMTABS_ADDRMAP as they may be varying
362 debug info type in single OBJFILE. */
364 for (partial_symtab
*pst
: require_partial_symbols (objfile
, 1))
365 if (!pst
->psymtabs_addrmap_supported
366 && pc
>= pst
->text_low (objfile
) && pc
< pst
->text_high (objfile
))
368 struct partial_symtab
*best_pst
;
370 best_pst
= find_pc_sect_psymtab_closer (objfile
, pc
, section
, pst
,
372 if (best_pst
!= NULL
)
379 /* Psymtab version of find_pc_sect_compunit_symtab. See its definition in
380 the definition of quick_symbol_functions in symfile.h. */
382 static struct compunit_symtab
*
383 psym_find_pc_sect_compunit_symtab (struct objfile
*objfile
,
384 struct bound_minimal_symbol msymbol
,
386 struct obj_section
*section
,
389 struct partial_symtab
*ps
= find_pc_sect_psymtab (objfile
, pc
, section
,
393 if (warn_if_readin
&& ps
->readin
)
394 /* Might want to error() here (in case symtab is corrupt and
395 will cause a core dump), but maybe we can successfully
396 continue, so let's not. */
398 (Internal error: pc %s in read in psymtab, but not in symtab.)\n"),
399 paddress (get_objfile_arch (objfile
), pc
));
400 psymtab_to_symtab (objfile
, ps
);
401 return ps
->compunit_symtab
;
406 /* Find which partial symbol within a psymtab matches PC and SECTION.
407 Return NULL if none. */
409 static struct partial_symbol
*
410 find_pc_sect_psymbol (struct objfile
*objfile
,
411 struct partial_symtab
*psymtab
, CORE_ADDR pc
,
412 struct obj_section
*section
)
414 struct partial_symbol
*best
= NULL
;
416 const CORE_ADDR textlow
= psymtab
->text_low (objfile
);
418 gdb_assert (psymtab
!= NULL
);
420 /* Cope with programs that start at address 0. */
421 best_pc
= (textlow
!= 0) ? textlow
- 1 : 0;
423 /* Search the global symbols as well as the static symbols, so that
424 find_pc_partial_function doesn't use a minimal symbol and thus
425 cache a bad endaddr. */
426 for (int i
= 0; i
< psymtab
->n_global_syms
; i
++)
429 = objfile
->partial_symtabs
->global_psymbols
[psymtab
->globals_offset
432 if (p
->domain
== VAR_DOMAIN
433 && p
->aclass
== LOC_BLOCK
434 && pc
>= p
->address (objfile
)
435 && (p
->address (objfile
) > best_pc
436 || (psymtab
->text_low (objfile
) == 0
437 && best_pc
== 0 && p
->address (objfile
) == 0)))
439 if (section
!= NULL
) /* Match on a specific section. */
441 if (!matching_obj_sections (p
->obj_section (objfile
),
445 best_pc
= p
->address (objfile
);
450 for (int i
= 0; i
< psymtab
->n_static_syms
; i
++)
453 = objfile
->partial_symtabs
->static_psymbols
[psymtab
->statics_offset
456 if (p
->domain
== VAR_DOMAIN
457 && p
->aclass
== LOC_BLOCK
458 && pc
>= p
->address (objfile
)
459 && (p
->address (objfile
) > best_pc
460 || (psymtab
->text_low (objfile
) == 0
461 && best_pc
== 0 && p
->address (objfile
) == 0)))
463 if (section
!= NULL
) /* Match on a specific section. */
465 if (!matching_obj_sections (p
->obj_section (objfile
),
469 best_pc
= p
->address (objfile
);
477 /* Psymtab version of lookup_symbol. See its definition in
478 the definition of quick_symbol_functions in symfile.h. */
480 static struct compunit_symtab
*
481 psym_lookup_symbol (struct objfile
*objfile
,
482 int block_index
, const char *name
,
483 const domain_enum domain
)
485 const int psymtab_index
= (block_index
== GLOBAL_BLOCK
? 1 : 0);
486 struct compunit_symtab
*stab_best
= NULL
;
488 lookup_name_info
lookup_name (name
, symbol_name_match_type::FULL
);
490 for (partial_symtab
*ps
: require_partial_symbols (objfile
, 1))
492 if (!ps
->readin
&& lookup_partial_symbol (objfile
, ps
, name
,
493 psymtab_index
, domain
))
495 struct symbol
*sym
, *with_opaque
= NULL
;
496 struct compunit_symtab
*stab
= psymtab_to_symtab (objfile
, ps
);
497 /* Note: While psymtab_to_symtab can return NULL if the
498 partial symtab is empty, we can assume it won't here
499 because lookup_partial_symbol succeeded. */
500 const struct blockvector
*bv
= COMPUNIT_BLOCKVECTOR (stab
);
501 const struct block
*block
= BLOCKVECTOR_BLOCK (bv
, block_index
);
503 sym
= block_find_symbol (block
, name
, domain
,
504 block_find_non_opaque_type_preferred
,
507 /* Some caution must be observed with overloaded functions
508 and methods, since the index will not contain any overload
509 information (but NAME might contain it). */
512 && SYMBOL_MATCHES_SEARCH_NAME (sym
, lookup_name
))
514 if (with_opaque
!= NULL
515 && SYMBOL_MATCHES_SEARCH_NAME (with_opaque
, lookup_name
))
518 /* Keep looking through other psymtabs. */
525 /* Returns true if PSYM matches LOOKUP_NAME. */
528 psymbol_name_matches (partial_symbol
*psym
,
529 const lookup_name_info
&lookup_name
)
531 const language_defn
*lang
= language_def (psym
->ginfo
.language
);
532 symbol_name_matcher_ftype
*name_match
533 = get_symbol_name_matcher (lang
, lookup_name
);
534 return name_match (symbol_search_name (&psym
->ginfo
), lookup_name
, NULL
);
537 /* Look in PST for a symbol in DOMAIN whose name matches NAME. Search
538 the global block of PST if GLOBAL, and otherwise the static block.
539 MATCH is the comparison operation that returns true iff MATCH (s,
540 NAME), where s is a SYMBOL_SEARCH_NAME. If ORDERED_COMPARE is
541 non-null, the symbols in the block are assumed to be ordered
542 according to it (allowing binary search). It must be compatible
543 with MATCH. Returns the symbol, if found, and otherwise NULL. */
545 static struct partial_symbol
*
546 match_partial_symbol (struct objfile
*objfile
,
547 struct partial_symtab
*pst
, int global
,
548 const char *name
, domain_enum domain
,
549 symbol_name_match_type match_type
,
550 symbol_compare_ftype
*ordered_compare
)
552 struct partial_symbol
**start
, **psym
;
553 struct partial_symbol
**top
, **real_top
, **bottom
, **center
;
554 int length
= (global
? pst
->n_global_syms
: pst
->n_static_syms
);
555 int do_linear_search
= 1;
560 lookup_name_info
lookup_name (name
, match_type
);
563 &objfile
->partial_symtabs
->global_psymbols
[pst
->globals_offset
] :
564 &objfile
->partial_symtabs
->static_psymbols
[pst
->statics_offset
]);
566 if (global
&& ordered_compare
) /* Can use a binary search. */
568 do_linear_search
= 0;
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
577 top
= start
+ length
- 1;
581 center
= bottom
+ (top
- bottom
) / 2;
582 gdb_assert (center
< top
);
584 enum language lang
= (*center
)->ginfo
.language
;
586 = lookup_name
.language_lookup_name (lang
).c_str ();
588 if (ordered_compare (symbol_search_name (&(*center
)->ginfo
),
594 gdb_assert (top
== bottom
);
596 while (top
<= real_top
597 && psymbol_name_matches (*top
, lookup_name
))
599 if (symbol_matches_domain ((*top
)->ginfo
.language
,
600 (*top
)->domain
, domain
))
606 /* Can't use a binary search or else we found during the binary search that
607 we should also do a linear search. */
609 if (do_linear_search
)
611 for (psym
= start
; psym
< start
+ length
; psym
++)
613 if (symbol_matches_domain ((*psym
)->ginfo
.language
,
614 (*psym
)->domain
, domain
)
615 && psymbol_name_matches (*psym
, lookup_name
))
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
629 static gdb::unique_xmalloc_ptr
<char>
630 psymtab_search_name (const char *name
)
632 switch (current_language
->la_language
)
636 if (strchr (name
, '('))
638 gdb::unique_xmalloc_ptr
<char> ret
= cp_remove_params (name
);
650 return gdb::unique_xmalloc_ptr
<char> (xstrdup (name
));
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. */
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
)
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;
669 gdb::unique_xmalloc_ptr
<char> search_name
= psymtab_search_name (name
);
671 lookup_name_info
lookup_name (search_name
.get (), symbol_name_match_type::FULL
);
674 &objfile
->partial_symtabs
->global_psymbols
[pst
->globals_offset
] :
675 &objfile
->partial_symtabs
->static_psymbols
[pst
->statics_offset
]);
677 if (global
) /* This means we can use a binary search. */
679 do_linear_search
= 0;
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
688 top
= start
+ length
- 1;
692 center
= bottom
+ (top
- bottom
) / 2;
694 internal_error (__FILE__
, __LINE__
,
695 _("failed internal consistency check"));
696 if (strcmp_iw_ordered (symbol_search_name (&(*center
)->ginfo
),
697 search_name
.get ()) >= 0)
706 if (!(top
== bottom
))
707 internal_error (__FILE__
, __LINE__
,
708 _("failed internal consistency check"));
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
,
716 /* Fixup to have a symbol which matches SYMBOL_MATCHES_SEARCH_NAME. */
719 while (top
<= real_top
&& symbol_matches_search_name (&(*top
)->ginfo
,
722 if (symbol_matches_domain ((*top
)->ginfo
.language
,
723 (*top
)->domain
, domain
))
729 /* Can't use a binary search or else we found during the binary search that
730 we should also do a linear search. */
732 if (do_linear_search
)
734 for (psym
= start
; psym
< start
+ length
; psym
++)
736 if (symbol_matches_domain ((*psym
)->ginfo
.language
,
737 (*psym
)->domain
, domain
)
738 && symbol_matches_search_name (&(*psym
)->ginfo
, lookup_name
))
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. */
752 static struct compunit_symtab
*
753 psymtab_to_symtab (struct objfile
*objfile
, struct partial_symtab
*pst
)
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
)
760 /* If it's been looked up before, return it. */
761 if (pst
->compunit_symtab
)
762 return pst
->compunit_symtab
;
764 /* If it has not yet been read in, read it. */
767 scoped_restore decrementer
= increment_reading_symtab ();
769 (*pst
->read_symtab
) (pst
, objfile
);
772 return pst
->compunit_symtab
;
775 /* Psymtab version of find_last_source_symtab. See its definition in
776 the definition of quick_symbol_functions in symfile.h. */
778 static struct symtab
*
779 psym_find_last_source_symtab (struct objfile
*ofp
)
781 struct partial_symtab
*cs_pst
= NULL
;
783 for (partial_symtab
*ps
: require_partial_symbols (ofp
, 1))
785 const char *name
= ps
->filename
;
786 int len
= strlen (name
);
788 if (!(len
> 2 && (strcmp (&name
[len
- 2], ".h") == 0
789 || strcmp (name
, "<<C++-namespaces>>") == 0)))
797 internal_error (__FILE__
, __LINE__
,
798 _("select_source_symtab: "
799 "readin pst found and no symtabs."));
803 struct compunit_symtab
*cust
= psymtab_to_symtab (ofp
, cs_pst
);
807 return compunit_primary_filetab (cust
);
813 /* Psymtab version of forget_cached_source_info. See its definition in
814 the definition of quick_symbol_functions in symfile.h. */
817 psym_forget_cached_source_info (struct objfile
*objfile
)
819 for (partial_symtab
*pst
: require_partial_symbols (objfile
, 1))
821 if (pst
->fullname
!= NULL
)
823 xfree (pst
->fullname
);
824 pst
->fullname
= NULL
;
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
)
834 fprintf_filtered (outfile
, " %s partial symbols:\n", what
);
838 fprintf_filtered (outfile
, " `%s'", (*p
)->ginfo
.name
);
839 if (symbol_demangled_name (&(*p
)->ginfo
) != NULL
)
841 fprintf_filtered (outfile
, " `%s'",
842 symbol_demangled_name (&(*p
)->ginfo
));
844 fputs_filtered (", ", outfile
);
845 switch ((*p
)->domain
)
848 fputs_filtered ("undefined domain, ", outfile
);
851 /* This is the usual thing -- don't print it. */
854 fputs_filtered ("struct domain, ", outfile
);
857 fputs_filtered ("label domain, ", outfile
);
860 fputs_filtered ("<invalid domain>, ", outfile
);
863 switch ((*p
)->aclass
)
866 fputs_filtered ("undefined", outfile
);
869 fputs_filtered ("constant int", outfile
);
872 fputs_filtered ("static", outfile
);
875 fputs_filtered ("register", outfile
);
878 fputs_filtered ("pass by value", outfile
);
881 fputs_filtered ("pass by reference", outfile
);
883 case LOC_REGPARM_ADDR
:
884 fputs_filtered ("register address parameter", outfile
);
887 fputs_filtered ("stack parameter", outfile
);
890 fputs_filtered ("type", outfile
);
893 fputs_filtered ("label", outfile
);
896 fputs_filtered ("function", outfile
);
898 case LOC_CONST_BYTES
:
899 fputs_filtered ("constant bytes", outfile
);
902 fputs_filtered ("unresolved", outfile
);
904 case LOC_OPTIMIZED_OUT
:
905 fputs_filtered ("optimized out", outfile
);
908 fputs_filtered ("computed at runtime", outfile
);
911 fputs_filtered ("<invalid location>", outfile
);
914 fputs_filtered (", ", outfile
);
915 fputs_filtered (paddress (gdbarch
, (*p
)->unrelocated_address ()), outfile
);
916 fprintf_filtered (outfile
, "\n");
922 dump_psymtab (struct objfile
*objfile
, struct partial_symtab
*psymtab
,
923 struct ui_file
*outfile
)
925 struct gdbarch
*gdbarch
= get_objfile_arch (objfile
);
928 if (psymtab
->anonymous
)
930 fprintf_filtered (outfile
, "\nAnonymous partial symtab (%s) ",
935 fprintf_filtered (outfile
, "\nPartial symtab for source file %s ",
938 fprintf_filtered (outfile
, "(object ");
939 gdb_print_host_address (psymtab
, outfile
);
940 fprintf_filtered (outfile
, ")\n\n");
941 fprintf_filtered (outfile
, " Read from object file %s (",
942 objfile_name (objfile
));
943 gdb_print_host_address (objfile
, outfile
);
944 fprintf_filtered (outfile
, ")\n");
948 fprintf_filtered (outfile
,
949 " Full symtab was read (at ");
950 gdb_print_host_address (psymtab
->compunit_symtab
, outfile
);
951 fprintf_filtered (outfile
, " by function at ");
952 gdb_print_host_address (psymtab
->read_symtab
, outfile
);
953 fprintf_filtered (outfile
, ")\n");
956 fprintf_filtered (outfile
, " Symbols cover text addresses ");
957 fputs_filtered (paddress (gdbarch
, psymtab
->text_low (objfile
)), outfile
);
958 fprintf_filtered (outfile
, "-");
959 fputs_filtered (paddress (gdbarch
, psymtab
->text_high (objfile
)), outfile
);
960 fprintf_filtered (outfile
, "\n");
961 fprintf_filtered (outfile
, " Address map supported - %s.\n",
962 psymtab
->psymtabs_addrmap_supported
? "yes" : "no");
963 fprintf_filtered (outfile
, " Depends on %d other partial symtabs.\n",
964 psymtab
->number_of_dependencies
);
965 for (i
= 0; i
< psymtab
->number_of_dependencies
; i
++)
967 fprintf_filtered (outfile
, " %d ", i
);
968 gdb_print_host_address (psymtab
->dependencies
[i
], outfile
);
969 fprintf_filtered (outfile
, " %s\n",
970 psymtab
->dependencies
[i
]->filename
);
972 if (psymtab
->user
!= NULL
)
974 fprintf_filtered (outfile
, " Shared partial symtab with user ");
975 gdb_print_host_address (psymtab
->user
, outfile
);
976 fprintf_filtered (outfile
, "\n");
978 if (psymtab
->n_global_syms
> 0)
980 print_partial_symbols
982 &objfile
->partial_symtabs
->global_psymbols
[psymtab
->globals_offset
],
983 psymtab
->n_global_syms
, "Global", outfile
);
985 if (psymtab
->n_static_syms
> 0)
987 print_partial_symbols
989 &objfile
->partial_symtabs
->static_psymbols
[psymtab
->statics_offset
],
990 psymtab
->n_static_syms
, "Static", outfile
);
992 fprintf_filtered (outfile
, "\n");
995 /* Psymtab version of print_stats. See its definition in
996 the definition of quick_symbol_functions in symfile.h. */
999 psym_print_stats (struct objfile
*objfile
)
1004 for (partial_symtab
*ps
: require_partial_symbols (objfile
, 1))
1006 if (ps
->readin
== 0)
1009 printf_filtered (_(" Number of psym tables (not yet expanded): %d\n"), i
);
1012 /* Psymtab version of dump. See its definition in
1013 the definition of quick_symbol_functions in symfile.h. */
1016 psym_dump (struct objfile
*objfile
)
1018 struct partial_symtab
*psymtab
;
1020 if (objfile
->partial_symtabs
->psymtabs
)
1022 printf_filtered ("Psymtabs:\n");
1023 for (psymtab
= objfile
->partial_symtabs
->psymtabs
;
1025 psymtab
= psymtab
->next
)
1027 printf_filtered ("%s at ",
1029 gdb_print_host_address (psymtab
, gdb_stdout
);
1030 printf_filtered (", ");
1033 printf_filtered ("\n\n");
1037 /* Psymtab version of expand_symtabs_for_function. See its definition in
1038 the definition of quick_symbol_functions in symfile.h. */
1041 psym_expand_symtabs_for_function (struct objfile
*objfile
,
1042 const char *func_name
)
1044 for (partial_symtab
*ps
: require_partial_symbols (objfile
, 1))
1049 if ((lookup_partial_symbol (objfile
, ps
, func_name
, 1, VAR_DOMAIN
)
1051 || (lookup_partial_symbol (objfile
, ps
, func_name
, 0, VAR_DOMAIN
)
1053 psymtab_to_symtab (objfile
, ps
);
1057 /* Psymtab version of expand_all_symtabs. See its definition in
1058 the definition of quick_symbol_functions in symfile.h. */
1061 psym_expand_all_symtabs (struct objfile
*objfile
)
1063 for (partial_symtab
*psymtab
: require_partial_symbols (objfile
, 1))
1064 psymtab_to_symtab (objfile
, psymtab
);
1067 /* Psymtab version of expand_symtabs_with_fullname. See its definition in
1068 the definition of quick_symbol_functions in symfile.h. */
1071 psym_expand_symtabs_with_fullname (struct objfile
*objfile
,
1072 const char *fullname
)
1074 for (partial_symtab
*p
: require_partial_symbols (objfile
, 1))
1076 /* Anonymous psymtabs don't have a name of a source file. */
1080 /* psymtab_to_fullname tries to open the file which is slow.
1081 Don't call it if we know the basenames don't match. */
1082 if ((basenames_may_differ
1083 || filename_cmp (lbasename (fullname
), lbasename (p
->filename
)) == 0)
1084 && filename_cmp (fullname
, psymtab_to_fullname (p
)) == 0)
1085 psymtab_to_symtab (objfile
, p
);
1089 /* Psymtab version of map_symbol_filenames. See its definition in
1090 the definition of quick_symbol_functions in symfile.h. */
1093 psym_map_symbol_filenames (struct objfile
*objfile
,
1094 symbol_filename_ftype
*fun
, void *data
,
1097 for (partial_symtab
*ps
: require_partial_symbols (objfile
, 1))
1099 const char *fullname
;
1104 /* We can skip shared psymtabs here, because any file name will be
1105 attached to the unshared psymtab. */
1106 if (ps
->user
!= NULL
)
1109 /* Anonymous psymtabs don't have a file name. */
1115 fullname
= psymtab_to_fullname (ps
);
1118 (*fun
) (ps
->filename
, fullname
, data
);
1122 /* Finds the fullname that a partial_symtab represents.
1124 If this functions finds the fullname, it will save it in ps->fullname
1125 and it will also return the value.
1127 If this function fails to find the file that this partial_symtab represents,
1128 NULL will be returned and ps->fullname will be set to NULL. */
1131 psymtab_to_fullname (struct partial_symtab
*ps
)
1133 gdb_assert (!ps
->anonymous
);
1135 /* Use cached copy if we have it.
1136 We rely on forget_cached_source_info being called appropriately
1137 to handle cases like the file being moved. */
1138 if (ps
->fullname
== NULL
)
1140 gdb::unique_xmalloc_ptr
<char> fullname
;
1141 scoped_fd fd
= find_and_open_source (ps
->filename
, ps
->dirname
,
1143 ps
->fullname
= fullname
.release ();
1147 /* rewrite_source_path would be applied by find_and_open_source, we
1148 should report the pathname where GDB tried to find the file. */
1150 if (ps
->dirname
== NULL
|| IS_ABSOLUTE_PATH (ps
->filename
))
1151 fullname
.reset (xstrdup (ps
->filename
));
1153 fullname
.reset (concat (ps
->dirname
, SLASH_STRING
,
1154 ps
->filename
, (char *) NULL
));
1156 ps
->fullname
= rewrite_source_path (fullname
.get ()).release ();
1157 if (ps
->fullname
== NULL
)
1158 ps
->fullname
= fullname
.release ();
1162 return ps
->fullname
;
1165 /* For all symbols, s, in BLOCK that are in DOMAIN and match NAME
1166 according to the function MATCH, call CALLBACK(BLOCK, s, DATA).
1167 BLOCK is assumed to come from OBJFILE. Returns 1 iff CALLBACK
1168 ever returns non-zero, and otherwise returns 0. */
1171 map_block (const char *name
, domain_enum domain
, struct objfile
*objfile
,
1172 const struct block
*block
,
1173 int (*callback
) (const struct block
*, struct symbol
*, void *),
1174 void *data
, symbol_name_match_type match
)
1176 struct block_iterator iter
;
1179 lookup_name_info
lookup_name (name
, match
);
1181 for (sym
= block_iter_match_first (block
, lookup_name
, &iter
);
1183 sym
= block_iter_match_next (lookup_name
, &iter
))
1185 if (symbol_matches_domain (SYMBOL_LANGUAGE (sym
),
1186 SYMBOL_DOMAIN (sym
), domain
))
1188 if (callback (block
, sym
, data
))
1196 /* Psymtab version of map_matching_symbols. See its definition in
1197 the definition of quick_symbol_functions in symfile.h. */
1200 psym_map_matching_symbols (struct objfile
*objfile
,
1201 const char *name
, domain_enum domain
,
1203 int (*callback
) (const struct block
*,
1204 struct symbol
*, void *),
1206 symbol_name_match_type match
,
1207 symbol_compare_ftype
*ordered_compare
)
1209 const int block_kind
= global
? GLOBAL_BLOCK
: STATIC_BLOCK
;
1211 for (partial_symtab
*ps
: require_partial_symbols (objfile
, 1))
1215 || match_partial_symbol (objfile
, ps
, global
, name
, domain
, match
,
1218 struct compunit_symtab
*cust
= psymtab_to_symtab (objfile
, ps
);
1219 const struct block
*block
;
1223 block
= BLOCKVECTOR_BLOCK (COMPUNIT_BLOCKVECTOR (cust
), block_kind
);
1224 if (map_block (name
, domain
, objfile
, block
,
1225 callback
, data
, match
))
1227 if (callback (block
, NULL
, data
))
1233 /* A helper for psym_expand_symtabs_matching that handles searching
1234 included psymtabs. This returns true if a symbol is found, and
1235 false otherwise. It also updates the 'searched_flag' on the
1236 various psymtabs that it searches. */
1239 recursively_search_psymtabs
1240 (struct partial_symtab
*ps
,
1241 struct objfile
*objfile
,
1242 enum search_domain domain
,
1243 const lookup_name_info
&lookup_name
,
1244 gdb::function_view
<expand_symtabs_symbol_matcher_ftype
> sym_matcher
)
1247 enum psymtab_search_status result
= PST_SEARCHED_AND_NOT_FOUND
;
1250 if (ps
->searched_flag
!= PST_NOT_SEARCHED
)
1251 return ps
->searched_flag
== PST_SEARCHED_AND_FOUND
;
1253 /* Recurse into shared psymtabs first, because they may have already
1254 been searched, and this could save some time. */
1255 for (i
= 0; i
< ps
->number_of_dependencies
; ++i
)
1259 /* Skip non-shared dependencies, these are handled elsewhere. */
1260 if (ps
->dependencies
[i
]->user
== NULL
)
1263 r
= recursively_search_psymtabs (ps
->dependencies
[i
],
1264 objfile
, domain
, lookup_name
,
1268 ps
->searched_flag
= PST_SEARCHED_AND_FOUND
;
1273 partial_symbol
**gbound
1274 = (objfile
->partial_symtabs
->global_psymbols
.data ()
1275 + ps
->globals_offset
+ ps
->n_global_syms
);
1276 partial_symbol
**sbound
1277 = (objfile
->partial_symtabs
->static_psymbols
.data ()
1278 + ps
->statics_offset
+ ps
->n_static_syms
);
1279 partial_symbol
**bound
= gbound
;
1281 /* Go through all of the symbols stored in a partial
1282 symtab in one loop. */
1283 partial_symbol
**psym
= (objfile
->partial_symtabs
->global_psymbols
.data ()
1284 + ps
->globals_offset
);
1289 if (bound
== gbound
&& ps
->n_static_syms
!= 0)
1291 psym
= (objfile
->partial_symtabs
->static_psymbols
.data ()
1292 + ps
->statics_offset
);
1303 if ((domain
== ALL_DOMAIN
1304 || (domain
== VARIABLES_DOMAIN
1305 && (*psym
)->aclass
!= LOC_TYPEDEF
1306 && (*psym
)->aclass
!= LOC_BLOCK
)
1307 || (domain
== FUNCTIONS_DOMAIN
1308 && (*psym
)->aclass
== LOC_BLOCK
)
1309 || (domain
== TYPES_DOMAIN
1310 && (*psym
)->aclass
== LOC_TYPEDEF
))
1311 && psymbol_name_matches (*psym
, lookup_name
)
1312 && (sym_matcher
== NULL
1313 || sym_matcher (symbol_search_name (&(*psym
)->ginfo
))))
1315 /* Found a match, so notify our caller. */
1316 result
= PST_SEARCHED_AND_FOUND
;
1323 ps
->searched_flag
= result
;
1324 return result
== PST_SEARCHED_AND_FOUND
;
1327 /* Psymtab version of expand_symtabs_matching. See its definition in
1328 the definition of quick_symbol_functions in symfile.h. */
1331 psym_expand_symtabs_matching
1332 (struct objfile
*objfile
,
1333 gdb::function_view
<expand_symtabs_file_matcher_ftype
> file_matcher
,
1334 const lookup_name_info
&lookup_name_in
,
1335 gdb::function_view
<expand_symtabs_symbol_matcher_ftype
> symbol_matcher
,
1336 gdb::function_view
<expand_symtabs_exp_notify_ftype
> expansion_notify
,
1337 enum search_domain domain
)
1339 lookup_name_info lookup_name
= lookup_name_in
.make_ignore_params ();
1341 /* Clear the search flags. */
1342 for (partial_symtab
*ps
: require_partial_symbols (objfile
, 1))
1343 ps
->searched_flag
= PST_NOT_SEARCHED
;
1345 for (partial_symtab
*ps
: objfile
->psymtabs ())
1352 /* We skip shared psymtabs because file-matching doesn't apply
1353 to them; but we search them later in the loop. */
1354 if (ps
->user
!= NULL
)
1364 match
= file_matcher (ps
->filename
, false);
1367 /* Before we invoke realpath, which can get expensive when many
1368 files are involved, do a quick comparison of the basenames. */
1369 if (basenames_may_differ
1370 || file_matcher (lbasename (ps
->filename
), true))
1371 match
= file_matcher (psymtab_to_fullname (ps
), false);
1377 if (recursively_search_psymtabs (ps
, objfile
, domain
,
1378 lookup_name
, symbol_matcher
))
1380 struct compunit_symtab
*symtab
=
1381 psymtab_to_symtab (objfile
, ps
);
1383 if (expansion_notify
!= NULL
)
1384 expansion_notify (symtab
);
1389 /* Psymtab version of has_symbols. See its definition in
1390 the definition of quick_symbol_functions in symfile.h. */
1393 psym_has_symbols (struct objfile
*objfile
)
1395 return objfile
->partial_symtabs
->psymtabs
!= NULL
;
1398 /* Helper function for psym_find_compunit_symtab_by_address that fills
1399 in psymbol_map for a given range of psymbols. */
1402 psym_fill_psymbol_map (struct objfile
*objfile
,
1403 struct partial_symtab
*psymtab
,
1404 std::set
<CORE_ADDR
> *seen_addrs
,
1405 const std::vector
<partial_symbol
*> &symbols
,
1409 for (int i
= 0; i
< length
; ++i
)
1411 struct partial_symbol
*psym
= symbols
[start
+ i
];
1413 if (psym
->aclass
== LOC_STATIC
)
1415 CORE_ADDR addr
= psym
->address (objfile
);
1416 if (seen_addrs
->find (addr
) == seen_addrs
->end ())
1418 seen_addrs
->insert (addr
);
1419 objfile
->psymbol_map
.emplace_back (addr
, psymtab
);
1425 /* See find_compunit_symtab_by_address in quick_symbol_functions, in
1428 static compunit_symtab
*
1429 psym_find_compunit_symtab_by_address (struct objfile
*objfile
,
1432 if (objfile
->psymbol_map
.empty ())
1434 std::set
<CORE_ADDR
> seen_addrs
;
1436 for (partial_symtab
*pst
: require_partial_symbols (objfile
, 1))
1438 psym_fill_psymbol_map (objfile
, pst
,
1440 objfile
->partial_symtabs
->global_psymbols
,
1441 pst
->globals_offset
,
1442 pst
->n_global_syms
);
1443 psym_fill_psymbol_map (objfile
, pst
,
1445 objfile
->partial_symtabs
->static_psymbols
,
1446 pst
->statics_offset
,
1447 pst
->n_static_syms
);
1450 objfile
->psymbol_map
.shrink_to_fit ();
1452 std::sort (objfile
->psymbol_map
.begin (), objfile
->psymbol_map
.end (),
1453 [] (const std::pair
<CORE_ADDR
, partial_symtab
*> &a
,
1454 const std::pair
<CORE_ADDR
, partial_symtab
*> &b
)
1456 return a
.first
< b
.first
;
1460 auto iter
= std::lower_bound
1461 (objfile
->psymbol_map
.begin (), objfile
->psymbol_map
.end (), address
,
1462 [] (const std::pair
<CORE_ADDR
, partial_symtab
*> &a
,
1468 if (iter
== objfile
->psymbol_map
.end () || iter
->first
!= address
)
1471 return psymtab_to_symtab (objfile
, iter
->second
);
1474 const struct quick_symbol_functions psym_functions
=
1477 psym_find_last_source_symtab
,
1478 psym_forget_cached_source_info
,
1479 psym_map_symtabs_matching_filename
,
1483 psym_expand_symtabs_for_function
,
1484 psym_expand_all_symtabs
,
1485 psym_expand_symtabs_with_fullname
,
1486 psym_map_matching_symbols
,
1487 psym_expand_symtabs_matching
,
1488 psym_find_pc_sect_compunit_symtab
,
1489 psym_find_compunit_symtab_by_address
,
1490 psym_map_symbol_filenames
1496 sort_pst_symbols (struct objfile
*objfile
, struct partial_symtab
*pst
)
1498 /* Sort the global list; don't sort the static list. */
1499 auto begin
= objfile
->partial_symtabs
->global_psymbols
.begin ();
1500 std::advance (begin
, pst
->globals_offset
);
1502 /* The psymbols for this partial_symtab are currently at the end of the
1504 auto end
= objfile
->partial_symtabs
->global_psymbols
.end ();
1506 std::sort (begin
, end
, [] (partial_symbol
*s1
, partial_symbol
*s2
)
1508 return strcmp_iw_ordered (symbol_search_name (&s1
->ginfo
),
1509 symbol_search_name (&s2
->ginfo
)) < 0;
1513 /* Allocate and partially fill a partial symtab. It will be
1514 completely filled at the end of the symbol list.
1516 FILENAME is the name of the symbol-file we are reading from. */
1518 struct partial_symtab
*
1519 start_psymtab_common (struct objfile
*objfile
,
1520 const char *filename
,
1523 struct partial_symtab
*psymtab
;
1525 psymtab
= allocate_psymtab (filename
, objfile
);
1526 psymtab
->set_text_low (textlow
);
1527 psymtab
->set_text_high (psymtab
->raw_text_low ()); /* default */
1528 psymtab
->globals_offset
= objfile
->partial_symtabs
->global_psymbols
.size ();
1529 psymtab
->statics_offset
= objfile
->partial_symtabs
->static_psymbols
.size ();
1533 /* Perform "finishing up" operations of a partial symtab. */
1536 end_psymtab_common (struct objfile
*objfile
, struct partial_symtab
*pst
)
1538 pst
->n_global_syms
= (objfile
->partial_symtabs
->global_psymbols
.size ()
1539 - pst
->globals_offset
);
1540 pst
->n_static_syms
= (objfile
->partial_symtabs
->static_psymbols
.size ()
1541 - pst
->statics_offset
);
1543 sort_pst_symbols (objfile
, pst
);
1546 /* Calculate a hash code for the given partial symbol. The hash is
1547 calculated using the symbol's value, language, domain, class
1548 and name. These are the values which are set by
1549 add_psymbol_to_bcache. */
1551 static unsigned long
1552 psymbol_hash (const void *addr
, int length
)
1554 unsigned long h
= 0;
1555 struct partial_symbol
*psymbol
= (struct partial_symbol
*) addr
;
1556 unsigned int lang
= psymbol
->ginfo
.language
;
1557 unsigned int domain
= psymbol
->domain
;
1558 unsigned int theclass
= psymbol
->aclass
;
1560 h
= hash_continue (&psymbol
->ginfo
.value
, sizeof (psymbol
->ginfo
.value
), h
);
1561 h
= hash_continue (&lang
, sizeof (unsigned int), h
);
1562 h
= hash_continue (&domain
, sizeof (unsigned int), h
);
1563 h
= hash_continue (&theclass
, sizeof (unsigned int), h
);
1564 /* Note that psymbol names are interned via symbol_set_names, so
1565 there's no need to hash the contents of the name here. */
1566 h
= hash_continue (&psymbol
->ginfo
.name
,
1567 sizeof (psymbol
->ginfo
.name
), h
);
1572 /* Returns true if the symbol at addr1 equals the symbol at addr2.
1573 For the comparison this function uses a symbols value,
1574 language, domain, class and name. */
1577 psymbol_compare (const void *addr1
, const void *addr2
, int length
)
1579 struct partial_symbol
*sym1
= (struct partial_symbol
*) addr1
;
1580 struct partial_symbol
*sym2
= (struct partial_symbol
*) addr2
;
1582 return (memcmp (&sym1
->ginfo
.value
, &sym2
->ginfo
.value
,
1583 sizeof (sym1
->ginfo
.value
)) == 0
1584 && sym1
->ginfo
.language
== sym2
->ginfo
.language
1585 && sym1
->domain
== sym2
->domain
1586 && sym1
->aclass
== sym2
->aclass
1587 /* Note that psymbol names are interned via
1588 symbol_set_names, so there's no need to compare the
1589 contents of the name here. */
1590 && sym1
->ginfo
.name
== sym2
->ginfo
.name
);
1593 /* Helper function, initialises partial symbol structure and stashes
1594 it into objfile's bcache. Note that our caching mechanism will
1595 use all fields of struct partial_symbol to determine hash value of the
1596 structure. In other words, having two symbols with the same name but
1597 different domain (or address) is possible and correct. */
1599 static struct partial_symbol
*
1600 add_psymbol_to_bcache (const char *name
, int namelength
, int copy_name
,
1602 enum address_class theclass
,
1605 enum language language
, struct objfile
*objfile
,
1608 struct partial_symbol psymbol
;
1609 memset (&psymbol
, 0, sizeof (psymbol
));
1611 psymbol
.set_unrelocated_address (coreaddr
);
1612 psymbol
.ginfo
.section
= section
;
1613 psymbol
.domain
= domain
;
1614 psymbol
.aclass
= theclass
;
1615 symbol_set_language (&psymbol
.ginfo
, language
,
1616 objfile
->partial_symtabs
->obstack ());
1617 symbol_set_names (&psymbol
.ginfo
, name
, namelength
, copy_name
,
1620 /* Stash the partial symbol away in the cache. */
1621 return ((struct partial_symbol
*)
1622 objfile
->partial_symtabs
->psymbol_cache
.insert
1623 (&psymbol
, sizeof (struct partial_symbol
), added
));
1626 /* Helper function, adds partial symbol to the given partial symbol list. */
1629 append_psymbol_to_list (std::vector
<partial_symbol
*> *list
,
1630 struct partial_symbol
*psym
,
1631 struct objfile
*objfile
)
1633 list
->push_back (psym
);
1634 OBJSTAT (objfile
, n_psyms
++);
1637 /* Add a symbol with a long value to a psymtab.
1638 Since one arg is a struct, we pass in a ptr and deref it (sigh).
1639 The only value we need to store for psyms is an address.
1640 For all other psyms pass zero for COREADDR.
1641 Return the partial symbol that has been added. */
1644 add_psymbol_to_list (const char *name
, int namelength
, int copy_name
,
1646 enum address_class theclass
,
1648 psymbol_placement where
,
1650 enum language language
, struct objfile
*objfile
)
1652 struct partial_symbol
*psym
;
1656 /* Stash the partial symbol away in the cache. */
1657 psym
= add_psymbol_to_bcache (name
, namelength
, copy_name
, domain
, theclass
,
1658 section
, coreaddr
, language
, objfile
, &added
);
1660 /* Do not duplicate global partial symbols. */
1661 if (where
== psymbol_placement::GLOBAL
&& !added
)
1664 /* Save pointer to partial symbol in psymtab, growing symtab if needed. */
1665 std::vector
<partial_symbol
*> *list
1666 = (where
== psymbol_placement::STATIC
1667 ? &objfile
->partial_symtabs
->static_psymbols
1668 : &objfile
->partial_symtabs
->global_psymbols
);
1669 append_psymbol_to_list (list
, psym
, objfile
);
1672 /* See psympriv.h. */
1675 init_psymbol_list (struct objfile
*objfile
, int total_symbols
)
1677 if (objfile
->partial_symtabs
->global_psymbols
.capacity () == 0
1678 && objfile
->partial_symtabs
->static_psymbols
.capacity () == 0)
1680 /* Current best guess is that approximately a twentieth of the
1681 total symbols (in a debugging file) are global or static
1682 oriented symbols, then multiply that by slop factor of
1684 objfile
->partial_symtabs
->global_psymbols
.reserve (total_symbols
/ 10);
1685 objfile
->partial_symtabs
->static_psymbols
.reserve (total_symbols
/ 10);
1689 /* See psympriv.h. */
1691 struct partial_symtab
*
1692 allocate_psymtab (const char *filename
, struct objfile
*objfile
)
1694 struct partial_symtab
*psymtab
1695 = objfile
->partial_symtabs
->allocate_psymtab ();
1698 = ((const char *) objfile
->per_bfd
->filename_cache
.insert
1699 (filename
, strlen (filename
) + 1));
1700 psymtab
->compunit_symtab
= NULL
;
1702 if (symtab_create_debug
)
1704 /* Be a bit clever with debugging messages, and don't print objfile
1705 every time, only when it changes. */
1706 static char *last_objfile_name
= NULL
;
1708 if (last_objfile_name
== NULL
1709 || strcmp (last_objfile_name
, objfile_name (objfile
)) != 0)
1711 xfree (last_objfile_name
);
1712 last_objfile_name
= xstrdup (objfile_name (objfile
));
1713 fprintf_filtered (gdb_stdlog
,
1714 "Creating one or more psymtabs for objfile %s ...\n",
1717 fprintf_filtered (gdb_stdlog
,
1718 "Created psymtab %s for module %s.\n",
1719 host_address_to_string (psymtab
), filename
);
1726 psymtab_storage::discard_psymtab (struct partial_symtab
*pst
)
1728 struct partial_symtab
**prev_pst
;
1731 Empty psymtabs happen as a result of header files which don't
1732 have any symbols in them. There can be a lot of them. But this
1733 check is wrong, in that a psymtab with N_SLINE entries but
1734 nothing else is not empty, but we don't realize that. Fixing
1735 that without slowing things down might be tricky. */
1737 /* First, snip it out of the psymtab chain. */
1739 prev_pst
= &psymtabs
;
1740 while ((*prev_pst
) != pst
)
1741 prev_pst
= &((*prev_pst
)->next
);
1742 (*prev_pst
) = pst
->next
;
1744 /* Next, put it on a free list for recycling. */
1746 pst
->next
= free_psymtabs
;
1747 free_psymtabs
= pst
;
1752 /* We need to pass a couple of items to the addrmap_foreach function,
1755 struct dump_psymtab_addrmap_data
1757 struct objfile
*objfile
;
1758 struct partial_symtab
*psymtab
;
1759 struct ui_file
*outfile
;
1761 /* Non-zero if the previously printed addrmap entry was for PSYMTAB.
1762 If so, we want to print the next one as well (since the next addrmap
1763 entry defines the end of the range). */
1764 int previous_matched
;
1767 /* Helper function for dump_psymtab_addrmap to print an addrmap entry. */
1770 dump_psymtab_addrmap_1 (void *datap
, CORE_ADDR start_addr
, void *obj
)
1772 struct dump_psymtab_addrmap_data
*data
1773 = (struct dump_psymtab_addrmap_data
*) datap
;
1774 struct gdbarch
*gdbarch
= get_objfile_arch (data
->objfile
);
1775 struct partial_symtab
*addrmap_psymtab
= (struct partial_symtab
*) obj
;
1776 const char *psymtab_address_or_end
= NULL
;
1780 if (data
->psymtab
== NULL
1781 || data
->psymtab
== addrmap_psymtab
)
1782 psymtab_address_or_end
= host_address_to_string (addrmap_psymtab
);
1783 else if (data
->previous_matched
)
1784 psymtab_address_or_end
= "<ends here>";
1786 if (data
->psymtab
== NULL
1787 || data
->psymtab
== addrmap_psymtab
1788 || data
->previous_matched
)
1790 fprintf_filtered (data
->outfile
, " %s%s %s\n",
1791 data
->psymtab
!= NULL
? " " : "",
1792 paddress (gdbarch
, start_addr
),
1793 psymtab_address_or_end
);
1796 data
->previous_matched
= (data
->psymtab
== NULL
1797 || data
->psymtab
== addrmap_psymtab
);
1802 /* Helper function for maintenance_print_psymbols to print the addrmap
1803 of PSYMTAB. If PSYMTAB is NULL print the entire addrmap. */
1806 dump_psymtab_addrmap (struct objfile
*objfile
, struct partial_symtab
*psymtab
,
1807 struct ui_file
*outfile
)
1809 struct dump_psymtab_addrmap_data addrmap_dump_data
;
1811 if ((psymtab
== NULL
1812 || psymtab
->psymtabs_addrmap_supported
)
1813 && objfile
->partial_symtabs
->psymtabs_addrmap
!= NULL
)
1815 addrmap_dump_data
.objfile
= objfile
;
1816 addrmap_dump_data
.psymtab
= psymtab
;
1817 addrmap_dump_data
.outfile
= outfile
;
1818 addrmap_dump_data
.previous_matched
= 0;
1819 fprintf_filtered (outfile
, "%sddress map:\n",
1820 psymtab
== NULL
? "Entire a" : " A");
1821 addrmap_foreach (objfile
->partial_symtabs
->psymtabs_addrmap
,
1822 dump_psymtab_addrmap_1
, &addrmap_dump_data
);
1827 maintenance_print_psymbols (const char *args
, int from_tty
)
1829 struct ui_file
*outfile
= gdb_stdout
;
1830 char *address_arg
= NULL
, *source_arg
= NULL
, *objfile_arg
= NULL
;
1831 int i
, outfile_idx
, found
;
1833 struct obj_section
*section
= NULL
;
1837 gdb_argv
argv (args
);
1839 for (i
= 0; argv
!= NULL
&& argv
[i
] != NULL
; ++i
)
1841 if (strcmp (argv
[i
], "-pc") == 0)
1843 if (argv
[i
+ 1] == NULL
)
1844 error (_("Missing pc value"));
1845 address_arg
= argv
[++i
];
1847 else if (strcmp (argv
[i
], "-source") == 0)
1849 if (argv
[i
+ 1] == NULL
)
1850 error (_("Missing source file"));
1851 source_arg
= argv
[++i
];
1853 else if (strcmp (argv
[i
], "-objfile") == 0)
1855 if (argv
[i
+ 1] == NULL
)
1856 error (_("Missing objfile name"));
1857 objfile_arg
= argv
[++i
];
1859 else if (strcmp (argv
[i
], "--") == 0)
1861 /* End of options. */
1865 else if (argv
[i
][0] == '-')
1867 /* Future proofing: Don't allow OUTFILE to begin with "-". */
1868 error (_("Unknown option: %s"), argv
[i
]);
1875 if (address_arg
!= NULL
&& source_arg
!= NULL
)
1876 error (_("Must specify at most one of -pc and -source"));
1878 stdio_file arg_outfile
;
1880 if (argv
!= NULL
&& argv
[outfile_idx
] != NULL
)
1882 if (argv
[outfile_idx
+ 1] != NULL
)
1883 error (_("Junk at end of command"));
1884 gdb::unique_xmalloc_ptr
<char> outfile_name
1885 (tilde_expand (argv
[outfile_idx
]));
1886 if (!arg_outfile
.open (outfile_name
.get (), FOPEN_WT
))
1887 perror_with_name (outfile_name
.get ());
1888 outfile
= &arg_outfile
;
1891 if (address_arg
!= NULL
)
1893 pc
= parse_and_eval_address (address_arg
);
1894 /* If we fail to find a section, that's ok, try the lookup anyway. */
1895 section
= find_pc_section (pc
);
1899 for (objfile
*objfile
: current_program_space
->objfiles ())
1901 int printed_objfile_header
= 0;
1902 int print_for_objfile
= 1;
1905 if (objfile_arg
!= NULL
)
1907 = compare_filenames_for_search (objfile_name (objfile
),
1909 if (!print_for_objfile
)
1912 if (address_arg
!= NULL
)
1914 struct bound_minimal_symbol msymbol
= { NULL
, NULL
};
1916 /* We don't assume each pc has a unique objfile (this is for
1918 struct partial_symtab
*ps
= find_pc_sect_psymtab (objfile
, pc
,
1922 if (!printed_objfile_header
)
1924 outfile
->printf ("\nPartial symtabs for objfile %s\n",
1925 objfile_name (objfile
));
1926 printed_objfile_header
= 1;
1928 dump_psymtab (objfile
, ps
, outfile
);
1929 dump_psymtab_addrmap (objfile
, ps
, outfile
);
1935 for (partial_symtab
*ps
: require_partial_symbols (objfile
, 1))
1937 int print_for_source
= 0;
1940 if (source_arg
!= NULL
)
1943 = compare_filenames_for_search (ps
->filename
, source_arg
);
1946 if (source_arg
== NULL
1947 || print_for_source
)
1949 if (!printed_objfile_header
)
1951 outfile
->printf ("\nPartial symtabs for objfile %s\n",
1952 objfile_name (objfile
));
1953 printed_objfile_header
= 1;
1955 dump_psymtab (objfile
, ps
, outfile
);
1956 dump_psymtab_addrmap (objfile
, ps
, outfile
);
1961 /* If we're printing all the objfile's symbols dump the full addrmap. */
1963 if (address_arg
== NULL
1964 && source_arg
== NULL
1965 && objfile
->partial_symtabs
->psymtabs_addrmap
!= NULL
)
1967 outfile
->puts ("\n");
1968 dump_psymtab_addrmap (objfile
, NULL
, outfile
);
1974 if (address_arg
!= NULL
)
1975 error (_("No partial symtab for address: %s"), address_arg
);
1976 if (source_arg
!= NULL
)
1977 error (_("No partial symtab for source file: %s"), source_arg
);
1981 /* List all the partial symbol tables whose names match REGEXP (optional). */
1984 maintenance_info_psymtabs (const char *regexp
, int from_tty
)
1986 struct program_space
*pspace
;
1991 ALL_PSPACES (pspace
)
1992 for (objfile
*objfile
: pspace
->objfiles ())
1994 struct gdbarch
*gdbarch
= get_objfile_arch (objfile
);
1996 /* We don't want to print anything for this objfile until we
1997 actually find a symtab whose name matches. */
1998 int printed_objfile_start
= 0;
2000 for (partial_symtab
*psymtab
: require_partial_symbols (objfile
, 1))
2005 || re_exec (psymtab
->filename
))
2007 if (! printed_objfile_start
)
2009 printf_filtered ("{ objfile %s ", objfile_name (objfile
));
2011 printf_filtered ("((struct objfile *) %s)\n",
2012 host_address_to_string (objfile
));
2013 printed_objfile_start
= 1;
2016 printf_filtered (" { psymtab %s ", psymtab
->filename
);
2018 printf_filtered ("((struct partial_symtab *) %s)\n",
2019 host_address_to_string (psymtab
));
2021 printf_filtered (" readin %s\n",
2022 psymtab
->readin
? "yes" : "no");
2023 printf_filtered (" fullname %s\n",
2025 ? psymtab
->fullname
: "(null)");
2026 printf_filtered (" text addresses ");
2027 fputs_filtered (paddress (gdbarch
,
2028 psymtab
->text_low (objfile
)),
2030 printf_filtered (" -- ");
2031 fputs_filtered (paddress (gdbarch
,
2032 psymtab
->text_high (objfile
)),
2034 printf_filtered ("\n");
2035 printf_filtered (" psymtabs_addrmap_supported %s\n",
2036 (psymtab
->psymtabs_addrmap_supported
2038 printf_filtered (" globals ");
2039 if (psymtab
->n_global_syms
)
2041 auto p
= &(objfile
->partial_symtabs
2042 ->global_psymbols
[psymtab
->globals_offset
]);
2045 ("(* (struct partial_symbol **) %s @ %d)\n",
2046 host_address_to_string (p
),
2047 psymtab
->n_global_syms
);
2050 printf_filtered ("(none)\n");
2051 printf_filtered (" statics ");
2052 if (psymtab
->n_static_syms
)
2054 auto p
= &(objfile
->partial_symtabs
2055 ->static_psymbols
[psymtab
->statics_offset
]);
2058 ("(* (struct partial_symbol **) %s @ %d)\n",
2059 host_address_to_string (p
),
2060 psymtab
->n_static_syms
);
2063 printf_filtered ("(none)\n");
2064 printf_filtered (" dependencies ");
2065 if (psymtab
->number_of_dependencies
)
2069 printf_filtered ("{\n");
2070 for (i
= 0; i
< psymtab
->number_of_dependencies
; i
++)
2072 struct partial_symtab
*dep
= psymtab
->dependencies
[i
];
2074 /* Note the string concatenation there --- no
2076 printf_filtered (" psymtab %s "
2077 "((struct partial_symtab *) %s)\n",
2079 host_address_to_string (dep
));
2081 printf_filtered (" }\n");
2084 printf_filtered ("(none)\n");
2085 printf_filtered (" }\n");
2089 if (printed_objfile_start
)
2090 printf_filtered ("}\n");
2094 /* Check consistency of currently expanded psymtabs vs symtabs. */
2097 maintenance_check_psymtabs (const char *ignore
, int from_tty
)
2100 struct compunit_symtab
*cust
= NULL
;
2101 const struct blockvector
*bv
;
2102 const struct block
*b
;
2105 for (objfile
*objfile
: current_program_space
->objfiles ())
2106 for (partial_symtab
*ps
: require_partial_symbols (objfile
, 1))
2108 struct gdbarch
*gdbarch
= get_objfile_arch (objfile
);
2110 /* We don't call psymtab_to_symtab here because that may cause symtab
2111 expansion. When debugging a problem it helps if checkers leave
2112 things unchanged. */
2113 cust
= ps
->compunit_symtab
;
2115 /* First do some checks that don't require the associated symtab. */
2116 if (ps
->text_high (objfile
) < ps
->text_low (objfile
))
2118 printf_filtered ("Psymtab ");
2119 puts_filtered (ps
->filename
);
2120 printf_filtered (" covers bad range ");
2121 fputs_filtered (paddress (gdbarch
, ps
->text_low (objfile
)),
2123 printf_filtered (" - ");
2124 fputs_filtered (paddress (gdbarch
, ps
->text_high (objfile
)),
2126 printf_filtered ("\n");
2130 /* Now do checks requiring the associated symtab. */
2133 bv
= COMPUNIT_BLOCKVECTOR (cust
);
2134 b
= BLOCKVECTOR_BLOCK (bv
, STATIC_BLOCK
);
2135 partial_symbol
**psym
2136 = &objfile
->partial_symtabs
->static_psymbols
[ps
->statics_offset
];
2137 length
= ps
->n_static_syms
;
2140 sym
= block_lookup_symbol (b
, symbol_search_name (&(*psym
)->ginfo
),
2141 symbol_name_match_type::SEARCH_NAME
,
2145 printf_filtered ("Static symbol `");
2146 puts_filtered ((*psym
)->ginfo
.name
);
2147 printf_filtered ("' only found in ");
2148 puts_filtered (ps
->filename
);
2149 printf_filtered (" psymtab\n");
2153 b
= BLOCKVECTOR_BLOCK (bv
, GLOBAL_BLOCK
);
2154 psym
= &objfile
->partial_symtabs
->global_psymbols
[ps
->globals_offset
];
2155 length
= ps
->n_global_syms
;
2158 sym
= block_lookup_symbol (b
, symbol_search_name (&(*psym
)->ginfo
),
2159 symbol_name_match_type::SEARCH_NAME
,
2163 printf_filtered ("Global symbol `");
2164 puts_filtered ((*psym
)->ginfo
.name
);
2165 printf_filtered ("' only found in ");
2166 puts_filtered (ps
->filename
);
2167 printf_filtered (" psymtab\n");
2171 if (ps
->raw_text_high () != 0
2172 && (ps
->text_low (objfile
) < BLOCK_START (b
)
2173 || ps
->text_high (objfile
) > BLOCK_END (b
)))
2175 printf_filtered ("Psymtab ");
2176 puts_filtered (ps
->filename
);
2177 printf_filtered (" covers ");
2178 fputs_filtered (paddress (gdbarch
, ps
->text_low (objfile
)),
2180 printf_filtered (" - ");
2181 fputs_filtered (paddress (gdbarch
, ps
->text_high (objfile
)),
2183 printf_filtered (" but symtab covers only ");
2184 fputs_filtered (paddress (gdbarch
, BLOCK_START (b
)), gdb_stdout
);
2185 printf_filtered (" - ");
2186 fputs_filtered (paddress (gdbarch
, BLOCK_END (b
)), gdb_stdout
);
2187 printf_filtered ("\n");
2193 _initialize_psymtab (void)
2195 add_cmd ("psymbols", class_maintenance
, maintenance_print_psymbols
, _("\
2196 Print dump of current partial symbol definitions.\n\
2197 Usage: mt print psymbols [-objfile OBJFILE] [-pc ADDRESS] [--] [OUTFILE]\n\
2198 mt print psymbols [-objfile OBJFILE] [-source SOURCE] [--] [OUTFILE]\n\
2199 Entries in the partial symbol table are dumped to file OUTFILE,\n\
2200 or the terminal if OUTFILE is unspecified.\n\
2201 If ADDRESS is provided, dump only the file for that address.\n\
2202 If SOURCE is provided, dump only that file's symbols.\n\
2203 If OBJFILE is provided, dump only that file's minimal symbols."),
2204 &maintenanceprintlist
);
2206 add_cmd ("psymtabs", class_maintenance
, maintenance_info_psymtabs
, _("\
2207 List the partial symbol tables for all object files.\n\
2208 This does not include information about individual partial symbols,\n\
2209 just the symbol table structures themselves."),
2210 &maintenanceinfolist
);
2212 add_cmd ("check-psymtabs", class_maintenance
, maintenance_check_psymtabs
,
2214 Check consistency of currently expanded psymtabs versus symtabs."),