Introduce minimal_symbol_reader
[deliverable/binutils-gdb.git] / gdb / minsyms.c
CommitLineData
c906108c 1/* GDB routines for manipulating the minimal symbol tables.
618f726f 2 Copyright (C) 1992-2016 Free Software Foundation, Inc.
c906108c
SS
3 Contributed by Cygnus Support, using pieces from other GDB modules.
4
c5aa993b 5 This file is part of GDB.
c906108c 6
c5aa993b
JM
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
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
c5aa993b 10 (at your option) any later version.
c906108c 11
c5aa993b
JM
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.
c906108c 16
c5aa993b 17 You should have received a copy of the GNU General Public License
a9762ec7 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c
SS
19
20
21/* This file contains support routines for creating, manipulating, and
22 destroying minimal symbol tables.
23
24 Minimal symbol tables are used to hold some very basic information about
25 all defined global symbols (text, data, bss, abs, etc). The only two
26 required pieces of information are the symbol's name and the address
27 associated with that symbol.
28
29 In many cases, even if a file was compiled with no special options for
30 debugging at all, as long as was not stripped it will contain sufficient
31 information to build useful minimal symbol tables using this structure.
c5aa993b 32
c906108c
SS
33 Even when a file contains enough debugging information to build a full
34 symbol table, these minimal symbols are still useful for quickly mapping
35 between names and addresses, and vice versa. They are also sometimes used
025bb325 36 to figure out what full symbol table entries need to be read in. */
c906108c
SS
37
38
39#include "defs.h"
9227b5eb 40#include <ctype.h>
c906108c
SS
41#include "symtab.h"
42#include "bfd.h"
0ba1096a 43#include "filenames.h"
c906108c
SS
44#include "symfile.h"
45#include "objfiles.h"
46#include "demangle.h"
7ed49443
JB
47#include "value.h"
48#include "cp-abi.h"
42848c96 49#include "target.h"
71c25dea
TT
50#include "cp-support.h"
51#include "language.h"
529480d0 52#include "cli/cli-utils.h"
bd9269f7 53#include "symbol.h"
c906108c
SS
54
55/* Accumulate the minimal symbols for each objfile in bunches of BUNCH_SIZE.
56 At the end, copy them all into one newly allocated location on an objfile's
34643a32 57 per-BFD storage obstack. */
c906108c
SS
58
59#define BUNCH_SIZE 127
60
61struct msym_bunch
c5aa993b
JM
62 {
63 struct msym_bunch *next;
64 struct minimal_symbol contents[BUNCH_SIZE];
65 };
c906108c
SS
66
67/* Bunch currently being filled up.
68 The next field points to chain of filled bunches. */
69
70static struct msym_bunch *msym_bunch;
71
72/* Number of slots filled in current bunch. */
73
74static int msym_bunch_index;
75
76/* Total number of minimal symbols recorded so far for the objfile. */
77
78static int msym_count;
79
b19686e0 80/* See minsyms.h. */
9227b5eb
JB
81
82unsigned int
83msymbol_hash_iw (const char *string)
84{
85 unsigned int hash = 0;
b8d56208 86
9227b5eb
JB
87 while (*string && *string != '(')
88 {
529480d0 89 string = skip_spaces_const (string);
9227b5eb 90 if (*string && *string != '(')
375f3d86 91 {
59d7bcaf 92 hash = SYMBOL_HASH_NEXT (hash, *string);
375f3d86
DJ
93 ++string;
94 }
9227b5eb 95 }
261397f8 96 return hash;
9227b5eb
JB
97}
98
b19686e0 99/* See minsyms.h. */
9227b5eb
JB
100
101unsigned int
102msymbol_hash (const char *string)
103{
104 unsigned int hash = 0;
b8d56208 105
9227b5eb 106 for (; *string; ++string)
59d7bcaf 107 hash = SYMBOL_HASH_NEXT (hash, *string);
261397f8 108 return hash;
9227b5eb
JB
109}
110
111/* Add the minimal symbol SYM to an objfile's minsym hash table, TABLE. */
984ac464 112static void
9227b5eb
JB
113add_minsym_to_hash_table (struct minimal_symbol *sym,
114 struct minimal_symbol **table)
115{
116 if (sym->hash_next == NULL)
117 {
f56f77c1 118 unsigned int hash
efd66ac6 119 = msymbol_hash (MSYMBOL_LINKAGE_NAME (sym)) % MINIMAL_SYMBOL_HASH_SIZE;
b8d56208 120
9227b5eb
JB
121 sym->hash_next = table[hash];
122 table[hash] = sym;
123 }
124}
125
0729fd50
DB
126/* Add the minimal symbol SYM to an objfile's minsym demangled hash table,
127 TABLE. */
128static void
129add_minsym_to_demangled_hash_table (struct minimal_symbol *sym,
130 struct minimal_symbol **table)
131{
132 if (sym->demangled_hash_next == NULL)
133 {
efd66ac6 134 unsigned int hash = msymbol_hash_iw (MSYMBOL_SEARCH_NAME (sym))
3e43a32a 135 % MINIMAL_SYMBOL_HASH_SIZE;
b8d56208 136
0729fd50
DB
137 sym->demangled_hash_next = table[hash];
138 table[hash] = sym;
139 }
140}
141
c906108c
SS
142/* Look through all the current minimal symbol tables and find the
143 first minimal symbol that matches NAME. If OBJF is non-NULL, limit
72a5efb3
DJ
144 the search to that objfile. If SFILE is non-NULL, the only file-scope
145 symbols considered will be from that source file (global symbols are
146 still preferred). Returns a pointer to the minimal symbol that
c906108c
SS
147 matches, or NULL if no match is found.
148
149 Note: One instance where there may be duplicate minimal symbols with
150 the same name is when the symbol tables for a shared library and the
151 symbol tables for an executable contain global symbols with the same
d73f140a
JB
152 names (the dynamic linker deals with the duplication).
153
154 It's also possible to have minimal symbols with different mangled
155 names, but identical demangled names. For example, the GNU C++ v3
156 ABI requires the generation of two (or perhaps three) copies of
157 constructor functions --- "in-charge", "not-in-charge", and
158 "allocate" copies; destructors may be duplicated as well.
159 Obviously, there must be distinct mangled names for each of these,
160 but the demangled names are all the same: S::S or S::~S. */
c906108c 161
3b7344d5
TT
162struct bound_minimal_symbol
163lookup_minimal_symbol (const char *name, const char *sfile,
164 struct objfile *objf)
c906108c
SS
165{
166 struct objfile *objfile;
7c7b6655
TT
167 struct bound_minimal_symbol found_symbol = { NULL, NULL };
168 struct bound_minimal_symbol found_file_symbol = { NULL, NULL };
169 struct bound_minimal_symbol trampoline_symbol = { NULL, NULL };
c906108c 170
261397f8
DJ
171 unsigned int hash = msymbol_hash (name) % MINIMAL_SYMBOL_HASH_SIZE;
172 unsigned int dem_hash = msymbol_hash_iw (name) % MINIMAL_SYMBOL_HASH_SIZE;
9227b5eb 173
71c25dea
TT
174 int needtofreename = 0;
175 const char *modified_name;
176
c906108c 177 if (sfile != NULL)
9f37bbcc 178 sfile = lbasename (sfile);
c906108c 179
025bb325 180 /* For C++, canonicalize the input name. */
71c25dea
TT
181 modified_name = name;
182 if (current_language->la_language == language_cplus)
183 {
184 char *cname = cp_canonicalize_string (name);
b8d56208 185
71c25dea
TT
186 if (cname)
187 {
188 modified_name = cname;
189 needtofreename = 1;
190 }
191 }
192
c906108c 193 for (objfile = object_files;
7c7b6655 194 objfile != NULL && found_symbol.minsym == NULL;
c5aa993b 195 objfile = objfile->next)
c906108c 196 {
7c7b6655
TT
197 struct minimal_symbol *msymbol;
198
56e3f43c 199 if (objf == NULL || objf == objfile
15d123c9 200 || objf == objfile->separate_debug_objfile_backlink)
c906108c 201 {
9227b5eb
JB
202 /* Do two passes: the first over the ordinary hash table,
203 and the second over the demangled hash table. */
0729fd50 204 int pass;
9227b5eb 205
cc485e62
DE
206 if (symbol_lookup_debug)
207 {
208 fprintf_unfiltered (gdb_stdlog,
209 "lookup_minimal_symbol (%s, %s, %s)\n",
210 name, sfile != NULL ? sfile : "NULL",
211 objfile_debug_name (objfile));
212 }
213
7c7b6655 214 for (pass = 1; pass <= 2 && found_symbol.minsym == NULL; pass++)
c906108c 215 {
0729fd50
DB
216 /* Select hash list according to pass. */
217 if (pass == 1)
34643a32 218 msymbol = objfile->per_bfd->msymbol_hash[hash];
0729fd50 219 else
34643a32 220 msymbol = objfile->per_bfd->msymbol_demangled_hash[dem_hash];
0729fd50 221
7c7b6655 222 while (msymbol != NULL && found_symbol.minsym == NULL)
c906108c 223 {
3567439c
DJ
224 int match;
225
226 if (pass == 1)
71c25dea 227 {
559a7a62
JK
228 int (*cmp) (const char *, const char *);
229
230 cmp = (case_sensitivity == case_sensitive_on
231 ? strcmp : strcasecmp);
efd66ac6 232 match = cmp (MSYMBOL_LINKAGE_NAME (msymbol),
559a7a62 233 modified_name) == 0;
71c25dea 234 }
3567439c 235 else
71c25dea 236 {
559a7a62 237 /* The function respects CASE_SENSITIVITY. */
efd66ac6 238 match = MSYMBOL_MATCHES_SEARCH_NAME (msymbol,
71c25dea
TT
239 modified_name);
240 }
241
3567439c 242 if (match)
c906108c 243 {
0729fd50
DB
244 switch (MSYMBOL_TYPE (msymbol))
245 {
246 case mst_file_text:
247 case mst_file_data:
248 case mst_file_bss:
6314a349 249 if (sfile == NULL
0ba1096a 250 || filename_cmp (msymbol->filename, sfile) == 0)
7c7b6655
TT
251 {
252 found_file_symbol.minsym = msymbol;
253 found_file_symbol.objfile = objfile;
254 }
0729fd50
DB
255 break;
256
257 case mst_solib_trampoline:
258
259 /* If a trampoline symbol is found, we prefer to
025bb325 260 keep looking for the *real* symbol. If the
0729fd50 261 actual symbol is not found, then we'll use the
025bb325 262 trampoline entry. */
7c7b6655
TT
263 if (trampoline_symbol.minsym == NULL)
264 {
265 trampoline_symbol.minsym = msymbol;
266 trampoline_symbol.objfile = objfile;
267 }
0729fd50
DB
268 break;
269
270 case mst_unknown:
271 default:
7c7b6655
TT
272 found_symbol.minsym = msymbol;
273 found_symbol.objfile = objfile;
0729fd50
DB
274 break;
275 }
c906108c 276 }
9227b5eb 277
0729fd50
DB
278 /* Find the next symbol on the hash chain. */
279 if (pass == 1)
280 msymbol = msymbol->hash_next;
281 else
282 msymbol = msymbol->demangled_hash_next;
9227b5eb 283 }
c906108c
SS
284 }
285 }
286 }
71c25dea
TT
287
288 if (needtofreename)
289 xfree ((void *) modified_name);
290
c906108c 291 /* External symbols are best. */
7c7b6655 292 if (found_symbol.minsym != NULL)
cc485e62
DE
293 {
294 if (symbol_lookup_debug)
295 {
296 fprintf_unfiltered (gdb_stdlog,
297 "lookup_minimal_symbol (...) = %s"
298 " (external)\n",
299 host_address_to_string (found_symbol.minsym));
300 }
301 return found_symbol;
302 }
c906108c
SS
303
304 /* File-local symbols are next best. */
7c7b6655 305 if (found_file_symbol.minsym != NULL)
cc485e62
DE
306 {
307 if (symbol_lookup_debug)
308 {
309 fprintf_unfiltered (gdb_stdlog,
310 "lookup_minimal_symbol (...) = %s"
311 " (file-local)\n",
312 host_address_to_string
313 (found_file_symbol.minsym));
314 }
315 return found_file_symbol;
316 }
c906108c
SS
317
318 /* Symbols for shared library trampolines are next best. */
cc485e62
DE
319 if (symbol_lookup_debug)
320 {
321 fprintf_unfiltered (gdb_stdlog,
322 "lookup_minimal_symbol (...) = %s%s\n",
323 trampoline_symbol.minsym != NULL
324 ? host_address_to_string (trampoline_symbol.minsym)
325 : "NULL",
326 trampoline_symbol.minsym != NULL
327 ? " (trampoline)" : "");
328 }
7c7b6655
TT
329 return trampoline_symbol;
330}
331
332/* See minsyms.h. */
c906108c 333
7c7b6655
TT
334struct bound_minimal_symbol
335lookup_bound_minimal_symbol (const char *name)
336{
3b7344d5 337 return lookup_minimal_symbol (name, NULL, NULL);
c906108c
SS
338}
339
bd9269f7
GB
340/* See common/symbol.h. */
341
342int
343find_minimal_symbol_address (const char *name, CORE_ADDR *addr,
344 struct objfile *objfile)
345{
346 struct bound_minimal_symbol sym
347 = lookup_minimal_symbol (name, NULL, objfile);
348
349 if (sym.minsym != NULL)
350 *addr = BMSYMBOL_VALUE_ADDRESS (sym);
351
352 return sym.minsym == NULL;
353}
354
b19686e0 355/* See minsyms.h. */
f8eba3c6
TT
356
357void
358iterate_over_minimal_symbols (struct objfile *objf, const char *name,
359 void (*callback) (struct minimal_symbol *,
360 void *),
361 void *user_data)
362{
363 unsigned int hash;
364 struct minimal_symbol *iter;
365 int (*cmp) (const char *, const char *);
366
367 /* The first pass is over the ordinary hash table. */
368 hash = msymbol_hash (name) % MINIMAL_SYMBOL_HASH_SIZE;
34643a32 369 iter = objf->per_bfd->msymbol_hash[hash];
f8eba3c6
TT
370 cmp = (case_sensitivity == case_sensitive_on ? strcmp : strcasecmp);
371 while (iter)
372 {
efd66ac6 373 if (cmp (MSYMBOL_LINKAGE_NAME (iter), name) == 0)
f8eba3c6
TT
374 (*callback) (iter, user_data);
375 iter = iter->hash_next;
376 }
377
378 /* The second pass is over the demangled table. */
379 hash = msymbol_hash_iw (name) % MINIMAL_SYMBOL_HASH_SIZE;
34643a32 380 iter = objf->per_bfd->msymbol_demangled_hash[hash];
f8eba3c6
TT
381 while (iter)
382 {
efd66ac6 383 if (MSYMBOL_MATCHES_SEARCH_NAME (iter, name))
f8eba3c6
TT
384 (*callback) (iter, user_data);
385 iter = iter->demangled_hash_next;
386 }
387}
388
b19686e0 389/* See minsyms.h. */
c5aa993b 390
3b7344d5 391struct bound_minimal_symbol
5520a790 392lookup_minimal_symbol_text (const char *name, struct objfile *objf)
c906108c
SS
393{
394 struct objfile *objfile;
395 struct minimal_symbol *msymbol;
3b7344d5
TT
396 struct bound_minimal_symbol found_symbol = { NULL, NULL };
397 struct bound_minimal_symbol found_file_symbol = { NULL, NULL };
c906108c 398
72a5efb3
DJ
399 unsigned int hash = msymbol_hash (name) % MINIMAL_SYMBOL_HASH_SIZE;
400
c906108c 401 for (objfile = object_files;
3b7344d5 402 objfile != NULL && found_symbol.minsym == NULL;
c5aa993b 403 objfile = objfile->next)
c906108c 404 {
56e3f43c 405 if (objf == NULL || objf == objfile
15d123c9 406 || objf == objfile->separate_debug_objfile_backlink)
c906108c 407 {
34643a32 408 for (msymbol = objfile->per_bfd->msymbol_hash[hash];
3b7344d5 409 msymbol != NULL && found_symbol.minsym == NULL;
72a5efb3 410 msymbol = msymbol->hash_next)
c906108c 411 {
efd66ac6 412 if (strcmp (MSYMBOL_LINKAGE_NAME (msymbol), name) == 0 &&
0875794a
JK
413 (MSYMBOL_TYPE (msymbol) == mst_text
414 || MSYMBOL_TYPE (msymbol) == mst_text_gnu_ifunc
415 || MSYMBOL_TYPE (msymbol) == mst_file_text))
c906108c
SS
416 {
417 switch (MSYMBOL_TYPE (msymbol))
418 {
419 case mst_file_text:
3b7344d5
TT
420 found_file_symbol.minsym = msymbol;
421 found_file_symbol.objfile = objfile;
c906108c
SS
422 break;
423 default:
3b7344d5
TT
424 found_symbol.minsym = msymbol;
425 found_symbol.objfile = objfile;
c906108c
SS
426 break;
427 }
428 }
429 }
430 }
431 }
432 /* External symbols are best. */
3b7344d5 433 if (found_symbol.minsym)
c906108c
SS
434 return found_symbol;
435
436 /* File-local symbols are next best. */
3b7344d5 437 return found_file_symbol;
c906108c
SS
438}
439
b19686e0 440/* See minsyms.h. */
907fc202
UW
441
442struct minimal_symbol *
443lookup_minimal_symbol_by_pc_name (CORE_ADDR pc, const char *name,
444 struct objfile *objf)
445{
446 struct objfile *objfile;
447 struct minimal_symbol *msymbol;
448
449 unsigned int hash = msymbol_hash (name) % MINIMAL_SYMBOL_HASH_SIZE;
450
451 for (objfile = object_files;
452 objfile != NULL;
453 objfile = objfile->next)
454 {
455 if (objf == NULL || objf == objfile
15d123c9 456 || objf == objfile->separate_debug_objfile_backlink)
907fc202 457 {
34643a32 458 for (msymbol = objfile->per_bfd->msymbol_hash[hash];
907fc202
UW
459 msymbol != NULL;
460 msymbol = msymbol->hash_next)
461 {
77e371c0 462 if (MSYMBOL_VALUE_ADDRESS (objfile, msymbol) == pc
efd66ac6 463 && strcmp (MSYMBOL_LINKAGE_NAME (msymbol), name) == 0)
907fc202
UW
464 return msymbol;
465 }
466 }
467 }
468
469 return NULL;
470}
471
b19686e0 472/* See minsyms.h. */
c5aa993b 473
3b7344d5 474struct bound_minimal_symbol
aa1ee363 475lookup_minimal_symbol_solib_trampoline (const char *name,
aa1ee363 476 struct objfile *objf)
c906108c
SS
477{
478 struct objfile *objfile;
479 struct minimal_symbol *msymbol;
3b7344d5 480 struct bound_minimal_symbol found_symbol = { NULL, NULL };
c906108c 481
72a5efb3
DJ
482 unsigned int hash = msymbol_hash (name) % MINIMAL_SYMBOL_HASH_SIZE;
483
c906108c 484 for (objfile = object_files;
3b7344d5 485 objfile != NULL;
c5aa993b 486 objfile = objfile->next)
c906108c 487 {
56e3f43c 488 if (objf == NULL || objf == objfile
15d123c9 489 || objf == objfile->separate_debug_objfile_backlink)
c906108c 490 {
34643a32 491 for (msymbol = objfile->per_bfd->msymbol_hash[hash];
3b7344d5 492 msymbol != NULL;
72a5efb3 493 msymbol = msymbol->hash_next)
c906108c 494 {
efd66ac6 495 if (strcmp (MSYMBOL_LINKAGE_NAME (msymbol), name) == 0 &&
c906108c 496 MSYMBOL_TYPE (msymbol) == mst_solib_trampoline)
3b7344d5
TT
497 {
498 found_symbol.objfile = objfile;
499 found_symbol.minsym = msymbol;
500 return found_symbol;
501 }
c906108c
SS
502 }
503 }
504 }
505
3b7344d5 506 return found_symbol;
c906108c
SS
507}
508
77e371c0
TT
509/* A helper function that makes *PC section-relative. This searches
510 the sections of OBJFILE and if *PC is in a section, it subtracts
511 the section offset and returns true. Otherwise it returns
512 false. */
513
514static int
515frob_address (struct objfile *objfile, CORE_ADDR *pc)
516{
517 struct obj_section *iter;
518
519 ALL_OBJFILE_OSECTIONS (objfile, iter)
520 {
521 if (*pc >= obj_section_addr (iter) && *pc < obj_section_endaddr (iter))
522 {
523 *pc -= obj_section_offset (iter);
524 return 1;
525 }
526 }
527
528 return 0;
529}
530
c906108c
SS
531/* Search through the minimal symbol table for each objfile and find
532 the symbol whose address is the largest address that is still less
00878c6e
PP
533 than or equal to PC, and matches SECTION (which is not NULL).
534 Returns a pointer to the minimal symbol if such a symbol is found,
535 or NULL if PC is not in a suitable range.
536 Note that we need to look through ALL the minimal symbol tables
537 before deciding on the symbol that comes closest to the specified PC.
538 This is because objfiles can overlap, for example objfile A has .text
539 at 0x100 and .data at 0x40000 and objfile B has .text at 0x234 and
540 .data at 0x40048.
c906108c 541
2eaf8d2a
DJ
542 If WANT_TRAMPOLINE is set, prefer mst_solib_trampoline symbols when
543 there are text and trampoline symbols at the same address.
544 Otherwise prefer mst_text symbols. */
545
7cbd4a93 546static struct bound_minimal_symbol
77e371c0 547lookup_minimal_symbol_by_pc_section_1 (CORE_ADDR pc_in,
714835d5 548 struct obj_section *section,
2eaf8d2a 549 int want_trampoline)
c906108c
SS
550{
551 int lo;
552 int hi;
fe978cb0 553 int newobj;
c906108c
SS
554 struct objfile *objfile;
555 struct minimal_symbol *msymbol;
556 struct minimal_symbol *best_symbol = NULL;
7cbd4a93
TT
557 struct objfile *best_objfile = NULL;
558 struct bound_minimal_symbol result;
2eaf8d2a 559 enum minimal_symbol_type want_type, other_type;
c906108c 560
2eaf8d2a
DJ
561 want_type = want_trampoline ? mst_solib_trampoline : mst_text;
562 other_type = want_trampoline ? mst_text : mst_solib_trampoline;
00878c6e
PP
563
564 /* We can not require the symbol found to be in section, because
96225718
DJ
565 e.g. IRIX 6.5 mdebug relies on this code returning an absolute
566 symbol - but find_pc_section won't return an absolute section and
567 hence the code below would skip over absolute symbols. We can
568 still take advantage of the call to find_pc_section, though - the
569 object file still must match. In case we have separate debug
570 files, search both the file and its separate debug file. There's
571 no telling which one will have the minimal symbols. */
572
00878c6e 573 gdb_assert (section != NULL);
96225718 574
15d123c9
TG
575 for (objfile = section->objfile;
576 objfile != NULL;
577 objfile = objfile_separate_debug_iterate (section->objfile, objfile))
c906108c 578 {
77e371c0
TT
579 CORE_ADDR pc = pc_in;
580
c906108c 581 /* If this objfile has a minimal symbol table, go search it using
c5aa993b
JM
582 a binary search. Note that a minimal symbol table always consists
583 of at least two symbols, a "real" symbol and the terminating
584 "null symbol". If there are no real symbols, then there is no
025bb325 585 minimal symbol table at all. */
c906108c 586
34643a32 587 if (objfile->per_bfd->minimal_symbol_count > 0)
c906108c 588 {
29e8a844
DJ
589 int best_zero_sized = -1;
590
34643a32 591 msymbol = objfile->per_bfd->msymbols;
c906108c 592 lo = 0;
34643a32 593 hi = objfile->per_bfd->minimal_symbol_count - 1;
c906108c
SS
594
595 /* This code assumes that the minimal symbols are sorted by
596 ascending address values. If the pc value is greater than or
597 equal to the first symbol's address, then some symbol in this
598 minimal symbol table is a suitable candidate for being the
599 "best" symbol. This includes the last real symbol, for cases
600 where the pc value is larger than any address in this vector.
601
602 By iterating until the address associated with the current
603 hi index (the endpoint of the test interval) is less than
604 or equal to the desired pc value, we accomplish two things:
605 (1) the case where the pc value is larger than any minimal
606 symbol address is trivially solved, (2) the address associated
607 with the hi index is always the one we want when the interation
608 terminates. In essence, we are iterating the test interval
609 down until the pc value is pushed out of it from the high end.
610
025bb325 611 Warning: this code is trickier than it would appear at first. */
c906108c 612
77e371c0
TT
613 if (frob_address (objfile, &pc)
614 && pc >= MSYMBOL_VALUE_RAW_ADDRESS (&msymbol[lo]))
c906108c 615 {
77e371c0 616 while (MSYMBOL_VALUE_RAW_ADDRESS (&msymbol[hi]) > pc)
c906108c 617 {
025bb325
MS
618 /* pc is still strictly less than highest address. */
619 /* Note "new" will always be >= lo. */
fe978cb0
PA
620 newobj = (lo + hi) / 2;
621 if ((MSYMBOL_VALUE_RAW_ADDRESS (&msymbol[newobj]) >= pc)
622 || (lo == newobj))
c906108c 623 {
fe978cb0 624 hi = newobj;
c906108c
SS
625 }
626 else
627 {
fe978cb0 628 lo = newobj;
c906108c
SS
629 }
630 }
631
632 /* If we have multiple symbols at the same address, we want
c5aa993b
JM
633 hi to point to the last one. That way we can find the
634 right symbol if it has an index greater than hi. */
34643a32 635 while (hi < objfile->per_bfd->minimal_symbol_count - 1
77e371c0
TT
636 && (MSYMBOL_VALUE_RAW_ADDRESS (&msymbol[hi])
637 == MSYMBOL_VALUE_RAW_ADDRESS (&msymbol[hi + 1])))
c906108c
SS
638 hi++;
639
29e8a844
DJ
640 /* Skip various undesirable symbols. */
641 while (hi >= 0)
642 {
643 /* Skip any absolute symbols. This is apparently
644 what adb and dbx do, and is needed for the CM-5.
645 There are two known possible problems: (1) on
646 ELF, apparently end, edata, etc. are absolute.
647 Not sure ignoring them here is a big deal, but if
648 we want to use them, the fix would go in
649 elfread.c. (2) I think shared library entry
650 points on the NeXT are absolute. If we want
651 special handling for this it probably should be
652 triggered by a special mst_abs_or_lib or some
653 such. */
654
712f90be 655 if (MSYMBOL_TYPE (&msymbol[hi]) == mst_abs)
29e8a844
DJ
656 {
657 hi--;
658 continue;
659 }
660
661 /* If SECTION was specified, skip any symbol from
662 wrong section. */
663 if (section
664 /* Some types of debug info, such as COFF,
665 don't fill the bfd_section member, so don't
666 throw away symbols on those platforms. */
efd66ac6 667 && MSYMBOL_OBJ_SECTION (objfile, &msymbol[hi]) != NULL
714835d5 668 && (!matching_obj_sections
efd66ac6 669 (MSYMBOL_OBJ_SECTION (objfile, &msymbol[hi]),
e27d198c 670 section)))
29e8a844
DJ
671 {
672 hi--;
673 continue;
674 }
675
2eaf8d2a
DJ
676 /* If we are looking for a trampoline and this is a
677 text symbol, or the other way around, check the
177b42fe 678 preceding symbol too. If they are otherwise
2eaf8d2a
DJ
679 identical prefer that one. */
680 if (hi > 0
681 && MSYMBOL_TYPE (&msymbol[hi]) == other_type
682 && MSYMBOL_TYPE (&msymbol[hi - 1]) == want_type
683 && (MSYMBOL_SIZE (&msymbol[hi])
684 == MSYMBOL_SIZE (&msymbol[hi - 1]))
77e371c0
TT
685 && (MSYMBOL_VALUE_RAW_ADDRESS (&msymbol[hi])
686 == MSYMBOL_VALUE_RAW_ADDRESS (&msymbol[hi - 1]))
efd66ac6
TT
687 && (MSYMBOL_OBJ_SECTION (objfile, &msymbol[hi])
688 == MSYMBOL_OBJ_SECTION (objfile, &msymbol[hi - 1])))
2eaf8d2a
DJ
689 {
690 hi--;
691 continue;
692 }
693
29e8a844
DJ
694 /* If the minimal symbol has a zero size, save it
695 but keep scanning backwards looking for one with
696 a non-zero size. A zero size may mean that the
697 symbol isn't an object or function (e.g. a
698 label), or it may just mean that the size was not
699 specified. */
5506f9f6 700 if (MSYMBOL_SIZE (&msymbol[hi]) == 0)
29e8a844 701 {
5506f9f6
KB
702 if (best_zero_sized == -1)
703 best_zero_sized = hi;
29e8a844
DJ
704 hi--;
705 continue;
706 }
707
f7a6bb70
DJ
708 /* If we are past the end of the current symbol, try
709 the previous symbol if it has a larger overlapping
710 size. This happens on i686-pc-linux-gnu with glibc;
711 the nocancel variants of system calls are inside
712 the cancellable variants, but both have sizes. */
713 if (hi > 0
714 && MSYMBOL_SIZE (&msymbol[hi]) != 0
77e371c0 715 && pc >= (MSYMBOL_VALUE_RAW_ADDRESS (&msymbol[hi])
f7a6bb70 716 + MSYMBOL_SIZE (&msymbol[hi]))
77e371c0 717 && pc < (MSYMBOL_VALUE_RAW_ADDRESS (&msymbol[hi - 1])
f7a6bb70
DJ
718 + MSYMBOL_SIZE (&msymbol[hi - 1])))
719 {
720 hi--;
721 continue;
722 }
723
29e8a844
DJ
724 /* Otherwise, this symbol must be as good as we're going
725 to get. */
726 break;
727 }
728
729 /* If HI has a zero size, and best_zero_sized is set,
730 then we had two or more zero-sized symbols; prefer
731 the first one we found (which may have a higher
732 address). Also, if we ran off the end, be sure
733 to back up. */
734 if (best_zero_sized != -1
735 && (hi < 0 || MSYMBOL_SIZE (&msymbol[hi]) == 0))
736 hi = best_zero_sized;
737
738 /* If the minimal symbol has a non-zero size, and this
739 PC appears to be outside the symbol's contents, then
740 refuse to use this symbol. If we found a zero-sized
741 symbol with an address greater than this symbol's,
742 use that instead. We assume that if symbols have
743 specified sizes, they do not overlap. */
744
745 if (hi >= 0
746 && MSYMBOL_SIZE (&msymbol[hi]) != 0
77e371c0 747 && pc >= (MSYMBOL_VALUE_RAW_ADDRESS (&msymbol[hi])
29e8a844
DJ
748 + MSYMBOL_SIZE (&msymbol[hi])))
749 {
750 if (best_zero_sized != -1)
751 hi = best_zero_sized;
752 else
753 /* Go on to the next object file. */
754 continue;
755 }
756
c906108c 757 /* The minimal symbol indexed by hi now is the best one in this
c5aa993b 758 objfile's minimal symbol table. See if it is the best one
025bb325 759 overall. */
c906108c 760
c906108c
SS
761 if (hi >= 0
762 && ((best_symbol == NULL) ||
77e371c0
TT
763 (MSYMBOL_VALUE_RAW_ADDRESS (best_symbol) <
764 MSYMBOL_VALUE_RAW_ADDRESS (&msymbol[hi]))))
c906108c
SS
765 {
766 best_symbol = &msymbol[hi];
7cbd4a93 767 best_objfile = objfile;
c906108c
SS
768 }
769 }
770 }
771 }
7cbd4a93
TT
772
773 result.minsym = best_symbol;
774 result.objfile = best_objfile;
775 return result;
c906108c
SS
776}
777
7cbd4a93 778struct bound_minimal_symbol
714835d5 779lookup_minimal_symbol_by_pc_section (CORE_ADDR pc, struct obj_section *section)
2eaf8d2a 780{
00878c6e
PP
781 if (section == NULL)
782 {
783 /* NOTE: cagney/2004-01-27: This was using find_pc_mapped_section to
784 force the section but that (well unless you're doing overlay
785 debugging) always returns NULL making the call somewhat useless. */
786 section = find_pc_section (pc);
787 if (section == NULL)
7cbd4a93
TT
788 {
789 struct bound_minimal_symbol result;
790
791 memset (&result, 0, sizeof (result));
792 return result;
793 }
00878c6e 794 }
2eaf8d2a
DJ
795 return lookup_minimal_symbol_by_pc_section_1 (pc, section, 0);
796}
797
b19686e0 798/* See minsyms.h. */
c906108c 799
7cbd4a93 800struct bound_minimal_symbol
fba45db2 801lookup_minimal_symbol_by_pc (CORE_ADDR pc)
c906108c 802{
7cbd4a93
TT
803 struct obj_section *section = find_pc_section (pc);
804
805 if (section == NULL)
806 {
807 struct bound_minimal_symbol result;
808
809 memset (&result, 0, sizeof (result));
810 return result;
811 }
812 return lookup_minimal_symbol_by_pc_section_1 (pc, section, 0);
c906108c 813}
0d5392b8 814
0875794a
JK
815/* Return non-zero iff PC is in an STT_GNU_IFUNC function resolver. */
816
817int
818in_gnu_ifunc_stub (CORE_ADDR pc)
819{
7cbd4a93 820 struct bound_minimal_symbol msymbol = lookup_minimal_symbol_by_pc (pc);
0875794a 821
7cbd4a93 822 return msymbol.minsym && MSYMBOL_TYPE (msymbol.minsym) == mst_text_gnu_ifunc;
0875794a
JK
823}
824
07be84bf
JK
825/* See elf_gnu_ifunc_resolve_addr for its real implementation. */
826
827static CORE_ADDR
828stub_gnu_ifunc_resolve_addr (struct gdbarch *gdbarch, CORE_ADDR pc)
829{
830 error (_("GDB cannot resolve STT_GNU_IFUNC symbol at address %s without "
831 "the ELF support compiled in."),
832 paddress (gdbarch, pc));
833}
834
835/* See elf_gnu_ifunc_resolve_name for its real implementation. */
836
837static int
838stub_gnu_ifunc_resolve_name (const char *function_name,
839 CORE_ADDR *function_address_p)
840{
841 error (_("GDB cannot resolve STT_GNU_IFUNC symbol \"%s\" without "
842 "the ELF support compiled in."),
843 function_name);
844}
845
0e30163f
JK
846/* See elf_gnu_ifunc_resolver_stop for its real implementation. */
847
848static void
849stub_gnu_ifunc_resolver_stop (struct breakpoint *b)
850{
851 internal_error (__FILE__, __LINE__,
852 _("elf_gnu_ifunc_resolver_stop cannot be reached."));
853}
854
855/* See elf_gnu_ifunc_resolver_return_stop for its real implementation. */
856
857static void
858stub_gnu_ifunc_resolver_return_stop (struct breakpoint *b)
859{
860 internal_error (__FILE__, __LINE__,
861 _("elf_gnu_ifunc_resolver_return_stop cannot be reached."));
862}
863
07be84bf
JK
864/* See elf_gnu_ifunc_fns for its real implementation. */
865
866static const struct gnu_ifunc_fns stub_gnu_ifunc_fns =
867{
868 stub_gnu_ifunc_resolve_addr,
869 stub_gnu_ifunc_resolve_name,
0e30163f
JK
870 stub_gnu_ifunc_resolver_stop,
871 stub_gnu_ifunc_resolver_return_stop,
07be84bf
JK
872};
873
874/* A placeholder for &elf_gnu_ifunc_fns. */
875
876const struct gnu_ifunc_fns *gnu_ifunc_fns_p = &stub_gnu_ifunc_fns;
877
b19686e0 878/* See minsyms.h. */
0d5392b8 879
7cbd4a93
TT
880struct bound_minimal_symbol
881lookup_minimal_symbol_and_objfile (const char *name)
0d5392b8 882{
7cbd4a93 883 struct bound_minimal_symbol result;
0d5392b8
TT
884 struct objfile *objfile;
885 unsigned int hash = msymbol_hash (name) % MINIMAL_SYMBOL_HASH_SIZE;
886
887 ALL_OBJFILES (objfile)
888 {
889 struct minimal_symbol *msym;
890
34643a32 891 for (msym = objfile->per_bfd->msymbol_hash[hash];
0d5392b8
TT
892 msym != NULL;
893 msym = msym->hash_next)
894 {
efd66ac6 895 if (strcmp (MSYMBOL_LINKAGE_NAME (msym), name) == 0)
0d5392b8 896 {
7cbd4a93
TT
897 result.minsym = msym;
898 result.objfile = objfile;
899 return result;
0d5392b8
TT
900 }
901 }
902 }
903
7cbd4a93
TT
904 memset (&result, 0, sizeof (result));
905 return result;
0d5392b8 906}
c906108c 907\f
c5aa993b 908
025bb325 909/* Return leading symbol character for a BFD. If BFD is NULL,
c906108c
SS
910 return the leading symbol character from the main objfile. */
911
c906108c 912static int
fba45db2 913get_symbol_leading_char (bfd *abfd)
c906108c
SS
914{
915 if (abfd != NULL)
916 return bfd_get_symbol_leading_char (abfd);
917 if (symfile_objfile != NULL && symfile_objfile->obfd != NULL)
918 return bfd_get_symbol_leading_char (symfile_objfile->obfd);
919 return 0;
920}
921
b19686e0 922/* See minsyms.h. */
c906108c 923
873a915e 924minimal_symbol_reader::minimal_symbol_reader ()
c906108c
SS
925{
926 msym_count = 0;
927 msym_bunch = NULL;
b19686e0
TT
928 /* Note that presetting msym_bunch_index to BUNCH_SIZE causes the
929 first call to save a minimal symbol to allocate the memory for
930 the first bunch. */
c906108c
SS
931 msym_bunch_index = BUNCH_SIZE;
932}
933
873a915e
TT
934/* Discard the currently collected minimal symbols, if any. If we wish
935 to save them for later use, we must have already copied them somewhere
936 else before calling this function.
937
938 FIXME: We could allocate the minimal symbol bunches on their own
939 obstack and then simply blow the obstack away when we are done with
940 it. Is it worth the extra trouble though? */
941
942minimal_symbol_reader::~minimal_symbol_reader ()
943{
944 struct msym_bunch *next;
945
946 while (msym_bunch != NULL)
947 {
948 next = msym_bunch->next;
949 xfree (msym_bunch);
950 msym_bunch = next;
951 }
952}
953
b19686e0
TT
954/* See minsyms.h. */
955
c906108c 956void
fba45db2
KB
957prim_record_minimal_symbol (const char *name, CORE_ADDR address,
958 enum minimal_symbol_type ms_type,
959 struct objfile *objfile)
c906108c
SS
960{
961 int section;
962
963 switch (ms_type)
964 {
965 case mst_text:
0875794a 966 case mst_text_gnu_ifunc:
c906108c
SS
967 case mst_file_text:
968 case mst_solib_trampoline:
b8fbeb18 969 section = SECT_OFF_TEXT (objfile);
c906108c
SS
970 break;
971 case mst_data:
972 case mst_file_data:
b8fbeb18 973 section = SECT_OFF_DATA (objfile);
c906108c
SS
974 break;
975 case mst_bss:
976 case mst_file_bss:
b8fbeb18 977 section = SECT_OFF_BSS (objfile);
c906108c
SS
978 break;
979 default:
980 section = -1;
981 }
982
983 prim_record_minimal_symbol_and_info (name, address, ms_type,
e6dc44a8 984 section, objfile);
c906108c
SS
985}
986
b19686e0 987/* See minsyms.h. */
c906108c
SS
988
989struct minimal_symbol *
04a679b8
TT
990prim_record_minimal_symbol_full (const char *name, int name_len, int copy_name,
991 CORE_ADDR address,
992 enum minimal_symbol_type ms_type,
993 int section,
04a679b8 994 struct objfile *objfile)
c906108c 995{
fe978cb0 996 struct msym_bunch *newobj;
52f0bd74 997 struct minimal_symbol *msymbol;
c906108c 998
66337bb1
CV
999 /* Don't put gcc_compiled, __gnu_compiled_cplus, and friends into
1000 the minimal symbols, because if there is also another symbol
1001 at the same address (e.g. the first function of the file),
1002 lookup_minimal_symbol_by_pc would have no way of getting the
1003 right one. */
1004 if (ms_type == mst_file_text && name[0] == 'g'
1005 && (strcmp (name, GCC_COMPILED_FLAG_SYMBOL) == 0
1006 || strcmp (name, GCC2_COMPILED_FLAG_SYMBOL) == 0))
1007 return (NULL);
1008
1009 /* It's safe to strip the leading char here once, since the name
025bb325 1010 is also stored stripped in the minimal symbol table. */
66337bb1 1011 if (name[0] == get_symbol_leading_char (objfile->obfd))
04a679b8
TT
1012 {
1013 ++name;
1014 --name_len;
1015 }
66337bb1 1016
61012eef 1017 if (ms_type == mst_file_text && startswith (name, "__gnu_compiled"))
66337bb1 1018 return (NULL);
c906108c
SS
1019
1020 if (msym_bunch_index == BUNCH_SIZE)
1021 {
fe978cb0 1022 newobj = XCNEW (struct msym_bunch);
c906108c 1023 msym_bunch_index = 0;
fe978cb0
PA
1024 newobj->next = msym_bunch;
1025 msym_bunch = newobj;
c906108c 1026 }
c5aa993b 1027 msymbol = &msym_bunch->contents[msym_bunch_index];
34643a32
TT
1028 MSYMBOL_SET_LANGUAGE (msymbol, language_auto,
1029 &objfile->per_bfd->storage_obstack);
efd66ac6 1030 MSYMBOL_SET_NAMES (msymbol, name, name_len, copy_name, objfile);
2de7ced7 1031
40c1a007 1032 SET_MSYMBOL_VALUE_ADDRESS (msymbol, address);
efd66ac6 1033 MSYMBOL_SECTION (msymbol) = section;
714835d5 1034
c906108c 1035 MSYMBOL_TYPE (msymbol) = ms_type;
b887350f
TT
1036 MSYMBOL_TARGET_FLAG_1 (msymbol) = 0;
1037 MSYMBOL_TARGET_FLAG_2 (msymbol) = 0;
d9eaeb59
JB
1038 /* Do not use the SET_MSYMBOL_SIZE macro to initialize the size,
1039 as it would also set the has_size flag. */
1040 msymbol->size = 0;
9227b5eb 1041
a79dea61 1042 /* The hash pointers must be cleared! If they're not,
025bb325 1043 add_minsym_to_hash_table will NOT add this msymbol to the hash table. */
9227b5eb
JB
1044 msymbol->hash_next = NULL;
1045 msymbol->demangled_hash_next = NULL;
1046
34643a32
TT
1047 /* If we already read minimal symbols for this objfile, then don't
1048 ever allocate a new one. */
1049 if (!objfile->per_bfd->minsyms_read)
5f6cac40
TT
1050 {
1051 msym_bunch_index++;
1052 objfile->per_bfd->n_minsyms++;
1053 }
c906108c 1054 msym_count++;
c906108c
SS
1055 return msymbol;
1056}
1057
b19686e0 1058/* See minsyms.h. */
04a679b8
TT
1059
1060struct minimal_symbol *
1061prim_record_minimal_symbol_and_info (const char *name, CORE_ADDR address,
1062 enum minimal_symbol_type ms_type,
1063 int section,
04a679b8
TT
1064 struct objfile *objfile)
1065{
1066 return prim_record_minimal_symbol_full (name, strlen (name), 1,
e6dc44a8
TT
1067 address, ms_type,
1068 section, objfile);
04a679b8
TT
1069}
1070
c906108c 1071/* Compare two minimal symbols by address and return a signed result based
025bb325 1072 on unsigned comparisons, so that we sort into unsigned numeric order.
c906108c
SS
1073 Within groups with the same address, sort by name. */
1074
1075static int
12b9c64f 1076compare_minimal_symbols (const void *fn1p, const void *fn2p)
c906108c 1077{
52f0bd74
AC
1078 const struct minimal_symbol *fn1;
1079 const struct minimal_symbol *fn2;
c906108c
SS
1080
1081 fn1 = (const struct minimal_symbol *) fn1p;
1082 fn2 = (const struct minimal_symbol *) fn2p;
1083
77e371c0 1084 if (MSYMBOL_VALUE_RAW_ADDRESS (fn1) < MSYMBOL_VALUE_RAW_ADDRESS (fn2))
c906108c 1085 {
025bb325 1086 return (-1); /* addr 1 is less than addr 2. */
c906108c 1087 }
77e371c0 1088 else if (MSYMBOL_VALUE_RAW_ADDRESS (fn1) > MSYMBOL_VALUE_RAW_ADDRESS (fn2))
c906108c 1089 {
025bb325 1090 return (1); /* addr 1 is greater than addr 2. */
c906108c 1091 }
c5aa993b
JM
1092 else
1093 /* addrs are equal: sort by name */
c906108c 1094 {
efd66ac6
TT
1095 const char *name1 = MSYMBOL_LINKAGE_NAME (fn1);
1096 const char *name2 = MSYMBOL_LINKAGE_NAME (fn2);
c906108c
SS
1097
1098 if (name1 && name2) /* both have names */
1099 return strcmp (name1, name2);
1100 else if (name2)
025bb325
MS
1101 return 1; /* fn1 has no name, so it is "less". */
1102 else if (name1) /* fn2 has no name, so it is "less". */
c906108c
SS
1103 return -1;
1104 else
025bb325 1105 return (0); /* Neither has a name, so they're equal. */
c906108c
SS
1106 }
1107}
1108
c906108c
SS
1109/* Compact duplicate entries out of a minimal symbol table by walking
1110 through the table and compacting out entries with duplicate addresses
1111 and matching names. Return the number of entries remaining.
1112
1113 On entry, the table resides between msymbol[0] and msymbol[mcount].
1114 On exit, it resides between msymbol[0] and msymbol[result_count].
1115
1116 When files contain multiple sources of symbol information, it is
1117 possible for the minimal symbol table to contain many duplicate entries.
1118 As an example, SVR4 systems use ELF formatted object files, which
1119 usually contain at least two different types of symbol tables (a
1120 standard ELF one and a smaller dynamic linking table), as well as
1121 DWARF debugging information for files compiled with -g.
1122
1123 Without compacting, the minimal symbol table for gdb itself contains
1124 over a 1000 duplicates, about a third of the total table size. Aside
1125 from the potential trap of not noticing that two successive entries
1126 identify the same location, this duplication impacts the time required
1127 to linearly scan the table, which is done in a number of places. So we
1128 just do one linear scan here and toss out the duplicates.
1129
1130 Note that we are not concerned here about recovering the space that
1131 is potentially freed up, because the strings themselves are allocated
34643a32 1132 on the storage_obstack, and will get automatically freed when the symbol
c906108c
SS
1133 table is freed. The caller can free up the unused minimal symbols at
1134 the end of the compacted region if their allocation strategy allows it.
1135
1136 Also note we only go up to the next to last entry within the loop
1137 and then copy the last entry explicitly after the loop terminates.
1138
1139 Since the different sources of information for each symbol may
1140 have different levels of "completeness", we may have duplicates
1141 that have one entry with type "mst_unknown" and the other with a
1142 known type. So if the one we are leaving alone has type mst_unknown,
1143 overwrite its type with the type from the one we are compacting out. */
1144
1145static int
fba45db2
KB
1146compact_minimal_symbols (struct minimal_symbol *msymbol, int mcount,
1147 struct objfile *objfile)
c906108c
SS
1148{
1149 struct minimal_symbol *copyfrom;
1150 struct minimal_symbol *copyto;
1151
1152 if (mcount > 0)
1153 {
1154 copyfrom = copyto = msymbol;
1155 while (copyfrom < msymbol + mcount - 1)
1156 {
77e371c0
TT
1157 if (MSYMBOL_VALUE_RAW_ADDRESS (copyfrom)
1158 == MSYMBOL_VALUE_RAW_ADDRESS ((copyfrom + 1))
1159 && MSYMBOL_SECTION (copyfrom) == MSYMBOL_SECTION (copyfrom + 1)
efd66ac6
TT
1160 && strcmp (MSYMBOL_LINKAGE_NAME (copyfrom),
1161 MSYMBOL_LINKAGE_NAME ((copyfrom + 1))) == 0)
c906108c 1162 {
c5aa993b 1163 if (MSYMBOL_TYPE ((copyfrom + 1)) == mst_unknown)
c906108c
SS
1164 {
1165 MSYMBOL_TYPE ((copyfrom + 1)) = MSYMBOL_TYPE (copyfrom);
1166 }
1167 copyfrom++;
1168 }
1169 else
afbb8d7a 1170 *copyto++ = *copyfrom++;
c906108c
SS
1171 }
1172 *copyto++ = *copyfrom++;
1173 mcount = copyto - msymbol;
1174 }
1175 return (mcount);
1176}
1177
afbb8d7a
KB
1178/* Build (or rebuild) the minimal symbol hash tables. This is necessary
1179 after compacting or sorting the table since the entries move around
025bb325 1180 thus causing the internal minimal_symbol pointers to become jumbled. */
afbb8d7a
KB
1181
1182static void
1183build_minimal_symbol_hash_tables (struct objfile *objfile)
1184{
1185 int i;
1186 struct minimal_symbol *msym;
1187
025bb325 1188 /* Clear the hash tables. */
afbb8d7a
KB
1189 for (i = 0; i < MINIMAL_SYMBOL_HASH_SIZE; i++)
1190 {
34643a32
TT
1191 objfile->per_bfd->msymbol_hash[i] = 0;
1192 objfile->per_bfd->msymbol_demangled_hash[i] = 0;
afbb8d7a
KB
1193 }
1194
025bb325 1195 /* Now, (re)insert the actual entries. */
34643a32
TT
1196 for ((i = objfile->per_bfd->minimal_symbol_count,
1197 msym = objfile->per_bfd->msymbols);
afbb8d7a
KB
1198 i > 0;
1199 i--, msym++)
1200 {
1201 msym->hash_next = 0;
34643a32 1202 add_minsym_to_hash_table (msym, objfile->per_bfd->msymbol_hash);
afbb8d7a
KB
1203
1204 msym->demangled_hash_next = 0;
efd66ac6 1205 if (MSYMBOL_SEARCH_NAME (msym) != MSYMBOL_LINKAGE_NAME (msym))
afbb8d7a 1206 add_minsym_to_demangled_hash_table (msym,
34643a32 1207 objfile->per_bfd->msymbol_demangled_hash);
afbb8d7a
KB
1208 }
1209}
1210
c906108c
SS
1211/* Add the minimal symbols in the existing bunches to the objfile's official
1212 minimal symbol table. In most cases there is no minimal symbol table yet
1213 for this objfile, and the existing bunches are used to create one. Once
1214 in a while (for shared libraries for example), we add symbols (e.g. common
1215 symbols) to an existing objfile.
1216
1217 Because of the way minimal symbols are collected, we generally have no way
1218 of knowing what source language applies to any particular minimal symbol.
1219 Specifically, we have no way of knowing if the minimal symbol comes from a
1220 C++ compilation unit or not. So for the sake of supporting cached
1221 demangled C++ names, we have no choice but to try and demangle each new one
1222 that comes in. If the demangling succeeds, then we assume it is a C++
1223 symbol and set the symbol's language and demangled name fields
1224 appropriately. Note that in order to avoid unnecessary demanglings, and
1225 allocating obstack space that subsequently can't be freed for the demangled
1226 names, we mark all newly added symbols with language_auto. After
1227 compaction of the minimal symbols, we go back and scan the entire minimal
1228 symbol table looking for these new symbols. For each new symbol we attempt
1229 to demangle it, and if successful, record it as a language_cplus symbol
1230 and cache the demangled form on the symbol obstack. Symbols which don't
1231 demangle are marked as language_unknown symbols, which inhibits future
025bb325 1232 attempts to demangle them if we later add more minimal symbols. */
c906108c
SS
1233
1234void
873a915e 1235minimal_symbol_reader::install (struct objfile *objfile)
c906108c 1236{
52f0bd74
AC
1237 int bindex;
1238 int mcount;
1239 struct msym_bunch *bunch;
1240 struct minimal_symbol *msymbols;
c906108c 1241 int alloc_count;
c906108c 1242
34643a32
TT
1243 if (objfile->per_bfd->minsyms_read)
1244 return;
1245
c906108c
SS
1246 if (msym_count > 0)
1247 {
45cfd468
DE
1248 if (symtab_create_debug)
1249 {
1250 fprintf_unfiltered (gdb_stdlog,
1251 "Installing %d minimal symbols of objfile %s.\n",
4262abfb 1252 msym_count, objfile_name (objfile));
45cfd468
DE
1253 }
1254
c906108c 1255 /* Allocate enough space in the obstack, into which we will gather the
c5aa993b
JM
1256 bunches of new and existing minimal symbols, sort them, and then
1257 compact out the duplicate entries. Once we have a final table,
1258 we will give back the excess space. */
c906108c 1259
34643a32
TT
1260 alloc_count = msym_count + objfile->per_bfd->minimal_symbol_count + 1;
1261 obstack_blank (&objfile->per_bfd->storage_obstack,
c906108c
SS
1262 alloc_count * sizeof (struct minimal_symbol));
1263 msymbols = (struct minimal_symbol *)
34643a32 1264 obstack_base (&objfile->per_bfd->storage_obstack);
c906108c
SS
1265
1266 /* Copy in the existing minimal symbols, if there are any. */
1267
34643a32
TT
1268 if (objfile->per_bfd->minimal_symbol_count)
1269 memcpy ((char *) msymbols, (char *) objfile->per_bfd->msymbols,
1270 objfile->per_bfd->minimal_symbol_count * sizeof (struct minimal_symbol));
c906108c
SS
1271
1272 /* Walk through the list of minimal symbol bunches, adding each symbol
c5aa993b
JM
1273 to the new contiguous array of symbols. Note that we start with the
1274 current, possibly partially filled bunch (thus we use the current
1275 msym_bunch_index for the first bunch we copy over), and thereafter
025bb325 1276 each bunch is full. */
c5aa993b 1277
34643a32 1278 mcount = objfile->per_bfd->minimal_symbol_count;
c5aa993b
JM
1279
1280 for (bunch = msym_bunch; bunch != NULL; bunch = bunch->next)
c906108c
SS
1281 {
1282 for (bindex = 0; bindex < msym_bunch_index; bindex++, mcount++)
66337bb1 1283 msymbols[mcount] = bunch->contents[bindex];
c906108c
SS
1284 msym_bunch_index = BUNCH_SIZE;
1285 }
1286
1287 /* Sort the minimal symbols by address. */
c5aa993b 1288
c906108c
SS
1289 qsort (msymbols, mcount, sizeof (struct minimal_symbol),
1290 compare_minimal_symbols);
c5aa993b 1291
c906108c 1292 /* Compact out any duplicates, and free up whatever space we are
c5aa993b
JM
1293 no longer using. */
1294
9227b5eb 1295 mcount = compact_minimal_symbols (msymbols, mcount, objfile);
c906108c 1296
ee11262d 1297 obstack_blank_fast (&objfile->per_bfd->storage_obstack,
c5aa993b 1298 (mcount + 1 - alloc_count) * sizeof (struct minimal_symbol));
c906108c 1299 msymbols = (struct minimal_symbol *)
34643a32 1300 obstack_finish (&objfile->per_bfd->storage_obstack);
c906108c
SS
1301
1302 /* We also terminate the minimal symbol table with a "null symbol",
c5aa993b
JM
1303 which is *not* included in the size of the table. This makes it
1304 easier to find the end of the table when we are handed a pointer
1305 to some symbol in the middle of it. Zero out the fields in the
1306 "null symbol" allocated at the end of the array. Note that the
1307 symbol count does *not* include this null symbol, which is why it
025bb325 1308 is indexed by mcount and not mcount-1. */
c906108c 1309
a83e9154 1310 memset (&msymbols[mcount], 0, sizeof (struct minimal_symbol));
c906108c
SS
1311
1312 /* Attach the minimal symbol table to the specified objfile.
34643a32 1313 The strings themselves are also located in the storage_obstack
c5aa993b 1314 of this objfile. */
c906108c 1315
34643a32
TT
1316 objfile->per_bfd->minimal_symbol_count = mcount;
1317 objfile->per_bfd->msymbols = msymbols;
c906108c 1318
afbb8d7a
KB
1319 /* Now build the hash tables; we can't do this incrementally
1320 at an earlier point since we weren't finished with the obstack
1321 yet. (And if the msymbol obstack gets moved, all the internal
025bb325 1322 pointers to other msymbols need to be adjusted.) */
afbb8d7a 1323 build_minimal_symbol_hash_tables (objfile);
c906108c
SS
1324 }
1325}
1326
c35384fb
TT
1327/* See minsyms.h. */
1328
1329void
1330terminate_minimal_symbol_table (struct objfile *objfile)
1331{
34643a32
TT
1332 if (! objfile->per_bfd->msymbols)
1333 objfile->per_bfd->msymbols
1334 = ((struct minimal_symbol *)
1335 obstack_alloc (&objfile->per_bfd->storage_obstack,
1336 sizeof (struct minimal_symbol)));
c35384fb
TT
1337
1338 {
1339 struct minimal_symbol *m
34643a32 1340 = &objfile->per_bfd->msymbols[objfile->per_bfd->minimal_symbol_count];
c35384fb
TT
1341
1342 memset (m, 0, sizeof (*m));
1343 /* Don't rely on these enumeration values being 0's. */
1344 MSYMBOL_TYPE (m) = mst_unknown;
34643a32
TT
1345 MSYMBOL_SET_LANGUAGE (m, language_unknown,
1346 &objfile->per_bfd->storage_obstack);
c35384fb
TT
1347 }
1348}
1349
c9630d9c
TT
1350/* Check if PC is in a shared library trampoline code stub.
1351 Return minimal symbol for the trampoline entry or NULL if PC is not
1352 in a trampoline code stub. */
c906108c 1353
c9630d9c 1354static struct minimal_symbol *
fba45db2 1355lookup_solib_trampoline_symbol_by_pc (CORE_ADDR pc)
c906108c 1356{
2eaf8d2a 1357 struct obj_section *section = find_pc_section (pc);
7cbd4a93 1358 struct bound_minimal_symbol msymbol;
2eaf8d2a
DJ
1359
1360 if (section == NULL)
1361 return NULL;
714835d5 1362 msymbol = lookup_minimal_symbol_by_pc_section_1 (pc, section, 1);
c906108c 1363
7cbd4a93
TT
1364 if (msymbol.minsym != NULL
1365 && MSYMBOL_TYPE (msymbol.minsym) == mst_solib_trampoline)
1366 return msymbol.minsym;
c906108c
SS
1367 return NULL;
1368}
1369
1370/* If PC is in a shared library trampoline code stub, return the
1371 address of the `real' function belonging to the stub.
1372 Return 0 if PC is not in a trampoline code stub or if the real
1373 function is not found in the minimal symbol table.
1374
1375 We may fail to find the right function if a function with the
1376 same name is defined in more than one shared library, but this
025bb325 1377 is considered bad programming style. We could return 0 if we find
c906108c
SS
1378 a duplicate function in case this matters someday. */
1379
1380CORE_ADDR
52f729a7 1381find_solib_trampoline_target (struct frame_info *frame, CORE_ADDR pc)
c906108c
SS
1382{
1383 struct objfile *objfile;
1384 struct minimal_symbol *msymbol;
1385 struct minimal_symbol *tsymbol = lookup_solib_trampoline_symbol_by_pc (pc);
1386
1387 if (tsymbol != NULL)
1388 {
1389 ALL_MSYMBOLS (objfile, msymbol)
c5aa993b 1390 {
0875794a
JK
1391 if ((MSYMBOL_TYPE (msymbol) == mst_text
1392 || MSYMBOL_TYPE (msymbol) == mst_text_gnu_ifunc)
efd66ac6
TT
1393 && strcmp (MSYMBOL_LINKAGE_NAME (msymbol),
1394 MSYMBOL_LINKAGE_NAME (tsymbol)) == 0)
77e371c0 1395 return MSYMBOL_VALUE_ADDRESS (objfile, msymbol);
42848c96
UW
1396
1397 /* Also handle minimal symbols pointing to function descriptors. */
1398 if (MSYMBOL_TYPE (msymbol) == mst_data
efd66ac6
TT
1399 && strcmp (MSYMBOL_LINKAGE_NAME (msymbol),
1400 MSYMBOL_LINKAGE_NAME (tsymbol)) == 0)
42848c96
UW
1401 {
1402 CORE_ADDR func;
b8d56208 1403
42848c96
UW
1404 func = gdbarch_convert_from_func_ptr_addr
1405 (get_objfile_arch (objfile),
77e371c0 1406 MSYMBOL_VALUE_ADDRESS (objfile, msymbol),
42848c96
UW
1407 &current_target);
1408
1409 /* Ignore data symbols that are not function descriptors. */
77e371c0 1410 if (func != MSYMBOL_VALUE_ADDRESS (objfile, msymbol))
42848c96
UW
1411 return func;
1412 }
c5aa993b 1413 }
c906108c
SS
1414 }
1415 return 0;
1416}
50e65b17
TT
1417
1418/* See minsyms.h. */
1419
1420CORE_ADDR
1421minimal_symbol_upper_bound (struct bound_minimal_symbol minsym)
1422{
1423 int i;
1424 short section;
1425 struct obj_section *obj_section;
1426 CORE_ADDR result;
1427 struct minimal_symbol *msymbol;
1428
1429 gdb_assert (minsym.minsym != NULL);
1430
1431 /* If the minimal symbol has a size, use it. Otherwise use the
1432 lesser of the next minimal symbol in the same section, or the end
1433 of the section, as the end of the function. */
1434
1435 if (MSYMBOL_SIZE (minsym.minsym) != 0)
77e371c0 1436 return BMSYMBOL_VALUE_ADDRESS (minsym) + MSYMBOL_SIZE (minsym.minsym);
50e65b17
TT
1437
1438 /* Step over other symbols at this same address, and symbols in
1439 other sections, to find the next symbol in this section with a
1440 different address. */
1441
1442 msymbol = minsym.minsym;
efd66ac6
TT
1443 section = MSYMBOL_SECTION (msymbol);
1444 for (i = 1; MSYMBOL_LINKAGE_NAME (msymbol + i) != NULL; i++)
50e65b17 1445 {
77e371c0
TT
1446 if ((MSYMBOL_VALUE_RAW_ADDRESS (msymbol + i)
1447 != MSYMBOL_VALUE_RAW_ADDRESS (msymbol))
efd66ac6 1448 && MSYMBOL_SECTION (msymbol + i) == section)
50e65b17
TT
1449 break;
1450 }
1451
efd66ac6
TT
1452 obj_section = MSYMBOL_OBJ_SECTION (minsym.objfile, minsym.minsym);
1453 if (MSYMBOL_LINKAGE_NAME (msymbol + i) != NULL
77e371c0 1454 && (MSYMBOL_VALUE_ADDRESS (minsym.objfile, msymbol + i)
efd66ac6 1455 < obj_section_endaddr (obj_section)))
77e371c0 1456 result = MSYMBOL_VALUE_ADDRESS (minsym.objfile, msymbol + i);
50e65b17
TT
1457 else
1458 /* We got the start address from the last msymbol in the objfile.
1459 So the end address is the end of the section. */
1460 result = obj_section_endaddr (obj_section);
1461
1462 return result;
1463}
This page took 1.515324 seconds and 4 git commands to generate.