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