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