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