Sync config.guess and config.sub with GCC
[deliverable/binutils-gdb.git] / gprof / corefile.c
CommitLineData
ef368dac
NC
1/* corefile.c
2
1ad40a04 3 Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009,
d165016d 4 2010, 2011, 2012 Free Software Foundation, Inc.
ef368dac
NC
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
651dbc76 10 the Free Software Foundation; either version 3 of the License, or
ef368dac
NC
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
44eb1801
NC
20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
21 02110-1301, USA. */
ef368dac 22\f
252b5132 23#include "gprof.h"
ecba005f 24#include "libiberty.h"
aee9ba6f 25#include "filenames.h"
6d9c411a
AM
26#include "search_list.h"
27#include "source.h"
252b5132 28#include "symtab.h"
b3296dc5 29#include "hist.h"
6d9c411a 30#include "corefile.h"
3289fe0c 31#include "safe-ctype.h"
252b5132
RH
32
33bfd *core_bfd;
9e972ca0
BE
34static int core_num_syms;
35static asymbol **core_syms;
252b5132 36asection *core_text_sect;
0e27a8f6 37void * core_text_space;
252b5132 38
9e972ca0 39static int min_insn_size;
252b5132
RH
40int offset_to_code;
41
42/* For mapping symbols to specific .o files during file ordering. */
0e27a8f6 43struct function_map * symbol_map;
252b5132
RH
44unsigned int symbol_map_count;
45
3e8f6abf
BE
46static void read_function_mappings (const char *);
47static int core_sym_class (asymbol *);
b34976b6 48static bfd_boolean get_src_info
3e8f6abf 49 (bfd_vma, const char **, const char **, int *);
1355568a 50
3e8f6abf
BE
51extern void i386_find_call (Sym *, bfd_vma, bfd_vma);
52extern void alpha_find_call (Sym *, bfd_vma, bfd_vma);
53extern void vax_find_call (Sym *, bfd_vma, bfd_vma);
54extern void tahoe_find_call (Sym *, bfd_vma, bfd_vma);
55extern void sparc_find_call (Sym *, bfd_vma, bfd_vma);
56extern void mips_find_call (Sym *, bfd_vma, bfd_vma);
252b5132 57
74335607
BE
58static void
59parse_error (const char *filename)
60{
61 fprintf (stderr, _("%s: unable to parse mapping file %s.\n"), whoami, filename);
62 done (1);
63}
64
e7e981d6
NC
65/* Compare two function_map structs based on function name.
66 We want to sort in ascending order. */
67
68static int
69cmp_symbol_map (const void * l, const void * r)
70{
d165016d 71 return strcmp (((struct function_map *) l)->function_name,
e7e981d6
NC
72 ((struct function_map *) r)->function_name);
73}
74
252b5132 75static void
3e8f6abf 76read_function_mappings (const char *filename)
252b5132 77{
e7e981d6 78 FILE * file = fopen (filename, "r");
252b5132
RH
79 char dummy[1024];
80 int count = 0;
e7e981d6 81 unsigned int i;
252b5132
RH
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)
74335607 98 parse_error (filename);
252b5132
RH
99
100 /* Just skip messages about files with no symbols. */
101 if (!strncmp (dummy, "No symbols in ", 14))
102 {
74335607
BE
103 matches = fscanf (file, "\n");
104 if (matches == EOF)
105 parse_error (filename);
252b5132
RH
106 continue;
107 }
108
109 /* Don't care what else is on this line at this point. */
74335607
BE
110 matches = fscanf (file, "%[^\n]\n", dummy);
111 if (!matches)
112 parse_error (filename);
252b5132
RH
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)
74335607 132 parse_error (filename);
252b5132
RH
133
134 /* Just skip messages about files with no symbols. */
135 if (!strncmp (dummy, "No symbols in ", 14))
136 {
74335607
BE
137 matches = fscanf (file, "\n");
138 if (matches == EOF)
139 parse_error (filename);
252b5132
RH
140 continue;
141 }
142
143 /* dummy has the filename, go ahead and copy it. */
1e9cc1c2 144 symbol_map[count].file_name = (char *) xmalloc (strlen (dummy) + 1);
252b5132
RH
145 strcpy (symbol_map[count].file_name, dummy);
146
147 /* Now we need the function name. */
74335607
BE
148 matches = fscanf (file, "%[^\n]\n", dummy);
149 if (!matches)
150 parse_error (filename);
252b5132 151 tmp = strrchr (dummy, ' ') + 1;
1e9cc1c2 152 symbol_map[count].function_name = (char *) xmalloc (strlen (tmp) + 1);
252b5132
RH
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;
252b5132 159
e7e981d6 160 for (i = 0; i < symbol_map_count; ++i)
aee9ba6f
KT
161 if (i == 0
162 || filename_cmp (symbol_map[i].file_name, symbol_map[i - 1].file_name))
e7e981d6
NC
163 symbol_map[i].is_first = 1;
164
165 qsort (symbol_map, symbol_map_count, sizeof (struct function_map), cmp_symbol_map);
166}
ef368dac 167
252b5132 168void
e7e981d6 169core_init (const char * aout_name)
252b5132 170{
37b1bfcd 171 int core_sym_bytes;
2f041bf7
AM
172 asymbol *synthsyms;
173 long synth_count;
174
1355568a 175 core_bfd = bfd_openr (aout_name, 0);
252b5132
RH
176
177 if (!core_bfd)
178 {
1355568a 179 perror (aout_name);
252b5132
RH
180 done (1);
181 }
182
183 if (!bfd_check_format (core_bfd, bfd_object))
184 {
11010f5a 185 fprintf (stderr, _("%s: %s: not in executable format\n"), whoami, aout_name);
252b5132
RH
186 done (1);
187 }
188
ef368dac 189 /* Get core's text section. */
252b5132
RH
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"),
1355568a 197 whoami, aout_name);
252b5132
RH
198 done (1);
199 }
200 }
201
ef368dac 202 /* Read core's symbol table. */
252b5132 203
ef368dac 204 /* This will probably give us more than we need, but that's ok. */
37b1bfcd
BE
205 core_sym_bytes = bfd_get_symtab_upper_bound (core_bfd);
206 if (core_sym_bytes < 0)
252b5132 207 {
1355568a 208 fprintf (stderr, "%s: %s: %s\n", whoami, aout_name,
252b5132
RH
209 bfd_errmsg (bfd_get_error ()));
210 done (1);
211 }
212
37b1bfcd 213 core_syms = (asymbol **) xmalloc (core_sym_bytes);
252b5132 214 core_num_syms = bfd_canonicalize_symtab (core_bfd, core_syms);
0eee5820 215
252b5132
RH
216 if (core_num_syms < 0)
217 {
1355568a 218 fprintf (stderr, "%s: %s: %s\n", whoami, aout_name,
252b5132
RH
219 bfd_errmsg (bfd_get_error ()));
220 done (1);
221 }
222
2f041bf7
AM
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);
1e9cc1c2 232 core_syms = (asymbol **) xrealloc (core_syms, new_size);
2f041bf7
AM
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
252b5132
RH
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
ef368dac 262/* Read in the text space of an a.out file. */
252b5132 263
252b5132 264void
3e8f6abf 265core_get_text_space (bfd *cbfd)
252b5132 266{
67cf9bc5 267 core_text_space = malloc (bfd_get_section_size (core_text_sect));
252b5132
RH
268
269 if (!core_text_space)
270 {
fdcf7d43 271 fprintf (stderr, _("%s: ran out room for %lu bytes of text space\n"),
67cf9bc5 272 whoami, (unsigned long) bfd_get_section_size (core_text_sect));
252b5132
RH
273 done (1);
274 }
0eee5820 275
1355568a 276 if (!bfd_get_section_contents (cbfd, core_text_sect, core_text_space,
67cf9bc5 277 0, bfd_get_section_size (core_text_sect)))
252b5132
RH
278 {
279 bfd_perror ("bfd_get_section_contents");
280 free (core_text_space);
281 core_text_space = 0;
282 }
0eee5820 283
252b5132 284 if (!core_text_space)
ef368dac 285 fprintf (stderr, _("%s: can't do -c\n"), whoami);
252b5132
RH
286}
287
288
289void
3e8f6abf 290find_call (Sym *parent, bfd_vma p_lowpc, bfd_vma p_highpc)
252b5132 291{
b3296dc5
VP
292 if (core_text_space == 0)
293 return;
294
295 hist_clip_symbol_address (&p_lowpc, &p_highpc);
296
252b5132
RH
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
ec0806ec
JT
319 case bfd_arch_mips:
320 mips_find_call (parent, p_lowpc, p_highpc);
321 break;
322
252b5132
RH
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. */
b34976b6 328 ignore_direct_calls = FALSE;
252b5132
RH
329 }
330}
331
ef368dac 332/* Return class of symbol SYM. The returned class can be any of:
0eee5820
AM
333 0 -> symbol is not interesting to us
334 'T' -> symbol is a global name
335 't' -> symbol is a local (static) name. */
ef368dac 336
252b5132 337static int
3e8f6abf 338core_sym_class (asymbol *sym)
252b5132
RH
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)
ef368dac 346 return 0;
252b5132 347
ef368dac
NC
348 /* Must be a text symbol, and static text symbols
349 don't qualify if ignore_static_funcs set. */
252b5132
RH
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')
ef368dac 361 return i; /* It's a global symbol. */
252b5132
RH
362
363 if (i == 'W')
ef368dac
NC
364 /* Treat weak symbols as text symbols. FIXME: a weak symbol may
365 also be a data symbol. */
366 return 'T';
252b5132
RH
367
368 if (i != 't')
369 {
ef368dac 370 /* Not a static text symbol. */
252b5132
RH
371 DBG (AOUTDEBUG, printf ("[core_sym_class] %s is of class %c\n",
372 sym->name, i));
373 return 0;
374 }
375
ef368dac 376 /* Do some more filtering on static function-names. */
252b5132 377 if (ignore_static_funcs)
ef368dac
NC
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). */
252b5132 382 if (!sym->name || sym->name[0] == '\0')
ef368dac 383 return 0;
252b5132
RH
384
385 for (name = sym->name; *name; ++name)
386 {
3289fe0c
NC
387 if (*name == '$')
388 return 0;
389
f36485f0 390 while (*name == '.')
183e4ed8 391 {
f36485f0
NC
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;
d165016d
AM
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
f36485f0
NC
402 if (strlen (name) > CLONE_NAME_LEN
403 && strncmp (name, CLONE_NAME, CLONE_NAME_LEN) == 0)
404 name += CLONE_NAME_LEN - 1;
183e4ed8 405
d165016d
AM
406 else if (strlen (name) > CONSTPROP_NAME_LEN
407 && strncmp (name, CONSTPROP_NAME, CONSTPROP_NAME_LEN) == 0)
408 name += CONSTPROP_NAME_LEN - 1;
409
183e4ed8 410 for (name++; *name; name++)
f36485f0
NC
411 if (digit_seen && *name == '.')
412 break;
413 else if (ISDIGIT (*name))
414 digit_seen = 1;
415 else
183e4ed8 416 return 0;
183e4ed8 417 }
ef368dac 418 }
0eee5820 419
ef368dac
NC
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. */
252b5132 427 sym_prefix = bfd_get_symbol_leading_char (core_bfd);
0eee5820 428
252b5132 429 if ((sym_prefix && sym_prefix != sym->name[0])
ef368dac 430 /* GCC may add special symbols to help gdb figure out the file
0eee5820 431 language. We want to ignore these, since sometimes they mask
ef368dac 432 the real function. (dj@ctron) */
252b5132
RH
433 || !strncmp (sym->name, "__gnu_compiled", 14)
434 || !strncmp (sym->name, "___gnu_compiled", 15))
435 {
436 return 0;
437 }
438
ef368dac
NC
439 /* If the object file supports marking of function symbols, then
440 we can zap anything that doesn't have BSF_FUNCTION set. */
252b5132
RH
441 if (ignore_non_functions && (sym->flags & BSF_FUNCTION) == 0)
442 return 0;
443
ef368dac 444 return 't'; /* It's a static text symbol. */
252b5132
RH
445}
446
ef368dac 447/* Get whatever source info we can get regarding address ADDR. */
252b5132 448
b34976b6 449static bfd_boolean
3e8f6abf 450get_src_info (bfd_vma addr, const char **filename, const char **name, int *line_num)
252b5132
RH
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",
fdcf7d43 461 (unsigned long) addr, fname, l, func_name));
252b5132
RH
462 *filename = fname;
463 *name = func_name;
464 *line_num = l;
b34976b6 465 return TRUE;
252b5132
RH
466 }
467 else
468 {
469 DBG (AOUTDEBUG, printf ("[get_src_info] no info for 0x%lx (%s:%d,%s)\n",
0af1713e
AM
470 (unsigned long) addr,
471 fname ? fname : "<unknown>", l,
252b5132 472 func_name ? func_name : "<unknown>"));
b34976b6 473 return FALSE;
252b5132
RH
474 }
475}
476
0e27a8f6
NC
477/* Return number of symbols in a symbol-table file. */
478
d165016d 479static int
0e27a8f6
NC
480num_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;
d165016d 488
0e27a8f6
NC
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
505void
506core_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
1ad40a04 544 while (!feof (f) && fgets (buf, BUFSIZE - 1, f))
0e27a8f6
NC
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
f89ddd70 552 sscanf (address, "%" BFD_VMA_FMT "x", &(symtab.limit->addr) );
0e27a8f6
NC
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
e7e981d6
NC
575static int
576search_mapped_symbol (const void * l, const void * r)
577{
578 return strcmp ((const char *) l, ((const struct function_map *) r)->function_name);
579}
580
ef368dac
NC
581/* Read in symbol table from core.
582 One symbol per function is entered. */
252b5132 583
252b5132 584void
e7e981d6 585core_create_function_syms (void)
252b5132 586{
e7e981d6 587 bfd_vma min_vma = ~ (bfd_vma) 0;
1355568a 588 bfd_vma max_vma = 0;
96d56e9f 589 int cxxclass;
e7e981d6 590 long i;
ca25b5ba 591 struct function_map * found = NULL;
02f2d833
AM
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 }
252b5132 606
ef368dac 607 /* Pass 1 - determine upper bound on number of function names. */
252b5132 608 symtab.len = 0;
0eee5820 609
252b5132
RH
610 for (i = 0; i < core_num_syms; ++i)
611 {
612 if (!core_sym_class (core_syms[i]))
ef368dac 613 continue;
252b5132 614
e7e981d6 615 /* Don't create a symtab entry for a function that has
252b5132
RH
616 a mapping to a file, unless it's the first function
617 in the file. */
ca25b5ba
TG
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 }
e7e981d6 626 if (found == NULL || found->is_first)
0eee5820 627 ++symtab.len;
252b5132
RH
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
d401d98a 636 symtab.base = (Sym *) xmalloc (symtab.len * sizeof (Sym));
252b5132 637
ef368dac 638 /* Pass 2 - create symbols. */
252b5132 639 symtab.limit = symtab.base;
0eee5820 640
252b5132
RH
641 for (i = 0; i < core_num_syms; ++i)
642 {
c3fcc31e
AM
643 asection *sym_sec;
644
96d56e9f 645 cxxclass = core_sym_class (core_syms[i]);
0eee5820 646
96d56e9f 647 if (!cxxclass)
252b5132
RH
648 {
649 DBG (AOUTDEBUG,
650 printf ("[core_create_function_syms] rejecting: 0x%lx %s\n",
fdcf7d43
ILT
651 (unsigned long) core_syms[i]->value,
652 core_syms[i]->name));
252b5132
RH
653 continue;
654 }
0eee5820 655
ca25b5ba
TG
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 }
e7e981d6 664 if (found && ! found->is_first)
252b5132
RH
665 continue;
666
667 sym_init (symtab.limit);
668
ef368dac 669 /* Symbol offsets are always section-relative. */
c3fcc31e
AM
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);
0eee5820 674
e7e981d6 675 if (found)
252b5132 676 {
e7e981d6 677 symtab.limit->name = found->file_name;
252b5132
RH
678 symtab.limit->mapped = 1;
679 }
680 else
681 {
682 symtab.limit->name = core_syms[i]->name;
683 symtab.limit->mapped = 0;
684 }
685
ef368dac 686 /* Lookup filename and line number, if we can. */
252b5132 687 {
e7e981d6
NC
688 const char * filename;
689 const char * func_name;
0eee5820 690
e7e981d6
NC
691 if (get_src_info (symtab.limit->addr, & filename, & func_name,
692 & symtab.limit->line_num))
252b5132
RH
693 {
694 symtab.limit->file = source_file_lookup_path (filename);
695
696 /* FIXME: Checking __osf__ here does not work with a cross
0eee5820 697 gprof. */
252b5132 698#ifdef __osf__
ef368dac
NC
699 /* Suppress symbols that are not function names. This is
700 useful to suppress code-labels and aliases.
0eee5820 701
ef368dac
NC
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. */
252b5132
RH
705
706 if (strcmp (symtab.limit->name, func_name) != 0)
707 {
ef368dac
NC
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. */
252b5132
RH
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
02f2d833
AM
720 symtab.limit->is_func = (!core_has_func_syms
721 || (core_syms[i]->flags & BSF_FUNCTION) != 0);
b34976b6 722 symtab.limit->is_bb_head = TRUE;
0eee5820 723
96d56e9f 724 if (cxxclass == 't')
b34976b6 725 symtab.limit->is_static = TRUE;
252b5132 726
8e1a114b
DB
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. */
252b5132 730 min_vma = MIN (symtab.limit->addr, min_vma);
c3fcc31e
AM
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);
8e1a114b
DB
735 else
736 max_vma = MAX (symtab.limit->addr, max_vma);
252b5132 737
252b5132
RH
738 DBG (AOUTDEBUG, printf ("[core_create_function_syms] %ld %s 0x%lx\n",
739 (long) (symtab.limit - symtab.base),
fdcf7d43
ILT
740 symtab.limit->name,
741 (unsigned long) symtab.limit->addr));
252b5132
RH
742 ++symtab.limit;
743 }
744
252b5132
RH
745 symtab.len = symtab.limit - symtab.base;
746 symtab_finalize (&symtab);
747}
748
ef368dac
NC
749/* Read in symbol table from core.
750 One symbol per line of source code is entered. */
252b5132 751
252b5132 752void
e7e981d6 753core_create_line_syms (void)
252b5132
RH
754{
755 char *prev_name, *prev_filename;
1355568a
AM
756 unsigned int prev_name_len, prev_filename_len;
757 bfd_vma vma, min_vma = ~(bfd_vma) 0, max_vma = 0;
d401d98a 758 Sym *prev, dummy, *sym;
252b5132
RH
759 const char *filename;
760 int prev_line_num;
761 Sym_Table ltab;
bb02f434 762 bfd_vma vma_high;
0eee5820 763
ef368dac
NC
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. */
37b1bfcd 767 core_create_function_syms ();
252b5132 768
37b1bfcd 769 /* Pass 1: count the number of symbols. */
ef368dac
NC
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.
0eee5820 775
ef368dac 776 Of course, this is rather slow and it would be better if
37b1bfcd 777 BFD would provide an iterator for enumerating all line infos. */
252b5132
RH
778 prev_name_len = PATH_MAX;
779 prev_filename_len = PATH_MAX;
1e9cc1c2
NC
780 prev_name = (char *) xmalloc (prev_name_len);
781 prev_filename = (char *) xmalloc (prev_filename_len);
252b5132
RH
782 ltab.len = 0;
783 prev_line_num = 0;
0eee5820 784
67cf9bc5 785 vma_high = core_text_sect->vma + bfd_get_section_size (core_text_sect);
37b1bfcd 786 for (vma = core_text_sect->vma; vma < vma_high; vma += min_insn_size)
252b5132 787 {
1355568a 788 unsigned int len;
252b5132 789
252b5132
RH
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
aee9ba6f 794 && filename_cmp (prev_filename, filename) == 0))
ef368dac 795 continue;
252b5132
RH
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);
1e9cc1c2 805 prev_name = (char *) xmalloc (prev_name_len);
252b5132 806 }
0eee5820 807
252b5132 808 strcpy (prev_name, dummy.name);
252b5132 809 len = strlen (filename);
0eee5820 810
252b5132
RH
811 if (len >= prev_filename_len)
812 {
813 prev_filename_len = len + 1024;
814 free (prev_filename);
1e9cc1c2 815 prev_filename = (char *) xmalloc (prev_filename_len);
252b5132 816 }
0eee5820 817
252b5132
RH
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
ef368dac 827 /* Make room for function symbols, too. */
252b5132
RH
828 ltab.len += symtab.len;
829 ltab.base = (Sym *) xmalloc (ltab.len * sizeof (Sym));
830 ltab.limit = ltab.base;
831
ef368dac 832 /* Pass 2 - create symbols. */
252b5132
RH
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. */
252b5132 850 prev = 0;
0eee5820 851
37b1bfcd 852 for (vma = core_text_sect->vma; vma < vma_high; vma += min_insn_size)
252b5132
RH
853 {
854 sym_init (ltab.limit);
0eee5820 855
37b1bfcd 856 if (!get_src_info (vma, &filename, &ltab.limit->name, &ltab.limit->line_num)
252b5132
RH
857 || (prev && prev->line_num == ltab.limit->line_num
858 && strcmp (prev->name, ltab.limit->name) == 0
aee9ba6f 859 && filename_cmp (prev->file->name, filename) == 0))
ef368dac 860 continue;
252b5132 861
ef368dac 862 /* Make name pointer a malloc'ed string. */
252b5132
RH
863 ltab.limit->name = xstrdup (ltab.limit->name);
864 ltab.limit->file = source_file_lookup_path (filename);
865
37b1bfcd 866 ltab.limit->addr = vma;
252b5132
RH
867
868 /* Set is_static based on the enclosing function, using either:
0eee5820
AM
869 1) the previous symbol, if it's from the same function, or
870 2) a symtab lookup. */
252b5132
RH
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);
d401d98a
AM
879 if (sym)
880 ltab.limit->is_static = sym->is_static;
252b5132
RH
881 }
882
883 prev = ltab.limit;
884
4a607dcc
ILT
885 DBG (AOUTDEBUG, printf ("[core_create_line_syms] %lu %s 0x%lx\n",
886 (unsigned long) (ltab.limit - ltab.base),
887 ltab.limit->name,
fdcf7d43 888 (unsigned long) ltab.limit->addr));
252b5132
RH
889 ++ltab.limit;
890 }
891
ef368dac 892 /* Copy in function symbols. */
252b5132
RH
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
ef368dac 904 /* Finalize ltab and make it symbol table. */
252b5132
RH
905 symtab_finalize (&ltab);
906 free (symtab.base);
907 symtab = ltab;
252b5132 908}
This page took 0.580803 seconds and 4 git commands to generate.