PARAMS removal.
[external/binutils.git] / gdb / minsyms.c
1 /* GDB routines for manipulating the minimal symbol tables.
2    Copyright 1992, 93, 94, 96, 97, 1998 Free Software Foundation, Inc.
3    Contributed by Cygnus Support, using pieces from other GDB modules.
4
5    This file is part of GDB.
6
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or
10    (at your option) any later version.
11
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, Inc., 59 Temple Place - Suite 330,
20    Boston, MA 02111-1307, USA.  */
21
22
23 /* This file contains support routines for creating, manipulating, and
24    destroying minimal symbol tables.
25
26    Minimal symbol tables are used to hold some very basic information about
27    all defined global symbols (text, data, bss, abs, etc).  The only two
28    required pieces of information are the symbol's name and the address
29    associated with that symbol.
30
31    In many cases, even if a file was compiled with no special options for
32    debugging at all, as long as was not stripped it will contain sufficient
33    information to build useful minimal symbol tables using this structure.
34
35    Even when a file contains enough debugging information to build a full
36    symbol table, these minimal symbols are still useful for quickly mapping
37    between names and addresses, and vice versa.  They are also sometimes used
38    to figure out what full symbol table entries need to be read in. */
39
40
41 #include "defs.h"
42 #include <ctype.h>
43 #include "gdb_string.h"
44 #include "symtab.h"
45 #include "bfd.h"
46 #include "symfile.h"
47 #include "objfiles.h"
48 #include "demangle.h"
49 #include "gdb-stabs.h"
50
51 /* Accumulate the minimal symbols for each objfile in bunches of BUNCH_SIZE.
52    At the end, copy them all into one newly allocated location on an objfile's
53    symbol obstack.  */
54
55 #define BUNCH_SIZE 127
56
57 struct msym_bunch
58   {
59     struct msym_bunch *next;
60     struct minimal_symbol contents[BUNCH_SIZE];
61   };
62
63 /* Bunch currently being filled up.
64    The next field points to chain of filled bunches.  */
65
66 static struct msym_bunch *msym_bunch;
67
68 /* Number of slots filled in current bunch.  */
69
70 static int msym_bunch_index;
71
72 /* Total number of minimal symbols recorded so far for the objfile.  */
73
74 static int msym_count;
75
76 /* Prototypes for local functions. */
77
78 static int compare_minimal_symbols (const void *, const void *);
79
80 static int
81 compact_minimal_symbols (struct minimal_symbol *, int, struct objfile *);
82
83 static void add_minsym_to_demangled_hash_table (struct minimal_symbol *sym,
84                                                 struct minimal_symbol **table);
85
86 /* Compute a hash code based using the same criteria as `strcmp_iw'.  */
87
88 unsigned int
89 msymbol_hash_iw (const char *string)
90 {
91   unsigned int hash = 0;
92   while (*string && *string != '(')
93     {
94       while (isspace (*string))
95         ++string;
96       if (*string && *string != '(')
97         hash = (31 * hash) + *string;
98       ++string;
99     }
100   return hash % MINIMAL_SYMBOL_HASH_SIZE;
101 }
102
103 /* Compute a hash code for a string.  */
104
105 unsigned int
106 msymbol_hash (const char *string)
107 {
108   unsigned int hash = 0;
109   for (; *string; ++string)
110     hash = (31 * hash) + *string;
111   return hash % MINIMAL_SYMBOL_HASH_SIZE;
112 }
113
114 /* Add the minimal symbol SYM to an objfile's minsym hash table, TABLE.  */
115 void
116 add_minsym_to_hash_table (struct minimal_symbol *sym,
117                           struct minimal_symbol **table)
118 {
119   if (sym->hash_next == NULL)
120     {
121       unsigned int hash = msymbol_hash (SYMBOL_NAME (sym));
122       sym->hash_next = table[hash];
123       table[hash] = sym;
124     }
125 }
126
127 /* Add the minimal symbol SYM to an objfile's minsym demangled hash table,
128    TABLE.  */
129 static void
130 add_minsym_to_demangled_hash_table (struct minimal_symbol *sym,
131                                   struct minimal_symbol **table)
132 {
133   if (sym->demangled_hash_next == NULL)
134     {
135       unsigned int hash = msymbol_hash_iw (SYMBOL_DEMANGLED_NAME (sym));
136       sym->demangled_hash_next = table[hash];
137       table[hash] = sym;
138     }
139 }
140
141
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
144    the search to that objfile.  If SFILE is non-NULL, limit the search
145    to that source file.  Returns a pointer to the minimal symbol that
146    matches, or NULL if no match is found.
147
148    Note:  One instance where there may be duplicate minimal symbols with
149    the same name is when the symbol tables for a shared library and the
150    symbol tables for an executable contain global symbols with the same
151    names (the dynamic linker deals with the duplication). */
152
153 struct minimal_symbol *
154 lookup_minimal_symbol (name, sfile, objf)
155      register const char *name;
156      const char *sfile;
157      struct objfile *objf;
158 {
159   struct objfile *objfile;
160   struct minimal_symbol *msymbol;
161   struct minimal_symbol *found_symbol = NULL;
162   struct minimal_symbol *found_file_symbol = NULL;
163   struct minimal_symbol *trampoline_symbol = NULL;
164
165   unsigned int hash = msymbol_hash (name);
166   unsigned int dem_hash = msymbol_hash_iw (name);
167
168 #ifdef SOFUN_ADDRESS_MAYBE_MISSING
169   if (sfile != NULL)
170     {
171       char *p = strrchr (sfile, '/');
172       if (p != NULL)
173         sfile = p + 1;
174     }
175 #endif
176
177   for (objfile = object_files;
178        objfile != NULL && found_symbol == NULL;
179        objfile = objfile->next)
180     {
181       if (objf == NULL || objf == objfile)
182         {
183           /* Do two passes: the first over the ordinary hash table,
184              and the second over the demangled hash table.  */
185         int pass;
186
187         for (pass = 1; pass <= 2 && found_symbol == NULL; pass++)
188             {
189             /* Select hash list according to pass.  */
190             if (pass == 1)
191               msymbol = objfile->msymbol_hash[hash];
192             else
193               msymbol = objfile->msymbol_demangled_hash[dem_hash];
194
195             while (msymbol != NULL && found_symbol == NULL)
196                 {
197                 if (SYMBOL_MATCHES_NAME (msymbol, name))
198                     {
199                     switch (MSYMBOL_TYPE (msymbol))
200                       {
201                       case mst_file_text:
202                       case mst_file_data:
203                       case mst_file_bss:
204 #ifdef SOFUN_ADDRESS_MAYBE_MISSING
205                         if (sfile == NULL || STREQ (msymbol->filename, sfile))
206                           found_file_symbol = msymbol;
207 #else
208                         /* We have neither the ability nor the need to
209                            deal with the SFILE parameter.  If we find
210                            more than one symbol, just return the latest
211                            one (the user can't expect useful behavior in
212                            that case).  */
213                         found_file_symbol = msymbol;
214 #endif
215                         break;
216
217                       case mst_solib_trampoline:
218
219                         /* If a trampoline symbol is found, we prefer to
220                            keep looking for the *real* symbol. If the
221                            actual symbol is not found, then we'll use the
222                            trampoline entry. */
223                         if (trampoline_symbol == NULL)
224                           trampoline_symbol = msymbol;
225                         break;
226
227                       case mst_unknown:
228                       default:
229                         found_symbol = msymbol;
230                         break;
231                       }
232                     }
233
234                 /* Find the next symbol on the hash chain.  */
235                 if (pass == 1)
236                   msymbol = msymbol->hash_next;
237                 else
238                   msymbol = msymbol->demangled_hash_next;
239                 }
240             }
241         }
242     }
243   /* External symbols are best.  */
244   if (found_symbol)
245     return found_symbol;
246
247   /* File-local symbols are next best.  */
248   if (found_file_symbol)
249     return found_file_symbol;
250
251   /* Symbols for shared library trampolines are next best.  */
252   if (trampoline_symbol)
253     return trampoline_symbol;
254
255   return NULL;
256 }
257
258 /* Look through all the current minimal symbol tables and find the
259    first minimal symbol that matches NAME and of text type.  
260    If OBJF is non-NULL, limit
261    the search to that objfile.  If SFILE is non-NULL, limit the search
262    to that source file.  Returns a pointer to the minimal symbol that
263    matches, or NULL if no match is found.
264  */
265
266 struct minimal_symbol *
267 lookup_minimal_symbol_text (name, sfile, objf)
268      register const char *name;
269      const char *sfile;
270      struct objfile *objf;
271 {
272   struct objfile *objfile;
273   struct minimal_symbol *msymbol;
274   struct minimal_symbol *found_symbol = NULL;
275   struct minimal_symbol *found_file_symbol = NULL;
276
277 #ifdef SOFUN_ADDRESS_MAYBE_MISSING
278   if (sfile != NULL)
279     {
280       char *p = strrchr (sfile, '/');
281       if (p != NULL)
282         sfile = p + 1;
283     }
284 #endif
285
286   for (objfile = object_files;
287        objfile != NULL && found_symbol == NULL;
288        objfile = objfile->next)
289     {
290       if (objf == NULL || objf == objfile)
291         {
292           for (msymbol = objfile->msymbols;
293                msymbol != NULL && SYMBOL_NAME (msymbol) != NULL &&
294                found_symbol == NULL;
295                msymbol++)
296             {
297               if (SYMBOL_MATCHES_NAME (msymbol, name) &&
298                   (MSYMBOL_TYPE (msymbol) == mst_text ||
299                    MSYMBOL_TYPE (msymbol) == mst_file_text))
300                 {
301                   switch (MSYMBOL_TYPE (msymbol))
302                     {
303                     case mst_file_text:
304 #ifdef SOFUN_ADDRESS_MAYBE_MISSING
305                       if (sfile == NULL || STREQ (msymbol->filename, sfile))
306                         found_file_symbol = msymbol;
307 #else
308                       /* We have neither the ability nor the need to
309                          deal with the SFILE parameter.  If we find
310                          more than one symbol, just return the latest
311                          one (the user can't expect useful behavior in
312                          that case).  */
313                       found_file_symbol = msymbol;
314 #endif
315                       break;
316                     default:
317                       found_symbol = msymbol;
318                       break;
319                     }
320                 }
321             }
322         }
323     }
324   /* External symbols are best.  */
325   if (found_symbol)
326     return found_symbol;
327
328   /* File-local symbols are next best.  */
329   if (found_file_symbol)
330     return found_file_symbol;
331
332   return NULL;
333 }
334
335 /* Look through all the current minimal symbol tables and find the
336    first minimal symbol that matches NAME and of solib trampoline type.  
337    If OBJF is non-NULL, limit
338    the search to that objfile.  If SFILE is non-NULL, limit the search
339    to that source file.  Returns a pointer to the minimal symbol that
340    matches, or NULL if no match is found.
341  */
342
343 struct minimal_symbol *
344 lookup_minimal_symbol_solib_trampoline (name, sfile, objf)
345      register const char *name;
346      const char *sfile;
347      struct objfile *objf;
348 {
349   struct objfile *objfile;
350   struct minimal_symbol *msymbol;
351   struct minimal_symbol *found_symbol = NULL;
352
353 #ifdef SOFUN_ADDRESS_MAYBE_MISSING
354   if (sfile != NULL)
355     {
356       char *p = strrchr (sfile, '/');
357       if (p != NULL)
358         sfile = p + 1;
359     }
360 #endif
361
362   for (objfile = object_files;
363        objfile != NULL && found_symbol == NULL;
364        objfile = objfile->next)
365     {
366       if (objf == NULL || objf == objfile)
367         {
368           for (msymbol = objfile->msymbols;
369                msymbol != NULL && SYMBOL_NAME (msymbol) != NULL &&
370                found_symbol == NULL;
371                msymbol++)
372             {
373               if (SYMBOL_MATCHES_NAME (msymbol, name) &&
374                   MSYMBOL_TYPE (msymbol) == mst_solib_trampoline)
375                 return msymbol;
376             }
377         }
378     }
379
380   return NULL;
381 }
382
383
384 /* Search through the minimal symbol table for each objfile and find
385    the symbol whose address is the largest address that is still less
386    than or equal to PC, and matches SECTION (if non-null).  Returns a
387    pointer to the minimal symbol if such a symbol is found, or NULL if
388    PC is not in a suitable range.  Note that we need to look through
389    ALL the minimal symbol tables before deciding on the symbol that
390    comes closest to the specified PC.  This is because objfiles can
391    overlap, for example objfile A has .text at 0x100 and .data at
392    0x40000 and objfile B has .text at 0x234 and .data at 0x40048.  */
393
394 struct minimal_symbol *
395 lookup_minimal_symbol_by_pc_section (pc, section)
396      CORE_ADDR pc;
397      asection *section;
398 {
399   int lo;
400   int hi;
401   int new;
402   struct objfile *objfile;
403   struct minimal_symbol *msymbol;
404   struct minimal_symbol *best_symbol = NULL;
405
406   /* pc has to be in a known section. This ensures that anything beyond
407      the end of the last segment doesn't appear to be part of the last
408      function in the last segment.  */
409   if (find_pc_section (pc) == NULL)
410     return NULL;
411
412   for (objfile = object_files;
413        objfile != NULL;
414        objfile = objfile->next)
415     {
416       /* If this objfile has a minimal symbol table, go search it using
417          a binary search.  Note that a minimal symbol table always consists
418          of at least two symbols, a "real" symbol and the terminating
419          "null symbol".  If there are no real symbols, then there is no
420          minimal symbol table at all. */
421
422       if ((msymbol = objfile->msymbols) != NULL)
423         {
424           lo = 0;
425           hi = objfile->minimal_symbol_count - 1;
426
427           /* This code assumes that the minimal symbols are sorted by
428              ascending address values.  If the pc value is greater than or
429              equal to the first symbol's address, then some symbol in this
430              minimal symbol table is a suitable candidate for being the
431              "best" symbol.  This includes the last real symbol, for cases
432              where the pc value is larger than any address in this vector.
433
434              By iterating until the address associated with the current
435              hi index (the endpoint of the test interval) is less than
436              or equal to the desired pc value, we accomplish two things:
437              (1) the case where the pc value is larger than any minimal
438              symbol address is trivially solved, (2) the address associated
439              with the hi index is always the one we want when the interation
440              terminates.  In essence, we are iterating the test interval
441              down until the pc value is pushed out of it from the high end.
442
443              Warning: this code is trickier than it would appear at first. */
444
445           /* Should also require that pc is <= end of objfile.  FIXME! */
446           if (pc >= SYMBOL_VALUE_ADDRESS (&msymbol[lo]))
447             {
448               while (SYMBOL_VALUE_ADDRESS (&msymbol[hi]) > pc)
449                 {
450                   /* pc is still strictly less than highest address */
451                   /* Note "new" will always be >= lo */
452                   new = (lo + hi) / 2;
453                   if ((SYMBOL_VALUE_ADDRESS (&msymbol[new]) >= pc) ||
454                       (lo == new))
455                     {
456                       hi = new;
457                     }
458                   else
459                     {
460                       lo = new;
461                     }
462                 }
463
464               /* If we have multiple symbols at the same address, we want
465                  hi to point to the last one.  That way we can find the
466                  right symbol if it has an index greater than hi.  */
467               while (hi < objfile->minimal_symbol_count - 1
468                      && (SYMBOL_VALUE_ADDRESS (&msymbol[hi])
469                          == SYMBOL_VALUE_ADDRESS (&msymbol[hi + 1])))
470                 hi++;
471
472               /* The minimal symbol indexed by hi now is the best one in this
473                  objfile's minimal symbol table.  See if it is the best one
474                  overall. */
475
476               /* Skip any absolute symbols.  This is apparently what adb
477                  and dbx do, and is needed for the CM-5.  There are two
478                  known possible problems: (1) on ELF, apparently end, edata,
479                  etc. are absolute.  Not sure ignoring them here is a big
480                  deal, but if we want to use them, the fix would go in
481                  elfread.c.  (2) I think shared library entry points on the
482                  NeXT are absolute.  If we want special handling for this
483                  it probably should be triggered by a special
484                  mst_abs_or_lib or some such.  */
485               while (hi >= 0
486                      && msymbol[hi].type == mst_abs)
487                 --hi;
488
489               /* If "section" specified, skip any symbol from wrong section */
490               /* This is the new code that distinguishes it from the old function */
491               if (section)
492                 while (hi >= 0
493                        && SYMBOL_BFD_SECTION (&msymbol[hi]) != section)
494                   --hi;
495
496               if (hi >= 0
497                   && ((best_symbol == NULL) ||
498                       (SYMBOL_VALUE_ADDRESS (best_symbol) <
499                        SYMBOL_VALUE_ADDRESS (&msymbol[hi]))))
500                 {
501                   best_symbol = &msymbol[hi];
502                 }
503             }
504         }
505     }
506   return (best_symbol);
507 }
508
509 /* Backward compatibility: search through the minimal symbol table 
510    for a matching PC (no section given) */
511
512 struct minimal_symbol *
513 lookup_minimal_symbol_by_pc (pc)
514      CORE_ADDR pc;
515 {
516   return lookup_minimal_symbol_by_pc_section (pc, find_pc_mapped_section (pc));
517 }
518
519 #ifdef SOFUN_ADDRESS_MAYBE_MISSING
520 CORE_ADDR
521 find_stab_function_addr (namestring, filename, objfile)
522      char *namestring;
523      char *filename;
524      struct objfile *objfile;
525 {
526   struct minimal_symbol *msym;
527   char *p;
528   int n;
529
530   p = strchr (namestring, ':');
531   if (p == NULL)
532     p = namestring;
533   n = p - namestring;
534   p = alloca (n + 2);
535   strncpy (p, namestring, n);
536   p[n] = 0;
537
538   msym = lookup_minimal_symbol (p, filename, objfile);
539   if (msym == NULL)
540     {
541       /* Sun Fortran appends an underscore to the minimal symbol name,
542          try again with an appended underscore if the minimal symbol
543          was not found.  */
544       p[n] = '_';
545       p[n + 1] = 0;
546       msym = lookup_minimal_symbol (p, filename, objfile);
547     }
548
549   if (msym == NULL && filename != NULL)
550     {
551       /* Try again without the filename. */
552       p[n] = 0;
553       msym = lookup_minimal_symbol (p, 0, objfile);
554     }
555   if (msym == NULL && filename != NULL)
556     {
557       /* And try again for Sun Fortran, but without the filename. */
558       p[n] = '_';
559       p[n + 1] = 0;
560       msym = lookup_minimal_symbol (p, 0, objfile);
561     }
562
563   return msym == NULL ? 0 : SYMBOL_VALUE_ADDRESS (msym);
564 }
565 #endif /* SOFUN_ADDRESS_MAYBE_MISSING */
566 \f
567
568 /* Return leading symbol character for a BFD. If BFD is NULL,
569    return the leading symbol character from the main objfile.  */
570
571 static int get_symbol_leading_char (bfd *);
572
573 static int
574 get_symbol_leading_char (abfd)
575      bfd *abfd;
576 {
577   if (abfd != NULL)
578     return bfd_get_symbol_leading_char (abfd);
579   if (symfile_objfile != NULL && symfile_objfile->obfd != NULL)
580     return bfd_get_symbol_leading_char (symfile_objfile->obfd);
581   return 0;
582 }
583
584 /* Prepare to start collecting minimal symbols.  Note that presetting
585    msym_bunch_index to BUNCH_SIZE causes the first call to save a minimal
586    symbol to allocate the memory for the first bunch. */
587
588 void
589 init_minimal_symbol_collection ()
590 {
591   msym_count = 0;
592   msym_bunch = NULL;
593   msym_bunch_index = BUNCH_SIZE;
594 }
595
596 void
597 prim_record_minimal_symbol (name, address, ms_type, objfile)
598      const char *name;
599      CORE_ADDR address;
600      enum minimal_symbol_type ms_type;
601      struct objfile *objfile;
602 {
603   int section;
604
605   switch (ms_type)
606     {
607     case mst_text:
608     case mst_file_text:
609     case mst_solib_trampoline:
610       section = SECT_OFF_TEXT (objfile);
611       break;
612     case mst_data:
613     case mst_file_data:
614       section = SECT_OFF_DATA (objfile);
615       break;
616     case mst_bss:
617     case mst_file_bss:
618       section = SECT_OFF_BSS (objfile);
619       break;
620     default:
621       section = -1;
622     }
623
624   prim_record_minimal_symbol_and_info (name, address, ms_type,
625                                        NULL, section, NULL, objfile);
626 }
627
628 /* Record a minimal symbol in the msym bunches.  Returns the symbol
629    newly created.  */
630
631 struct minimal_symbol *
632 prim_record_minimal_symbol_and_info (name, address, ms_type, info, section,
633                                      bfd_section, objfile)
634      const char *name;
635      CORE_ADDR address;
636      enum minimal_symbol_type ms_type;
637      char *info;
638      int section;
639      asection *bfd_section;
640      struct objfile *objfile;
641 {
642   register struct msym_bunch *new;
643   register struct minimal_symbol *msymbol;
644
645   if (ms_type == mst_file_text)
646     {
647       /* Don't put gcc_compiled, __gnu_compiled_cplus, and friends into
648          the minimal symbols, because if there is also another symbol
649          at the same address (e.g. the first function of the file),
650          lookup_minimal_symbol_by_pc would have no way of getting the
651          right one.  */
652       if (name[0] == 'g'
653           && (strcmp (name, GCC_COMPILED_FLAG_SYMBOL) == 0
654               || strcmp (name, GCC2_COMPILED_FLAG_SYMBOL) == 0))
655         return (NULL);
656
657       {
658         const char *tempstring = name;
659         if (tempstring[0] == get_symbol_leading_char (objfile->obfd))
660           ++tempstring;
661         if (STREQN (tempstring, "__gnu_compiled", 14))
662           return (NULL);
663       }
664     }
665
666   if (msym_bunch_index == BUNCH_SIZE)
667     {
668       new = (struct msym_bunch *) xmalloc (sizeof (struct msym_bunch));
669       msym_bunch_index = 0;
670       new->next = msym_bunch;
671       msym_bunch = new;
672     }
673   msymbol = &msym_bunch->contents[msym_bunch_index];
674   SYMBOL_NAME (msymbol) = obsavestring ((char *) name, strlen (name),
675                                         &objfile->symbol_obstack);
676   SYMBOL_INIT_LANGUAGE_SPECIFIC (msymbol, language_unknown);
677   SYMBOL_VALUE_ADDRESS (msymbol) = address;
678   SYMBOL_SECTION (msymbol) = section;
679   SYMBOL_BFD_SECTION (msymbol) = bfd_section;
680
681   MSYMBOL_TYPE (msymbol) = ms_type;
682   /* FIXME:  This info, if it remains, needs its own field.  */
683   MSYMBOL_INFO (msymbol) = info;        /* FIXME! */
684
685   /* The hash pointers must be cleared! If they're not,
686      add_minsym_to_hash_table will NOT add this msymbol to the hash table. */
687   msymbol->hash_next = NULL;
688   msymbol->demangled_hash_next = NULL;
689
690   msym_bunch_index++;
691   msym_count++;
692   OBJSTAT (objfile, n_minsyms++);
693   return msymbol;
694 }
695
696 /* Compare two minimal symbols by address and return a signed result based
697    on unsigned comparisons, so that we sort into unsigned numeric order.  
698    Within groups with the same address, sort by name.  */
699
700 static int
701 compare_minimal_symbols (fn1p, fn2p)
702      const PTR fn1p;
703      const PTR fn2p;
704 {
705   register const struct minimal_symbol *fn1;
706   register const struct minimal_symbol *fn2;
707
708   fn1 = (const struct minimal_symbol *) fn1p;
709   fn2 = (const struct minimal_symbol *) fn2p;
710
711   if (SYMBOL_VALUE_ADDRESS (fn1) < SYMBOL_VALUE_ADDRESS (fn2))
712     {
713       return (-1);              /* addr 1 is less than addr 2 */
714     }
715   else if (SYMBOL_VALUE_ADDRESS (fn1) > SYMBOL_VALUE_ADDRESS (fn2))
716     {
717       return (1);               /* addr 1 is greater than addr 2 */
718     }
719   else
720     /* addrs are equal: sort by name */
721     {
722       char *name1 = SYMBOL_NAME (fn1);
723       char *name2 = SYMBOL_NAME (fn2);
724
725       if (name1 && name2)       /* both have names */
726         return strcmp (name1, name2);
727       else if (name2)
728         return 1;               /* fn1 has no name, so it is "less" */
729       else if (name1)           /* fn2 has no name, so it is "less" */
730         return -1;
731       else
732         return (0);             /* neither has a name, so they're equal. */
733     }
734 }
735
736 /* Discard the currently collected minimal symbols, if any.  If we wish
737    to save them for later use, we must have already copied them somewhere
738    else before calling this function.
739
740    FIXME:  We could allocate the minimal symbol bunches on their own
741    obstack and then simply blow the obstack away when we are done with
742    it.  Is it worth the extra trouble though? */
743
744 static void
745 do_discard_minimal_symbols_cleanup (void *arg)
746 {
747   register struct msym_bunch *next;
748
749   while (msym_bunch != NULL)
750     {
751       next = msym_bunch->next;
752       free ((PTR) msym_bunch);
753       msym_bunch = next;
754     }
755 }
756
757 struct cleanup *
758 make_cleanup_discard_minimal_symbols (void)
759 {
760   return make_cleanup (do_discard_minimal_symbols_cleanup, 0);
761 }
762
763
764
765 /* Compact duplicate entries out of a minimal symbol table by walking
766    through the table and compacting out entries with duplicate addresses
767    and matching names.  Return the number of entries remaining.
768
769    On entry, the table resides between msymbol[0] and msymbol[mcount].
770    On exit, it resides between msymbol[0] and msymbol[result_count].
771
772    When files contain multiple sources of symbol information, it is
773    possible for the minimal symbol table to contain many duplicate entries.
774    As an example, SVR4 systems use ELF formatted object files, which
775    usually contain at least two different types of symbol tables (a
776    standard ELF one and a smaller dynamic linking table), as well as
777    DWARF debugging information for files compiled with -g.
778
779    Without compacting, the minimal symbol table for gdb itself contains
780    over a 1000 duplicates, about a third of the total table size.  Aside
781    from the potential trap of not noticing that two successive entries
782    identify the same location, this duplication impacts the time required
783    to linearly scan the table, which is done in a number of places.  So we
784    just do one linear scan here and toss out the duplicates.
785
786    Note that we are not concerned here about recovering the space that
787    is potentially freed up, because the strings themselves are allocated
788    on the symbol_obstack, and will get automatically freed when the symbol
789    table is freed.  The caller can free up the unused minimal symbols at
790    the end of the compacted region if their allocation strategy allows it.
791
792    Also note we only go up to the next to last entry within the loop
793    and then copy the last entry explicitly after the loop terminates.
794
795    Since the different sources of information for each symbol may
796    have different levels of "completeness", we may have duplicates
797    that have one entry with type "mst_unknown" and the other with a
798    known type.  So if the one we are leaving alone has type mst_unknown,
799    overwrite its type with the type from the one we are compacting out.  */
800
801 static int
802 compact_minimal_symbols (msymbol, mcount, objfile)
803      struct minimal_symbol *msymbol;
804      int mcount;
805      struct objfile *objfile;
806 {
807   struct minimal_symbol *copyfrom;
808   struct minimal_symbol *copyto;
809
810   if (mcount > 0)
811     {
812       copyfrom = copyto = msymbol;
813       while (copyfrom < msymbol + mcount - 1)
814         {
815           if (SYMBOL_VALUE_ADDRESS (copyfrom) ==
816               SYMBOL_VALUE_ADDRESS ((copyfrom + 1)) &&
817               (STREQ (SYMBOL_NAME (copyfrom), SYMBOL_NAME ((copyfrom + 1)))))
818             {
819               if (MSYMBOL_TYPE ((copyfrom + 1)) == mst_unknown)
820                 {
821                   MSYMBOL_TYPE ((copyfrom + 1)) = MSYMBOL_TYPE (copyfrom);
822                 }
823               copyfrom++;
824             }
825           else
826             {
827               *copyto++ = *copyfrom++;
828
829               add_minsym_to_hash_table (copyto - 1, objfile->msymbol_hash);
830             }
831         }
832       *copyto++ = *copyfrom++;
833       mcount = copyto - msymbol;
834     }
835   return (mcount);
836 }
837
838 /* Add the minimal symbols in the existing bunches to the objfile's official
839    minimal symbol table.  In most cases there is no minimal symbol table yet
840    for this objfile, and the existing bunches are used to create one.  Once
841    in a while (for shared libraries for example), we add symbols (e.g. common
842    symbols) to an existing objfile.
843
844    Because of the way minimal symbols are collected, we generally have no way
845    of knowing what source language applies to any particular minimal symbol.
846    Specifically, we have no way of knowing if the minimal symbol comes from a
847    C++ compilation unit or not.  So for the sake of supporting cached
848    demangled C++ names, we have no choice but to try and demangle each new one
849    that comes in.  If the demangling succeeds, then we assume it is a C++
850    symbol and set the symbol's language and demangled name fields
851    appropriately.  Note that in order to avoid unnecessary demanglings, and
852    allocating obstack space that subsequently can't be freed for the demangled
853    names, we mark all newly added symbols with language_auto.  After
854    compaction of the minimal symbols, we go back and scan the entire minimal
855    symbol table looking for these new symbols.  For each new symbol we attempt
856    to demangle it, and if successful, record it as a language_cplus symbol
857    and cache the demangled form on the symbol obstack.  Symbols which don't
858    demangle are marked as language_unknown symbols, which inhibits future
859    attempts to demangle them if we later add more minimal symbols. */
860
861 void
862 install_minimal_symbols (objfile)
863      struct objfile *objfile;
864 {
865   register int bindex;
866   register int mcount;
867   register struct msym_bunch *bunch;
868   register struct minimal_symbol *msymbols;
869   int alloc_count;
870   register char leading_char;
871
872   if (msym_count > 0)
873     {
874       /* Allocate enough space in the obstack, into which we will gather the
875          bunches of new and existing minimal symbols, sort them, and then
876          compact out the duplicate entries.  Once we have a final table,
877          we will give back the excess space.  */
878
879       alloc_count = msym_count + objfile->minimal_symbol_count + 1;
880       obstack_blank (&objfile->symbol_obstack,
881                      alloc_count * sizeof (struct minimal_symbol));
882       msymbols = (struct minimal_symbol *)
883         obstack_base (&objfile->symbol_obstack);
884
885       /* Copy in the existing minimal symbols, if there are any.  */
886
887       if (objfile->minimal_symbol_count)
888         memcpy ((char *) msymbols, (char *) objfile->msymbols,
889             objfile->minimal_symbol_count * sizeof (struct minimal_symbol));
890
891       /* Walk through the list of minimal symbol bunches, adding each symbol
892          to the new contiguous array of symbols.  Note that we start with the
893          current, possibly partially filled bunch (thus we use the current
894          msym_bunch_index for the first bunch we copy over), and thereafter
895          each bunch is full. */
896
897       mcount = objfile->minimal_symbol_count;
898       leading_char = get_symbol_leading_char (objfile->obfd);
899
900       for (bunch = msym_bunch; bunch != NULL; bunch = bunch->next)
901         {
902           for (bindex = 0; bindex < msym_bunch_index; bindex++, mcount++)
903             {
904               msymbols[mcount] = bunch->contents[bindex];
905               SYMBOL_LANGUAGE (&msymbols[mcount]) = language_auto;
906               if (SYMBOL_NAME (&msymbols[mcount])[0] == leading_char)
907                 {
908                   SYMBOL_NAME (&msymbols[mcount])++;
909                 }
910             }
911           msym_bunch_index = BUNCH_SIZE;
912         }
913
914       /* Sort the minimal symbols by address.  */
915
916       qsort (msymbols, mcount, sizeof (struct minimal_symbol),
917              compare_minimal_symbols);
918
919       /* Compact out any duplicates, and free up whatever space we are
920          no longer using.  */
921
922       mcount = compact_minimal_symbols (msymbols, mcount, objfile);
923
924       obstack_blank (&objfile->symbol_obstack,
925                (mcount + 1 - alloc_count) * sizeof (struct minimal_symbol));
926       msymbols = (struct minimal_symbol *)
927         obstack_finish (&objfile->symbol_obstack);
928
929       /* We also terminate the minimal symbol table with a "null symbol",
930          which is *not* included in the size of the table.  This makes it
931          easier to find the end of the table when we are handed a pointer
932          to some symbol in the middle of it.  Zero out the fields in the
933          "null symbol" allocated at the end of the array.  Note that the
934          symbol count does *not* include this null symbol, which is why it
935          is indexed by mcount and not mcount-1. */
936
937       SYMBOL_NAME (&msymbols[mcount]) = NULL;
938       SYMBOL_VALUE_ADDRESS (&msymbols[mcount]) = 0;
939       MSYMBOL_INFO (&msymbols[mcount]) = NULL;
940       MSYMBOL_TYPE (&msymbols[mcount]) = mst_unknown;
941       SYMBOL_INIT_LANGUAGE_SPECIFIC (&msymbols[mcount], language_unknown);
942
943       /* Attach the minimal symbol table to the specified objfile.
944          The strings themselves are also located in the symbol_obstack
945          of this objfile.  */
946
947       objfile->minimal_symbol_count = mcount;
948       objfile->msymbols = msymbols;
949
950       /* Now walk through all the minimal symbols, selecting the newly added
951          ones and attempting to cache their C++ demangled names. */
952
953       for (; mcount-- > 0; msymbols++)
954         {
955           SYMBOL_INIT_DEMANGLED_NAME (msymbols, &objfile->symbol_obstack);
956           if (SYMBOL_DEMANGLED_NAME (msymbols) != NULL)
957           add_minsym_to_demangled_hash_table (msymbols,
958                                               objfile->msymbol_demangled_hash);
959         }
960     }
961 }
962
963 /* Sort all the minimal symbols in OBJFILE.  */
964
965 void
966 msymbols_sort (objfile)
967      struct objfile *objfile;
968 {
969   qsort (objfile->msymbols, objfile->minimal_symbol_count,
970          sizeof (struct minimal_symbol), compare_minimal_symbols);
971 }
972
973 /* Check if PC is in a shared library trampoline code stub.
974    Return minimal symbol for the trampoline entry or NULL if PC is not
975    in a trampoline code stub.  */
976
977 struct minimal_symbol *
978 lookup_solib_trampoline_symbol_by_pc (pc)
979      CORE_ADDR pc;
980 {
981   struct minimal_symbol *msymbol = lookup_minimal_symbol_by_pc (pc);
982
983   if (msymbol != NULL && MSYMBOL_TYPE (msymbol) == mst_solib_trampoline)
984     return msymbol;
985   return NULL;
986 }
987
988 /* If PC is in a shared library trampoline code stub, return the
989    address of the `real' function belonging to the stub.
990    Return 0 if PC is not in a trampoline code stub or if the real
991    function is not found in the minimal symbol table.
992
993    We may fail to find the right function if a function with the
994    same name is defined in more than one shared library, but this
995    is considered bad programming style. We could return 0 if we find
996    a duplicate function in case this matters someday.  */
997
998 CORE_ADDR
999 find_solib_trampoline_target (pc)
1000      CORE_ADDR pc;
1001 {
1002   struct objfile *objfile;
1003   struct minimal_symbol *msymbol;
1004   struct minimal_symbol *tsymbol = lookup_solib_trampoline_symbol_by_pc (pc);
1005
1006   if (tsymbol != NULL)
1007     {
1008       ALL_MSYMBOLS (objfile, msymbol)
1009       {
1010         if (MSYMBOL_TYPE (msymbol) == mst_text
1011             && STREQ (SYMBOL_NAME (msymbol), SYMBOL_NAME (tsymbol)))
1012           return SYMBOL_VALUE_ADDRESS (msymbol);
1013       }
1014     }
1015   return 0;
1016 }