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