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