* NEWS: Mention new parameter basenames-may-differ.
[deliverable/binutils-gdb.git] / gdb / psymtab.c
CommitLineData
ccefe4c4
TT
1/* Partial symbol tables.
2
7b6bb8da 3 Copyright (C) 2009, 2010, 2011 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"
22#include "psympriv.h"
23#include "objfiles.h"
24#include "gdb_assert.h"
25#include "block.h"
26#include "filenames.h"
27#include "source.h"
28#include "addrmap.h"
29#include "gdbtypes.h"
30#include "bcache.h"
31#include "ui-out.h"
32#include "command.h"
33#include "readline/readline.h"
34#include "gdb_regex.h"
40658b94 35#include "dictionary.h"
c00f8484
KS
36#include "language.h"
37#include "cp-support.h"
ccefe4c4
TT
38
39#ifndef DEV_TTY
40#define DEV_TTY "/dev/tty"
41#endif
42
710e1a31
SW
43struct psymbol_bcache
44{
45 struct bcache *bcache;
46};
47
ccefe4c4
TT
48/* A fast way to get from a psymtab to its symtab (after the first time). */
49#define PSYMTAB_TO_SYMTAB(pst) \
50 ((pst) -> symtab != NULL ? (pst) -> symtab : psymtab_to_symtab (pst))
51
40658b94
PH
52static struct partial_symbol *match_partial_symbol (struct partial_symtab *,
53 int,
54 const char *, domain_enum,
2edb89d3
JK
55 symbol_compare_ftype *,
56 symbol_compare_ftype *);
40658b94 57
ccefe4c4
TT
58static struct partial_symbol *lookup_partial_symbol (struct partial_symtab *,
59 const char *, int,
60 domain_enum);
61
62static char *psymtab_to_fullname (struct partial_symtab *ps);
63
64static struct partial_symbol *find_pc_sect_psymbol (struct partial_symtab *,
65 CORE_ADDR,
66 struct obj_section *);
67
68static struct partial_symbol *fixup_psymbol_section (struct partial_symbol
69 *psym,
70 struct objfile *objfile);
71
72static struct symtab *psymtab_to_symtab (struct partial_symtab *pst);
73
b11896a5
TT
74/* Ensure that the partial symbols for OBJFILE have been loaded. This
75 function always returns its argument, as a convenience. */
76
77struct objfile *
78require_partial_symbols (struct objfile *objfile, int verbose)
79{
80 if ((objfile->flags & OBJF_PSYMTABS_READ) == 0)
81 {
82 objfile->flags |= OBJF_PSYMTABS_READ;
83
84 if (objfile->sf->sym_read_psymbols)
85 {
86 if (verbose)
87 {
88 printf_unfiltered (_("Reading symbols from %s..."),
89 objfile->name);
90 gdb_flush (gdb_stdout);
91 }
92 (*objfile->sf->sym_read_psymbols) (objfile);
93 if (verbose)
94 {
95 if (!objfile_has_symbols (objfile))
96 {
97 wrap_here ("");
98 printf_unfiltered (_("(no debugging symbols found)..."));
99 wrap_here ("");
100 }
101
102 printf_unfiltered (_("done.\n"));
103 }
104 }
105 }
106
107 return objfile;
108}
109
110/* Traverse all psymtabs in one objfile, requiring that the psymtabs
111 be read in. */
112
113#define ALL_OBJFILE_PSYMTABS_REQUIRED(objfile, p) \
114 for ((p) = require_partial_symbols (objfile, 1)->psymtabs; \
115 (p) != NULL; \
116 (p) = (p)->next)
117
118/* We want to make sure this file always requires psymtabs. */
119
120#undef ALL_OBJFILE_PSYMTABS
121
122/* Traverse all psymtabs in all objfiles. */
123
124#define ALL_PSYMTABS(objfile, p) \
125 ALL_OBJFILES (objfile) \
126 ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, p)
127
ccefe4c4
TT
128/* Lookup the partial symbol table of a source file named NAME.
129 *If* there is no '/' in the name, a match after a '/'
130 in the psymtab filename will also work. */
131
132static struct partial_symtab *
133lookup_partial_symtab (struct objfile *objfile, const char *name,
134 const char *full_path, const char *real_path)
135{
136 struct partial_symtab *pst;
c011a4f4 137 const char *name_basename = lbasename (name);
ccefe4c4 138
b11896a5 139 ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, pst)
ccefe4c4
TT
140 {
141 if (FILENAME_CMP (name, pst->filename) == 0)
142 {
143 return (pst);
144 }
145
c011a4f4
DE
146 /* Before we invoke realpath, which can get expensive when many
147 files are involved, do a quick comparison of the basenames. */
148 if (! basenames_may_differ
149 && FILENAME_CMP (name_basename, lbasename (pst->filename)) != 0)
150 continue;
151
ccefe4c4
TT
152 /* If the user gave us an absolute path, try to find the file in
153 this symtab and use its absolute path. */
154 if (full_path != NULL)
155 {
156 psymtab_to_fullname (pst);
157 if (pst->fullname != NULL
158 && FILENAME_CMP (full_path, pst->fullname) == 0)
159 {
160 return pst;
161 }
162 }
163
164 if (real_path != NULL)
165 {
166 char *rp = NULL;
167 psymtab_to_fullname (pst);
168 if (pst->fullname != NULL)
169 {
170 rp = gdb_realpath (pst->fullname);
171 make_cleanup (xfree, rp);
172 }
173 if (rp != NULL && FILENAME_CMP (real_path, rp) == 0)
174 {
175 return pst;
176 }
177 }
178 }
179
0df8b418 180 /* Now, search for a matching tail (only if name doesn't have any dirs). */
ccefe4c4 181
c011a4f4 182 if (name_basename == name)
b11896a5 183 ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, pst)
ccefe4c4
TT
184 {
185 if (FILENAME_CMP (lbasename (pst->filename), name) == 0)
186 return (pst);
187 }
188
189 return (NULL);
190}
191
192static int
193lookup_symtab_via_partial_symtab (struct objfile *objfile, const char *name,
194 const char *full_path, const char *real_path,
195 struct symtab **result)
196{
197 struct partial_symtab *ps;
198
199 ps = lookup_partial_symtab (objfile, name, full_path, real_path);
200 if (!ps)
201 return 0;
202
203 if (ps->readin)
204 error (_("Internal: readin %s pst for `%s' found when no symtab found."),
205 ps->filename, name);
206
207 *result = PSYMTAB_TO_SYMTAB (ps);
208 return 1;
209}
210
211/* Find which partial symtab contains PC and SECTION starting at psymtab PST.
212 We may find a different psymtab than PST. See FIND_PC_SECT_PSYMTAB. */
213
214static struct partial_symtab *
215find_pc_sect_psymtab_closer (CORE_ADDR pc, struct obj_section *section,
216 struct partial_symtab *pst,
217 struct minimal_symbol *msymbol)
218{
219 struct objfile *objfile = pst->objfile;
220 struct partial_symtab *tpst;
221 struct partial_symtab *best_pst = pst;
222 CORE_ADDR best_addr = pst->textlow;
223
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. */
228 if (!(objfile->flags & OBJF_REORDERED) &&
0df8b418 229 section == 0) /* Can't validate section this way. */
ccefe4c4
TT
230 return pst;
231
232 if (msymbol == NULL)
233 return (pst);
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 {
244 if (pc >= tpst->textlow && pc < tpst->texthigh)
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. */
253 p = find_pc_sect_psymbol (tpst, pc, section);
254 if (p != NULL
255 && SYMBOL_VALUE_ADDRESS (p)
256 == SYMBOL_VALUE_ADDRESS (msymbol))
257 return tpst;
258
259 /* Also accept the textlow value of a psymtab as a
260 "symbol", to provide some support for partial
261 symbol tables with line information but no debug
262 symbols (e.g. those produced by an assembler). */
263 if (p != NULL)
264 this_addr = SYMBOL_VALUE_ADDRESS (p);
265 else
266 this_addr = tpst->textlow;
267
268 /* Check whether it is closer than our current
269 BEST_ADDR. Since this symbol address is
270 necessarily lower or equal to PC, the symbol closer
271 to PC is the symbol which address is the highest.
272 This way we return the psymtab which contains such
0df8b418 273 best match symbol. This can help in cases where the
ccefe4c4
TT
274 symbol information/debuginfo is not complete, like
275 for instance on IRIX6 with gcc, where no debug info
0df8b418
MS
276 is emitted for statics. (See also the nodebug.exp
277 testcase.) */
ccefe4c4
TT
278 if (this_addr > best_addr)
279 {
280 best_addr = this_addr;
281 best_pst = tpst;
282 }
283 }
284 }
285 return best_pst;
286}
287
288/* Find which partial symtab contains PC and SECTION. Return 0 if
289 none. We return the psymtab that contains a symbol whose address
290 exactly matches PC, or, if we cannot find an exact match, the
291 psymtab that contains a symbol whose address is closest to PC. */
292static struct partial_symtab *
293find_pc_sect_psymtab (struct objfile *objfile, CORE_ADDR pc,
294 struct obj_section *section,
295 struct minimal_symbol *msymbol)
296{
297 struct partial_symtab *pst;
298
299 /* Try just the PSYMTABS_ADDRMAP mapping first as it has better granularity
300 than the later used TEXTLOW/TEXTHIGH one. */
301
302 if (objfile->psymtabs_addrmap != NULL)
303 {
304 pst = addrmap_find (objfile->psymtabs_addrmap, pc);
305 if (pst != NULL)
306 {
307 /* FIXME: addrmaps currently do not handle overlayed sections,
308 so fall back to the non-addrmap case if we're debugging
309 overlays and the addrmap returned the wrong section. */
310 if (overlay_debugging && msymbol && section)
311 {
312 struct partial_symbol *p;
ad3bbd48 313
ccefe4c4
TT
314 /* NOTE: This assumes that every psymbol has a
315 corresponding msymbol, which is not necessarily
316 true; the debug info might be much richer than the
317 object's symbol table. */
318 p = find_pc_sect_psymbol (pst, pc, section);
319 if (!p
320 || SYMBOL_VALUE_ADDRESS (p)
321 != SYMBOL_VALUE_ADDRESS (msymbol))
322 goto next;
323 }
324
325 /* We do not try to call FIND_PC_SECT_PSYMTAB_CLOSER as
326 PSYMTABS_ADDRMAP we used has already the best 1-byte
327 granularity and FIND_PC_SECT_PSYMTAB_CLOSER may mislead us into
328 a worse chosen section due to the TEXTLOW/TEXTHIGH ranges
329 overlap. */
330
331 return pst;
332 }
333 }
334
335 next:
336
337 /* Existing PSYMTABS_ADDRMAP mapping is present even for PARTIAL_SYMTABs
338 which still have no corresponding full SYMTABs read. But it is not
339 present for non-DWARF2 debug infos not supporting PSYMTABS_ADDRMAP in GDB
340 so far. */
341
342 /* Check even OBJFILE with non-zero PSYMTABS_ADDRMAP as only several of
343 its CUs may be missing in PSYMTABS_ADDRMAP as they may be varying
344 debug info type in single OBJFILE. */
345
b11896a5 346 ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, pst)
ccefe4c4
TT
347 if (pc >= pst->textlow && pc < pst->texthigh)
348 {
349 struct partial_symtab *best_pst;
350
351 best_pst = find_pc_sect_psymtab_closer (pc, section, pst, msymbol);
352 if (best_pst != NULL)
353 return best_pst;
354 }
355
356 return NULL;
357}
358
359static struct symtab *
360find_pc_sect_symtab_from_partial (struct objfile *objfile,
361 struct minimal_symbol *msymbol,
362 CORE_ADDR pc, struct obj_section *section,
363 int warn_if_readin)
364{
365 struct partial_symtab *ps = find_pc_sect_psymtab (objfile, pc, section,
366 msymbol);
367 if (ps)
368 {
369 if (warn_if_readin && ps->readin)
370 /* Might want to error() here (in case symtab is corrupt and
371 will cause a core dump), but maybe we can successfully
372 continue, so let's not. */
373 warning (_("\
374(Internal error: pc %s in read in psymtab, but not in symtab.)\n"),
375 paddress (get_objfile_arch (ps->objfile), pc));
376 return PSYMTAB_TO_SYMTAB (ps);
377 }
378 return NULL;
379}
380
381/* Find which partial symbol within a psymtab matches PC and SECTION.
382 Return 0 if none. */
383
384static struct partial_symbol *
385find_pc_sect_psymbol (struct partial_symtab *psymtab, CORE_ADDR pc,
386 struct obj_section *section)
387{
388 struct partial_symbol *best = NULL, *p, **pp;
389 CORE_ADDR best_pc;
390
391 gdb_assert (psymtab != NULL);
392
0df8b418 393 /* Cope with programs that start at address 0. */
ccefe4c4
TT
394 best_pc = (psymtab->textlow != 0) ? psymtab->textlow - 1 : 0;
395
396 /* Search the global symbols as well as the static symbols, so that
397 find_pc_partial_function doesn't use a minimal symbol and thus
398 cache a bad endaddr. */
399 for (pp = psymtab->objfile->global_psymbols.list + psymtab->globals_offset;
400 (pp - (psymtab->objfile->global_psymbols.list + psymtab->globals_offset)
401 < psymtab->n_global_syms);
402 pp++)
403 {
404 p = *pp;
405 if (SYMBOL_DOMAIN (p) == VAR_DOMAIN
406 && SYMBOL_CLASS (p) == LOC_BLOCK
407 && pc >= SYMBOL_VALUE_ADDRESS (p)
408 && (SYMBOL_VALUE_ADDRESS (p) > best_pc
409 || (psymtab->textlow == 0
410 && best_pc == 0 && SYMBOL_VALUE_ADDRESS (p) == 0)))
411 {
0df8b418 412 if (section) /* Match on a specific section. */
ccefe4c4
TT
413 {
414 fixup_psymbol_section (p, psymtab->objfile);
415 if (!matching_obj_sections (SYMBOL_OBJ_SECTION (p), section))
416 continue;
417 }
418 best_pc = SYMBOL_VALUE_ADDRESS (p);
419 best = p;
420 }
421 }
422
423 for (pp = psymtab->objfile->static_psymbols.list + psymtab->statics_offset;
424 (pp - (psymtab->objfile->static_psymbols.list + psymtab->statics_offset)
425 < psymtab->n_static_syms);
426 pp++)
427 {
428 p = *pp;
429 if (SYMBOL_DOMAIN (p) == VAR_DOMAIN
430 && SYMBOL_CLASS (p) == LOC_BLOCK
431 && pc >= SYMBOL_VALUE_ADDRESS (p)
432 && (SYMBOL_VALUE_ADDRESS (p) > best_pc
433 || (psymtab->textlow == 0
434 && best_pc == 0 && SYMBOL_VALUE_ADDRESS (p) == 0)))
435 {
0df8b418 436 if (section) /* Match on a specific section. */
ccefe4c4
TT
437 {
438 fixup_psymbol_section (p, psymtab->objfile);
439 if (!matching_obj_sections (SYMBOL_OBJ_SECTION (p), section))
440 continue;
441 }
442 best_pc = SYMBOL_VALUE_ADDRESS (p);
443 best = p;
444 }
445 }
446
447 return best;
448}
449
450static struct partial_symbol *
451fixup_psymbol_section (struct partial_symbol *psym, struct objfile *objfile)
452{
453 CORE_ADDR addr;
454
455 if (!psym)
456 return NULL;
457
458 if (SYMBOL_OBJ_SECTION (psym))
459 return psym;
460
461 gdb_assert (objfile);
462
463 switch (SYMBOL_CLASS (psym))
464 {
465 case LOC_STATIC:
466 case LOC_LABEL:
467 case LOC_BLOCK:
468 addr = SYMBOL_VALUE_ADDRESS (psym);
469 break;
470 default:
471 /* Nothing else will be listed in the minsyms -- no use looking
472 it up. */
473 return psym;
474 }
475
476 fixup_section (&psym->ginfo, addr, objfile);
477
478 return psym;
479}
480
481static struct symtab *
482lookup_symbol_aux_psymtabs (struct objfile *objfile,
483 int block_index, const char *name,
484 const domain_enum domain)
485{
486 struct partial_symtab *ps;
487 const int psymtab_index = (block_index == GLOBAL_BLOCK ? 1 : 0);
488
b11896a5 489 ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps)
ccefe4c4
TT
490 {
491 if (!ps->readin && lookup_partial_symbol (ps, name, psymtab_index, domain))
c00f8484
KS
492 {
493 struct symbol *sym = NULL;
494 struct symtab *stab = PSYMTAB_TO_SYMTAB (ps);
495
496 /* Some caution must be observed with overloaded functions
497 and methods, since the psymtab will not contain any overload
498 information (but NAME might contain it). */
499 if (stab->primary)
500 {
501 struct blockvector *bv = BLOCKVECTOR (stab);
502 struct block *block = BLOCKVECTOR_BLOCK (bv, block_index);
503
504 sym = lookup_block_symbol (block, name, domain);
505 }
506
507 if (sym && strcmp_iw (SYMBOL_SEARCH_NAME (sym), name) == 0)
508 return stab;
509
510 /* Keep looking through other psymtabs. */
511 }
ccefe4c4
TT
512 }
513
514 return NULL;
515}
516
40658b94
PH
517/* Look in PST for a symbol in DOMAIN whose name matches NAME. Search
518 the global block of PST if GLOBAL, and otherwise the static block.
519 MATCH is the comparison operation that returns true iff MATCH (s,
520 NAME), where s is a SYMBOL_SEARCH_NAME. If ORDERED_COMPARE is
521 non-null, the symbols in the block are assumed to be ordered
522 according to it (allowing binary search). It must be compatible
523 with MATCH. Returns the symbol, if found, and otherwise NULL. */
524
525static struct partial_symbol *
526match_partial_symbol (struct partial_symtab *pst, int global,
527 const char *name, domain_enum domain,
2edb89d3
JK
528 symbol_compare_ftype *match,
529 symbol_compare_ftype *ordered_compare)
40658b94
PH
530{
531 struct partial_symbol **start, **psym;
532 struct partial_symbol **top, **real_top, **bottom, **center;
533 int length = (global ? pst->n_global_syms : pst->n_static_syms);
534 int do_linear_search = 1;
535
536 if (length == 0)
537 return NULL;
538 start = (global ?
539 pst->objfile->global_psymbols.list + pst->globals_offset :
540 pst->objfile->static_psymbols.list + pst->statics_offset);
541
542 if (global && ordered_compare) /* Can use a binary search. */
543 {
544 do_linear_search = 0;
545
546 /* Binary search. This search is guaranteed to end with center
547 pointing at the earliest partial symbol whose name might be
548 correct. At that point *all* partial symbols with an
549 appropriate name will be checked against the correct
550 domain. */
551
552 bottom = start;
553 top = start + length - 1;
554 real_top = top;
555 while (top > bottom)
556 {
557 center = bottom + (top - bottom) / 2;
558 gdb_assert (center < top);
559 if (!do_linear_search
560 && (SYMBOL_LANGUAGE (*center) == language_java))
561 do_linear_search = 1;
562 if (ordered_compare (SYMBOL_SEARCH_NAME (*center), name) >= 0)
563 top = center;
564 else
565 bottom = center + 1;
566 }
567 gdb_assert (top == bottom);
568
569 while (top <= real_top
570 && match (SYMBOL_SEARCH_NAME (*top), name) == 0)
571 {
572 if (symbol_matches_domain (SYMBOL_LANGUAGE (*top),
573 SYMBOL_DOMAIN (*top), domain))
574 return *top;
575 top++;
576 }
577 }
578
579 /* Can't use a binary search or else we found during the binary search that
580 we should also do a linear search. */
581
582 if (do_linear_search)
583 {
584 for (psym = start; psym < start + length; psym++)
585 {
586 if (symbol_matches_domain (SYMBOL_LANGUAGE (*psym),
587 SYMBOL_DOMAIN (*psym), domain)
588 && match (SYMBOL_SEARCH_NAME (*psym), name) == 0)
589 return *psym;
590 }
591 }
592
593 return NULL;
594}
595
774b6a14
TT
596static void
597pre_expand_symtabs_matching_psymtabs (struct objfile *objfile,
8903c50d
TT
598 enum block_enum block_kind,
599 const char *name,
774b6a14 600 domain_enum domain)
58b6ab13 601{
774b6a14 602 /* Nothing. */
58b6ab13
TT
603}
604
c00f8484
KS
605/* Returns the name used to search psymtabs. Unlike symtabs, psymtabs do
606 not contain any method/function instance information (since this would
607 force reading type information while reading psymtabs). Therefore,
608 if NAME contains overload information, it must be stripped before searching
609 psymtabs.
610
611 The caller is responsible for freeing the return result. */
612
613static char *
614psymtab_search_name (const char *name)
615{
616 switch (current_language->la_language)
617 {
618 case language_cplus:
619 case language_java:
620 {
621 if (strchr (name, '('))
622 {
623 char *ret = cp_remove_params (name);
624
625 if (ret)
626 return ret;
627 }
628 }
629 break;
630
631 default:
632 break;
633 }
634
635 return xstrdup (name);
636}
637
ccefe4c4 638/* Look, in partial_symtab PST, for symbol whose natural name is NAME.
40658b94 639 Check the global symbols if GLOBAL, the static symbols if not. */
ccefe4c4 640
18430289 641static struct partial_symbol *
ccefe4c4
TT
642lookup_partial_symbol (struct partial_symtab *pst, const char *name,
643 int global, domain_enum domain)
644{
ccefe4c4
TT
645 struct partial_symbol **start, **psym;
646 struct partial_symbol **top, **real_top, **bottom, **center;
647 int length = (global ? pst->n_global_syms : pst->n_static_syms);
648 int do_linear_search = 1;
c00f8484
KS
649 char *search_name;
650 struct cleanup *cleanup;
ccefe4c4
TT
651
652 if (length == 0)
653 {
654 return (NULL);
655 }
c00f8484
KS
656
657 search_name = psymtab_search_name (name);
658 cleanup = make_cleanup (xfree, search_name);
ccefe4c4
TT
659 start = (global ?
660 pst->objfile->global_psymbols.list + pst->globals_offset :
661 pst->objfile->static_psymbols.list + pst->statics_offset);
662
0df8b418 663 if (global) /* This means we can use a binary search. */
ccefe4c4
TT
664 {
665 do_linear_search = 0;
666
667 /* Binary search. This search is guaranteed to end with center
668 pointing at the earliest partial symbol whose name might be
669 correct. At that point *all* partial symbols with an
670 appropriate name will be checked against the correct
671 domain. */
672
673 bottom = start;
674 top = start + length - 1;
675 real_top = top;
676 while (top > bottom)
677 {
678 center = bottom + (top - bottom) / 2;
679 if (!(center < top))
3e43a32a
MS
680 internal_error (__FILE__, __LINE__,
681 _("failed internal consistency check"));
ccefe4c4 682 if (!do_linear_search
40658b94 683 && SYMBOL_LANGUAGE (*center) == language_java)
ccefe4c4
TT
684 {
685 do_linear_search = 1;
686 }
c00f8484
KS
687 if (strcmp_iw_ordered (SYMBOL_SEARCH_NAME (*center),
688 search_name) >= 0)
ccefe4c4
TT
689 {
690 top = center;
691 }
692 else
693 {
694 bottom = center + 1;
695 }
696 }
697 if (!(top == bottom))
3e43a32a
MS
698 internal_error (__FILE__, __LINE__,
699 _("failed internal consistency check"));
ccefe4c4 700
559a7a62
JK
701 /* For `case_sensitivity == case_sensitive_off' strcmp_iw_ordered will
702 search more exactly than what matches SYMBOL_MATCHES_SEARCH_NAME. */
703 while (top >= start && SYMBOL_MATCHES_SEARCH_NAME (*top, search_name))
704 top--;
705
706 /* Fixup to have a symbol which matches SYMBOL_MATCHES_SEARCH_NAME. */
707 top++;
708
709 while (top <= real_top && SYMBOL_MATCHES_SEARCH_NAME (*top, search_name))
ccefe4c4
TT
710 {
711 if (symbol_matches_domain (SYMBOL_LANGUAGE (*top),
712 SYMBOL_DOMAIN (*top), domain))
c00f8484
KS
713 {
714 do_cleanups (cleanup);
715 return (*top);
716 }
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 {
728 if (symbol_matches_domain (SYMBOL_LANGUAGE (*psym),
729 SYMBOL_DOMAIN (*psym), domain)
c00f8484
KS
730 && SYMBOL_MATCHES_SEARCH_NAME (*psym, search_name))
731 {
732 do_cleanups (cleanup);
733 return (*psym);
734 }
ccefe4c4
TT
735 }
736 }
737
c00f8484 738 do_cleanups (cleanup);
ccefe4c4
TT
739 return (NULL);
740}
741
742/* Get the symbol table that corresponds to a partial_symtab.
743 This is fast after the first time you do it. In fact, there
744 is an even faster macro PSYMTAB_TO_SYMTAB that does the fast
745 case inline. */
746
747static struct symtab *
748psymtab_to_symtab (struct partial_symtab *pst)
749{
0df8b418 750 /* If it's been looked up before, return it. */
ccefe4c4
TT
751 if (pst->symtab)
752 return pst->symtab;
753
754 /* If it has not yet been read in, read it. */
755 if (!pst->readin)
756 {
757 struct cleanup *back_to = increment_reading_symtab ();
ad3bbd48 758
ccefe4c4
TT
759 (*pst->read_symtab) (pst);
760 do_cleanups (back_to);
761 }
762
763 return pst->symtab;
764}
765
766static void
767relocate_psymtabs (struct objfile *objfile,
768 struct section_offsets *new_offsets,
769 struct section_offsets *delta)
770{
771 struct partial_symbol **psym;
772 struct partial_symtab *p;
773
b11896a5 774 ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, p)
ccefe4c4
TT
775 {
776 p->textlow += ANOFFSET (delta, SECT_OFF_TEXT (objfile));
777 p->texthigh += ANOFFSET (delta, SECT_OFF_TEXT (objfile));
778 }
779
780 for (psym = objfile->global_psymbols.list;
781 psym < objfile->global_psymbols.next;
782 psym++)
783 {
784 fixup_psymbol_section (*psym, objfile);
785 if (SYMBOL_SECTION (*psym) >= 0)
786 SYMBOL_VALUE_ADDRESS (*psym) += ANOFFSET (delta,
787 SYMBOL_SECTION (*psym));
788 }
789 for (psym = objfile->static_psymbols.list;
790 psym < objfile->static_psymbols.next;
791 psym++)
792 {
793 fixup_psymbol_section (*psym, objfile);
794 if (SYMBOL_SECTION (*psym) >= 0)
795 SYMBOL_VALUE_ADDRESS (*psym) += ANOFFSET (delta,
796 SYMBOL_SECTION (*psym));
797 }
798}
799
800static struct symtab *
801find_last_source_symtab_from_partial (struct objfile *ofp)
802{
ccefe4c4
TT
803 struct partial_symtab *ps;
804 struct partial_symtab *cs_pst = 0;
805
b11896a5 806 ALL_OBJFILE_PSYMTABS_REQUIRED (ofp, ps)
ccefe4c4
TT
807 {
808 const char *name = ps->filename;
809 int len = strlen (name);
ad3bbd48 810
ccefe4c4
TT
811 if (!(len > 2 && (strcmp (&name[len - 2], ".h") == 0
812 || strcmp (name, "<<C++-namespaces>>") == 0)))
813 cs_pst = ps;
814 }
815
816 if (cs_pst)
817 {
818 if (cs_pst->readin)
819 {
820 internal_error (__FILE__, __LINE__,
821 _("select_source_symtab: "
822 "readin pst found and no symtabs."));
823 }
824 else
825 return PSYMTAB_TO_SYMTAB (cs_pst);
826 }
827 return NULL;
828}
829
830static void
831forget_cached_source_info_partial (struct objfile *objfile)
832{
833 struct partial_symtab *pst;
834
b11896a5 835 ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, pst)
ccefe4c4
TT
836 {
837 if (pst->fullname != NULL)
838 {
839 xfree (pst->fullname);
840 pst->fullname = NULL;
841 }
842 }
843}
844
845static void
846print_partial_symbols (struct gdbarch *gdbarch,
847 struct partial_symbol **p, int count, char *what,
848 struct ui_file *outfile)
849{
850 fprintf_filtered (outfile, " %s partial symbols:\n", what);
851 while (count-- > 0)
852 {
853 fprintf_filtered (outfile, " `%s'", SYMBOL_LINKAGE_NAME (*p));
854 if (SYMBOL_DEMANGLED_NAME (*p) != NULL)
855 {
856 fprintf_filtered (outfile, " `%s'", SYMBOL_DEMANGLED_NAME (*p));
857 }
858 fputs_filtered (", ", outfile);
859 switch (SYMBOL_DOMAIN (*p))
860 {
861 case UNDEF_DOMAIN:
862 fputs_filtered ("undefined domain, ", outfile);
863 break;
864 case VAR_DOMAIN:
0df8b418 865 /* This is the usual thing -- don't print it. */
ccefe4c4
TT
866 break;
867 case STRUCT_DOMAIN:
868 fputs_filtered ("struct domain, ", outfile);
869 break;
870 case LABEL_DOMAIN:
871 fputs_filtered ("label domain, ", outfile);
872 break;
873 default:
874 fputs_filtered ("<invalid domain>, ", outfile);
875 break;
876 }
877 switch (SYMBOL_CLASS (*p))
878 {
879 case LOC_UNDEF:
880 fputs_filtered ("undefined", outfile);
881 break;
882 case LOC_CONST:
883 fputs_filtered ("constant int", outfile);
884 break;
885 case LOC_STATIC:
886 fputs_filtered ("static", outfile);
887 break;
888 case LOC_REGISTER:
889 fputs_filtered ("register", outfile);
890 break;
891 case LOC_ARG:
892 fputs_filtered ("pass by value", outfile);
893 break;
894 case LOC_REF_ARG:
895 fputs_filtered ("pass by reference", outfile);
896 break;
897 case LOC_REGPARM_ADDR:
898 fputs_filtered ("register address parameter", outfile);
899 break;
900 case LOC_LOCAL:
901 fputs_filtered ("stack parameter", outfile);
902 break;
903 case LOC_TYPEDEF:
904 fputs_filtered ("type", outfile);
905 break;
906 case LOC_LABEL:
907 fputs_filtered ("label", outfile);
908 break;
909 case LOC_BLOCK:
910 fputs_filtered ("function", outfile);
911 break;
912 case LOC_CONST_BYTES:
913 fputs_filtered ("constant bytes", outfile);
914 break;
915 case LOC_UNRESOLVED:
916 fputs_filtered ("unresolved", outfile);
917 break;
918 case LOC_OPTIMIZED_OUT:
919 fputs_filtered ("optimized out", outfile);
920 break;
921 case LOC_COMPUTED:
922 fputs_filtered ("computed at runtime", outfile);
923 break;
924 default:
925 fputs_filtered ("<invalid location>", outfile);
926 break;
927 }
928 fputs_filtered (", ", outfile);
929 fputs_filtered (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (*p)), outfile);
930 fprintf_filtered (outfile, "\n");
931 p++;
932 }
933}
934
935static void
936dump_psymtab (struct objfile *objfile, struct partial_symtab *psymtab,
937 struct ui_file *outfile)
938{
939 struct gdbarch *gdbarch = get_objfile_arch (objfile);
940 int i;
941
942 fprintf_filtered (outfile, "\nPartial symtab for source file %s ",
943 psymtab->filename);
944 fprintf_filtered (outfile, "(object ");
945 gdb_print_host_address (psymtab, outfile);
946 fprintf_filtered (outfile, ")\n\n");
947 fprintf_unfiltered (outfile, " Read from object file %s (",
948 objfile->name);
949 gdb_print_host_address (objfile, outfile);
950 fprintf_unfiltered (outfile, ")\n");
951
952 if (psymtab->readin)
953 {
954 fprintf_filtered (outfile,
955 " Full symtab was read (at ");
956 gdb_print_host_address (psymtab->symtab, outfile);
957 fprintf_filtered (outfile, " by function at ");
958 gdb_print_host_address (psymtab->read_symtab, outfile);
959 fprintf_filtered (outfile, ")\n");
960 }
961
962 fprintf_filtered (outfile, " Relocate symbols by ");
963 for (i = 0; i < psymtab->objfile->num_sections; ++i)
964 {
965 if (i != 0)
966 fprintf_filtered (outfile, ", ");
967 wrap_here (" ");
968 fputs_filtered (paddress (gdbarch,
969 ANOFFSET (psymtab->section_offsets, i)),
970 outfile);
971 }
972 fprintf_filtered (outfile, "\n");
973
974 fprintf_filtered (outfile, " Symbols cover text addresses ");
975 fputs_filtered (paddress (gdbarch, psymtab->textlow), outfile);
976 fprintf_filtered (outfile, "-");
977 fputs_filtered (paddress (gdbarch, psymtab->texthigh), outfile);
978 fprintf_filtered (outfile, "\n");
979 fprintf_filtered (outfile, " Depends on %d other partial symtabs.\n",
980 psymtab->number_of_dependencies);
981 for (i = 0; i < psymtab->number_of_dependencies; i++)
982 {
983 fprintf_filtered (outfile, " %d ", i);
984 gdb_print_host_address (psymtab->dependencies[i], outfile);
985 fprintf_filtered (outfile, " %s\n",
986 psymtab->dependencies[i]->filename);
987 }
988 if (psymtab->n_global_syms > 0)
989 {
990 print_partial_symbols (gdbarch,
991 objfile->global_psymbols.list
992 + psymtab->globals_offset,
993 psymtab->n_global_syms, "Global", outfile);
994 }
995 if (psymtab->n_static_syms > 0)
996 {
997 print_partial_symbols (gdbarch,
998 objfile->static_psymbols.list
999 + psymtab->statics_offset,
1000 psymtab->n_static_syms, "Static", outfile);
1001 }
1002 fprintf_filtered (outfile, "\n");
1003}
1004
1005static void
1006print_psymtab_stats_for_objfile (struct objfile *objfile)
1007{
1008 int i;
1009 struct partial_symtab *ps;
ad3bbd48 1010
ccefe4c4 1011 i = 0;
b11896a5 1012 ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps)
ccefe4c4
TT
1013 {
1014 if (ps->readin == 0)
1015 i++;
1016 }
1017 printf_filtered (_(" Number of psym tables (not yet expanded): %d\n"), i);
1018}
1019
1020static void
1021dump_psymtabs_for_objfile (struct objfile *objfile)
1022{
1023 struct partial_symtab *psymtab;
1024
1025 if (objfile->psymtabs)
1026 {
1027 printf_filtered ("Psymtabs:\n");
1028 for (psymtab = objfile->psymtabs;
1029 psymtab != NULL;
1030 psymtab = psymtab->next)
1031 {
1032 printf_filtered ("%s at ",
1033 psymtab->filename);
1034 gdb_print_host_address (psymtab, gdb_stdout);
1035 printf_filtered (", ");
1036 if (psymtab->objfile != objfile)
1037 {
1038 printf_filtered ("NOT ON CHAIN! ");
1039 }
1040 wrap_here (" ");
1041 }
1042 printf_filtered ("\n\n");
1043 }
1044}
1045
1046/* Look through the partial symtabs for all symbols which begin
0df8b418 1047 by matching FUNC_NAME. Make sure we read that symbol table in. */
ccefe4c4
TT
1048
1049static void
1050read_symtabs_for_function (struct objfile *objfile, const char *func_name)
1051{
1052 struct partial_symtab *ps;
1053
b11896a5 1054 ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps)
ccefe4c4
TT
1055 {
1056 if (ps->readin)
1057 continue;
1058
1059 if ((lookup_partial_symbol (ps, func_name, 1, VAR_DOMAIN)
1060 != NULL)
1061 || (lookup_partial_symbol (ps, func_name, 0, VAR_DOMAIN)
1062 != NULL))
1063 psymtab_to_symtab (ps);
1064 }
1065}
1066
1067static void
1068expand_partial_symbol_tables (struct objfile *objfile)
1069{
1070 struct partial_symtab *psymtab;
1071
b11896a5 1072 ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, psymtab)
ccefe4c4
TT
1073 {
1074 psymtab_to_symtab (psymtab);
1075 }
1076}
1077
1078static void
1079read_psymtabs_with_filename (struct objfile *objfile, const char *filename)
1080{
1081 struct partial_symtab *p;
1082
b11896a5 1083 ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, p)
ccefe4c4 1084 {
0ba1096a 1085 if (filename_cmp (filename, p->filename) == 0)
ccefe4c4
TT
1086 PSYMTAB_TO_SYMTAB (p);
1087 }
1088}
1089
ccefe4c4
TT
1090static void
1091map_symbol_filenames_psymtab (struct objfile *objfile,
74e2f255
DE
1092 symbol_filename_ftype *fun, void *data,
1093 int need_fullname)
ccefe4c4
TT
1094{
1095 struct partial_symtab *ps;
1096
b11896a5 1097 ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps)
ccefe4c4
TT
1098 {
1099 const char *fullname;
1100
1101 if (ps->readin)
1102 continue;
1103
821296b7 1104 QUIT;
74e2f255
DE
1105 if (need_fullname)
1106 fullname = psymtab_to_fullname (ps);
1107 else
1108 fullname = NULL;
2837d59e 1109 (*fun) (ps->filename, fullname, data);
ccefe4c4
TT
1110 }
1111}
1112
1113int find_and_open_source (const char *filename,
1114 const char *dirname,
1115 char **fullname);
1116
1117/* Finds the fullname that a partial_symtab represents.
1118
1119 If this functions finds the fullname, it will save it in ps->fullname
1120 and it will also return the value.
1121
1122 If this function fails to find the file that this partial_symtab represents,
1123 NULL will be returned and ps->fullname will be set to NULL. */
256f06f3 1124
ccefe4c4
TT
1125static char *
1126psymtab_to_fullname (struct partial_symtab *ps)
1127{
1128 int r;
1129
1130 if (!ps)
1131 return NULL;
1132
256f06f3
DE
1133 /* Use cached copy if we have it.
1134 We rely on forget_cached_source_info being called appropriately
1135 to handle cases like the file being moved. */
1136 if (ps->fullname)
1137 return ps->fullname;
1138
ccefe4c4
TT
1139 r = find_and_open_source (ps->filename, ps->dirname, &ps->fullname);
1140
1141 if (r >= 0)
1142 {
1143 close (r);
1144 return ps->fullname;
1145 }
1146
1147 return NULL;
1148}
1149
dd786858 1150static const char *
ccefe4c4
TT
1151find_symbol_file_from_partial (struct objfile *objfile, const char *name)
1152{
1153 struct partial_symtab *pst;
1154
b11896a5 1155 ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, pst)
ccefe4c4
TT
1156 {
1157 if (lookup_partial_symbol (pst, name, 1, VAR_DOMAIN))
1158 return pst->filename;
1159 }
1160 return NULL;
1161}
1162
40658b94
PH
1163/* For all symbols, s, in BLOCK that are in NAMESPACE and match NAME
1164 according to the function MATCH, call CALLBACK(BLOCK, s, DATA).
1165 BLOCK is assumed to come from OBJFILE. Returns 1 iff CALLBACK
1166 ever returns non-zero, and otherwise returns 0. */
ccefe4c4 1167
40658b94
PH
1168static int
1169map_block (const char *name, domain_enum namespace, struct objfile *objfile,
1170 struct block *block,
1171 int (*callback) (struct block *, struct symbol *, void *),
2edb89d3 1172 void *data, symbol_compare_ftype *match)
ccefe4c4 1173{
40658b94
PH
1174 struct dict_iterator iter;
1175 struct symbol *sym;
ccefe4c4 1176
40658b94
PH
1177 for (sym = dict_iter_match_first (BLOCK_DICT (block), name, match, &iter);
1178 sym != NULL; sym = dict_iter_match_next (name, match, &iter))
ccefe4c4 1179 {
40658b94
PH
1180 if (symbol_matches_domain (SYMBOL_LANGUAGE (sym),
1181 SYMBOL_DOMAIN (sym), namespace))
1182 {
1183 if (callback (block, sym, data))
1184 return 1;
1185 }
ccefe4c4
TT
1186 }
1187
40658b94 1188 return 0;
ccefe4c4
TT
1189}
1190
40658b94
PH
1191/* Psymtab version of map_matching_symbols. See its definition in
1192 the definition of quick_symbol_functions in symfile.h. */
1193
ccefe4c4 1194static void
40658b94
PH
1195map_matching_symbols_psymtab (const char *name, domain_enum namespace,
1196 struct objfile *objfile, int global,
1197 int (*callback) (struct block *,
1198 struct symbol *, void *),
1199 void *data,
2edb89d3
JK
1200 symbol_compare_ftype *match,
1201 symbol_compare_ftype *ordered_compare)
ccefe4c4 1202{
40658b94 1203 const int block_kind = global ? GLOBAL_BLOCK : STATIC_BLOCK;
ccefe4c4
TT
1204 struct partial_symtab *ps;
1205
b11896a5 1206 ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps)
ccefe4c4
TT
1207 {
1208 QUIT;
1209 if (ps->readin
40658b94
PH
1210 || match_partial_symbol (ps, global, name, namespace, match,
1211 ordered_compare))
ccefe4c4
TT
1212 {
1213 struct symtab *s = PSYMTAB_TO_SYMTAB (ps);
40658b94 1214 struct block *block;
ad3bbd48 1215
ccefe4c4
TT
1216 if (s == NULL || !s->primary)
1217 continue;
40658b94
PH
1218 block = BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), block_kind);
1219 if (map_block (name, namespace, objfile, block,
1220 callback, data, match))
1221 return;
1222 if (callback (block, NULL, data))
1223 return;
ccefe4c4
TT
1224 }
1225 }
40658b94 1226}
ccefe4c4
TT
1227
1228static void
1229expand_symtabs_matching_via_partial (struct objfile *objfile,
3e43a32a
MS
1230 int (*file_matcher) (const char *,
1231 void *),
1232 int (*name_matcher) (const char *,
1233 void *),
8903c50d 1234 enum search_domain kind,
ccefe4c4
TT
1235 void *data)
1236{
1237 struct partial_symtab *ps;
1238
b11896a5 1239 ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps)
ccefe4c4
TT
1240 {
1241 struct partial_symbol **psym;
1242 struct partial_symbol **bound, **gbound, **sbound;
1243 int keep_going = 1;
1244
1245 if (ps->readin)
1246 continue;
1247
7b08b9eb 1248 if (file_matcher && ! (*file_matcher) (ps->filename, data))
ccefe4c4
TT
1249 continue;
1250
3e43a32a
MS
1251 gbound = objfile->global_psymbols.list
1252 + ps->globals_offset + ps->n_global_syms;
1253 sbound = objfile->static_psymbols.list
1254 + ps->statics_offset + ps->n_static_syms;
ccefe4c4
TT
1255 bound = gbound;
1256
1257 /* Go through all of the symbols stored in a partial
0df8b418 1258 symtab in one loop. */
ccefe4c4
TT
1259 psym = objfile->global_psymbols.list + ps->globals_offset;
1260 while (keep_going)
1261 {
1262 if (psym >= bound)
1263 {
1264 if (bound == gbound && ps->n_static_syms != 0)
1265 {
1266 psym = objfile->static_psymbols.list + ps->statics_offset;
1267 bound = sbound;
1268 }
1269 else
1270 keep_going = 0;
1271 continue;
1272 }
1273 else
1274 {
1275 QUIT;
1276
7b08b9eb
JK
1277 if ((kind == ALL_DOMAIN
1278 || (kind == VARIABLES_DOMAIN
ccefe4c4
TT
1279 && SYMBOL_CLASS (*psym) != LOC_TYPEDEF
1280 && SYMBOL_CLASS (*psym) != LOC_BLOCK)
7b08b9eb
JK
1281 || (kind == FUNCTIONS_DOMAIN
1282 && SYMBOL_CLASS (*psym) == LOC_BLOCK)
1283 || (kind == TYPES_DOMAIN
1284 && SYMBOL_CLASS (*psym) == LOC_TYPEDEF))
1285 && (*name_matcher) (SYMBOL_NATURAL_NAME (*psym), data))
ccefe4c4
TT
1286 {
1287 PSYMTAB_TO_SYMTAB (ps);
1288 keep_going = 0;
1289 }
1290 }
1291 psym++;
1292 }
1293 }
1294}
1295
1296static int
1297objfile_has_psyms (struct objfile *objfile)
1298{
1299 return objfile->psymtabs != NULL;
1300}
1301
1302const struct quick_symbol_functions psym_functions =
1303{
1304 objfile_has_psyms,
1305 find_last_source_symtab_from_partial,
1306 forget_cached_source_info_partial,
1307 lookup_symtab_via_partial_symtab,
1308 lookup_symbol_aux_psymtabs,
774b6a14 1309 pre_expand_symtabs_matching_psymtabs,
ccefe4c4
TT
1310 print_psymtab_stats_for_objfile,
1311 dump_psymtabs_for_objfile,
1312 relocate_psymtabs,
1313 read_symtabs_for_function,
1314 expand_partial_symbol_tables,
1315 read_psymtabs_with_filename,
1316 find_symbol_file_from_partial,
40658b94 1317 map_matching_symbols_psymtab,
ccefe4c4
TT
1318 expand_symtabs_matching_via_partial,
1319 find_pc_sect_symtab_from_partial,
ccefe4c4
TT
1320 map_symbol_filenames_psymtab
1321};
1322
1323\f
1324
1325/* This compares two partial symbols by names, using strcmp_iw_ordered
1326 for the comparison. */
1327
1328static int
1329compare_psymbols (const void *s1p, const void *s2p)
1330{
1331 struct partial_symbol *const *s1 = s1p;
1332 struct partial_symbol *const *s2 = s2p;
1333
1334 return strcmp_iw_ordered (SYMBOL_SEARCH_NAME (*s1),
1335 SYMBOL_SEARCH_NAME (*s2));
1336}
1337
1338void
1339sort_pst_symbols (struct partial_symtab *pst)
1340{
0df8b418 1341 /* Sort the global list; don't sort the static list. */
ccefe4c4
TT
1342
1343 qsort (pst->objfile->global_psymbols.list + pst->globals_offset,
1344 pst->n_global_syms, sizeof (struct partial_symbol *),
1345 compare_psymbols);
1346}
1347
1348/* Allocate and partially fill a partial symtab. It will be
1349 completely filled at the end of the symbol list.
1350
0df8b418 1351 FILENAME is the name of the symbol-file we are reading from. */
ccefe4c4
TT
1352
1353struct partial_symtab *
1354start_psymtab_common (struct objfile *objfile,
1355 struct section_offsets *section_offsets,
1356 const char *filename,
1357 CORE_ADDR textlow, struct partial_symbol **global_syms,
1358 struct partial_symbol **static_syms)
1359{
1360 struct partial_symtab *psymtab;
1361
1362 psymtab = allocate_psymtab (filename, objfile);
1363 psymtab->section_offsets = section_offsets;
1364 psymtab->textlow = textlow;
1365 psymtab->texthigh = psymtab->textlow; /* default */
1366 psymtab->globals_offset = global_syms - objfile->global_psymbols.list;
1367 psymtab->statics_offset = static_syms - objfile->static_psymbols.list;
1368 return (psymtab);
1369}
1370
cbd70537
SW
1371/* Calculate a hash code for the given partial symbol. The hash is
1372 calculated using the symbol's value, language, domain, class
0df8b418 1373 and name. These are the values which are set by
cbd70537
SW
1374 add_psymbol_to_bcache. */
1375
710e1a31 1376static unsigned long
cbd70537
SW
1377psymbol_hash (const void *addr, int length)
1378{
1379 unsigned long h = 0;
1380 struct partial_symbol *psymbol = (struct partial_symbol *) addr;
1381 unsigned int lang = psymbol->ginfo.language;
1382 unsigned int domain = PSYMBOL_DOMAIN (psymbol);
1383 unsigned int class = PSYMBOL_CLASS (psymbol);
1384
1385 h = hash_continue (&psymbol->ginfo.value, sizeof (psymbol->ginfo.value), h);
1386 h = hash_continue (&lang, sizeof (unsigned int), h);
1387 h = hash_continue (&domain, sizeof (unsigned int), h);
1388 h = hash_continue (&class, sizeof (unsigned int), h);
1389 h = hash_continue (psymbol->ginfo.name, strlen (psymbol->ginfo.name), h);
1390
1391 return h;
1392}
1393
1394/* Returns true if the symbol at addr1 equals the symbol at addr2.
1395 For the comparison this function uses a symbols value,
1396 language, domain, class and name. */
1397
710e1a31 1398static int
cbd70537
SW
1399psymbol_compare (const void *addr1, const void *addr2, int length)
1400{
1401 struct partial_symbol *sym1 = (struct partial_symbol *) addr1;
1402 struct partial_symbol *sym2 = (struct partial_symbol *) addr2;
1403
1404 return (memcmp (&sym1->ginfo.value, &sym1->ginfo.value,
1405 sizeof (sym1->ginfo.value)) == 0
1406 && sym1->ginfo.language == sym2->ginfo.language
1407 && PSYMBOL_DOMAIN (sym1) == PSYMBOL_DOMAIN (sym2)
1408 && PSYMBOL_CLASS (sym1) == PSYMBOL_CLASS (sym2)
1409 && sym1->ginfo.name == sym2->ginfo.name);
1410}
1411
710e1a31
SW
1412/* Initialize a partial symbol bcache. */
1413
1414struct psymbol_bcache *
1415psymbol_bcache_init (void)
1416{
1417 struct psymbol_bcache *bcache = XCALLOC (1, struct psymbol_bcache);
1418 bcache->bcache = bcache_xmalloc (psymbol_hash, psymbol_compare);
1419 return bcache;
1420}
1421
1422/* Free a partial symbol bcache. */
1423void
1424psymbol_bcache_free (struct psymbol_bcache *bcache)
1425{
1426 if (bcache == NULL)
1427 return;
1428
1429 bcache_xfree (bcache->bcache);
1430 xfree (bcache);
1431}
1432
0df8b418 1433/* Return the internal bcache of the psymbol_bcache BCACHE. */
710e1a31
SW
1434
1435struct bcache *
1436psymbol_bcache_get_bcache (struct psymbol_bcache *bcache)
1437{
1438 return bcache->bcache;
1439}
1440
1441/* Find a copy of the SYM in BCACHE. If BCACHE has never seen this
1442 symbol before, add a copy to BCACHE. In either case, return a pointer
1443 to BCACHE's copy of the symbol. If optional ADDED is not NULL, return
1444 1 in case of new entry or 0 if returning an old entry. */
1445
1446static const struct partial_symbol *
1447psymbol_bcache_full (struct partial_symbol *sym,
1448 struct psymbol_bcache *bcache,
1449 int *added)
1450{
1451 return bcache_full (sym,
1452 sizeof (struct partial_symbol),
1453 bcache->bcache,
1454 added);
1455}
1456
ccefe4c4
TT
1457/* Helper function, initialises partial symbol structure and stashes
1458 it into objfile's bcache. Note that our caching mechanism will
1459 use all fields of struct partial_symbol to determine hash value of the
1460 structure. In other words, having two symbols with the same name but
1461 different domain (or address) is possible and correct. */
1462
1463static const struct partial_symbol *
72b9f47f 1464add_psymbol_to_bcache (const char *name, int namelength, int copy_name,
ccefe4c4
TT
1465 domain_enum domain,
1466 enum address_class class,
1467 long val, /* Value as a long */
1468 CORE_ADDR coreaddr, /* Value as a CORE_ADDR */
1469 enum language language, struct objfile *objfile,
1470 int *added)
1471{
cbd70537
SW
1472 struct partial_symbol psymbol;
1473
fc956729
SW
1474 /* We must ensure that the entire 'value' field has been zeroed
1475 before assigning to it, because an assignment may not write the
1476 entire field. */
1477 memset (&psymbol.ginfo.value, 0, sizeof (psymbol.ginfo.value));
1478
0df8b418 1479 /* val and coreaddr are mutually exclusive, one of them *will* be zero. */
ccefe4c4
TT
1480 if (val != 0)
1481 {
1482 SYMBOL_VALUE (&psymbol) = val;
1483 }
1484 else
1485 {
1486 SYMBOL_VALUE_ADDRESS (&psymbol) = coreaddr;
1487 }
1488 SYMBOL_SECTION (&psymbol) = 0;
fc956729 1489 SYMBOL_OBJ_SECTION (&psymbol) = NULL;
33e5013e 1490 SYMBOL_SET_LANGUAGE (&psymbol, language);
ccefe4c4
TT
1491 PSYMBOL_DOMAIN (&psymbol) = domain;
1492 PSYMBOL_CLASS (&psymbol) = class;
1493
1494 SYMBOL_SET_NAMES (&psymbol, name, namelength, copy_name, objfile);
1495
0df8b418 1496 /* Stash the partial symbol away in the cache. */
710e1a31
SW
1497 return psymbol_bcache_full (&psymbol,
1498 objfile->psymbol_cache,
1499 added);
ccefe4c4
TT
1500}
1501
923c6a3d 1502/* Increase the space allocated for LISTP, which is probably
0df8b418 1503 global_psymbols or static_psymbols. This space will eventually
923c6a3d
TT
1504 be freed in free_objfile(). */
1505
1506static void
1507extend_psymbol_list (struct psymbol_allocation_list *listp,
1508 struct objfile *objfile)
1509{
1510 int new_size;
1511
1512 if (listp->size == 0)
1513 {
1514 new_size = 255;
1515 listp->list = (struct partial_symbol **)
1516 xmalloc (new_size * sizeof (struct partial_symbol *));
1517 }
1518 else
1519 {
1520 new_size = listp->size * 2;
1521 listp->list = (struct partial_symbol **)
1522 xrealloc ((char *) listp->list,
1523 new_size * sizeof (struct partial_symbol *));
1524 }
1525 /* Next assumes we only went one over. Should be good if
0df8b418 1526 program works correctly. */
923c6a3d
TT
1527 listp->next = listp->list + listp->size;
1528 listp->size = new_size;
1529}
1530
ccefe4c4
TT
1531/* Helper function, adds partial symbol to the given partial symbol
1532 list. */
1533
1534static void
1535append_psymbol_to_list (struct psymbol_allocation_list *list,
1536 const struct partial_symbol *psym,
1537 struct objfile *objfile)
1538{
1539 if (list->next >= list->list + list->size)
1540 extend_psymbol_list (list, objfile);
1541 *list->next++ = (struct partial_symbol *) psym;
1542 OBJSTAT (objfile, n_psyms++);
1543}
1544
1545/* Add a symbol with a long value to a psymtab.
1546 Since one arg is a struct, we pass in a ptr and deref it (sigh).
1547 Return the partial symbol that has been added. */
1548
1549/* NOTE: carlton/2003-09-11: The reason why we return the partial
1550 symbol is so that callers can get access to the symbol's demangled
1551 name, which they don't have any cheap way to determine otherwise.
1552 (Currenly, dwarf2read.c is the only file who uses that information,
1553 though it's possible that other readers might in the future.)
1554 Elena wasn't thrilled about that, and I don't blame her, but we
1555 couldn't come up with a better way to get that information. If
1556 it's needed in other situations, we could consider breaking up
1557 SYMBOL_SET_NAMES to provide access to the demangled name lookup
1558 cache. */
1559
1560const struct partial_symbol *
72b9f47f 1561add_psymbol_to_list (const char *name, int namelength, int copy_name,
ccefe4c4
TT
1562 domain_enum domain,
1563 enum address_class class,
1564 struct psymbol_allocation_list *list,
1565 long val, /* Value as a long */
1566 CORE_ADDR coreaddr, /* Value as a CORE_ADDR */
1567 enum language language, struct objfile *objfile)
1568{
1569 const struct partial_symbol *psym;
1570
1571 int added;
1572
0df8b418 1573 /* Stash the partial symbol away in the cache. */
ccefe4c4
TT
1574 psym = add_psymbol_to_bcache (name, namelength, copy_name, domain, class,
1575 val, coreaddr, language, objfile, &added);
1576
1577 /* Do not duplicate global partial symbols. */
1578 if (list == &objfile->global_psymbols
1579 && !added)
1580 return psym;
1581
0df8b418 1582 /* Save pointer to partial symbol in psymtab, growing symtab if needed. */
ccefe4c4
TT
1583 append_psymbol_to_list (list, psym, objfile);
1584 return psym;
1585}
1586
1587/* Initialize storage for partial symbols. */
1588
1589void
1590init_psymbol_list (struct objfile *objfile, int total_symbols)
1591{
1592 /* Free any previously allocated psymbol lists. */
1593
1594 if (objfile->global_psymbols.list)
1595 {
1596 xfree (objfile->global_psymbols.list);
1597 }
1598 if (objfile->static_psymbols.list)
1599 {
1600 xfree (objfile->static_psymbols.list);
1601 }
1602
1603 /* Current best guess is that approximately a twentieth
1604 of the total symbols (in a debugging file) are global or static
0df8b418 1605 oriented symbols. */
ccefe4c4
TT
1606
1607 objfile->global_psymbols.size = total_symbols / 10;
1608 objfile->static_psymbols.size = total_symbols / 10;
1609
1610 if (objfile->global_psymbols.size > 0)
1611 {
1612 objfile->global_psymbols.next =
1613 objfile->global_psymbols.list = (struct partial_symbol **)
1614 xmalloc ((objfile->global_psymbols.size
1615 * sizeof (struct partial_symbol *)));
1616 }
1617 if (objfile->static_psymbols.size > 0)
1618 {
1619 objfile->static_psymbols.next =
1620 objfile->static_psymbols.list = (struct partial_symbol **)
1621 xmalloc ((objfile->static_psymbols.size
1622 * sizeof (struct partial_symbol *)));
1623 }
1624}
1625
1626struct partial_symtab *
1627allocate_psymtab (const char *filename, struct objfile *objfile)
1628{
1629 struct partial_symtab *psymtab;
1630
1631 if (objfile->free_psymtabs)
1632 {
1633 psymtab = objfile->free_psymtabs;
1634 objfile->free_psymtabs = psymtab->next;
1635 }
1636 else
1637 psymtab = (struct partial_symtab *)
1638 obstack_alloc (&objfile->objfile_obstack,
1639 sizeof (struct partial_symtab));
1640
1641 memset (psymtab, 0, sizeof (struct partial_symtab));
1642 psymtab->filename = obsavestring (filename, strlen (filename),
1643 &objfile->objfile_obstack);
1644 psymtab->symtab = NULL;
1645
1646 /* Prepend it to the psymtab list for the objfile it belongs to.
1647 Psymtabs are searched in most recent inserted -> least recent
0df8b418 1648 inserted order. */
ccefe4c4
TT
1649
1650 psymtab->objfile = objfile;
1651 psymtab->next = objfile->psymtabs;
1652 objfile->psymtabs = psymtab;
ccefe4c4
TT
1653
1654 return (psymtab);
1655}
1656
1657void
1658discard_psymtab (struct partial_symtab *pst)
1659{
1660 struct partial_symtab **prev_pst;
1661
1662 /* From dbxread.c:
1663 Empty psymtabs happen as a result of header files which don't
1664 have any symbols in them. There can be a lot of them. But this
1665 check is wrong, in that a psymtab with N_SLINE entries but
1666 nothing else is not empty, but we don't realize that. Fixing
1667 that without slowing things down might be tricky. */
1668
0df8b418 1669 /* First, snip it out of the psymtab chain. */
ccefe4c4
TT
1670
1671 prev_pst = &(pst->objfile->psymtabs);
1672 while ((*prev_pst) != pst)
1673 prev_pst = &((*prev_pst)->next);
1674 (*prev_pst) = pst->next;
1675
0df8b418 1676 /* Next, put it on a free list for recycling. */
ccefe4c4
TT
1677
1678 pst->next = pst->objfile->free_psymtabs;
1679 pst->objfile->free_psymtabs = pst;
1680}
1681
ccefe4c4
TT
1682\f
1683
1684void
1685maintenance_print_psymbols (char *args, int from_tty)
1686{
1687 char **argv;
1688 struct ui_file *outfile;
1689 struct cleanup *cleanups;
1690 char *symname = NULL;
1691 char *filename = DEV_TTY;
1692 struct objfile *objfile;
1693 struct partial_symtab *ps;
1694
1695 dont_repeat ();
1696
1697 if (args == NULL)
1698 {
3e43a32a
MS
1699 error (_("\
1700print-psymbols takes an output file name and optional symbol file name"));
ccefe4c4
TT
1701 }
1702 argv = gdb_buildargv (args);
1703 cleanups = make_cleanup_freeargv (argv);
1704
1705 if (argv[0] != NULL)
1706 {
1707 filename = argv[0];
0df8b418 1708 /* If a second arg is supplied, it is a source file name to match on. */
ccefe4c4
TT
1709 if (argv[1] != NULL)
1710 {
1711 symname = argv[1];
1712 }
1713 }
1714
1715 filename = tilde_expand (filename);
1716 make_cleanup (xfree, filename);
1717
1718 outfile = gdb_fopen (filename, FOPEN_WT);
1719 if (outfile == 0)
1720 perror_with_name (filename);
1721 make_cleanup_ui_file_delete (outfile);
1722
1723 immediate_quit++;
1724 ALL_PSYMTABS (objfile, ps)
0ba1096a 1725 if (symname == NULL || filename_cmp (symname, ps->filename) == 0)
ccefe4c4
TT
1726 dump_psymtab (objfile, ps, outfile);
1727 immediate_quit--;
1728 do_cleanups (cleanups);
1729}
1730
1731/* List all the partial symbol tables whose names match REGEXP (optional). */
1732void
1733maintenance_info_psymtabs (char *regexp, int from_tty)
1734{
1735 struct program_space *pspace;
1736 struct objfile *objfile;
1737
1738 if (regexp)
1739 re_comp (regexp);
1740
1741 ALL_PSPACES (pspace)
1742 ALL_PSPACE_OBJFILES (pspace, objfile)
1743 {
1744 struct gdbarch *gdbarch = get_objfile_arch (objfile);
1745 struct partial_symtab *psymtab;
1746
1747 /* We don't want to print anything for this objfile until we
1748 actually find a symtab whose name matches. */
1749 int printed_objfile_start = 0;
1750
b11896a5 1751 ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, psymtab)
ccefe4c4
TT
1752 {
1753 QUIT;
1754
1755 if (! regexp
1756 || re_exec (psymtab->filename))
1757 {
1758 if (! printed_objfile_start)
1759 {
1760 printf_filtered ("{ objfile %s ", objfile->name);
1761 wrap_here (" ");
1762 printf_filtered ("((struct objfile *) %s)\n",
1763 host_address_to_string (objfile));
1764 printed_objfile_start = 1;
1765 }
1766
1767 printf_filtered (" { psymtab %s ", psymtab->filename);
1768 wrap_here (" ");
1769 printf_filtered ("((struct partial_symtab *) %s)\n",
1770 host_address_to_string (psymtab));
1771
1772 printf_filtered (" readin %s\n",
1773 psymtab->readin ? "yes" : "no");
1774 printf_filtered (" fullname %s\n",
3e43a32a
MS
1775 psymtab->fullname
1776 ? psymtab->fullname : "(null)");
ccefe4c4
TT
1777 printf_filtered (" text addresses ");
1778 fputs_filtered (paddress (gdbarch, psymtab->textlow),
1779 gdb_stdout);
1780 printf_filtered (" -- ");
1781 fputs_filtered (paddress (gdbarch, psymtab->texthigh),
1782 gdb_stdout);
1783 printf_filtered ("\n");
1784 printf_filtered (" globals ");
1785 if (psymtab->n_global_syms)
1786 {
1787 printf_filtered ("(* (struct partial_symbol **) %s @ %d)\n",
1788 host_address_to_string (psymtab->objfile->global_psymbols.list
1789 + psymtab->globals_offset),
1790 psymtab->n_global_syms);
1791 }
1792 else
1793 printf_filtered ("(none)\n");
1794 printf_filtered (" statics ");
1795 if (psymtab->n_static_syms)
1796 {
1797 printf_filtered ("(* (struct partial_symbol **) %s @ %d)\n",
1798 host_address_to_string (psymtab->objfile->static_psymbols.list
1799 + psymtab->statics_offset),
1800 psymtab->n_static_syms);
1801 }
1802 else
1803 printf_filtered ("(none)\n");
1804 printf_filtered (" dependencies ");
1805 if (psymtab->number_of_dependencies)
1806 {
1807 int i;
1808
1809 printf_filtered ("{\n");
1810 for (i = 0; i < psymtab->number_of_dependencies; i++)
1811 {
1812 struct partial_symtab *dep = psymtab->dependencies[i];
1813
1814 /* Note the string concatenation there --- no comma. */
1815 printf_filtered (" psymtab %s "
1816 "((struct partial_symtab *) %s)\n",
1817 dep->filename,
1818 host_address_to_string (dep));
1819 }
1820 printf_filtered (" }\n");
1821 }
1822 else
1823 printf_filtered ("(none)\n");
1824 printf_filtered (" }\n");
1825 }
1826 }
1827
1828 if (printed_objfile_start)
1829 printf_filtered ("}\n");
1830 }
1831}
1832
1833/* Check consistency of psymtabs and symtabs. */
1834
1835void
1836maintenance_check_symtabs (char *ignore, int from_tty)
1837{
1838 struct symbol *sym;
1839 struct partial_symbol **psym;
1840 struct symtab *s = NULL;
1841 struct partial_symtab *ps;
1842 struct blockvector *bv;
1843 struct objfile *objfile;
1844 struct block *b;
1845 int length;
1846
1847 ALL_PSYMTABS (objfile, ps)
1848 {
1849 struct gdbarch *gdbarch = get_objfile_arch (objfile);
ad3bbd48 1850
ccefe4c4
TT
1851 s = PSYMTAB_TO_SYMTAB (ps);
1852 if (s == NULL)
1853 continue;
1854 bv = BLOCKVECTOR (s);
1855 b = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
1856 psym = ps->objfile->static_psymbols.list + ps->statics_offset;
1857 length = ps->n_static_syms;
1858 while (length--)
1859 {
1860 sym = lookup_block_symbol (b, SYMBOL_LINKAGE_NAME (*psym),
1861 SYMBOL_DOMAIN (*psym));
1862 if (!sym)
1863 {
1864 printf_filtered ("Static symbol `");
1865 puts_filtered (SYMBOL_LINKAGE_NAME (*psym));
1866 printf_filtered ("' only found in ");
1867 puts_filtered (ps->filename);
1868 printf_filtered (" psymtab\n");
1869 }
1870 psym++;
1871 }
1872 b = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
1873 psym = ps->objfile->global_psymbols.list + ps->globals_offset;
1874 length = ps->n_global_syms;
1875 while (length--)
1876 {
1877 sym = lookup_block_symbol (b, SYMBOL_LINKAGE_NAME (*psym),
1878 SYMBOL_DOMAIN (*psym));
1879 if (!sym)
1880 {
1881 printf_filtered ("Global symbol `");
1882 puts_filtered (SYMBOL_LINKAGE_NAME (*psym));
1883 printf_filtered ("' only found in ");
1884 puts_filtered (ps->filename);
1885 printf_filtered (" psymtab\n");
1886 }
1887 psym++;
1888 }
1889 if (ps->texthigh < ps->textlow)
1890 {
1891 printf_filtered ("Psymtab ");
1892 puts_filtered (ps->filename);
1893 printf_filtered (" covers bad range ");
1894 fputs_filtered (paddress (gdbarch, ps->textlow), gdb_stdout);
1895 printf_filtered (" - ");
1896 fputs_filtered (paddress (gdbarch, ps->texthigh), gdb_stdout);
1897 printf_filtered ("\n");
1898 continue;
1899 }
1900 if (ps->texthigh == 0)
1901 continue;
1902 if (ps->textlow < BLOCK_START (b) || ps->texthigh > BLOCK_END (b))
1903 {
1904 printf_filtered ("Psymtab ");
1905 puts_filtered (ps->filename);
1906 printf_filtered (" covers ");
1907 fputs_filtered (paddress (gdbarch, ps->textlow), gdb_stdout);
1908 printf_filtered (" - ");
1909 fputs_filtered (paddress (gdbarch, ps->texthigh), gdb_stdout);
1910 printf_filtered (" but symtab covers only ");
1911 fputs_filtered (paddress (gdbarch, BLOCK_START (b)), gdb_stdout);
1912 printf_filtered (" - ");
1913 fputs_filtered (paddress (gdbarch, BLOCK_END (b)), gdb_stdout);
1914 printf_filtered ("\n");
1915 }
1916 }
1917}
1918
1919\f
1920
1921void
7b08b9eb 1922expand_partial_symbol_names (int (*fun) (const char *, void *), void *data)
ccefe4c4
TT
1923{
1924 struct objfile *objfile;
1925
1926 ALL_OBJFILES (objfile)
1927 {
1928 if (objfile->sf)
7b08b9eb
JK
1929 objfile->sf->qf->expand_symtabs_matching (objfile, NULL, fun,
1930 ALL_DOMAIN, data);
ccefe4c4
TT
1931 }
1932}
1933
1934void
74e2f255
DE
1935map_partial_symbol_filenames (symbol_filename_ftype *fun, void *data,
1936 int need_fullname)
ccefe4c4
TT
1937{
1938 struct objfile *objfile;
1939
1940 ALL_OBJFILES (objfile)
1941 {
1942 if (objfile->sf)
74e2f255
DE
1943 objfile->sf->qf->map_symbol_filenames (objfile, fun, data,
1944 need_fullname);
ccefe4c4
TT
1945 }
1946}
This page took 0.321344 seconds and 4 git commands to generate.