gdb/testsuite: Add test for case where gdb_demangle returns NULL
[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 {
763 printf_filtered (_("Reading in symbols for %s..."),
764 pst->filename);
765 gdb_flush (gdb_stdout);
766 }
767
891813be 768 pst->read_symtab (objfile);
077cbab2
TT
769
770 /* Finish up the debug error message. */
771 if (info_verbose)
772 printf_filtered (_("done.\n"));
ccefe4c4
TT
773 }
774
128a391f 775 return pst->get_compunit_symtab ();
ccefe4c4
TT
776}
777
95cf5869
DE
778/* Psymtab version of find_last_source_symtab. See its definition in
779 the definition of quick_symbol_functions in symfile.h. */
83827540 780
ccefe4c4 781static struct symtab *
83827540 782psym_find_last_source_symtab (struct objfile *ofp)
ccefe4c4 783{
95cf5869 784 struct partial_symtab *cs_pst = NULL;
ccefe4c4 785
26abc753 786 for (partial_symtab *ps : require_partial_symbols (ofp, true))
ccefe4c4
TT
787 {
788 const char *name = ps->filename;
789 int len = strlen (name);
ad3bbd48 790
ccefe4c4
TT
791 if (!(len > 2 && (strcmp (&name[len - 2], ".h") == 0
792 || strcmp (name, "<<C++-namespaces>>") == 0)))
793 cs_pst = ps;
794 }
795
796 if (cs_pst)
797 {
128a391f 798 if (cs_pst->readin_p ())
ccefe4c4
TT
799 {
800 internal_error (__FILE__, __LINE__,
801 _("select_source_symtab: "
802 "readin pst found and no symtabs."));
803 }
804 else
43f3e411
DE
805 {
806 struct compunit_symtab *cust = psymtab_to_symtab (ofp, cs_pst);
807
808 if (cust == NULL)
809 return NULL;
810 return compunit_primary_filetab (cust);
811 }
ccefe4c4
TT
812 }
813 return NULL;
814}
815
95cf5869
DE
816/* Psymtab version of forget_cached_source_info. See its definition in
817 the definition of quick_symbol_functions in symfile.h. */
83827540 818
ccefe4c4 819static void
83827540 820psym_forget_cached_source_info (struct objfile *objfile)
ccefe4c4 821{
26abc753 822 for (partial_symtab *pst : require_partial_symbols (objfile, true))
ccefe4c4
TT
823 {
824 if (pst->fullname != NULL)
825 {
826 xfree (pst->fullname);
827 pst->fullname = NULL;
828 }
829 }
830}
831
832static void
02e9e7f7 833print_partial_symbols (struct gdbarch *gdbarch, struct objfile *objfile,
a121b7c1 834 struct partial_symbol **p, int count, const char *what,
ccefe4c4
TT
835 struct ui_file *outfile)
836{
837 fprintf_filtered (outfile, " %s partial symbols:\n", what);
838 while (count-- > 0)
839 {
27618ce4 840 QUIT;
4d4eaa30 841 fprintf_filtered (outfile, " `%s'", (*p)->ginfo.linkage_name ());
c9d95fa3 842 if ((*p)->ginfo.demangled_name () != NULL)
ccefe4c4 843 {
af97b416 844 fprintf_filtered (outfile, " `%s'",
c9d95fa3 845 (*p)->ginfo.demangled_name ());
ccefe4c4
TT
846 }
847 fputs_filtered (", ", outfile);
8a6d4234 848 switch ((*p)->domain)
ccefe4c4
TT
849 {
850 case UNDEF_DOMAIN:
851 fputs_filtered ("undefined domain, ", outfile);
852 break;
853 case VAR_DOMAIN:
0df8b418 854 /* This is the usual thing -- don't print it. */
ccefe4c4
TT
855 break;
856 case STRUCT_DOMAIN:
857 fputs_filtered ("struct domain, ", outfile);
858 break;
06ff036e
AB
859 case MODULE_DOMAIN:
860 fputs_filtered ("module domain, ", outfile);
861 break;
ccefe4c4
TT
862 case LABEL_DOMAIN:
863 fputs_filtered ("label domain, ", outfile);
864 break;
06ff036e
AB
865 case COMMON_BLOCK_DOMAIN:
866 fputs_filtered ("common block domain, ", outfile);
867 break;
ccefe4c4
TT
868 default:
869 fputs_filtered ("<invalid domain>, ", outfile);
870 break;
871 }
8a6d4234 872 switch ((*p)->aclass)
ccefe4c4
TT
873 {
874 case LOC_UNDEF:
875 fputs_filtered ("undefined", outfile);
876 break;
877 case LOC_CONST:
878 fputs_filtered ("constant int", outfile);
879 break;
880 case LOC_STATIC:
881 fputs_filtered ("static", outfile);
882 break;
883 case LOC_REGISTER:
884 fputs_filtered ("register", outfile);
885 break;
886 case LOC_ARG:
887 fputs_filtered ("pass by value", outfile);
888 break;
889 case LOC_REF_ARG:
890 fputs_filtered ("pass by reference", outfile);
891 break;
892 case LOC_REGPARM_ADDR:
893 fputs_filtered ("register address parameter", outfile);
894 break;
895 case LOC_LOCAL:
896 fputs_filtered ("stack parameter", outfile);
897 break;
898 case LOC_TYPEDEF:
899 fputs_filtered ("type", outfile);
900 break;
901 case LOC_LABEL:
902 fputs_filtered ("label", outfile);
903 break;
904 case LOC_BLOCK:
905 fputs_filtered ("function", outfile);
906 break;
907 case LOC_CONST_BYTES:
908 fputs_filtered ("constant bytes", outfile);
909 break;
910 case LOC_UNRESOLVED:
911 fputs_filtered ("unresolved", outfile);
912 break;
913 case LOC_OPTIMIZED_OUT:
914 fputs_filtered ("optimized out", outfile);
915 break;
916 case LOC_COMPUTED:
917 fputs_filtered ("computed at runtime", outfile);
918 break;
919 default:
920 fputs_filtered ("<invalid location>", outfile);
921 break;
922 }
923 fputs_filtered (", ", outfile);
02e9e7f7 924 fputs_filtered (paddress (gdbarch, (*p)->unrelocated_address ()), outfile);
ccefe4c4
TT
925 fprintf_filtered (outfile, "\n");
926 p++;
927 }
928}
929
930static void
931dump_psymtab (struct objfile *objfile, struct partial_symtab *psymtab,
932 struct ui_file *outfile)
933{
934 struct gdbarch *gdbarch = get_objfile_arch (objfile);
935 int i;
936
b4c41fc7
DE
937 if (psymtab->anonymous)
938 {
939 fprintf_filtered (outfile, "\nAnonymous partial symtab (%s) ",
940 psymtab->filename);
941 }
942 else
943 {
944 fprintf_filtered (outfile, "\nPartial symtab for source file %s ",
945 psymtab->filename);
946 }
ccefe4c4
TT
947 fprintf_filtered (outfile, "(object ");
948 gdb_print_host_address (psymtab, outfile);
949 fprintf_filtered (outfile, ")\n\n");
22068491
TT
950 fprintf_filtered (outfile, " Read from object file %s (",
951 objfile_name (objfile));
ccefe4c4 952 gdb_print_host_address (objfile, outfile);
22068491 953 fprintf_filtered (outfile, ")\n");
ccefe4c4 954
128a391f 955 if (psymtab->readin_p ())
ccefe4c4
TT
956 {
957 fprintf_filtered (outfile,
958 " Full symtab was read (at ");
128a391f 959 gdb_print_host_address (psymtab->get_compunit_symtab (), outfile);
ccefe4c4
TT
960 fprintf_filtered (outfile, ")\n");
961 }
962
ccefe4c4 963 fprintf_filtered (outfile, " Symbols cover text addresses ");
79748972 964 fputs_filtered (paddress (gdbarch, psymtab->text_low (objfile)), outfile);
ccefe4c4 965 fprintf_filtered (outfile, "-");
79748972 966 fputs_filtered (paddress (gdbarch, psymtab->text_high (objfile)), outfile);
ccefe4c4 967 fprintf_filtered (outfile, "\n");
9750bca9
JK
968 fprintf_filtered (outfile, " Address map supported - %s.\n",
969 psymtab->psymtabs_addrmap_supported ? "yes" : "no");
ccefe4c4
TT
970 fprintf_filtered (outfile, " Depends on %d other partial symtabs.\n",
971 psymtab->number_of_dependencies);
972 for (i = 0; i < psymtab->number_of_dependencies; i++)
973 {
974 fprintf_filtered (outfile, " %d ", i);
975 gdb_print_host_address (psymtab->dependencies[i], outfile);
976 fprintf_filtered (outfile, " %s\n",
977 psymtab->dependencies[i]->filename);
978 }
9439a077
TT
979 if (psymtab->user != NULL)
980 {
981 fprintf_filtered (outfile, " Shared partial symtab with user ");
982 gdb_print_host_address (psymtab->user, outfile);
983 fprintf_filtered (outfile, "\n");
984 }
ccefe4c4
TT
985 if (psymtab->n_global_syms > 0)
986 {
d320c2b5
TT
987 print_partial_symbols
988 (gdbarch, objfile,
989 &objfile->partial_symtabs->global_psymbols[psymtab->globals_offset],
990 psymtab->n_global_syms, "Global", outfile);
ccefe4c4
TT
991 }
992 if (psymtab->n_static_syms > 0)
993 {
d320c2b5
TT
994 print_partial_symbols
995 (gdbarch, objfile,
996 &objfile->partial_symtabs->static_psymbols[psymtab->statics_offset],
997 psymtab->n_static_syms, "Static", outfile);
ccefe4c4
TT
998 }
999 fprintf_filtered (outfile, "\n");
1000}
1001
95cf5869
DE
1002/* Psymtab version of print_stats. See its definition in
1003 the definition of quick_symbol_functions in symfile.h. */
83827540 1004
ccefe4c4 1005static void
83827540 1006psym_print_stats (struct objfile *objfile)
ccefe4c4
TT
1007{
1008 int i;
ad3bbd48 1009
ccefe4c4 1010 i = 0;
26abc753 1011 for (partial_symtab *ps : require_partial_symbols (objfile, true))
ccefe4c4 1012 {
128a391f 1013 if (!ps->readin_p ())
ccefe4c4
TT
1014 i++;
1015 }
1016 printf_filtered (_(" Number of psym tables (not yet expanded): %d\n"), i);
1017}
1018
95cf5869
DE
1019/* Psymtab version of dump. See its definition in
1020 the definition of quick_symbol_functions in symfile.h. */
83827540 1021
ccefe4c4 1022static void
83827540 1023psym_dump (struct objfile *objfile)
ccefe4c4
TT
1024{
1025 struct partial_symtab *psymtab;
1026
d320c2b5 1027 if (objfile->partial_symtabs->psymtabs)
ccefe4c4
TT
1028 {
1029 printf_filtered ("Psymtabs:\n");
d320c2b5 1030 for (psymtab = objfile->partial_symtabs->psymtabs;
ccefe4c4
TT
1031 psymtab != NULL;
1032 psymtab = psymtab->next)
1033 {
1034 printf_filtered ("%s at ",
1035 psymtab->filename);
1036 gdb_print_host_address (psymtab, gdb_stdout);
1037 printf_filtered (", ");
ccefe4c4
TT
1038 wrap_here (" ");
1039 }
1040 printf_filtered ("\n\n");
1041 }
1042}
1043
95cf5869
DE
1044/* Psymtab version of expand_symtabs_for_function. See its definition in
1045 the definition of quick_symbol_functions in symfile.h. */
ccefe4c4
TT
1046
1047static void
83827540
DE
1048psym_expand_symtabs_for_function (struct objfile *objfile,
1049 const char *func_name)
ccefe4c4 1050{
26abc753 1051 for (partial_symtab *ps : require_partial_symbols (objfile, true))
b22a7c6a 1052 {
128a391f 1053 if (ps->readin_p ())
b22a7c6a 1054 continue;
ccefe4c4 1055
b22a7c6a
TT
1056 if ((lookup_partial_symbol (objfile, ps, func_name, 1, VAR_DOMAIN)
1057 != NULL)
1058 || (lookup_partial_symbol (objfile, ps, func_name, 0, VAR_DOMAIN)
1059 != NULL))
1060 psymtab_to_symtab (objfile, ps);
1061 }
ccefe4c4
TT
1062}
1063
95cf5869
DE
1064/* Psymtab version of expand_all_symtabs. See its definition in
1065 the definition of quick_symbol_functions in symfile.h. */
83827540 1066
ccefe4c4 1067static void
83827540 1068psym_expand_all_symtabs (struct objfile *objfile)
ccefe4c4 1069{
26abc753 1070 for (partial_symtab *psymtab : require_partial_symbols (objfile, true))
b22a7c6a 1071 psymtab_to_symtab (objfile, psymtab);
ccefe4c4
TT
1072}
1073
95cf5869
DE
1074/* Psymtab version of expand_symtabs_with_fullname. See its definition in
1075 the definition of quick_symbol_functions in symfile.h. */
83827540 1076
ccefe4c4 1077static void
83827540
DE
1078psym_expand_symtabs_with_fullname (struct objfile *objfile,
1079 const char *fullname)
ccefe4c4 1080{
26abc753 1081 for (partial_symtab *p : require_partial_symbols (objfile, true))
ccefe4c4 1082 {
b4c41fc7
DE
1083 /* Anonymous psymtabs don't have a name of a source file. */
1084 if (p->anonymous)
1085 continue;
1086
5ff888ce
DE
1087 /* psymtab_to_fullname tries to open the file which is slow.
1088 Don't call it if we know the basenames don't match. */
1089 if ((basenames_may_differ
1090 || filename_cmp (lbasename (fullname), lbasename (p->filename)) == 0)
1091 && filename_cmp (fullname, psymtab_to_fullname (p)) == 0)
5c80ed9d 1092 psymtab_to_symtab (objfile, p);
ccefe4c4
TT
1093 }
1094}
1095
95cf5869
DE
1096/* Psymtab version of map_symbol_filenames. See its definition in
1097 the definition of quick_symbol_functions in symfile.h. */
83827540 1098
ccefe4c4 1099static void
83827540
DE
1100psym_map_symbol_filenames (struct objfile *objfile,
1101 symbol_filename_ftype *fun, void *data,
1102 int need_fullname)
ccefe4c4 1103{
26abc753 1104 for (partial_symtab *ps : require_partial_symbols (objfile, true))
ccefe4c4
TT
1105 {
1106 const char *fullname;
1107
128a391f 1108 if (ps->readin_p ())
ccefe4c4
TT
1109 continue;
1110
f80c6f3f
DE
1111 /* We can skip shared psymtabs here, because any file name will be
1112 attached to the unshared psymtab. */
1113 if (ps->user != NULL)
1114 continue;
1115
b4c41fc7
DE
1116 /* Anonymous psymtabs don't have a file name. */
1117 if (ps->anonymous)
1118 continue;
1119
821296b7 1120 QUIT;
74e2f255
DE
1121 if (need_fullname)
1122 fullname = psymtab_to_fullname (ps);
1123 else
1124 fullname = NULL;
2837d59e 1125 (*fun) (ps->filename, fullname, data);
ccefe4c4
TT
1126 }
1127}
1128
ccefe4c4
TT
1129/* Finds the fullname that a partial_symtab represents.
1130
1131 If this functions finds the fullname, it will save it in ps->fullname
1132 and it will also return the value.
1133
1134 If this function fails to find the file that this partial_symtab represents,
1135 NULL will be returned and ps->fullname will be set to NULL. */
256f06f3 1136
da5132d3 1137static const char *
ccefe4c4
TT
1138psymtab_to_fullname (struct partial_symtab *ps)
1139{
fbd9ab74 1140 gdb_assert (!ps->anonymous);
ccefe4c4 1141
256f06f3
DE
1142 /* Use cached copy if we have it.
1143 We rely on forget_cached_source_info being called appropriately
1144 to handle cases like the file being moved. */
fbd9ab74
JK
1145 if (ps->fullname == NULL)
1146 {
e0cc99a6 1147 gdb::unique_xmalloc_ptr<char> fullname;
2179fbc3
TT
1148 scoped_fd fd = find_and_open_source (ps->filename, ps->dirname,
1149 &fullname);
e0cc99a6 1150 ps->fullname = fullname.release ();
256f06f3 1151
2179fbc3 1152 if (fd.get () < 0)
fbd9ab74 1153 {
fbd9ab74
JK
1154 /* rewrite_source_path would be applied by find_and_open_source, we
1155 should report the pathname where GDB tried to find the file. */
ccefe4c4 1156
fbd9ab74 1157 if (ps->dirname == NULL || IS_ABSOLUTE_PATH (ps->filename))
0b581c69 1158 fullname.reset (xstrdup (ps->filename));
fbd9ab74 1159 else
0b581c69
TT
1160 fullname.reset (concat (ps->dirname, SLASH_STRING,
1161 ps->filename, (char *) NULL));
fbd9ab74 1162
0b581c69 1163 ps->fullname = rewrite_source_path (fullname.get ()).release ();
fbd9ab74 1164 if (ps->fullname == NULL)
0b581c69 1165 ps->fullname = fullname.release ();
fbd9ab74 1166 }
95cf5869 1167 }
fbd9ab74
JK
1168
1169 return ps->fullname;
ccefe4c4
TT
1170}
1171
95cf5869
DE
1172/* Psymtab version of map_matching_symbols. See its definition in
1173 the definition of quick_symbol_functions in symfile.h. */
40658b94 1174
ccefe4c4 1175static void
199b4314
TT
1176psym_map_matching_symbols
1177 (struct objfile *objfile,
b054970d 1178 const lookup_name_info &name, domain_enum domain,
199b4314
TT
1179 int global,
1180 gdb::function_view<symbol_found_callback_ftype> callback,
199b4314 1181 symbol_compare_ftype *ordered_compare)
ccefe4c4 1182{
40658b94 1183 const int block_kind = global ? GLOBAL_BLOCK : STATIC_BLOCK;
ccefe4c4 1184
26abc753 1185 for (partial_symtab *ps : require_partial_symbols (objfile, true))
ccefe4c4
TT
1186 {
1187 QUIT;
128a391f 1188 if (ps->readin_p ()
b054970d 1189 || match_partial_symbol (objfile, ps, global, name, domain,
40658b94 1190 ordered_compare))
ccefe4c4 1191 {
43f3e411 1192 struct compunit_symtab *cust = psymtab_to_symtab (objfile, ps);
582942f4 1193 const struct block *block;
ad3bbd48 1194
43f3e411 1195 if (cust == NULL)
ccefe4c4 1196 continue;
43f3e411 1197 block = BLOCKVECTOR_BLOCK (COMPUNIT_BLOCKVECTOR (cust), block_kind);
b054970d 1198 if (!iterate_over_symbols_terminated (block, name,
6a3dbf1b 1199 domain, callback))
40658b94 1200 return;
ccefe4c4
TT
1201 }
1202 }
95cf5869 1203}
ccefe4c4 1204
14bc53a8
PA
1205/* A helper for psym_expand_symtabs_matching that handles searching
1206 included psymtabs. This returns true if a symbol is found, and
1207 false otherwise. It also updates the 'searched_flag' on the
9439a077
TT
1208 various psymtabs that it searches. */
1209
14bc53a8
PA
1210static bool
1211recursively_search_psymtabs
d2f7dcb2
JB
1212 (struct partial_symtab *ps,
1213 struct objfile *objfile,
1214 enum search_domain domain,
b5ec771e 1215 const lookup_name_info &lookup_name,
14bc53a8 1216 gdb::function_view<expand_symtabs_symbol_matcher_ftype> sym_matcher)
9439a077 1217{
9439a077 1218 int keep_going = 1;
f486487f 1219 enum psymtab_search_status result = PST_SEARCHED_AND_NOT_FOUND;
9439a077
TT
1220 int i;
1221
1222 if (ps->searched_flag != PST_NOT_SEARCHED)
1223 return ps->searched_flag == PST_SEARCHED_AND_FOUND;
1224
1225 /* Recurse into shared psymtabs first, because they may have already
1226 been searched, and this could save some time. */
1227 for (i = 0; i < ps->number_of_dependencies; ++i)
1228 {
1229 int r;
1230
1231 /* Skip non-shared dependencies, these are handled elsewhere. */
1232 if (ps->dependencies[i]->user == NULL)
1233 continue;
1234
1235 r = recursively_search_psymtabs (ps->dependencies[i],
b5ec771e
PA
1236 objfile, domain, lookup_name,
1237 sym_matcher);
9439a077
TT
1238 if (r != 0)
1239 {
1240 ps->searched_flag = PST_SEARCHED_AND_FOUND;
14bc53a8 1241 return true;
9439a077
TT
1242 }
1243 }
1244
af5bf4ad 1245 partial_symbol **gbound
d320c2b5
TT
1246 = (objfile->partial_symtabs->global_psymbols.data ()
1247 + ps->globals_offset + ps->n_global_syms);
af5bf4ad 1248 partial_symbol **sbound
d320c2b5
TT
1249 = (objfile->partial_symtabs->static_psymbols.data ()
1250 + ps->statics_offset + ps->n_static_syms);
af5bf4ad 1251 partial_symbol **bound = gbound;
9439a077
TT
1252
1253 /* Go through all of the symbols stored in a partial
1254 symtab in one loop. */
d320c2b5
TT
1255 partial_symbol **psym = (objfile->partial_symtabs->global_psymbols.data ()
1256 + ps->globals_offset);
9439a077
TT
1257 while (keep_going)
1258 {
1259 if (psym >= bound)
1260 {
1261 if (bound == gbound && ps->n_static_syms != 0)
1262 {
d320c2b5
TT
1263 psym = (objfile->partial_symtabs->static_psymbols.data ()
1264 + ps->statics_offset);
9439a077
TT
1265 bound = sbound;
1266 }
1267 else
1268 keep_going = 0;
1269 continue;
1270 }
1271 else
1272 {
1273 QUIT;
1274
b5ec771e 1275 if ((domain == ALL_DOMAIN
59c35742
AB
1276 || (domain == MODULES_DOMAIN
1277 && (*psym)->domain == MODULE_DOMAIN)
b5ec771e 1278 || (domain == VARIABLES_DOMAIN
8a6d4234
TT
1279 && (*psym)->aclass != LOC_TYPEDEF
1280 && (*psym)->aclass != LOC_BLOCK)
b5ec771e 1281 || (domain == FUNCTIONS_DOMAIN
8a6d4234 1282 && (*psym)->aclass == LOC_BLOCK)
b5ec771e 1283 || (domain == TYPES_DOMAIN
8a6d4234 1284 && (*psym)->aclass == LOC_TYPEDEF))
b5ec771e 1285 && psymbol_name_matches (*psym, lookup_name)
af97b416 1286 && (sym_matcher == NULL
c9d95fa3 1287 || sym_matcher ((*psym)->ginfo.search_name ())))
9439a077
TT
1288 {
1289 /* Found a match, so notify our caller. */
1290 result = PST_SEARCHED_AND_FOUND;
1291 keep_going = 0;
1292 }
1293 }
1294 psym++;
1295 }
1296
1297 ps->searched_flag = result;
1298 return result == PST_SEARCHED_AND_FOUND;
1299}
1300
95cf5869
DE
1301/* Psymtab version of expand_symtabs_matching. See its definition in
1302 the definition of quick_symbol_functions in symfile.h. */
83827540 1303
ccefe4c4 1304static void
83827540 1305psym_expand_symtabs_matching
f8eba3c6 1306 (struct objfile *objfile,
14bc53a8 1307 gdb::function_view<expand_symtabs_file_matcher_ftype> file_matcher,
c62446b1 1308 const lookup_name_info &lookup_name_in,
14bc53a8
PA
1309 gdb::function_view<expand_symtabs_symbol_matcher_ftype> symbol_matcher,
1310 gdb::function_view<expand_symtabs_exp_notify_ftype> expansion_notify,
b5ec771e 1311 enum search_domain domain)
ccefe4c4 1312{
c62446b1
PA
1313 lookup_name_info lookup_name = lookup_name_in.make_ignore_params ();
1314
9439a077 1315 /* Clear the search flags. */
26abc753 1316 for (partial_symtab *ps : require_partial_symbols (objfile, true))
b22a7c6a 1317 ps->searched_flag = PST_NOT_SEARCHED;
ccefe4c4 1318
f252c6d5 1319 for (partial_symtab *ps : objfile->psymtabs ())
9439a077 1320 {
30b3dd9d
DE
1321 QUIT;
1322
128a391f 1323 if (ps->readin_p ())
ccefe4c4
TT
1324 continue;
1325
9439a077
TT
1326 /* We skip shared psymtabs because file-matching doesn't apply
1327 to them; but we search them later in the loop. */
1328 if (ps->user != NULL)
ccefe4c4
TT
1329 continue;
1330
b4c41fc7
DE
1331 if (file_matcher)
1332 {
14bc53a8 1333 bool match;
680d1742 1334
b4c41fc7
DE
1335 if (ps->anonymous)
1336 continue;
fbd9ab74 1337
14bc53a8 1338 match = file_matcher (ps->filename, false);
680d1742
DE
1339 if (!match)
1340 {
1341 /* Before we invoke realpath, which can get expensive when many
1342 files are involved, do a quick comparison of the basenames. */
1343 if (basenames_may_differ
14bc53a8
PA
1344 || file_matcher (lbasename (ps->filename), true))
1345 match = file_matcher (psymtab_to_fullname (ps), false);
680d1742
DE
1346 }
1347 if (!match)
b4c41fc7
DE
1348 continue;
1349 }
ccefe4c4 1350
b5ec771e
PA
1351 if (recursively_search_psymtabs (ps, objfile, domain,
1352 lookup_name, symbol_matcher))
276d885b
GB
1353 {
1354 struct compunit_symtab *symtab =
1355 psymtab_to_symtab (objfile, ps);
1356
1357 if (expansion_notify != NULL)
14bc53a8 1358 expansion_notify (symtab);
276d885b 1359 }
ccefe4c4
TT
1360 }
1361}
1362
95cf5869
DE
1363/* Psymtab version of has_symbols. See its definition in
1364 the definition of quick_symbol_functions in symfile.h. */
83827540 1365
ccefe4c4 1366static int
83827540 1367psym_has_symbols (struct objfile *objfile)
ccefe4c4 1368{
d320c2b5 1369 return objfile->partial_symtabs->psymtabs != NULL;
ccefe4c4
TT
1370}
1371
71a3c369
TT
1372/* Helper function for psym_find_compunit_symtab_by_address that fills
1373 in psymbol_map for a given range of psymbols. */
1374
1375static void
1376psym_fill_psymbol_map (struct objfile *objfile,
1377 struct partial_symtab *psymtab,
1378 std::set<CORE_ADDR> *seen_addrs,
1379 const std::vector<partial_symbol *> &symbols,
1380 int start,
1381 int length)
1382{
1383 for (int i = 0; i < length; ++i)
1384 {
1385 struct partial_symbol *psym = symbols[start + i];
1386
8a6d4234 1387 if (psym->aclass == LOC_STATIC)
71a3c369 1388 {
02e9e7f7 1389 CORE_ADDR addr = psym->address (objfile);
71a3c369
TT
1390 if (seen_addrs->find (addr) == seen_addrs->end ())
1391 {
1392 seen_addrs->insert (addr);
1393 objfile->psymbol_map.emplace_back (addr, psymtab);
1394 }
1395 }
1396 }
1397}
1398
1399/* See find_compunit_symtab_by_address in quick_symbol_functions, in
1400 symfile.h. */
1401
1402static compunit_symtab *
1403psym_find_compunit_symtab_by_address (struct objfile *objfile,
1404 CORE_ADDR address)
1405{
1406 if (objfile->psymbol_map.empty ())
1407 {
71a3c369
TT
1408 std::set<CORE_ADDR> seen_addrs;
1409
26abc753 1410 for (partial_symtab *pst : require_partial_symbols (objfile, true))
b22a7c6a
TT
1411 {
1412 psym_fill_psymbol_map (objfile, pst,
1413 &seen_addrs,
d320c2b5 1414 objfile->partial_symtabs->global_psymbols,
b22a7c6a
TT
1415 pst->globals_offset,
1416 pst->n_global_syms);
1417 psym_fill_psymbol_map (objfile, pst,
1418 &seen_addrs,
d320c2b5 1419 objfile->partial_symtabs->static_psymbols,
b22a7c6a
TT
1420 pst->statics_offset,
1421 pst->n_static_syms);
1422 }
71a3c369
TT
1423
1424 objfile->psymbol_map.shrink_to_fit ();
1425
1426 std::sort (objfile->psymbol_map.begin (), objfile->psymbol_map.end (),
1427 [] (const std::pair<CORE_ADDR, partial_symtab *> &a,
1428 const std::pair<CORE_ADDR, partial_symtab *> &b)
1429 {
1430 return a.first < b.first;
1431 });
1432 }
1433
1434 auto iter = std::lower_bound
1435 (objfile->psymbol_map.begin (), objfile->psymbol_map.end (), address,
1436 [] (const std::pair<CORE_ADDR, partial_symtab *> &a,
1437 CORE_ADDR b)
1438 {
1439 return a.first < b;
1440 });
1441
1442 if (iter == objfile->psymbol_map.end () || iter->first != address)
1443 return NULL;
1444
1445 return psymtab_to_symtab (objfile, iter->second);
1446}
1447
ccefe4c4
TT
1448const struct quick_symbol_functions psym_functions =
1449{
83827540
DE
1450 psym_has_symbols,
1451 psym_find_last_source_symtab,
1452 psym_forget_cached_source_info,
1453 psym_map_symtabs_matching_filename,
1454 psym_lookup_symbol,
1455 psym_print_stats,
1456 psym_dump,
83827540
DE
1457 psym_expand_symtabs_for_function,
1458 psym_expand_all_symtabs,
1459 psym_expand_symtabs_with_fullname,
1460 psym_map_matching_symbols,
1461 psym_expand_symtabs_matching,
1462 psym_find_pc_sect_compunit_symtab,
71a3c369 1463 psym_find_compunit_symtab_by_address,
83827540 1464 psym_map_symbol_filenames
ccefe4c4
TT
1465};
1466
1467\f
1468
8763cede 1469static void
5c80ed9d 1470sort_pst_symbols (struct objfile *objfile, struct partial_symtab *pst)
ccefe4c4 1471{
0df8b418 1472 /* Sort the global list; don't sort the static list. */
d320c2b5 1473 auto begin = objfile->partial_symtabs->global_psymbols.begin ();
af5bf4ad
SM
1474 std::advance (begin, pst->globals_offset);
1475
1476 /* The psymbols for this partial_symtab are currently at the end of the
1477 vector. */
d320c2b5 1478 auto end = objfile->partial_symtabs->global_psymbols.end ();
ccefe4c4 1479
af5bf4ad
SM
1480 std::sort (begin, end, [] (partial_symbol *s1, partial_symbol *s2)
1481 {
c9d95fa3
CB
1482 return strcmp_iw_ordered (s1->ginfo.search_name (),
1483 s2->ginfo.search_name ()) < 0;
af5bf4ad 1484 });
ccefe4c4
TT
1485}
1486
c3693a1d
TT
1487/* Partially fill a partial symtab. It will be completely filled at
1488 the end of the symbol list. */
ccefe4c4 1489
c3693a1d
TT
1490partial_symtab::partial_symtab (const char *filename,
1491 struct objfile *objfile,
1492 CORE_ADDR textlow)
1493 : partial_symtab (filename, objfile)
ccefe4c4 1494{
c3693a1d
TT
1495 set_text_low (textlow);
1496 set_text_high (raw_text_low ()); /* default */
1497 globals_offset = objfile->partial_symtabs->global_psymbols.size ();
1498 statics_offset = objfile->partial_symtabs->static_psymbols.size ();
ccefe4c4
TT
1499}
1500
8763cede
DE
1501/* Perform "finishing up" operations of a partial symtab. */
1502
1503void
1504end_psymtab_common (struct objfile *objfile, struct partial_symtab *pst)
1505{
d320c2b5
TT
1506 pst->n_global_syms = (objfile->partial_symtabs->global_psymbols.size ()
1507 - pst->globals_offset);
1508 pst->n_static_syms = (objfile->partial_symtabs->static_psymbols.size ()
1509 - pst->statics_offset);
8763cede
DE
1510
1511 sort_pst_symbols (objfile, pst);
1512}
1513
cbd70537
SW
1514/* Calculate a hash code for the given partial symbol. The hash is
1515 calculated using the symbol's value, language, domain, class
0df8b418 1516 and name. These are the values which are set by
cbd70537
SW
1517 add_psymbol_to_bcache. */
1518
710e1a31 1519static unsigned long
cbd70537
SW
1520psymbol_hash (const void *addr, int length)
1521{
1522 unsigned long h = 0;
1523 struct partial_symbol *psymbol = (struct partial_symbol *) addr;
c1b5c1eb 1524 unsigned int lang = psymbol->ginfo.language ();
8a6d4234
TT
1525 unsigned int domain = psymbol->domain;
1526 unsigned int theclass = psymbol->aclass;
cbd70537 1527
4cbd39b2
CB
1528 h = fast_hash (&psymbol->ginfo.value, sizeof (psymbol->ginfo.value), h);
1529 h = fast_hash (&lang, sizeof (unsigned int), h);
1530 h = fast_hash (&domain, sizeof (unsigned int), h);
1531 h = fast_hash (&theclass, sizeof (unsigned int), h);
4d4eaa30 1532 /* Note that psymbol names are interned via compute_and_set_names, so
e793c052 1533 there's no need to hash the contents of the name here. */
4d4eaa30 1534 h = fast_hash (&psymbol->ginfo.m_name, sizeof (psymbol->ginfo.m_name), h);
cbd70537
SW
1535
1536 return h;
1537}
1538
1539/* Returns true if the symbol at addr1 equals the symbol at addr2.
1540 For the comparison this function uses a symbols value,
1541 language, domain, class and name. */
1542
710e1a31 1543static int
cbd70537
SW
1544psymbol_compare (const void *addr1, const void *addr2, int length)
1545{
1546 struct partial_symbol *sym1 = (struct partial_symbol *) addr1;
1547 struct partial_symbol *sym2 = (struct partial_symbol *) addr2;
1548
af97b416
TT
1549 return (memcmp (&sym1->ginfo.value, &sym2->ginfo.value,
1550 sizeof (sym1->ginfo.value)) == 0
c1b5c1eb 1551 && sym1->ginfo.language () == sym2->ginfo.language ()
8a6d4234
TT
1552 && sym1->domain == sym2->domain
1553 && sym1->aclass == sym2->aclass
e793c052 1554 /* Note that psymbol names are interned via
4d4eaa30 1555 compute_and_set_names, so there's no need to compare the
e793c052 1556 contents of the name here. */
4d4eaa30 1557 && sym1->ginfo.linkage_name () == sym2->ginfo.linkage_name ());
cbd70537
SW
1558}
1559
95cf5869 1560/* Helper function, initialises partial symbol structure and stashes
ccefe4c4
TT
1561 it into objfile's bcache. Note that our caching mechanism will
1562 use all fields of struct partial_symbol to determine hash value of the
1563 structure. In other words, having two symbols with the same name but
1564 different domain (or address) is possible and correct. */
1565
af5bf4ad 1566static struct partial_symbol *
31edb802 1567add_psymbol_to_bcache (gdb::string_view name, bool copy_name,
ccefe4c4 1568 domain_enum domain,
fe978cb0 1569 enum address_class theclass,
79748972 1570 short section,
1762568f 1571 CORE_ADDR coreaddr,
ccefe4c4
TT
1572 enum language language, struct objfile *objfile,
1573 int *added)
1574{
cbd70537 1575 struct partial_symbol psymbol;
af97b416 1576 memset (&psymbol, 0, sizeof (psymbol));
cbd70537 1577
79748972 1578 psymbol.set_unrelocated_address (coreaddr);
af97b416 1579 psymbol.ginfo.section = section;
8a6d4234
TT
1580 psymbol.domain = domain;
1581 psymbol.aclass = theclass;
d3ecddab 1582 psymbol.ginfo.set_language (language, objfile->partial_symtabs->obstack ());
4d4eaa30 1583 psymbol.ginfo.compute_and_set_names (name, copy_name, objfile->per_bfd);
ccefe4c4 1584
0df8b418 1585 /* Stash the partial symbol away in the cache. */
25629dfd
TT
1586 return ((struct partial_symbol *)
1587 objfile->partial_symtabs->psymbol_cache.insert
1588 (&psymbol, sizeof (struct partial_symbol), added));
ccefe4c4
TT
1589}
1590
95cf5869 1591/* Helper function, adds partial symbol to the given partial symbol list. */
ccefe4c4
TT
1592
1593static void
af5bf4ad
SM
1594append_psymbol_to_list (std::vector<partial_symbol *> *list,
1595 struct partial_symbol *psym,
ccefe4c4
TT
1596 struct objfile *objfile)
1597{
af5bf4ad 1598 list->push_back (psym);
ccefe4c4
TT
1599 OBJSTAT (objfile, n_psyms++);
1600}
1601
703a86c2 1602/* See psympriv.h. */
ccefe4c4 1603
7dc25483 1604void
31edb802 1605add_psymbol_to_list (gdb::string_view name, bool copy_name,
ccefe4c4 1606 domain_enum domain,
fe978cb0 1607 enum address_class theclass,
79748972 1608 short section,
75aedd27 1609 psymbol_placement where,
1762568f 1610 CORE_ADDR coreaddr,
ccefe4c4
TT
1611 enum language language, struct objfile *objfile)
1612{
af5bf4ad 1613 struct partial_symbol *psym;
ccefe4c4
TT
1614
1615 int added;
1616
0df8b418 1617 /* Stash the partial symbol away in the cache. */
31edb802 1618 psym = add_psymbol_to_bcache (name, copy_name, domain, theclass,
79748972 1619 section, coreaddr, language, objfile, &added);
ccefe4c4
TT
1620
1621 /* Do not duplicate global partial symbols. */
75aedd27 1622 if (where == psymbol_placement::GLOBAL && !added)
7dc25483 1623 return;
ccefe4c4 1624
0df8b418 1625 /* Save pointer to partial symbol in psymtab, growing symtab if needed. */
75aedd27
TT
1626 std::vector<partial_symbol *> *list
1627 = (where == psymbol_placement::STATIC
d320c2b5
TT
1628 ? &objfile->partial_symtabs->static_psymbols
1629 : &objfile->partial_symtabs->global_psymbols);
ccefe4c4 1630 append_psymbol_to_list (list, psym, objfile);
ccefe4c4
TT
1631}
1632
6eee24ce 1633/* See psympriv.h. */
ccefe4c4
TT
1634
1635void
1636init_psymbol_list (struct objfile *objfile, int total_symbols)
1637{
d320c2b5
TT
1638 if (objfile->partial_symtabs->global_psymbols.capacity () == 0
1639 && objfile->partial_symtabs->static_psymbols.capacity () == 0)
6eee24ce
TT
1640 {
1641 /* Current best guess is that approximately a twentieth of the
1642 total symbols (in a debugging file) are global or static
1643 oriented symbols, then multiply that by slop factor of
1644 two. */
d320c2b5
TT
1645 objfile->partial_symtabs->global_psymbols.reserve (total_symbols / 10);
1646 objfile->partial_symtabs->static_psymbols.reserve (total_symbols / 10);
6eee24ce 1647 }
ccefe4c4
TT
1648}
1649
baa62830
TT
1650/* See psympriv.h. */
1651
32caafd0
TT
1652partial_symtab::partial_symtab (const char *filename_, struct objfile *objfile)
1653 : searched_flag (PST_NOT_SEARCHED),
1654 text_low_valid (0),
1655 text_high_valid (0)
ccefe4c4 1656{
32caafd0 1657 objfile->partial_symtabs->install_psymtab (this);
ccefe4c4 1658
32caafd0 1659 filename
25629dfd 1660 = ((const char *) objfile->per_bfd->filename_cache.insert
32caafd0 1661 (filename_, strlen (filename_) + 1));
ccefe4c4 1662
45cfd468
DE
1663 if (symtab_create_debug)
1664 {
1665 /* Be a bit clever with debugging messages, and don't print objfile
1666 every time, only when it changes. */
1667 static char *last_objfile_name = NULL;
1668
1669 if (last_objfile_name == NULL
4262abfb 1670 || strcmp (last_objfile_name, objfile_name (objfile)) != 0)
45cfd468
DE
1671 {
1672 xfree (last_objfile_name);
4262abfb 1673 last_objfile_name = xstrdup (objfile_name (objfile));
22068491
TT
1674 fprintf_filtered (gdb_stdlog,
1675 "Creating one or more psymtabs for objfile %s ...\n",
1676 last_objfile_name);
45cfd468 1677 }
22068491
TT
1678 fprintf_filtered (gdb_stdlog,
1679 "Created psymtab %s for module %s.\n",
32caafd0 1680 host_address_to_string (this), filename);
45cfd468 1681 }
ccefe4c4
TT
1682}
1683
0494dbec
TT
1684/* See psympriv.h. */
1685
1686void
1687partial_symtab::read_dependencies (struct objfile *objfile)
1688{
1689 for (int i = 0; i < number_of_dependencies; ++i)
1690 {
128a391f 1691 if (!dependencies[i]->readin_p ())
0494dbec
TT
1692 {
1693 /* Inform about additional files to be read in. */
1694 if (info_verbose)
1695 {
1696 fputs_filtered (" ", gdb_stdout);
1697 wrap_here ("");
1698 fputs_filtered ("and ", gdb_stdout);
1699 wrap_here ("");
1700 printf_filtered ("%s...", dependencies[i]->filename);
1701 wrap_here (""); /* Flush output */
1702 gdb_flush (gdb_stdout);
1703 }
1704 dependencies[i]->expand_psymtab (objfile);
1705 }
1706 }
1707}
1708
1709
ccefe4c4 1710void
d320c2b5 1711psymtab_storage::discard_psymtab (struct partial_symtab *pst)
ccefe4c4
TT
1712{
1713 struct partial_symtab **prev_pst;
1714
1715 /* From dbxread.c:
1716 Empty psymtabs happen as a result of header files which don't
1717 have any symbols in them. There can be a lot of them. But this
1718 check is wrong, in that a psymtab with N_SLINE entries but
1719 nothing else is not empty, but we don't realize that. Fixing
1720 that without slowing things down might be tricky. */
1721
0df8b418 1722 /* First, snip it out of the psymtab chain. */
ccefe4c4 1723
d320c2b5 1724 prev_pst = &psymtabs;
ccefe4c4
TT
1725 while ((*prev_pst) != pst)
1726 prev_pst = &((*prev_pst)->next);
1727 (*prev_pst) = pst->next;
6f17252b 1728 delete pst;
ccefe4c4
TT
1729}
1730
ccefe4c4
TT
1731\f
1732
372405a5
DE
1733/* We need to pass a couple of items to the addrmap_foreach function,
1734 so use a struct. */
1735
1736struct dump_psymtab_addrmap_data
1737{
1738 struct objfile *objfile;
1739 struct partial_symtab *psymtab;
1740 struct ui_file *outfile;
1741
1742 /* Non-zero if the previously printed addrmap entry was for PSYMTAB.
1743 If so, we want to print the next one as well (since the next addrmap
1744 entry defines the end of the range). */
1745 int previous_matched;
1746};
1747
1748/* Helper function for dump_psymtab_addrmap to print an addrmap entry. */
1749
1750static int
1751dump_psymtab_addrmap_1 (void *datap, CORE_ADDR start_addr, void *obj)
1752{
709b5518
PA
1753 struct dump_psymtab_addrmap_data *data
1754 = (struct dump_psymtab_addrmap_data *) datap;
372405a5 1755 struct gdbarch *gdbarch = get_objfile_arch (data->objfile);
709b5518 1756 struct partial_symtab *addrmap_psymtab = (struct partial_symtab *) obj;
372405a5
DE
1757 const char *psymtab_address_or_end = NULL;
1758
1759 QUIT;
1760
1761 if (data->psymtab == NULL
1762 || data->psymtab == addrmap_psymtab)
1763 psymtab_address_or_end = host_address_to_string (addrmap_psymtab);
1764 else if (data->previous_matched)
1765 psymtab_address_or_end = "<ends here>";
1766
1767 if (data->psymtab == NULL
1768 || data->psymtab == addrmap_psymtab
1769 || data->previous_matched)
1770 {
1771 fprintf_filtered (data->outfile, " %s%s %s\n",
1772 data->psymtab != NULL ? " " : "",
1773 paddress (gdbarch, start_addr),
1774 psymtab_address_or_end);
1775 }
1776
1777 data->previous_matched = (data->psymtab == NULL
1778 || data->psymtab == addrmap_psymtab);
1779
1780 return 0;
1781}
1782
1783/* Helper function for maintenance_print_psymbols to print the addrmap
1784 of PSYMTAB. If PSYMTAB is NULL print the entire addrmap. */
1785
1786static void
1787dump_psymtab_addrmap (struct objfile *objfile, struct partial_symtab *psymtab,
1788 struct ui_file *outfile)
1789{
1790 struct dump_psymtab_addrmap_data addrmap_dump_data;
1791
34c41c68
DE
1792 if ((psymtab == NULL
1793 || psymtab->psymtabs_addrmap_supported)
d320c2b5 1794 && objfile->partial_symtabs->psymtabs_addrmap != NULL)
372405a5
DE
1795 {
1796 addrmap_dump_data.objfile = objfile;
1797 addrmap_dump_data.psymtab = psymtab;
1798 addrmap_dump_data.outfile = outfile;
1799 addrmap_dump_data.previous_matched = 0;
1800 fprintf_filtered (outfile, "%sddress map:\n",
1801 psymtab == NULL ? "Entire a" : " A");
d320c2b5
TT
1802 addrmap_foreach (objfile->partial_symtabs->psymtabs_addrmap,
1803 dump_psymtab_addrmap_1, &addrmap_dump_data);
372405a5
DE
1804 }
1805}
1806
dfc7bb5b 1807static void
990b9f9f 1808maintenance_print_psymbols (const char *args, int from_tty)
ccefe4c4 1809{
34c41c68 1810 struct ui_file *outfile = gdb_stdout;
34c41c68 1811 char *address_arg = NULL, *source_arg = NULL, *objfile_arg = NULL;
34c41c68
DE
1812 int i, outfile_idx, found;
1813 CORE_ADDR pc = 0;
1814 struct obj_section *section = NULL;
ccefe4c4
TT
1815
1816 dont_repeat ();
1817
773a1edc 1818 gdb_argv argv (args);
ccefe4c4 1819
99e8a4f9 1820 for (i = 0; argv != NULL && argv[i] != NULL; ++i)
ccefe4c4 1821 {
34c41c68
DE
1822 if (strcmp (argv[i], "-pc") == 0)
1823 {
1824 if (argv[i + 1] == NULL)
1825 error (_("Missing pc value"));
1826 address_arg = argv[++i];
1827 }
1828 else if (strcmp (argv[i], "-source") == 0)
1829 {
1830 if (argv[i + 1] == NULL)
1831 error (_("Missing source file"));
1832 source_arg = argv[++i];
1833 }
1834 else if (strcmp (argv[i], "-objfile") == 0)
1835 {
1836 if (argv[i + 1] == NULL)
1837 error (_("Missing objfile name"));
1838 objfile_arg = argv[++i];
1839 }
1840 else if (strcmp (argv[i], "--") == 0)
1841 {
1842 /* End of options. */
1843 ++i;
1844 break;
1845 }
1846 else if (argv[i][0] == '-')
ccefe4c4 1847 {
34c41c68
DE
1848 /* Future proofing: Don't allow OUTFILE to begin with "-". */
1849 error (_("Unknown option: %s"), argv[i]);
ccefe4c4 1850 }
34c41c68
DE
1851 else
1852 break;
ccefe4c4 1853 }
34c41c68 1854 outfile_idx = i;
ccefe4c4 1855
34c41c68
DE
1856 if (address_arg != NULL && source_arg != NULL)
1857 error (_("Must specify at most one of -pc and -source"));
ccefe4c4 1858
d7e74731
PA
1859 stdio_file arg_outfile;
1860
99e8a4f9 1861 if (argv != NULL && argv[outfile_idx] != NULL)
34c41c68 1862 {
34c41c68
DE
1863 if (argv[outfile_idx + 1] != NULL)
1864 error (_("Junk at end of command"));
ee0c3293
TT
1865 gdb::unique_xmalloc_ptr<char> outfile_name
1866 (tilde_expand (argv[outfile_idx]));
1867 if (!arg_outfile.open (outfile_name.get (), FOPEN_WT))
1868 perror_with_name (outfile_name.get ());
d7e74731 1869 outfile = &arg_outfile;
34c41c68 1870 }
ccefe4c4 1871
34c41c68
DE
1872 if (address_arg != NULL)
1873 {
1874 pc = parse_and_eval_address (address_arg);
1875 /* If we fail to find a section, that's ok, try the lookup anyway. */
1876 section = find_pc_section (pc);
1877 }
372405a5 1878
34c41c68 1879 found = 0;
2030c079 1880 for (objfile *objfile : current_program_space->objfiles ())
27618ce4 1881 {
34c41c68
DE
1882 int printed_objfile_header = 0;
1883 int print_for_objfile = 1;
1884
27618ce4 1885 QUIT;
34c41c68
DE
1886 if (objfile_arg != NULL)
1887 print_for_objfile
1888 = compare_filenames_for_search (objfile_name (objfile),
1889 objfile_arg);
1890 if (!print_for_objfile)
1891 continue;
1892
1893 if (address_arg != NULL)
1894 {
1895 struct bound_minimal_symbol msymbol = { NULL, NULL };
1896
1897 /* We don't assume each pc has a unique objfile (this is for
1898 debugging). */
b22a7c6a
TT
1899 struct partial_symtab *ps = find_pc_sect_psymtab (objfile, pc,
1900 section, msymbol);
34c41c68
DE
1901 if (ps != NULL)
1902 {
1903 if (!printed_objfile_header)
1904 {
d7e74731
PA
1905 outfile->printf ("\nPartial symtabs for objfile %s\n",
1906 objfile_name (objfile));
34c41c68
DE
1907 printed_objfile_header = 1;
1908 }
1909 dump_psymtab (objfile, ps, outfile);
1910 dump_psymtab_addrmap (objfile, ps, outfile);
1911 found = 1;
1912 }
1913 }
1914 else
1915 {
26abc753 1916 for (partial_symtab *ps : require_partial_symbols (objfile, true))
34c41c68
DE
1917 {
1918 int print_for_source = 0;
1919
1920 QUIT;
1921 if (source_arg != NULL)
1922 {
1923 print_for_source
1924 = compare_filenames_for_search (ps->filename, source_arg);
1925 found = 1;
1926 }
1927 if (source_arg == NULL
1928 || print_for_source)
1929 {
1930 if (!printed_objfile_header)
1931 {
d7e74731
PA
1932 outfile->printf ("\nPartial symtabs for objfile %s\n",
1933 objfile_name (objfile));
34c41c68
DE
1934 printed_objfile_header = 1;
1935 }
1936 dump_psymtab (objfile, ps, outfile);
1937 dump_psymtab_addrmap (objfile, ps, outfile);
1938 }
1939 }
1940 }
1941
1942 /* If we're printing all the objfile's symbols dump the full addrmap. */
1943
1944 if (address_arg == NULL
1945 && source_arg == NULL
d320c2b5 1946 && objfile->partial_symtabs->psymtabs_addrmap != NULL)
372405a5 1947 {
d7e74731 1948 outfile->puts ("\n");
34c41c68 1949 dump_psymtab_addrmap (objfile, NULL, outfile);
372405a5 1950 }
27618ce4 1951 }
372405a5 1952
34c41c68
DE
1953 if (!found)
1954 {
1955 if (address_arg != NULL)
1956 error (_("No partial symtab for address: %s"), address_arg);
1957 if (source_arg != NULL)
1958 error (_("No partial symtab for source file: %s"), source_arg);
1959 }
ccefe4c4
TT
1960}
1961
1962/* List all the partial symbol tables whose names match REGEXP (optional). */
95cf5869 1963
dfc7bb5b 1964static void
990b9f9f 1965maintenance_info_psymtabs (const char *regexp, int from_tty)
ccefe4c4
TT
1966{
1967 struct program_space *pspace;
ccefe4c4
TT
1968
1969 if (regexp)
1970 re_comp (regexp);
1971
1972 ALL_PSPACES (pspace)
2030c079 1973 for (objfile *objfile : pspace->objfiles ())
99d89cde
TT
1974 {
1975 struct gdbarch *gdbarch = get_objfile_arch (objfile);
ccefe4c4 1976
99d89cde
TT
1977 /* We don't want to print anything for this objfile until we
1978 actually find a symtab whose name matches. */
1979 int printed_objfile_start = 0;
ccefe4c4 1980
26abc753 1981 for (partial_symtab *psymtab : require_partial_symbols (objfile, true))
99d89cde
TT
1982 {
1983 QUIT;
1984
1985 if (! regexp
1986 || re_exec (psymtab->filename))
1987 {
1988 if (! printed_objfile_start)
1989 {
1990 printf_filtered ("{ objfile %s ", objfile_name (objfile));
1991 wrap_here (" ");
1992 printf_filtered ("((struct objfile *) %s)\n",
1993 host_address_to_string (objfile));
1994 printed_objfile_start = 1;
1995 }
1996
1997 printf_filtered (" { psymtab %s ", psymtab->filename);
1998 wrap_here (" ");
1999 printf_filtered ("((struct partial_symtab *) %s)\n",
2000 host_address_to_string (psymtab));
2001
2002 printf_filtered (" readin %s\n",
128a391f 2003 psymtab->readin_p () ? "yes" : "no");
99d89cde
TT
2004 printf_filtered (" fullname %s\n",
2005 psymtab->fullname
2006 ? psymtab->fullname : "(null)");
2007 printf_filtered (" text addresses ");
2008 fputs_filtered (paddress (gdbarch,
2009 psymtab->text_low (objfile)),
2010 gdb_stdout);
2011 printf_filtered (" -- ");
2012 fputs_filtered (paddress (gdbarch,
2013 psymtab->text_high (objfile)),
2014 gdb_stdout);
2015 printf_filtered ("\n");
2016 printf_filtered (" psymtabs_addrmap_supported %s\n",
2017 (psymtab->psymtabs_addrmap_supported
2018 ? "yes" : "no"));
2019 printf_filtered (" globals ");
2020 if (psymtab->n_global_syms)
2021 {
d320c2b5
TT
2022 auto p = &(objfile->partial_symtabs
2023 ->global_psymbols[psymtab->globals_offset]);
99d89cde
TT
2024
2025 printf_filtered
2026 ("(* (struct partial_symbol **) %s @ %d)\n",
2027 host_address_to_string (p),
2028 psymtab->n_global_syms);
2029 }
2030 else
2031 printf_filtered ("(none)\n");
2032 printf_filtered (" statics ");
2033 if (psymtab->n_static_syms)
2034 {
d320c2b5
TT
2035 auto p = &(objfile->partial_symtabs
2036 ->static_psymbols[psymtab->statics_offset]);
99d89cde
TT
2037
2038 printf_filtered
2039 ("(* (struct partial_symbol **) %s @ %d)\n",
2040 host_address_to_string (p),
2041 psymtab->n_static_syms);
2042 }
2043 else
2044 printf_filtered ("(none)\n");
2045 printf_filtered (" dependencies ");
2046 if (psymtab->number_of_dependencies)
2047 {
2048 int i;
2049
2050 printf_filtered ("{\n");
2051 for (i = 0; i < psymtab->number_of_dependencies; i++)
2052 {
2053 struct partial_symtab *dep = psymtab->dependencies[i];
2054
2055 /* Note the string concatenation there --- no
2056 comma. */
2057 printf_filtered (" psymtab %s "
2058 "((struct partial_symtab *) %s)\n",
2059 dep->filename,
2060 host_address_to_string (dep));
2061 }
2062 printf_filtered (" }\n");
2063 }
2064 else
2065 printf_filtered ("(none)\n");
2066 printf_filtered (" }\n");
2067 }
2068 }
ccefe4c4 2069
99d89cde
TT
2070 if (printed_objfile_start)
2071 printf_filtered ("}\n");
2072 }
ccefe4c4
TT
2073}
2074
7d0c9981 2075/* Check consistency of currently expanded psymtabs vs symtabs. */
ccefe4c4 2076
dfc7bb5b 2077static void
990b9f9f 2078maintenance_check_psymtabs (const char *ignore, int from_tty)
ccefe4c4
TT
2079{
2080 struct symbol *sym;
43f3e411 2081 struct compunit_symtab *cust = NULL;
346d1dfe 2082 const struct blockvector *bv;
582942f4 2083 const struct block *b;
ccefe4c4
TT
2084 int length;
2085
2030c079 2086 for (objfile *objfile : current_program_space->objfiles ())
26abc753 2087 for (partial_symtab *ps : require_partial_symbols (objfile, true))
7d0c9981 2088 {
aed57c53 2089 struct gdbarch *gdbarch = get_objfile_arch (objfile);
7d0c9981 2090
aed57c53
TT
2091 /* We don't call psymtab_to_symtab here because that may cause symtab
2092 expansion. When debugging a problem it helps if checkers leave
2093 things unchanged. */
128a391f 2094 cust = ps->get_compunit_symtab ();
aed57c53
TT
2095
2096 /* First do some checks that don't require the associated symtab. */
2097 if (ps->text_high (objfile) < ps->text_low (objfile))
ccefe4c4 2098 {
aed57c53 2099 printf_filtered ("Psymtab ");
ccefe4c4 2100 puts_filtered (ps->filename);
aed57c53
TT
2101 printf_filtered (" covers bad range ");
2102 fputs_filtered (paddress (gdbarch, ps->text_low (objfile)),
2103 gdb_stdout);
2104 printf_filtered (" - ");
2105 fputs_filtered (paddress (gdbarch, ps->text_high (objfile)),
2106 gdb_stdout);
2107 printf_filtered ("\n");
2108 continue;
ccefe4c4 2109 }
aed57c53
TT
2110
2111 /* Now do checks requiring the associated symtab. */
2112 if (cust == NULL)
2113 continue;
2114 bv = COMPUNIT_BLOCKVECTOR (cust);
2115 b = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
d320c2b5
TT
2116 partial_symbol **psym
2117 = &objfile->partial_symtabs->static_psymbols[ps->statics_offset];
aed57c53
TT
2118 length = ps->n_static_syms;
2119 while (length--)
2120 {
c9d95fa3 2121 sym = block_lookup_symbol (b, (*psym)->ginfo.search_name (),
aed57c53
TT
2122 symbol_name_match_type::SEARCH_NAME,
2123 (*psym)->domain);
2124 if (!sym)
2125 {
2126 printf_filtered ("Static symbol `");
4d4eaa30 2127 puts_filtered ((*psym)->ginfo.linkage_name ());
aed57c53
TT
2128 printf_filtered ("' only found in ");
2129 puts_filtered (ps->filename);
2130 printf_filtered (" psymtab\n");
2131 }
2132 psym++;
2133 }
2134 b = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
d320c2b5 2135 psym = &objfile->partial_symtabs->global_psymbols[ps->globals_offset];
aed57c53
TT
2136 length = ps->n_global_syms;
2137 while (length--)
ccefe4c4 2138 {
c9d95fa3 2139 sym = block_lookup_symbol (b, (*psym)->ginfo.search_name (),
aed57c53
TT
2140 symbol_name_match_type::SEARCH_NAME,
2141 (*psym)->domain);
2142 if (!sym)
2143 {
2144 printf_filtered ("Global symbol `");
4d4eaa30 2145 puts_filtered ((*psym)->ginfo.linkage_name ());
aed57c53
TT
2146 printf_filtered ("' only found in ");
2147 puts_filtered (ps->filename);
2148 printf_filtered (" psymtab\n");
2149 }
2150 psym++;
2151 }
2152 if (ps->raw_text_high () != 0
2153 && (ps->text_low (objfile) < BLOCK_START (b)
2154 || ps->text_high (objfile) > BLOCK_END (b)))
2155 {
2156 printf_filtered ("Psymtab ");
ccefe4c4 2157 puts_filtered (ps->filename);
aed57c53
TT
2158 printf_filtered (" covers ");
2159 fputs_filtered (paddress (gdbarch, ps->text_low (objfile)),
2160 gdb_stdout);
2161 printf_filtered (" - ");
2162 fputs_filtered (paddress (gdbarch, ps->text_high (objfile)),
2163 gdb_stdout);
2164 printf_filtered (" but symtab covers only ");
2165 fputs_filtered (paddress (gdbarch, BLOCK_START (b)), gdb_stdout);
2166 printf_filtered (" - ");
2167 fputs_filtered (paddress (gdbarch, BLOCK_END (b)), gdb_stdout);
2168 printf_filtered ("\n");
ccefe4c4 2169 }
ccefe4c4 2170 }
ccefe4c4
TT
2171}
2172
6c265988 2173void _initialize_psymtab ();
dfc7bb5b 2174void
6c265988 2175_initialize_psymtab ()
dfc7bb5b
YQ
2176{
2177 add_cmd ("psymbols", class_maintenance, maintenance_print_psymbols, _("\
2178Print dump of current partial symbol definitions.\n\
48c5e7e2
TT
2179Usage: mt print psymbols [-objfile OBJFILE] [-pc ADDRESS] [--] [OUTFILE]\n\
2180 mt print psymbols [-objfile OBJFILE] [-source SOURCE] [--] [OUTFILE]\n\
34c41c68
DE
2181Entries in the partial symbol table are dumped to file OUTFILE,\n\
2182or the terminal if OUTFILE is unspecified.\n\
2183If ADDRESS is provided, dump only the file for that address.\n\
2184If SOURCE is provided, dump only that file's symbols.\n\
2185If OBJFILE is provided, dump only that file's minimal symbols."),
dfc7bb5b
YQ
2186 &maintenanceprintlist);
2187
2188 add_cmd ("psymtabs", class_maintenance, maintenance_info_psymtabs, _("\
2189List the partial symbol tables for all object files.\n\
2190This does not include information about individual partial symbols,\n\
2191just the symbol table structures themselves."),
2192 &maintenanceinfolist);
2193
7d0c9981
DE
2194 add_cmd ("check-psymtabs", class_maintenance, maintenance_check_psymtabs,
2195 _("\
2196Check consistency of currently expanded psymtabs versus symtabs."),
dfc7bb5b
YQ
2197 &maintenancelist);
2198}
This page took 1.426641 seconds and 4 git commands to generate.