OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-stable/] [gdb-7.2/] [gdb/] [minsyms.c] - Blame information for rev 861

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 330 jeremybenn
/* GDB routines for manipulating the minimal symbol tables.
2
   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
3
   2002, 2003, 2004, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
4
   Contributed by Cygnus Support, using pieces from other GDB modules.
5
 
6
   This file is part of GDB.
7
 
8
   This program is free software; you can redistribute it and/or modify
9
   it under the terms of the GNU General Public License as published by
10
   the Free Software Foundation; either version 3 of the License, or
11
   (at your option) any later version.
12
 
13
   This program is distributed in the hope that it will be useful,
14
   but WITHOUT ANY WARRANTY; without even the implied warranty of
15
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
   GNU General Public License for more details.
17
 
18
   You should have received a copy of the GNU General Public License
19
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
20
 
21
 
22
/* This file contains support routines for creating, manipulating, and
23
   destroying minimal symbol tables.
24
 
25
   Minimal symbol tables are used to hold some very basic information about
26
   all defined global symbols (text, data, bss, abs, etc).  The only two
27
   required pieces of information are the symbol's name and the address
28
   associated with that symbol.
29
 
30
   In many cases, even if a file was compiled with no special options for
31
   debugging at all, as long as was not stripped it will contain sufficient
32
   information to build useful minimal symbol tables using this structure.
33
 
34
   Even when a file contains enough debugging information to build a full
35
   symbol table, these minimal symbols are still useful for quickly mapping
36
   between names and addresses, and vice versa.  They are also sometimes used
37
   to figure out what full symbol table entries need to be read in. */
38
 
39
 
40
#include "defs.h"
41
#include <ctype.h>
42
#include "gdb_string.h"
43
#include "symtab.h"
44
#include "bfd.h"
45
#include "symfile.h"
46
#include "objfiles.h"
47
#include "demangle.h"
48
#include "value.h"
49
#include "cp-abi.h"
50
#include "target.h"
51
#include "cp-support.h"
52
#include "language.h"
53
 
54
/* Accumulate the minimal symbols for each objfile in bunches of BUNCH_SIZE.
55
   At the end, copy them all into one newly allocated location on an objfile's
56
   symbol obstack.  */
57
 
58
#define BUNCH_SIZE 127
59
 
60
struct msym_bunch
61
  {
62
    struct msym_bunch *next;
63
    struct minimal_symbol contents[BUNCH_SIZE];
64
  };
65
 
66
/* Bunch currently being filled up.
67
   The next field points to chain of filled bunches.  */
68
 
69
static struct msym_bunch *msym_bunch;
70
 
71
/* Number of slots filled in current bunch.  */
72
 
73
static int msym_bunch_index;
74
 
75
/* Total number of minimal symbols recorded so far for the objfile.  */
76
 
77
static int msym_count;
78
 
79
/* Compute a hash code based using the same criteria as `strcmp_iw'.  */
80
 
81
unsigned int
82
msymbol_hash_iw (const char *string)
83
{
84
  unsigned int hash = 0;
85
 
86
  while (*string && *string != '(')
87
    {
88
      while (isspace (*string))
89
        ++string;
90
      if (*string && *string != '(')
91
        {
92
          hash = hash * 67 + *string - 113;
93
          ++string;
94
        }
95
    }
96
  return hash;
97
}
98
 
99
/* Compute a hash code for a string.  */
100
 
101
unsigned int
102
msymbol_hash (const char *string)
103
{
104
  unsigned int hash = 0;
105
 
106
  for (; *string; ++string)
107
    hash = hash * 67 + *string - 113;
108
  return hash;
109
}
110
 
111
/* Add the minimal symbol SYM to an objfile's minsym hash table, TABLE.  */
112
void
113
add_minsym_to_hash_table (struct minimal_symbol *sym,
114
                          struct minimal_symbol **table)
115
{
116
  if (sym->hash_next == NULL)
117
    {
118
      unsigned int hash
119
        = msymbol_hash (SYMBOL_LINKAGE_NAME (sym)) % MINIMAL_SYMBOL_HASH_SIZE;
120
 
121
      sym->hash_next = table[hash];
122
      table[hash] = sym;
123
    }
124
}
125
 
126
/* Add the minimal symbol SYM to an objfile's minsym demangled hash table,
127
   TABLE.  */
128
static void
129
add_minsym_to_demangled_hash_table (struct minimal_symbol *sym,
130
                                  struct minimal_symbol **table)
131
{
132
  if (sym->demangled_hash_next == NULL)
133
    {
134
      unsigned int hash
135
        = msymbol_hash_iw (SYMBOL_SEARCH_NAME (sym)) % MINIMAL_SYMBOL_HASH_SIZE;
136
 
137
      sym->demangled_hash_next = table[hash];
138
      table[hash] = sym;
139
    }
140
}
141
 
142
 
143
/* Return OBJFILE where minimal symbol SYM is defined.  */
144
struct objfile *
145
msymbol_objfile (struct minimal_symbol *sym)
146
{
147
  struct objfile *objf;
148
  struct minimal_symbol *tsym;
149
 
150
  unsigned int hash
151
    = msymbol_hash (SYMBOL_LINKAGE_NAME (sym)) % MINIMAL_SYMBOL_HASH_SIZE;
152
 
153
  for (objf = object_files; objf; objf = objf->next)
154
    for (tsym = objf->msymbol_hash[hash]; tsym; tsym = tsym->hash_next)
155
      if (tsym == sym)
156
        return objf;
157
 
158
  /* We should always be able to find the objfile ...  */
159
  internal_error (__FILE__, __LINE__, _("failed internal consistency check"));
160
}
161
 
162
 
163
/* Look through all the current minimal symbol tables and find the
164
   first minimal symbol that matches NAME.  If OBJF is non-NULL, limit
165
   the search to that objfile.  If SFILE is non-NULL, the only file-scope
166
   symbols considered will be from that source file (global symbols are
167
   still preferred).  Returns a pointer to the minimal symbol that
168
   matches, or NULL if no match is found.
169
 
170
   Note:  One instance where there may be duplicate minimal symbols with
171
   the same name is when the symbol tables for a shared library and the
172
   symbol tables for an executable contain global symbols with the same
173
   names (the dynamic linker deals with the duplication).
174
 
175
   It's also possible to have minimal symbols with different mangled
176
   names, but identical demangled names.  For example, the GNU C++ v3
177
   ABI requires the generation of two (or perhaps three) copies of
178
   constructor functions --- "in-charge", "not-in-charge", and
179
   "allocate" copies; destructors may be duplicated as well.
180
   Obviously, there must be distinct mangled names for each of these,
181
   but the demangled names are all the same: S::S or S::~S.  */
182
 
183
struct minimal_symbol *
184
lookup_minimal_symbol (const char *name, const char *sfile,
185
                       struct objfile *objf)
186
{
187
  struct objfile *objfile;
188
  struct minimal_symbol *msymbol;
189
  struct minimal_symbol *found_symbol = NULL;
190
  struct minimal_symbol *found_file_symbol = NULL;
191
  struct minimal_symbol *trampoline_symbol = NULL;
192
 
193
  unsigned int hash = msymbol_hash (name) % MINIMAL_SYMBOL_HASH_SIZE;
194
  unsigned int dem_hash = msymbol_hash_iw (name) % MINIMAL_SYMBOL_HASH_SIZE;
195
 
196
  int needtofreename = 0;
197
  const char *modified_name;
198
 
199
  if (sfile != NULL)
200
    {
201
      char *p = strrchr (sfile, '/');
202
 
203
      if (p != NULL)
204
        sfile = p + 1;
205
    }
206
 
207
  /* For C++, canonicalize the input name. */
208
  modified_name = name;
209
  if (current_language->la_language == language_cplus)
210
    {
211
      char *cname = cp_canonicalize_string (name);
212
 
213
      if (cname)
214
        {
215
          modified_name = cname;
216
          needtofreename = 1;
217
        }
218
    }
219
 
220
  for (objfile = object_files;
221
       objfile != NULL && found_symbol == NULL;
222
       objfile = objfile->next)
223
    {
224
      if (objf == NULL || objf == objfile
225
          || objf == objfile->separate_debug_objfile_backlink)
226
        {
227
          /* Do two passes: the first over the ordinary hash table,
228
             and the second over the demangled hash table.  */
229
        int pass;
230
 
231
        for (pass = 1; pass <= 2 && found_symbol == NULL; pass++)
232
            {
233
            /* Select hash list according to pass.  */
234
            if (pass == 1)
235
              msymbol = objfile->msymbol_hash[hash];
236
            else
237
              msymbol = objfile->msymbol_demangled_hash[dem_hash];
238
 
239
            while (msymbol != NULL && found_symbol == NULL)
240
                {
241
                  int match;
242
 
243
                  if (pass == 1)
244
                    {
245
                      match = strcmp (SYMBOL_LINKAGE_NAME (msymbol),
246
                                      modified_name) == 0;
247
                    }
248
                  else
249
                    {
250
                      match = SYMBOL_MATCHES_SEARCH_NAME (msymbol,
251
                                                          modified_name);
252
                    }
253
 
254
                  if (match)
255
                    {
256
                    switch (MSYMBOL_TYPE (msymbol))
257
                      {
258
                      case mst_file_text:
259
                      case mst_file_data:
260
                      case mst_file_bss:
261
                        if (sfile == NULL
262
                            || strcmp (msymbol->filename, sfile) == 0)
263
                          found_file_symbol = msymbol;
264
                        break;
265
 
266
                      case mst_solib_trampoline:
267
 
268
                        /* If a trampoline symbol is found, we prefer to
269
                           keep looking for the *real* symbol. If the
270
                           actual symbol is not found, then we'll use the
271
                           trampoline entry. */
272
                        if (trampoline_symbol == NULL)
273
                          trampoline_symbol = msymbol;
274
                        break;
275
 
276
                      case mst_unknown:
277
                      default:
278
                        found_symbol = msymbol;
279
                        break;
280
                      }
281
                    }
282
 
283
                /* Find the next symbol on the hash chain.  */
284
                if (pass == 1)
285
                  msymbol = msymbol->hash_next;
286
                else
287
                  msymbol = msymbol->demangled_hash_next;
288
                }
289
            }
290
        }
291
    }
292
 
293
  if (needtofreename)
294
    xfree ((void *) modified_name);
295
 
296
  /* External symbols are best.  */
297
  if (found_symbol)
298
    return found_symbol;
299
 
300
  /* File-local symbols are next best.  */
301
  if (found_file_symbol)
302
    return found_file_symbol;
303
 
304
  /* Symbols for shared library trampolines are next best.  */
305
  if (trampoline_symbol)
306
    return trampoline_symbol;
307
 
308
  return NULL;
309
}
310
 
311
/* Look through all the current minimal symbol tables and find the
312
   first minimal symbol that matches NAME and has text type.  If OBJF
313
   is non-NULL, limit the search to that objfile.  Returns a pointer
314
   to the minimal symbol that matches, or NULL if no match is found.
315
 
316
   This function only searches the mangled (linkage) names.  */
317
 
318
struct minimal_symbol *
319
lookup_minimal_symbol_text (const char *name, struct objfile *objf)
320
{
321
  struct objfile *objfile;
322
  struct minimal_symbol *msymbol;
323
  struct minimal_symbol *found_symbol = NULL;
324
  struct minimal_symbol *found_file_symbol = NULL;
325
 
326
  unsigned int hash = msymbol_hash (name) % MINIMAL_SYMBOL_HASH_SIZE;
327
 
328
  for (objfile = object_files;
329
       objfile != NULL && found_symbol == NULL;
330
       objfile = objfile->next)
331
    {
332
      if (objf == NULL || objf == objfile
333
          || objf == objfile->separate_debug_objfile_backlink)
334
        {
335
          for (msymbol = objfile->msymbol_hash[hash];
336
               msymbol != NULL && found_symbol == NULL;
337
               msymbol = msymbol->hash_next)
338
            {
339
              if (strcmp (SYMBOL_LINKAGE_NAME (msymbol), name) == 0 &&
340
                  (MSYMBOL_TYPE (msymbol) == mst_text ||
341
                   MSYMBOL_TYPE (msymbol) == mst_file_text))
342
                {
343
                  switch (MSYMBOL_TYPE (msymbol))
344
                    {
345
                    case mst_file_text:
346
                      found_file_symbol = msymbol;
347
                      break;
348
                    default:
349
                      found_symbol = msymbol;
350
                      break;
351
                    }
352
                }
353
            }
354
        }
355
    }
356
  /* External symbols are best.  */
357
  if (found_symbol)
358
    return found_symbol;
359
 
360
  /* File-local symbols are next best.  */
361
  if (found_file_symbol)
362
    return found_file_symbol;
363
 
364
  return NULL;
365
}
366
 
367
/* Look through all the current minimal symbol tables and find the
368
   first minimal symbol that matches NAME and PC.  If OBJF is non-NULL,
369
   limit the search to that objfile.  Returns a pointer to the minimal
370
   symbol that matches, or NULL if no match is found.  */
371
 
372
struct minimal_symbol *
373
lookup_minimal_symbol_by_pc_name (CORE_ADDR pc, const char *name,
374
                                  struct objfile *objf)
375
{
376
  struct objfile *objfile;
377
  struct minimal_symbol *msymbol;
378
 
379
  unsigned int hash = msymbol_hash (name) % MINIMAL_SYMBOL_HASH_SIZE;
380
 
381
  for (objfile = object_files;
382
       objfile != NULL;
383
       objfile = objfile->next)
384
    {
385
      if (objf == NULL || objf == objfile
386
          || objf == objfile->separate_debug_objfile_backlink)
387
        {
388
          for (msymbol = objfile->msymbol_hash[hash];
389
               msymbol != NULL;
390
               msymbol = msymbol->hash_next)
391
            {
392
              if (SYMBOL_VALUE_ADDRESS (msymbol) == pc
393
                  && strcmp (SYMBOL_LINKAGE_NAME (msymbol), name) == 0)
394
                return msymbol;
395
            }
396
        }
397
    }
398
 
399
  return NULL;
400
}
401
 
402
/* Look through all the current minimal symbol tables and find the
403
   first minimal symbol that matches NAME and is a solib trampoline.
404
   If OBJF is non-NULL, limit the search to that objfile.  Returns a
405
   pointer to the minimal symbol that matches, or NULL if no match is
406
   found.
407
 
408
   This function only searches the mangled (linkage) names.  */
409
 
410
struct minimal_symbol *
411
lookup_minimal_symbol_solib_trampoline (const char *name,
412
                                        struct objfile *objf)
413
{
414
  struct objfile *objfile;
415
  struct minimal_symbol *msymbol;
416
  struct minimal_symbol *found_symbol = NULL;
417
 
418
  unsigned int hash = msymbol_hash (name) % MINIMAL_SYMBOL_HASH_SIZE;
419
 
420
  for (objfile = object_files;
421
       objfile != NULL && found_symbol == NULL;
422
       objfile = objfile->next)
423
    {
424
      if (objf == NULL || objf == objfile
425
          || objf == objfile->separate_debug_objfile_backlink)
426
        {
427
          for (msymbol = objfile->msymbol_hash[hash];
428
               msymbol != NULL && found_symbol == NULL;
429
               msymbol = msymbol->hash_next)
430
            {
431
              if (strcmp (SYMBOL_LINKAGE_NAME (msymbol), name) == 0 &&
432
                  MSYMBOL_TYPE (msymbol) == mst_solib_trampoline)
433
                return msymbol;
434
            }
435
        }
436
    }
437
 
438
  return NULL;
439
}
440
 
441
/* Search through the minimal symbol table for each objfile and find
442
   the symbol whose address is the largest address that is still less
443
   than or equal to PC, and matches SECTION (which is not NULL).
444
   Returns a pointer to the minimal symbol if such a symbol is found,
445
   or NULL if PC is not in a suitable range.
446
   Note that we need to look through ALL the minimal symbol tables
447
   before deciding on the symbol that comes closest to the specified PC.
448
   This is because objfiles can overlap, for example objfile A has .text
449
   at 0x100 and .data at 0x40000 and objfile B has .text at 0x234 and
450
   .data at 0x40048.
451
 
452
   If WANT_TRAMPOLINE is set, prefer mst_solib_trampoline symbols when
453
   there are text and trampoline symbols at the same address.
454
   Otherwise prefer mst_text symbols.  */
455
 
456
static struct minimal_symbol *
457
lookup_minimal_symbol_by_pc_section_1 (CORE_ADDR pc,
458
                                       struct obj_section *section,
459
                                       int want_trampoline)
460
{
461
  int lo;
462
  int hi;
463
  int new;
464
  struct objfile *objfile;
465
  struct minimal_symbol *msymbol;
466
  struct minimal_symbol *best_symbol = NULL;
467
  enum minimal_symbol_type want_type, other_type;
468
 
469
  want_type = want_trampoline ? mst_solib_trampoline : mst_text;
470
  other_type = want_trampoline ? mst_text : mst_solib_trampoline;
471
 
472
  /* We can not require the symbol found to be in section, because
473
     e.g. IRIX 6.5 mdebug relies on this code returning an absolute
474
     symbol - but find_pc_section won't return an absolute section and
475
     hence the code below would skip over absolute symbols.  We can
476
     still take advantage of the call to find_pc_section, though - the
477
     object file still must match.  In case we have separate debug
478
     files, search both the file and its separate debug file.  There's
479
     no telling which one will have the minimal symbols.  */
480
 
481
  gdb_assert (section != NULL);
482
 
483
  for (objfile = section->objfile;
484
       objfile != NULL;
485
       objfile = objfile_separate_debug_iterate (section->objfile, objfile))
486
    {
487
      /* If this objfile has a minimal symbol table, go search it using
488
         a binary search.  Note that a minimal symbol table always consists
489
         of at least two symbols, a "real" symbol and the terminating
490
         "null symbol".  If there are no real symbols, then there is no
491
         minimal symbol table at all. */
492
 
493
      if (objfile->minimal_symbol_count > 0)
494
        {
495
          int best_zero_sized = -1;
496
 
497
          msymbol = objfile->msymbols;
498
          lo = 0;
499
          hi = objfile->minimal_symbol_count - 1;
500
 
501
          /* This code assumes that the minimal symbols are sorted by
502
             ascending address values.  If the pc value is greater than or
503
             equal to the first symbol's address, then some symbol in this
504
             minimal symbol table is a suitable candidate for being the
505
             "best" symbol.  This includes the last real symbol, for cases
506
             where the pc value is larger than any address in this vector.
507
 
508
             By iterating until the address associated with the current
509
             hi index (the endpoint of the test interval) is less than
510
             or equal to the desired pc value, we accomplish two things:
511
             (1) the case where the pc value is larger than any minimal
512
             symbol address is trivially solved, (2) the address associated
513
             with the hi index is always the one we want when the interation
514
             terminates.  In essence, we are iterating the test interval
515
             down until the pc value is pushed out of it from the high end.
516
 
517
             Warning: this code is trickier than it would appear at first. */
518
 
519
          /* Should also require that pc is <= end of objfile.  FIXME! */
520
          if (pc >= SYMBOL_VALUE_ADDRESS (&msymbol[lo]))
521
            {
522
              while (SYMBOL_VALUE_ADDRESS (&msymbol[hi]) > pc)
523
                {
524
                  /* pc is still strictly less than highest address */
525
                  /* Note "new" will always be >= lo */
526
                  new = (lo + hi) / 2;
527
                  if ((SYMBOL_VALUE_ADDRESS (&msymbol[new]) >= pc) ||
528
                      (lo == new))
529
                    {
530
                      hi = new;
531
                    }
532
                  else
533
                    {
534
                      lo = new;
535
                    }
536
                }
537
 
538
              /* If we have multiple symbols at the same address, we want
539
                 hi to point to the last one.  That way we can find the
540
                 right symbol if it has an index greater than hi.  */
541
              while (hi < objfile->minimal_symbol_count - 1
542
                     && (SYMBOL_VALUE_ADDRESS (&msymbol[hi])
543
                         == SYMBOL_VALUE_ADDRESS (&msymbol[hi + 1])))
544
                hi++;
545
 
546
              /* Skip various undesirable symbols.  */
547
              while (hi >= 0)
548
                {
549
                  /* Skip any absolute symbols.  This is apparently
550
                     what adb and dbx do, and is needed for the CM-5.
551
                     There are two known possible problems: (1) on
552
                     ELF, apparently end, edata, etc. are absolute.
553
                     Not sure ignoring them here is a big deal, but if
554
                     we want to use them, the fix would go in
555
                     elfread.c.  (2) I think shared library entry
556
                     points on the NeXT are absolute.  If we want
557
                     special handling for this it probably should be
558
                     triggered by a special mst_abs_or_lib or some
559
                     such.  */
560
 
561
                  if (MSYMBOL_TYPE (&msymbol[hi]) == mst_abs)
562
                    {
563
                      hi--;
564
                      continue;
565
                    }
566
 
567
                  /* If SECTION was specified, skip any symbol from
568
                     wrong section.  */
569
                  if (section
570
                      /* Some types of debug info, such as COFF,
571
                         don't fill the bfd_section member, so don't
572
                         throw away symbols on those platforms.  */
573
                      && SYMBOL_OBJ_SECTION (&msymbol[hi]) != NULL
574
                      && (!matching_obj_sections
575
                          (SYMBOL_OBJ_SECTION (&msymbol[hi]), section)))
576
                    {
577
                      hi--;
578
                      continue;
579
                    }
580
 
581
                  /* If we are looking for a trampoline and this is a
582
                     text symbol, or the other way around, check the
583
                     preceeding symbol too.  If they are otherwise
584
                     identical prefer that one.  */
585
                  if (hi > 0
586
                      && MSYMBOL_TYPE (&msymbol[hi]) == other_type
587
                      && MSYMBOL_TYPE (&msymbol[hi - 1]) == want_type
588
                      && (MSYMBOL_SIZE (&msymbol[hi])
589
                          == MSYMBOL_SIZE (&msymbol[hi - 1]))
590
                      && (SYMBOL_VALUE_ADDRESS (&msymbol[hi])
591
                          == SYMBOL_VALUE_ADDRESS (&msymbol[hi - 1]))
592
                      && (SYMBOL_OBJ_SECTION (&msymbol[hi])
593
                          == SYMBOL_OBJ_SECTION (&msymbol[hi - 1])))
594
                    {
595
                      hi--;
596
                      continue;
597
                    }
598
 
599
                  /* If the minimal symbol has a zero size, save it
600
                     but keep scanning backwards looking for one with
601
                     a non-zero size.  A zero size may mean that the
602
                     symbol isn't an object or function (e.g. a
603
                     label), or it may just mean that the size was not
604
                     specified.  */
605
                  if (MSYMBOL_SIZE (&msymbol[hi]) == 0
606
                      && best_zero_sized == -1)
607
                    {
608
                      best_zero_sized = hi;
609
                      hi--;
610
                      continue;
611
                    }
612
 
613
                  /* If we are past the end of the current symbol, try
614
                     the previous symbol if it has a larger overlapping
615
                     size.  This happens on i686-pc-linux-gnu with glibc;
616
                     the nocancel variants of system calls are inside
617
                     the cancellable variants, but both have sizes.  */
618
                  if (hi > 0
619
                      && MSYMBOL_SIZE (&msymbol[hi]) != 0
620
                      && pc >= (SYMBOL_VALUE_ADDRESS (&msymbol[hi])
621
                                + MSYMBOL_SIZE (&msymbol[hi]))
622
                      && pc < (SYMBOL_VALUE_ADDRESS (&msymbol[hi - 1])
623
                               + MSYMBOL_SIZE (&msymbol[hi - 1])))
624
                    {
625
                      hi--;
626
                      continue;
627
                    }
628
 
629
                  /* Otherwise, this symbol must be as good as we're going
630
                     to get.  */
631
                  break;
632
                }
633
 
634
              /* If HI has a zero size, and best_zero_sized is set,
635
                 then we had two or more zero-sized symbols; prefer
636
                 the first one we found (which may have a higher
637
                 address).  Also, if we ran off the end, be sure
638
                 to back up.  */
639
              if (best_zero_sized != -1
640
                  && (hi < 0 || MSYMBOL_SIZE (&msymbol[hi]) == 0))
641
                hi = best_zero_sized;
642
 
643
              /* If the minimal symbol has a non-zero size, and this
644
                 PC appears to be outside the symbol's contents, then
645
                 refuse to use this symbol.  If we found a zero-sized
646
                 symbol with an address greater than this symbol's,
647
                 use that instead.  We assume that if symbols have
648
                 specified sizes, they do not overlap.  */
649
 
650
              if (hi >= 0
651
                  && MSYMBOL_SIZE (&msymbol[hi]) != 0
652
                  && pc >= (SYMBOL_VALUE_ADDRESS (&msymbol[hi])
653
                            + MSYMBOL_SIZE (&msymbol[hi])))
654
                {
655
                  if (best_zero_sized != -1)
656
                    hi = best_zero_sized;
657
                  else
658
                    /* Go on to the next object file.  */
659
                    continue;
660
                }
661
 
662
              /* The minimal symbol indexed by hi now is the best one in this
663
                 objfile's minimal symbol table.  See if it is the best one
664
                 overall. */
665
 
666
              if (hi >= 0
667
                  && ((best_symbol == NULL) ||
668
                      (SYMBOL_VALUE_ADDRESS (best_symbol) <
669
                       SYMBOL_VALUE_ADDRESS (&msymbol[hi]))))
670
                {
671
                  best_symbol = &msymbol[hi];
672
                }
673
            }
674
        }
675
    }
676
  return (best_symbol);
677
}
678
 
679
struct minimal_symbol *
680
lookup_minimal_symbol_by_pc_section (CORE_ADDR pc, struct obj_section *section)
681
{
682
  if (section == NULL)
683
    {
684
      /* NOTE: cagney/2004-01-27: This was using find_pc_mapped_section to
685
         force the section but that (well unless you're doing overlay
686
         debugging) always returns NULL making the call somewhat useless.  */
687
      section = find_pc_section (pc);
688
      if (section == NULL)
689
        return NULL;
690
    }
691
  return lookup_minimal_symbol_by_pc_section_1 (pc, section, 0);
692
}
693
 
694
/* Backward compatibility: search through the minimal symbol table
695
   for a matching PC (no section given) */
696
 
697
struct minimal_symbol *
698
lookup_minimal_symbol_by_pc (CORE_ADDR pc)
699
{
700
  return lookup_minimal_symbol_by_pc_section (pc, NULL);
701
}
702
 
703
/* Find the minimal symbol named NAME, and return both the minsym
704
   struct and its objfile.  This only checks the linkage name.  Sets
705
   *OBJFILE_P and returns the minimal symbol, if it is found.  If it
706
   is not found, returns NULL.  */
707
 
708
struct minimal_symbol *
709
lookup_minimal_symbol_and_objfile (const char *name,
710
                                   struct objfile **objfile_p)
711
{
712
  struct objfile *objfile;
713
  unsigned int hash = msymbol_hash (name) % MINIMAL_SYMBOL_HASH_SIZE;
714
 
715
  ALL_OBJFILES (objfile)
716
    {
717
      struct minimal_symbol *msym;
718
 
719
      for (msym = objfile->msymbol_hash[hash];
720
           msym != NULL;
721
           msym = msym->hash_next)
722
        {
723
          if (strcmp (SYMBOL_LINKAGE_NAME (msym), name) == 0)
724
            {
725
              *objfile_p = objfile;
726
              return msym;
727
            }
728
        }
729
    }
730
 
731
  return 0;
732
}
733
 
734
 
735
/* Return leading symbol character for a BFD. If BFD is NULL,
736
   return the leading symbol character from the main objfile.  */
737
 
738
static int get_symbol_leading_char (bfd *);
739
 
740
static int
741
get_symbol_leading_char (bfd *abfd)
742
{
743
  if (abfd != NULL)
744
    return bfd_get_symbol_leading_char (abfd);
745
  if (symfile_objfile != NULL && symfile_objfile->obfd != NULL)
746
    return bfd_get_symbol_leading_char (symfile_objfile->obfd);
747
  return 0;
748
}
749
 
750
/* Prepare to start collecting minimal symbols.  Note that presetting
751
   msym_bunch_index to BUNCH_SIZE causes the first call to save a minimal
752
   symbol to allocate the memory for the first bunch. */
753
 
754
void
755
init_minimal_symbol_collection (void)
756
{
757
  msym_count = 0;
758
  msym_bunch = NULL;
759
  msym_bunch_index = BUNCH_SIZE;
760
}
761
 
762
void
763
prim_record_minimal_symbol (const char *name, CORE_ADDR address,
764
                            enum minimal_symbol_type ms_type,
765
                            struct objfile *objfile)
766
{
767
  int section;
768
 
769
  switch (ms_type)
770
    {
771
    case mst_text:
772
    case mst_file_text:
773
    case mst_solib_trampoline:
774
      section = SECT_OFF_TEXT (objfile);
775
      break;
776
    case mst_data:
777
    case mst_file_data:
778
      section = SECT_OFF_DATA (objfile);
779
      break;
780
    case mst_bss:
781
    case mst_file_bss:
782
      section = SECT_OFF_BSS (objfile);
783
      break;
784
    default:
785
      section = -1;
786
    }
787
 
788
  prim_record_minimal_symbol_and_info (name, address, ms_type,
789
                                       section, NULL, objfile);
790
}
791
 
792
/* Record a minimal symbol in the msym bunches.  Returns the symbol
793
   newly created.  */
794
 
795
struct minimal_symbol *
796
prim_record_minimal_symbol_full (const char *name, int name_len, int copy_name,
797
                                 CORE_ADDR address,
798
                                 enum minimal_symbol_type ms_type,
799
                                 int section,
800
                                 asection *bfd_section,
801
                                 struct objfile *objfile)
802
{
803
  struct obj_section *obj_section;
804
  struct msym_bunch *new;
805
  struct minimal_symbol *msymbol;
806
 
807
  /* Don't put gcc_compiled, __gnu_compiled_cplus, and friends into
808
     the minimal symbols, because if there is also another symbol
809
     at the same address (e.g. the first function of the file),
810
     lookup_minimal_symbol_by_pc would have no way of getting the
811
     right one.  */
812
  if (ms_type == mst_file_text && name[0] == 'g'
813
      && (strcmp (name, GCC_COMPILED_FLAG_SYMBOL) == 0
814
          || strcmp (name, GCC2_COMPILED_FLAG_SYMBOL) == 0))
815
    return (NULL);
816
 
817
  /* It's safe to strip the leading char here once, since the name
818
     is also stored stripped in the minimal symbol table. */
819
  if (name[0] == get_symbol_leading_char (objfile->obfd))
820
    {
821
      ++name;
822
      --name_len;
823
    }
824
 
825
  if (ms_type == mst_file_text && strncmp (name, "__gnu_compiled", 14) == 0)
826
    return (NULL);
827
 
828
  if (msym_bunch_index == BUNCH_SIZE)
829
    {
830
      new = XCALLOC (1, struct msym_bunch);
831
      msym_bunch_index = 0;
832
      new->next = msym_bunch;
833
      msym_bunch = new;
834
    }
835
  msymbol = &msym_bunch->contents[msym_bunch_index];
836
  SYMBOL_INIT_LANGUAGE_SPECIFIC (msymbol, language_unknown);
837
  SYMBOL_LANGUAGE (msymbol) = language_auto;
838
  SYMBOL_SET_NAMES (msymbol, name, name_len, copy_name, objfile);
839
 
840
  SYMBOL_VALUE_ADDRESS (msymbol) = address;
841
  SYMBOL_SECTION (msymbol) = section;
842
  SYMBOL_OBJ_SECTION (msymbol) = NULL;
843
 
844
  /* Find obj_section corresponding to bfd_section.  */
845
  if (bfd_section)
846
    ALL_OBJFILE_OSECTIONS (objfile, obj_section)
847
      {
848
        if (obj_section->the_bfd_section == bfd_section)
849
          {
850
            SYMBOL_OBJ_SECTION (msymbol) = obj_section;
851
            break;
852
          }
853
      }
854
 
855
  MSYMBOL_TYPE (msymbol) = ms_type;
856
  MSYMBOL_TARGET_FLAG_1 (msymbol) = 0;
857
  MSYMBOL_TARGET_FLAG_2 (msymbol) = 0;
858
  MSYMBOL_SIZE (msymbol) = 0;
859
 
860
  /* The hash pointers must be cleared! If they're not,
861
     add_minsym_to_hash_table will NOT add this msymbol to the hash table. */
862
  msymbol->hash_next = NULL;
863
  msymbol->demangled_hash_next = NULL;
864
 
865
  msym_bunch_index++;
866
  msym_count++;
867
  OBJSTAT (objfile, n_minsyms++);
868
  return msymbol;
869
}
870
 
871
/* Record a minimal symbol in the msym bunches.  Returns the symbol
872
   newly created.  */
873
 
874
struct minimal_symbol *
875
prim_record_minimal_symbol_and_info (const char *name, CORE_ADDR address,
876
                                     enum minimal_symbol_type ms_type,
877
                                     int section,
878
                                     asection *bfd_section,
879
                                     struct objfile *objfile)
880
{
881
  return prim_record_minimal_symbol_full (name, strlen (name), 1,
882
                                          address, ms_type, section,
883
                                          bfd_section, objfile);
884
}
885
 
886
/* Compare two minimal symbols by address and return a signed result based
887
   on unsigned comparisons, so that we sort into unsigned numeric order.
888
   Within groups with the same address, sort by name.  */
889
 
890
static int
891
compare_minimal_symbols (const void *fn1p, const void *fn2p)
892
{
893
  const struct minimal_symbol *fn1;
894
  const struct minimal_symbol *fn2;
895
 
896
  fn1 = (const struct minimal_symbol *) fn1p;
897
  fn2 = (const struct minimal_symbol *) fn2p;
898
 
899
  if (SYMBOL_VALUE_ADDRESS (fn1) < SYMBOL_VALUE_ADDRESS (fn2))
900
    {
901
      return (-1);              /* addr 1 is less than addr 2 */
902
    }
903
  else if (SYMBOL_VALUE_ADDRESS (fn1) > SYMBOL_VALUE_ADDRESS (fn2))
904
    {
905
      return (1);               /* addr 1 is greater than addr 2 */
906
    }
907
  else
908
    /* addrs are equal: sort by name */
909
    {
910
      char *name1 = SYMBOL_LINKAGE_NAME (fn1);
911
      char *name2 = SYMBOL_LINKAGE_NAME (fn2);
912
 
913
      if (name1 && name2)       /* both have names */
914
        return strcmp (name1, name2);
915
      else if (name2)
916
        return 1;               /* fn1 has no name, so it is "less" */
917
      else if (name1)           /* fn2 has no name, so it is "less" */
918
        return -1;
919
      else
920
        return (0);              /* neither has a name, so they're equal. */
921
    }
922
}
923
 
924
/* Discard the currently collected minimal symbols, if any.  If we wish
925
   to save them for later use, we must have already copied them somewhere
926
   else before calling this function.
927
 
928
   FIXME:  We could allocate the minimal symbol bunches on their own
929
   obstack and then simply blow the obstack away when we are done with
930
   it.  Is it worth the extra trouble though? */
931
 
932
static void
933
do_discard_minimal_symbols_cleanup (void *arg)
934
{
935
  struct msym_bunch *next;
936
 
937
  while (msym_bunch != NULL)
938
    {
939
      next = msym_bunch->next;
940
      xfree (msym_bunch);
941
      msym_bunch = next;
942
    }
943
}
944
 
945
struct cleanup *
946
make_cleanup_discard_minimal_symbols (void)
947
{
948
  return make_cleanup (do_discard_minimal_symbols_cleanup, 0);
949
}
950
 
951
 
952
 
953
/* Compact duplicate entries out of a minimal symbol table by walking
954
   through the table and compacting out entries with duplicate addresses
955
   and matching names.  Return the number of entries remaining.
956
 
957
   On entry, the table resides between msymbol[0] and msymbol[mcount].
958
   On exit, it resides between msymbol[0] and msymbol[result_count].
959
 
960
   When files contain multiple sources of symbol information, it is
961
   possible for the minimal symbol table to contain many duplicate entries.
962
   As an example, SVR4 systems use ELF formatted object files, which
963
   usually contain at least two different types of symbol tables (a
964
   standard ELF one and a smaller dynamic linking table), as well as
965
   DWARF debugging information for files compiled with -g.
966
 
967
   Without compacting, the minimal symbol table for gdb itself contains
968
   over a 1000 duplicates, about a third of the total table size.  Aside
969
   from the potential trap of not noticing that two successive entries
970
   identify the same location, this duplication impacts the time required
971
   to linearly scan the table, which is done in a number of places.  So we
972
   just do one linear scan here and toss out the duplicates.
973
 
974
   Note that we are not concerned here about recovering the space that
975
   is potentially freed up, because the strings themselves are allocated
976
   on the objfile_obstack, and will get automatically freed when the symbol
977
   table is freed.  The caller can free up the unused minimal symbols at
978
   the end of the compacted region if their allocation strategy allows it.
979
 
980
   Also note we only go up to the next to last entry within the loop
981
   and then copy the last entry explicitly after the loop terminates.
982
 
983
   Since the different sources of information for each symbol may
984
   have different levels of "completeness", we may have duplicates
985
   that have one entry with type "mst_unknown" and the other with a
986
   known type.  So if the one we are leaving alone has type mst_unknown,
987
   overwrite its type with the type from the one we are compacting out.  */
988
 
989
static int
990
compact_minimal_symbols (struct minimal_symbol *msymbol, int mcount,
991
                         struct objfile *objfile)
992
{
993
  struct minimal_symbol *copyfrom;
994
  struct minimal_symbol *copyto;
995
 
996
  if (mcount > 0)
997
    {
998
      copyfrom = copyto = msymbol;
999
      while (copyfrom < msymbol + mcount - 1)
1000
        {
1001
          if (SYMBOL_VALUE_ADDRESS (copyfrom)
1002
              == SYMBOL_VALUE_ADDRESS ((copyfrom + 1))
1003
              && strcmp (SYMBOL_LINKAGE_NAME (copyfrom),
1004
                         SYMBOL_LINKAGE_NAME ((copyfrom + 1))) == 0)
1005
            {
1006
              if (MSYMBOL_TYPE ((copyfrom + 1)) == mst_unknown)
1007
                {
1008
                  MSYMBOL_TYPE ((copyfrom + 1)) = MSYMBOL_TYPE (copyfrom);
1009
                }
1010
              copyfrom++;
1011
            }
1012
          else
1013
            *copyto++ = *copyfrom++;
1014
        }
1015
      *copyto++ = *copyfrom++;
1016
      mcount = copyto - msymbol;
1017
    }
1018
  return (mcount);
1019
}
1020
 
1021
/* Build (or rebuild) the minimal symbol hash tables.  This is necessary
1022
   after compacting or sorting the table since the entries move around
1023
   thus causing the internal minimal_symbol pointers to become jumbled. */
1024
 
1025
static void
1026
build_minimal_symbol_hash_tables (struct objfile *objfile)
1027
{
1028
  int i;
1029
  struct minimal_symbol *msym;
1030
 
1031
  /* Clear the hash tables. */
1032
  for (i = 0; i < MINIMAL_SYMBOL_HASH_SIZE; i++)
1033
    {
1034
      objfile->msymbol_hash[i] = 0;
1035
      objfile->msymbol_demangled_hash[i] = 0;
1036
    }
1037
 
1038
  /* Now, (re)insert the actual entries. */
1039
  for (i = objfile->minimal_symbol_count, msym = objfile->msymbols;
1040
       i > 0;
1041
       i--, msym++)
1042
    {
1043
      msym->hash_next = 0;
1044
      add_minsym_to_hash_table (msym, objfile->msymbol_hash);
1045
 
1046
      msym->demangled_hash_next = 0;
1047
      if (SYMBOL_SEARCH_NAME (msym) != SYMBOL_LINKAGE_NAME (msym))
1048
        add_minsym_to_demangled_hash_table (msym,
1049
                                            objfile->msymbol_demangled_hash);
1050
    }
1051
}
1052
 
1053
/* Add the minimal symbols in the existing bunches to the objfile's official
1054
   minimal symbol table.  In most cases there is no minimal symbol table yet
1055
   for this objfile, and the existing bunches are used to create one.  Once
1056
   in a while (for shared libraries for example), we add symbols (e.g. common
1057
   symbols) to an existing objfile.
1058
 
1059
   Because of the way minimal symbols are collected, we generally have no way
1060
   of knowing what source language applies to any particular minimal symbol.
1061
   Specifically, we have no way of knowing if the minimal symbol comes from a
1062
   C++ compilation unit or not.  So for the sake of supporting cached
1063
   demangled C++ names, we have no choice but to try and demangle each new one
1064
   that comes in.  If the demangling succeeds, then we assume it is a C++
1065
   symbol and set the symbol's language and demangled name fields
1066
   appropriately.  Note that in order to avoid unnecessary demanglings, and
1067
   allocating obstack space that subsequently can't be freed for the demangled
1068
   names, we mark all newly added symbols with language_auto.  After
1069
   compaction of the minimal symbols, we go back and scan the entire minimal
1070
   symbol table looking for these new symbols.  For each new symbol we attempt
1071
   to demangle it, and if successful, record it as a language_cplus symbol
1072
   and cache the demangled form on the symbol obstack.  Symbols which don't
1073
   demangle are marked as language_unknown symbols, which inhibits future
1074
   attempts to demangle them if we later add more minimal symbols. */
1075
 
1076
void
1077
install_minimal_symbols (struct objfile *objfile)
1078
{
1079
  int bindex;
1080
  int mcount;
1081
  struct msym_bunch *bunch;
1082
  struct minimal_symbol *msymbols;
1083
  int alloc_count;
1084
 
1085
  if (msym_count > 0)
1086
    {
1087
      /* Allocate enough space in the obstack, into which we will gather the
1088
         bunches of new and existing minimal symbols, sort them, and then
1089
         compact out the duplicate entries.  Once we have a final table,
1090
         we will give back the excess space.  */
1091
 
1092
      alloc_count = msym_count + objfile->minimal_symbol_count + 1;
1093
      obstack_blank (&objfile->objfile_obstack,
1094
                     alloc_count * sizeof (struct minimal_symbol));
1095
      msymbols = (struct minimal_symbol *)
1096
        obstack_base (&objfile->objfile_obstack);
1097
 
1098
      /* Copy in the existing minimal symbols, if there are any.  */
1099
 
1100
      if (objfile->minimal_symbol_count)
1101
        memcpy ((char *) msymbols, (char *) objfile->msymbols,
1102
            objfile->minimal_symbol_count * sizeof (struct minimal_symbol));
1103
 
1104
      /* Walk through the list of minimal symbol bunches, adding each symbol
1105
         to the new contiguous array of symbols.  Note that we start with the
1106
         current, possibly partially filled bunch (thus we use the current
1107
         msym_bunch_index for the first bunch we copy over), and thereafter
1108
         each bunch is full. */
1109
 
1110
      mcount = objfile->minimal_symbol_count;
1111
 
1112
      for (bunch = msym_bunch; bunch != NULL; bunch = bunch->next)
1113
        {
1114
          for (bindex = 0; bindex < msym_bunch_index; bindex++, mcount++)
1115
            msymbols[mcount] = bunch->contents[bindex];
1116
          msym_bunch_index = BUNCH_SIZE;
1117
        }
1118
 
1119
      /* Sort the minimal symbols by address.  */
1120
 
1121
      qsort (msymbols, mcount, sizeof (struct minimal_symbol),
1122
             compare_minimal_symbols);
1123
 
1124
      /* Compact out any duplicates, and free up whatever space we are
1125
         no longer using.  */
1126
 
1127
      mcount = compact_minimal_symbols (msymbols, mcount, objfile);
1128
 
1129
      obstack_blank (&objfile->objfile_obstack,
1130
               (mcount + 1 - alloc_count) * sizeof (struct minimal_symbol));
1131
      msymbols = (struct minimal_symbol *)
1132
        obstack_finish (&objfile->objfile_obstack);
1133
 
1134
      /* We also terminate the minimal symbol table with a "null symbol",
1135
         which is *not* included in the size of the table.  This makes it
1136
         easier to find the end of the table when we are handed a pointer
1137
         to some symbol in the middle of it.  Zero out the fields in the
1138
         "null symbol" allocated at the end of the array.  Note that the
1139
         symbol count does *not* include this null symbol, which is why it
1140
         is indexed by mcount and not mcount-1. */
1141
 
1142
      SYMBOL_LINKAGE_NAME (&msymbols[mcount]) = NULL;
1143
      SYMBOL_VALUE_ADDRESS (&msymbols[mcount]) = 0;
1144
      MSYMBOL_TARGET_FLAG_1 (&msymbols[mcount]) = 0;
1145
      MSYMBOL_TARGET_FLAG_2 (&msymbols[mcount]) = 0;
1146
      MSYMBOL_SIZE (&msymbols[mcount]) = 0;
1147
      MSYMBOL_TYPE (&msymbols[mcount]) = mst_unknown;
1148
      SYMBOL_INIT_LANGUAGE_SPECIFIC (&msymbols[mcount], language_unknown);
1149
 
1150
      /* Attach the minimal symbol table to the specified objfile.
1151
         The strings themselves are also located in the objfile_obstack
1152
         of this objfile.  */
1153
 
1154
      objfile->minimal_symbol_count = mcount;
1155
      objfile->msymbols = msymbols;
1156
 
1157
      /* Try to guess the appropriate C++ ABI by looking at the names
1158
         of the minimal symbols in the table.  */
1159
      {
1160
        int i;
1161
 
1162
        for (i = 0; i < mcount; i++)
1163
          {
1164
            /* If a symbol's name starts with _Z and was successfully
1165
               demangled, then we can assume we've found a GNU v3 symbol.
1166
               For now we set the C++ ABI globally; if the user is
1167
               mixing ABIs then the user will need to "set cp-abi"
1168
               manually.  */
1169
            const char *name = SYMBOL_LINKAGE_NAME (&objfile->msymbols[i]);
1170
 
1171
            if (name[0] == '_' && name[1] == 'Z'
1172
                && SYMBOL_DEMANGLED_NAME (&objfile->msymbols[i]) != NULL)
1173
              {
1174
                set_cp_abi_as_auto_default ("gnu-v3");
1175
                break;
1176
              }
1177
          }
1178
      }
1179
 
1180
      /* Now build the hash tables; we can't do this incrementally
1181
         at an earlier point since we weren't finished with the obstack
1182
         yet.  (And if the msymbol obstack gets moved, all the internal
1183
         pointers to other msymbols need to be adjusted.) */
1184
      build_minimal_symbol_hash_tables (objfile);
1185
    }
1186
}
1187
 
1188
/* Sort all the minimal symbols in OBJFILE.  */
1189
 
1190
void
1191
msymbols_sort (struct objfile *objfile)
1192
{
1193
  qsort (objfile->msymbols, objfile->minimal_symbol_count,
1194
         sizeof (struct minimal_symbol), compare_minimal_symbols);
1195
  build_minimal_symbol_hash_tables (objfile);
1196
}
1197
 
1198
/* Check if PC is in a shared library trampoline code stub.
1199
   Return minimal symbol for the trampoline entry or NULL if PC is not
1200
   in a trampoline code stub.  */
1201
 
1202
struct minimal_symbol *
1203
lookup_solib_trampoline_symbol_by_pc (CORE_ADDR pc)
1204
{
1205
  struct obj_section *section = find_pc_section (pc);
1206
  struct minimal_symbol *msymbol;
1207
 
1208
  if (section == NULL)
1209
    return NULL;
1210
  msymbol = lookup_minimal_symbol_by_pc_section_1 (pc, section, 1);
1211
 
1212
  if (msymbol != NULL && MSYMBOL_TYPE (msymbol) == mst_solib_trampoline)
1213
    return msymbol;
1214
  return NULL;
1215
}
1216
 
1217
/* If PC is in a shared library trampoline code stub, return the
1218
   address of the `real' function belonging to the stub.
1219
   Return 0 if PC is not in a trampoline code stub or if the real
1220
   function is not found in the minimal symbol table.
1221
 
1222
   We may fail to find the right function if a function with the
1223
   same name is defined in more than one shared library, but this
1224
   is considered bad programming style. We could return 0 if we find
1225
   a duplicate function in case this matters someday.  */
1226
 
1227
CORE_ADDR
1228
find_solib_trampoline_target (struct frame_info *frame, CORE_ADDR pc)
1229
{
1230
  struct objfile *objfile;
1231
  struct minimal_symbol *msymbol;
1232
  struct minimal_symbol *tsymbol = lookup_solib_trampoline_symbol_by_pc (pc);
1233
 
1234
  if (tsymbol != NULL)
1235
    {
1236
      ALL_MSYMBOLS (objfile, msymbol)
1237
      {
1238
        if (MSYMBOL_TYPE (msymbol) == mst_text
1239
            && strcmp (SYMBOL_LINKAGE_NAME (msymbol),
1240
                       SYMBOL_LINKAGE_NAME (tsymbol)) == 0)
1241
          return SYMBOL_VALUE_ADDRESS (msymbol);
1242
 
1243
        /* Also handle minimal symbols pointing to function descriptors.  */
1244
        if (MSYMBOL_TYPE (msymbol) == mst_data
1245
            && strcmp (SYMBOL_LINKAGE_NAME (msymbol),
1246
                       SYMBOL_LINKAGE_NAME (tsymbol)) == 0)
1247
          {
1248
            CORE_ADDR func;
1249
 
1250
            func = gdbarch_convert_from_func_ptr_addr
1251
                    (get_objfile_arch (objfile),
1252
                     SYMBOL_VALUE_ADDRESS (msymbol),
1253
                     &current_target);
1254
 
1255
            /* Ignore data symbols that are not function descriptors.  */
1256
            if (func != SYMBOL_VALUE_ADDRESS (msymbol))
1257
              return func;
1258
          }
1259
      }
1260
    }
1261
  return 0;
1262
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.