xref: /netbsd-src/external/gpl3/binutils/dist/gprof/corefile.c (revision bdc22b2e01993381dcefeff2bc9b56ca75a4235c)
1 /* corefile.c
2 
3    Copyright (C) 1999-2018 Free Software Foundation, Inc.
4 
5    This file is part of GNU Binutils.
6 
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 3 of the License, or
10    (at your option) any later version.
11 
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16 
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
20    02110-1301, USA.  */
21 
22 #include "gprof.h"
23 #include "libiberty.h"
24 #include "filenames.h"
25 #include "search_list.h"
26 #include "source.h"
27 #include "symtab.h"
28 #include "hist.h"
29 #include "corefile.h"
30 #include "safe-ctype.h"
31 #include <limits.h>    /* For UINT_MAX.  */
32 
33 #include <stdlib.h>
34 
35 bfd *core_bfd;
36 static int core_num_syms;
37 static asymbol **core_syms;
38 asection *core_text_sect;
39 void * core_text_space;
40 
41 static int min_insn_size;
42 int offset_to_code;
43 
44 /* For mapping symbols to specific .o files during file ordering.  */
45 struct function_map * symbol_map;
46 unsigned int symbol_map_count;
47 
48 static void read_function_mappings (const char *);
49 static int core_sym_class (asymbol *);
50 static bfd_boolean get_src_info
51   (bfd_vma, const char **, const char **, int *);
52 
53 extern void i386_find_call  (Sym *, bfd_vma, bfd_vma);
54 extern void alpha_find_call (Sym *, bfd_vma, bfd_vma);
55 extern void vax_find_call   (Sym *, bfd_vma, bfd_vma);
56 extern void tahoe_find_call (Sym *, bfd_vma, bfd_vma);
57 extern void sparc_find_call (Sym *, bfd_vma, bfd_vma);
58 extern void mips_find_call  (Sym *, bfd_vma, bfd_vma);
59 extern void aarch64_find_call (Sym *, bfd_vma, bfd_vma);
60 
61 static void
62 parse_error (const char *filename)
63 {
64   fprintf (stderr, _("%s: unable to parse mapping file %s.\n"), whoami, filename);
65   done (1);
66 }
67 
68 /* Compare two function_map structs based on function name.
69    We want to sort in ascending order.  */
70 
71 static int
72 cmp_symbol_map (const void * l, const void * r)
73 {
74   return strcmp (((struct function_map *) l)->function_name,
75 		 ((struct function_map *) r)->function_name);
76 }
77 
78 #define BUFSIZE      (1024)
79 /* This is BUFSIZE - 1 as a string.  Suitable for use in fprintf/sscanf format strings.  */
80 #define STR_BUFSIZE  "1023"
81 
82 static void
83 read_function_mappings (const char *filename)
84 {
85   FILE * file = fopen (filename, "r");
86   char dummy[BUFSIZE];
87   int count = 0;
88   unsigned int i;
89 
90   if (!file)
91     {
92       fprintf (stderr, _("%s: could not open %s.\n"), whoami, filename);
93       done (1);
94     }
95 
96   /* First parse the mapping file so we know how big we need to
97      make our tables.  We also do some sanity checks at this
98      time.  */
99   while (!feof (file))
100     {
101       int matches;
102 
103       matches = fscanf (file, "%" STR_BUFSIZE "[^\n:]", dummy);
104       if (!matches)
105 	parse_error (filename);
106 
107       /* Just skip messages about files with no symbols.  */
108       if (!strncmp (dummy, "No symbols in ", 14))
109 	{
110 	  matches = fscanf (file, "\n");
111 	  if (matches == EOF)
112 	    parse_error (filename);
113 	  continue;
114 	}
115 
116       /* Don't care what else is on this line at this point.  */
117       matches = fscanf (file, "%" STR_BUFSIZE "[^\n]\n", dummy);
118       if (!matches)
119 	parse_error (filename);
120       count++;
121     }
122 
123   /* Now we know how big we need to make our table.  */
124   symbol_map = ((struct function_map *)
125 		xmalloc (count * sizeof (struct function_map)));
126 
127   /* Rewind the input file so we can read it again.  */
128   rewind (file);
129 
130   /* Read each entry and put it into the table.  */
131   count = 0;
132   while (!feof (file))
133     {
134       int matches;
135       char *tmp;
136 
137       matches = fscanf (file, "%" STR_BUFSIZE "[^\n:]", dummy);
138       if (!matches)
139 	parse_error (filename);
140 
141       /* Just skip messages about files with no symbols.  */
142       if (!strncmp (dummy, "No symbols in ", 14))
143 	{
144 	  matches = fscanf (file, "\n");
145 	  if (matches == EOF)
146 	    parse_error (filename);
147 	  continue;
148 	}
149 
150       /* dummy has the filename, go ahead and copy it.  */
151       symbol_map[count].file_name = (char *) xmalloc (strlen (dummy) + 1);
152       strcpy (symbol_map[count].file_name, dummy);
153 
154       /* Now we need the function name.  */
155       matches = fscanf (file, "%" STR_BUFSIZE "[^\n]\n", dummy);
156       if (!matches)
157 	parse_error (filename);
158       tmp = strrchr (dummy, ' ') + 1;
159       symbol_map[count].function_name = (char *) xmalloc (strlen (tmp) + 1);
160       strcpy (symbol_map[count].function_name, tmp);
161       count++;
162     }
163 
164   /* Record the size of the map table for future reference.  */
165   symbol_map_count = count;
166 
167   for (i = 0; i < symbol_map_count; ++i)
168     if (i == 0
169         || filename_cmp (symbol_map[i].file_name, symbol_map[i - 1].file_name))
170       symbol_map[i].is_first = 1;
171 
172   qsort (symbol_map, symbol_map_count, sizeof (struct function_map), cmp_symbol_map);
173 
174   fclose (file);
175 }
176 
177 void
178 core_init (const char * aout_name)
179 {
180   int core_sym_bytes;
181   asymbol *synthsyms;
182   long synth_count;
183 
184   core_bfd = bfd_openr (aout_name, 0);
185 
186   if (!core_bfd)
187     {
188       perror (aout_name);
189       done (1);
190     }
191 
192   if (!bfd_check_format (core_bfd, bfd_object))
193     {
194       fprintf (stderr, _("%s: %s: not in executable format\n"), whoami, aout_name);
195       done (1);
196     }
197 
198   /* Get core's text section.  */
199   core_text_sect = bfd_get_section_by_name (core_bfd, ".text");
200   if (!core_text_sect)
201     {
202       core_text_sect = bfd_get_section_by_name (core_bfd, "$CODE$");
203       if (!core_text_sect)
204 	{
205 	  fprintf (stderr, _("%s: can't find .text section in %s\n"),
206 		   whoami, aout_name);
207 	  done (1);
208 	}
209     }
210 
211   /* Read core's symbol table.  */
212 
213   /* This will probably give us more than we need, but that's ok.  */
214   core_sym_bytes = bfd_get_symtab_upper_bound (core_bfd);
215   if (core_sym_bytes < 0)
216     {
217       fprintf (stderr, "%s: %s: %s\n", whoami, aout_name,
218 	       bfd_errmsg (bfd_get_error ()));
219       done (1);
220     }
221 
222   core_syms = (asymbol **) xmalloc (core_sym_bytes);
223   core_num_syms = bfd_canonicalize_symtab (core_bfd, core_syms);
224 
225   if (core_num_syms < 0)
226     {
227       fprintf (stderr, "%s: %s: %s\n", whoami, aout_name,
228 	       bfd_errmsg (bfd_get_error ()));
229       done (1);
230     }
231 
232   synth_count = bfd_get_synthetic_symtab (core_bfd, core_num_syms, core_syms,
233 					  0, NULL, &synthsyms);
234   if (synth_count > 0)
235     {
236       asymbol **symp;
237       long new_size;
238       long i;
239 
240       new_size = (core_num_syms + synth_count + 1) * sizeof (*core_syms);
241       core_syms = (asymbol **) xrealloc (core_syms, new_size);
242       symp = core_syms + core_num_syms;
243       core_num_syms += synth_count;
244       for (i = 0; i < synth_count; i++)
245 	*symp++ = synthsyms + i;
246       *symp = 0;
247     }
248 
249   min_insn_size = 1;
250   offset_to_code = 0;
251 
252   switch (bfd_get_arch (core_bfd))
253     {
254     case bfd_arch_vax:
255     case bfd_arch_tahoe:
256       offset_to_code = 2;
257       break;
258 
259     case bfd_arch_alpha:
260       min_insn_size = 4;
261       break;
262 
263     default:
264       break;
265     }
266 
267   if (function_mapping_file)
268     read_function_mappings (function_mapping_file);
269 }
270 
271 /* Read in the text space of an a.out file.  */
272 
273 void
274 core_get_text_space (bfd *cbfd)
275 {
276   core_text_space = malloc (bfd_get_section_size (core_text_sect));
277 
278   if (!core_text_space)
279     {
280       fprintf (stderr, _("%s: ran out room for %lu bytes of text space\n"),
281 	       whoami, (unsigned long) bfd_get_section_size (core_text_sect));
282       done (1);
283     }
284 
285   if (!bfd_get_section_contents (cbfd, core_text_sect, core_text_space,
286 				 0, bfd_get_section_size (core_text_sect)))
287     {
288       bfd_perror ("bfd_get_section_contents");
289       free (core_text_space);
290       core_text_space = 0;
291     }
292 
293   if (!core_text_space)
294     fprintf (stderr, _("%s: can't do -c\n"), whoami);
295 }
296 
297 
298 void
299 find_call (Sym *parent, bfd_vma p_lowpc, bfd_vma p_highpc)
300 {
301   if (core_text_space == 0)
302     return;
303 
304   hist_clip_symbol_address (&p_lowpc, &p_highpc);
305 
306   switch (bfd_get_arch (core_bfd))
307     {
308     case bfd_arch_i386:
309       i386_find_call (parent, p_lowpc, p_highpc);
310       break;
311 
312     case bfd_arch_alpha:
313       alpha_find_call (parent, p_lowpc, p_highpc);
314       break;
315 
316     case bfd_arch_vax:
317       vax_find_call (parent, p_lowpc, p_highpc);
318       break;
319 
320     case bfd_arch_sparc:
321       sparc_find_call (parent, p_lowpc, p_highpc);
322       break;
323 
324     case bfd_arch_tahoe:
325       tahoe_find_call (parent, p_lowpc, p_highpc);
326       break;
327 
328     case bfd_arch_mips:
329       mips_find_call (parent, p_lowpc, p_highpc);
330       break;
331 
332     case bfd_arch_aarch64:
333       aarch64_find_call (parent, p_lowpc, p_highpc);
334       break;
335 
336     default:
337       fprintf (stderr, _("%s: -c not supported on architecture %s\n"),
338 	       whoami, bfd_printable_name(core_bfd));
339 
340       /* Don't give the error more than once.  */
341       ignore_direct_calls = FALSE;
342     }
343 }
344 
345 /* Return class of symbol SYM.  The returned class can be any of:
346 	0   -> symbol is not interesting to us
347 	'T' -> symbol is a global name
348 	't' -> symbol is a local (static) name.  */
349 
350 static int
351 core_sym_class (asymbol *sym)
352 {
353   symbol_info syminfo;
354   const char *name;
355   char sym_prefix;
356   int i;
357 
358   if (sym->section == NULL || (sym->flags & BSF_DEBUGGING) != 0)
359     return 0;
360 
361   /* Must be a text symbol, and static text symbols
362      don't qualify if ignore_static_funcs set.   */
363   if (ignore_static_funcs && (sym->flags & BSF_LOCAL))
364     {
365       DBG (AOUTDEBUG, printf ("[core_sym_class] %s: not a function\n",
366 			      sym->name));
367       return 0;
368     }
369 
370   bfd_get_symbol_info (core_bfd, sym, &syminfo);
371   i = syminfo.type;
372 
373   if (i == 'T')
374     return i;			/* It's a global symbol.  */
375 
376   if (i == 'W')
377     /* Treat weak symbols as text symbols.  FIXME: a weak symbol may
378        also be a data symbol.  */
379     return 'T';
380 
381   if (i != 't')
382     {
383       /* Not a static text symbol.  */
384       DBG (AOUTDEBUG, printf ("[core_sym_class] %s is of class %c\n",
385 			      sym->name, i));
386       return 0;
387     }
388 
389   /* Do some more filtering on static function-names.  */
390   if (ignore_static_funcs)
391     return 0;
392 
393   /* Can't zero-length name or funny characters in name, where
394      `funny' includes: `.' (.o file names) and `$' (Pascal labels).  */
395   if (!sym->name || sym->name[0] == '\0')
396     return 0;
397 
398   for (name = sym->name; *name; ++name)
399     {
400       if (*name == '$')
401         return 0;
402 
403       while (*name == '.')
404 	{
405 	  /* Allow both nested subprograms (which end with ".NNN", where N is
406 	     a digit) and GCC cloned functions (which contain ".clone").
407 	     Allow for multiple iterations of both - apparently GCC can clone
408 	     clones and subprograms.  */
409 	  int digit_seen = 0;
410 #define CLONE_NAME	    ".clone."
411 #define CLONE_NAME_LEN	    strlen (CLONE_NAME)
412 #define CONSTPROP_NAME	    ".constprop."
413 #define CONSTPROP_NAME_LEN  strlen (CONSTPROP_NAME)
414 
415 	  if (strlen (name) > CLONE_NAME_LEN
416 	      && strncmp (name, CLONE_NAME, CLONE_NAME_LEN) == 0)
417 	    name += CLONE_NAME_LEN - 1;
418 
419 	  else if (strlen (name) > CONSTPROP_NAME_LEN
420 	      && strncmp (name, CONSTPROP_NAME, CONSTPROP_NAME_LEN) == 0)
421 	    name += CONSTPROP_NAME_LEN - 1;
422 
423 	  for (name++; *name; name++)
424 	    if (digit_seen && *name == '.')
425 	      break;
426 	    else if (ISDIGIT (*name))
427 	      digit_seen = 1;
428 	    else
429 	      return 0;
430 	}
431     }
432 
433   /* On systems where the C compiler adds an underscore to all
434      names, static names without underscores seem usually to be
435      labels in hand written assembler in the library.  We don't want
436      these names.  This is certainly necessary on a Sparc running
437      SunOS 4.1 (try profiling a program that does a lot of
438      division). I don't know whether it has harmful side effects on
439      other systems.  Perhaps it should be made configurable.  */
440   sym_prefix = bfd_get_symbol_leading_char (core_bfd);
441 
442   if ((sym_prefix && sym_prefix != sym->name[0])
443       /* GCC may add special symbols to help gdb figure out the file
444 	language.  We want to ignore these, since sometimes they mask
445 	the real function.  (dj@ctron)  */
446       || !strncmp (sym->name, "__gnu_compiled", 14)
447       || !strncmp (sym->name, "___gnu_compiled", 15))
448     {
449       return 0;
450     }
451 
452   /* If the object file supports marking of function symbols, then
453      we can zap anything that doesn't have BSF_FUNCTION set.  */
454   if (ignore_non_functions && (sym->flags & BSF_FUNCTION) == 0)
455     return 0;
456 
457   return 't';			/* It's a static text symbol.  */
458 }
459 
460 /* Get whatever source info we can get regarding address ADDR.  */
461 
462 static bfd_boolean
463 get_src_info (bfd_vma addr, const char **filename, const char **name, int *line_num)
464 {
465   const char *fname = 0, *func_name = 0;
466   int l = 0;
467 
468   if (bfd_find_nearest_line (core_bfd, core_text_sect, core_syms,
469 			     addr - core_text_sect->vma,
470 			     &fname, &func_name, (unsigned int *) &l)
471       && fname && func_name && l)
472     {
473       DBG (AOUTDEBUG, printf ("[get_src_info] 0x%lx -> %s:%d (%s)\n",
474 			      (unsigned long) addr, fname, l, func_name));
475       *filename = fname;
476       *name = func_name;
477       *line_num = l;
478       return TRUE;
479     }
480   else
481     {
482       DBG (AOUTDEBUG, printf ("[get_src_info] no info for 0x%lx (%s:%d,%s)\n",
483 			      (unsigned long) addr,
484 			      fname ? fname : "<unknown>", l,
485 			      func_name ? func_name : "<unknown>"));
486       return FALSE;
487     }
488 }
489 
490 static char buf[BUFSIZE];
491 static char address[BUFSIZE];
492 static char name[BUFSIZE];
493 
494 /* Return number of symbols in a symbol-table file.  */
495 
496 static unsigned int
497 num_of_syms_in (FILE * f)
498 {
499   char   type;
500   unsigned int num = 0;
501 
502   while (!feof (f) && fgets (buf, BUFSIZE - 1, f))
503     {
504       if (sscanf (buf, "%" STR_BUFSIZE "s %c %" STR_BUFSIZE "s", address, &type, name) == 3)
505         if (type == 't' || type == 'T')
506 	  {
507 	    /* PR 20499 - prevent integer overflow computing argument to xmalloc.  */
508 	    if (++num >= UINT_MAX / sizeof (Sym))
509 	      return -1U;
510 	  }
511     }
512 
513   return num;
514 }
515 
516 /* Read symbol table from a file.  */
517 
518 void
519 core_create_syms_from (const char * sym_table_file)
520 {
521   char type;
522   bfd_vma min_vma = ~(bfd_vma) 0;
523   bfd_vma max_vma = 0;
524   FILE * f;
525 
526   f = fopen (sym_table_file, "r");
527   if (!f)
528     {
529       fprintf (stderr, _("%s: could not open %s.\n"), whoami, sym_table_file);
530       done (1);
531     }
532 
533   /* Pass 1 - determine upper bound on number of function names.  */
534   symtab.len = num_of_syms_in (f);
535 
536   if (symtab.len == 0)
537     {
538       fprintf (stderr, _("%s: file `%s' has no symbols\n"), whoami, sym_table_file);
539       done (1);
540     }
541   else if (symtab.len == -1U)
542     {
543       fprintf (stderr, _("%s: file `%s' has too many symbols\n"),
544 	       whoami, sym_table_file);
545       done (1);
546     }
547 
548   symtab.base = (Sym *) xmalloc (symtab.len * sizeof (Sym));
549 
550   /* Pass 2 - create symbols.  */
551   symtab.limit = symtab.base;
552 
553   if (fseek (f, 0, SEEK_SET) != 0)
554     {
555       perror (sym_table_file);
556       done (1);
557     }
558 
559   while (!feof (f) && fgets (buf, BUFSIZE - 1, f))
560     {
561       if (sscanf (buf, "%" STR_BUFSIZE "s %c %" STR_BUFSIZE "s", address, &type, name) != 3)
562 	continue;
563       if (type != 't' && type != 'T')
564 	continue;
565 
566       sym_init (symtab.limit);
567 
568       sscanf (address, "%" BFD_VMA_FMT "x", &(symtab.limit->addr) );
569 
570       symtab.limit->name = (char *) xmalloc (strlen (name) + 1);
571       strcpy ((char *) symtab.limit->name, name);
572       symtab.limit->mapped = 0;
573       symtab.limit->is_func = TRUE;
574       symtab.limit->is_bb_head = TRUE;
575       symtab.limit->is_static = (type == 't');
576       min_vma = MIN (symtab.limit->addr, min_vma);
577       max_vma = MAX (symtab.limit->addr, max_vma);
578 
579       ++symtab.limit;
580     }
581   fclose (f);
582 
583   symtab.len = symtab.limit - symtab.base;
584   symtab_finalize (&symtab);
585 }
586 
587 static int
588 search_mapped_symbol (const void * l, const void * r)
589 {
590     return strcmp ((const char *) l, ((const struct function_map *) r)->function_name);
591 }
592 
593 /* Read in symbol table from core.
594    One symbol per function is entered.  */
595 
596 void
597 core_create_function_syms (void)
598 {
599   bfd_vma min_vma = ~ (bfd_vma) 0;
600   bfd_vma max_vma = 0;
601   int cxxclass;
602   long i;
603   struct function_map * found = NULL;
604   int core_has_func_syms = 0;
605 
606   switch (core_bfd->xvec->flavour)
607     {
608     default:
609       break;
610     case bfd_target_coff_flavour:
611     case bfd_target_ecoff_flavour:
612     case bfd_target_xcoff_flavour:
613     case bfd_target_elf_flavour:
614     case bfd_target_nlm_flavour:
615     case bfd_target_som_flavour:
616       core_has_func_syms = 1;
617     }
618 
619   /* Pass 1 - determine upper bound on number of function names.  */
620   symtab.len = 0;
621 
622   for (i = 0; i < core_num_syms; ++i)
623     {
624       if (!core_sym_class (core_syms[i]))
625 	continue;
626 
627       /* Don't create a symtab entry for a function that has
628 	 a mapping to a file, unless it's the first function
629 	 in the file.  */
630       if (symbol_map_count != 0)
631 	{
632 	  /* Note: some systems (SunOS 5.8) crash if bsearch base argument
633 	     is NULL.  */
634 	  found = (struct function_map *) bsearch
635 	    (core_syms[i]->name, symbol_map, symbol_map_count,
636 	     sizeof (struct function_map), search_mapped_symbol);
637 	}
638       if (found == NULL || found->is_first)
639 	++symtab.len;
640     }
641 
642   if (symtab.len == 0)
643     {
644       fprintf (stderr, _("%s: file `%s' has no symbols\n"), whoami, a_out_name);
645       done (1);
646     }
647 
648   symtab.base = (Sym *) xmalloc (symtab.len * sizeof (Sym));
649 
650   /* Pass 2 - create symbols.  */
651   symtab.limit = symtab.base;
652 
653   for (i = 0; i < core_num_syms; ++i)
654     {
655       asection *sym_sec;
656 
657       cxxclass = core_sym_class (core_syms[i]);
658 
659       if (!cxxclass)
660 	{
661 	  DBG (AOUTDEBUG,
662 	       printf ("[core_create_function_syms] rejecting: 0x%lx %s\n",
663 		       (unsigned long) core_syms[i]->value,
664 		       core_syms[i]->name));
665 	  continue;
666 	}
667 
668       if (symbol_map_count != 0)
669 	{
670 	  /* Note: some systems (SunOS 5.8) crash if bsearch base argument
671 	     is NULL.  */
672 	  found = (struct function_map *) bsearch
673 	    (core_syms[i]->name, symbol_map, symbol_map_count,
674 	     sizeof (struct function_map), search_mapped_symbol);
675 	}
676       if (found && ! found->is_first)
677 	continue;
678 
679       sym_init (symtab.limit);
680 
681       /* Symbol offsets are always section-relative.  */
682       sym_sec = core_syms[i]->section;
683       symtab.limit->addr = core_syms[i]->value;
684       if (sym_sec)
685 	symtab.limit->addr += bfd_get_section_vma (sym_sec->owner, sym_sec);
686 
687       if (found)
688 	{
689 	  symtab.limit->name = found->file_name;
690 	  symtab.limit->mapped = 1;
691 	}
692       else
693 	{
694 	  symtab.limit->name = core_syms[i]->name;
695 	  symtab.limit->mapped = 0;
696 	}
697 
698       /* Lookup filename and line number, if we can.  */
699       {
700 	const char * filename;
701 	const char * func_name;
702 
703 	if (get_src_info (symtab.limit->addr, & filename, & func_name,
704 			  & symtab.limit->line_num))
705 	  {
706 	    symtab.limit->file = source_file_lookup_path (filename);
707 
708 	    /* FIXME: Checking __osf__ here does not work with a cross
709 	       gprof.  */
710 #ifdef __osf__
711 	    /* Suppress symbols that are not function names.  This is
712 	       useful to suppress code-labels and aliases.
713 
714 	       This is known to be useful under DEC's OSF/1.  Under SunOS 4.x,
715 	       labels do not appear in the symbol table info, so this isn't
716 	       necessary.  */
717 
718 	    if (strcmp (symtab.limit->name, func_name) != 0)
719 	      {
720 		/* The symbol's address maps to a different name, so
721 		   it can't be a function-entry point.  This happens
722 		   for labels, for example.  */
723 		DBG (AOUTDEBUG,
724 		     printf ("[core_create_function_syms: rej %s (maps to %s)\n",
725 			     symtab.limit->name, func_name));
726 		continue;
727 	      }
728 #endif
729 	  }
730       }
731 
732       symtab.limit->is_func = (!core_has_func_syms
733 			       || (core_syms[i]->flags & BSF_FUNCTION) != 0);
734       symtab.limit->is_bb_head = TRUE;
735 
736       if (cxxclass == 't')
737 	symtab.limit->is_static = TRUE;
738 
739       /* Keep track of the minimum and maximum vma addresses used by all
740 	 symbols.  When computing the max_vma, use the ending address of the
741 	 section containing the symbol, if available.  */
742       min_vma = MIN (symtab.limit->addr, min_vma);
743       if (sym_sec)
744 	max_vma = MAX (bfd_get_section_vma (sym_sec->owner, sym_sec)
745 		       + bfd_section_size (sym_sec->owner, sym_sec) - 1,
746 		       max_vma);
747       else
748 	max_vma = MAX (symtab.limit->addr, max_vma);
749 
750       DBG (AOUTDEBUG, printf ("[core_create_function_syms] %ld %s 0x%lx\n",
751 			      (long) (symtab.limit - symtab.base),
752 			      symtab.limit->name,
753 			      (unsigned long) symtab.limit->addr));
754       ++symtab.limit;
755     }
756 
757   symtab.len = symtab.limit - symtab.base;
758   symtab_finalize (&symtab);
759 }
760 
761 /* Read in symbol table from core.
762    One symbol per line of source code is entered.  */
763 
764 void
765 core_create_line_syms (void)
766 {
767   char *prev_name, *prev_filename;
768   unsigned int prev_name_len, prev_filename_len;
769   bfd_vma vma, min_vma = ~(bfd_vma) 0, max_vma = 0;
770   Sym *prev, dummy, *sym;
771   const char *filename;
772   int prev_line_num;
773   Sym_Table ltab;
774   bfd_vma vma_high;
775 
776   /* Create symbols for functions as usual.  This is necessary in
777      cases where parts of a program were not compiled with -g.  For
778      those parts we still want to get info at the function level.  */
779   core_create_function_syms ();
780 
781   /* Pass 1: count the number of symbols.  */
782 
783   /* To find all line information, walk through all possible
784      text-space addresses (one by one!) and get the debugging
785      info for each address.  When the debugging info changes,
786      it is time to create a new symbol.
787 
788      Of course, this is rather slow and it would be better if
789      BFD would provide an iterator for enumerating all line infos.  */
790   prev_name_len = PATH_MAX;
791   prev_filename_len = PATH_MAX;
792   prev_name = (char *) xmalloc (prev_name_len);
793   prev_filename = (char *) xmalloc (prev_filename_len);
794   ltab.len = 0;
795   prev_line_num = 0;
796 
797   vma_high = core_text_sect->vma + bfd_get_section_size (core_text_sect);
798   for (vma = core_text_sect->vma; vma < vma_high; vma += min_insn_size)
799     {
800       unsigned int len;
801 
802       if (!get_src_info (vma, &filename, &dummy.name, &dummy.line_num)
803 	  || (prev_line_num == dummy.line_num
804 	      && prev_name != NULL
805 	      && strcmp (prev_name, dummy.name) == 0
806 	      && filename_cmp (prev_filename, filename) == 0))
807 	continue;
808 
809       ++ltab.len;
810       prev_line_num = dummy.line_num;
811 
812       len = strlen (dummy.name);
813       if (len >= prev_name_len)
814 	{
815 	  prev_name_len = len + 1024;
816 	  free (prev_name);
817 	  prev_name = (char *) xmalloc (prev_name_len);
818 	}
819 
820       strcpy (prev_name, dummy.name);
821       len = strlen (filename);
822 
823       if (len >= prev_filename_len)
824 	{
825 	  prev_filename_len = len + 1024;
826 	  free (prev_filename);
827 	  prev_filename = (char *) xmalloc (prev_filename_len);
828 	}
829 
830       strcpy (prev_filename, filename);
831 
832       min_vma = MIN (vma, min_vma);
833       max_vma = MAX (vma, max_vma);
834     }
835 
836   free (prev_name);
837   free (prev_filename);
838 
839   /* Make room for function symbols, too.  */
840   ltab.len += symtab.len;
841   ltab.base = (Sym *) xmalloc (ltab.len * sizeof (Sym));
842   ltab.limit = ltab.base;
843 
844   /* Pass 2 - create symbols.  */
845 
846   /* We now set is_static as we go along, rather than by running
847      through the symbol table at the end.
848 
849      The old way called symtab_finalize before the is_static pass,
850      causing a problem since symtab_finalize uses is_static as part of
851      its address conflict resolution algorithm.  Since global symbols
852      were preferred over static symbols, and all line symbols were
853      global at that point, static function names that conflicted with
854      their own line numbers (static, but labeled as global) were
855      rejected in favor of the line num.
856 
857      This was not the desired functionality.  We always want to keep
858      our function symbols and discard any conflicting line symbols.
859      Perhaps symtab_finalize should be modified to make this
860      distinction as well, but the current fix works and the code is a
861      lot cleaner now.  */
862   prev = 0;
863 
864   for (vma = core_text_sect->vma; vma < vma_high; vma += min_insn_size)
865     {
866       sym_init (ltab.limit);
867 
868       if (!get_src_info (vma, &filename, &ltab.limit->name, &ltab.limit->line_num)
869 	  || (prev && prev->line_num == ltab.limit->line_num
870 	      && strcmp (prev->name, ltab.limit->name) == 0
871 	      && filename_cmp (prev->file->name, filename) == 0))
872 	continue;
873 
874       /* Make name pointer a malloc'ed string.  */
875       ltab.limit->name = xstrdup (ltab.limit->name);
876       ltab.limit->file = source_file_lookup_path (filename);
877 
878       ltab.limit->addr = vma;
879 
880       /* Set is_static based on the enclosing function, using either:
881 	 1) the previous symbol, if it's from the same function, or
882 	 2) a symtab lookup.  */
883       if (prev && ltab.limit->file == prev->file &&
884 	  strcmp (ltab.limit->name, prev->name) == 0)
885 	{
886 	  ltab.limit->is_static = prev->is_static;
887 	}
888       else
889 	{
890 	  sym = sym_lookup(&symtab, ltab.limit->addr);
891           if (sym)
892 	    ltab.limit->is_static = sym->is_static;
893 	}
894 
895       prev = ltab.limit;
896 
897       DBG (AOUTDEBUG, printf ("[core_create_line_syms] %lu %s 0x%lx\n",
898 			      (unsigned long) (ltab.limit - ltab.base),
899 			      ltab.limit->name,
900 			      (unsigned long) ltab.limit->addr));
901       ++ltab.limit;
902     }
903 
904   /* Copy in function symbols.  */
905   memcpy (ltab.limit, symtab.base, symtab.len * sizeof (Sym));
906   ltab.limit += symtab.len;
907 
908   if ((unsigned int) (ltab.limit - ltab.base) != ltab.len)
909     {
910       fprintf (stderr,
911 	       _("%s: somebody miscounted: ltab.len=%d instead of %ld\n"),
912 	       whoami, ltab.len, (long) (ltab.limit - ltab.base));
913       done (1);
914     }
915 
916   /* Finalize ltab and make it symbol table.  */
917   symtab_finalize (&ltab);
918   free (symtab.base);
919   symtab = ltab;
920 }
921