Remove tahoe support
[deliverable/binutils-gdb.git] / gprof / corefile.c
CommitLineData
ef368dac
NC
1/* corefile.c
2
219d1afa 3 Copyright (C) 1999-2018 Free Software Foundation, Inc.
ef368dac
NC
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
651dbc76 9 the Free Software Foundation; either version 3 of the License, or
ef368dac
NC
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
44eb1801
NC
19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
20 02110-1301, USA. */
ef368dac 21\f
252b5132 22#include "gprof.h"
ecba005f 23#include "libiberty.h"
aee9ba6f 24#include "filenames.h"
6d9c411a
AM
25#include "search_list.h"
26#include "source.h"
252b5132 27#include "symtab.h"
b3296dc5 28#include "hist.h"
6d9c411a 29#include "corefile.h"
3289fe0c 30#include "safe-ctype.h"
c6165913 31#include <limits.h> /* For UINT_MAX. */
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);
3e8f6abf
BE
54extern void sparc_find_call (Sym *, bfd_vma, bfd_vma);
55extern void mips_find_call (Sym *, bfd_vma, bfd_vma);
cd2ae971 56extern void aarch64_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
38334d6d
NC
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
252b5132 79static void
3e8f6abf 80read_function_mappings (const char *filename)
252b5132 81{
e7e981d6 82 FILE * file = fopen (filename, "r");
38334d6d 83 char dummy[BUFSIZE];
252b5132 84 int count = 0;
e7e981d6 85 unsigned int i;
252b5132
RH
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
38334d6d 100 matches = fscanf (file, "%" STR_BUFSIZE "[^\n:]", dummy);
252b5132 101 if (!matches)
74335607 102 parse_error (filename);
252b5132
RH
103
104 /* Just skip messages about files with no symbols. */
105 if (!strncmp (dummy, "No symbols in ", 14))
106 {
74335607
BE
107 matches = fscanf (file, "\n");
108 if (matches == EOF)
109 parse_error (filename);
252b5132
RH
110 continue;
111 }
112
113 /* Don't care what else is on this line at this point. */
38334d6d 114 matches = fscanf (file, "%" STR_BUFSIZE "[^\n]\n", dummy);
74335607
BE
115 if (!matches)
116 parse_error (filename);
252b5132
RH
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
38334d6d 134 matches = fscanf (file, "%" STR_BUFSIZE "[^\n:]", dummy);
252b5132 135 if (!matches)
74335607 136 parse_error (filename);
252b5132
RH
137
138 /* Just skip messages about files with no symbols. */
139 if (!strncmp (dummy, "No symbols in ", 14))
140 {
74335607
BE
141 matches = fscanf (file, "\n");
142 if (matches == EOF)
143 parse_error (filename);
252b5132
RH
144 continue;
145 }
146
147 /* dummy has the filename, go ahead and copy it. */
1e9cc1c2 148 symbol_map[count].file_name = (char *) xmalloc (strlen (dummy) + 1);
252b5132
RH
149 strcpy (symbol_map[count].file_name, dummy);
150
151 /* Now we need the function name. */
38334d6d 152 matches = fscanf (file, "%" STR_BUFSIZE "[^\n]\n", dummy);
74335607
BE
153 if (!matches)
154 parse_error (filename);
252b5132 155 tmp = strrchr (dummy, ' ') + 1;
1e9cc1c2 156 symbol_map[count].function_name = (char *) xmalloc (strlen (tmp) + 1);
252b5132
RH
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;
252b5132 163
e7e981d6 164 for (i = 0; i < symbol_map_count; ++i)
aee9ba6f
KT
165 if (i == 0
166 || filename_cmp (symbol_map[i].file_name, symbol_map[i - 1].file_name))
e7e981d6
NC
167 symbol_map[i].is_first = 1;
168
169 qsort (symbol_map, symbol_map_count, sizeof (struct function_map), cmp_symbol_map);
5af84f93
NC
170
171 fclose (file);
e7e981d6 172}
ef368dac 173
252b5132 174void
e7e981d6 175core_init (const char * aout_name)
252b5132 176{
37b1bfcd 177 int core_sym_bytes;
2f041bf7
AM
178 asymbol *synthsyms;
179 long synth_count;
180
1355568a 181 core_bfd = bfd_openr (aout_name, 0);
252b5132
RH
182
183 if (!core_bfd)
184 {
1355568a 185 perror (aout_name);
252b5132
RH
186 done (1);
187 }
188
189 if (!bfd_check_format (core_bfd, bfd_object))
190 {
11010f5a 191 fprintf (stderr, _("%s: %s: not in executable format\n"), whoami, aout_name);
252b5132
RH
192 done (1);
193 }
194
ef368dac 195 /* Get core's text section. */
252b5132
RH
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"),
1355568a 203 whoami, aout_name);
252b5132
RH
204 done (1);
205 }
206 }
207
ef368dac 208 /* Read core's symbol table. */
252b5132 209
ef368dac 210 /* This will probably give us more than we need, but that's ok. */
37b1bfcd
BE
211 core_sym_bytes = bfd_get_symtab_upper_bound (core_bfd);
212 if (core_sym_bytes < 0)
252b5132 213 {
1355568a 214 fprintf (stderr, "%s: %s: %s\n", whoami, aout_name,
252b5132
RH
215 bfd_errmsg (bfd_get_error ()));
216 done (1);
217 }
218
37b1bfcd 219 core_syms = (asymbol **) xmalloc (core_sym_bytes);
252b5132 220 core_num_syms = bfd_canonicalize_symtab (core_bfd, core_syms);
0eee5820 221
252b5132
RH
222 if (core_num_syms < 0)
223 {
1355568a 224 fprintf (stderr, "%s: %s: %s\n", whoami, aout_name,
252b5132
RH
225 bfd_errmsg (bfd_get_error ()));
226 done (1);
227 }
228
2f041bf7
AM
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);
1e9cc1c2 238 core_syms = (asymbol **) xrealloc (core_syms, new_size);
2f041bf7
AM
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
252b5132
RH
246 min_insn_size = 1;
247 offset_to_code = 0;
248
249 switch (bfd_get_arch (core_bfd))
250 {
251 case bfd_arch_vax:
252b5132
RH
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
ef368dac 267/* Read in the text space of an a.out file. */
252b5132 268
252b5132 269void
3e8f6abf 270core_get_text_space (bfd *cbfd)
252b5132 271{
67cf9bc5 272 core_text_space = malloc (bfd_get_section_size (core_text_sect));
252b5132
RH
273
274 if (!core_text_space)
275 {
fdcf7d43 276 fprintf (stderr, _("%s: ran out room for %lu bytes of text space\n"),
67cf9bc5 277 whoami, (unsigned long) bfd_get_section_size (core_text_sect));
252b5132
RH
278 done (1);
279 }
0eee5820 280
1355568a 281 if (!bfd_get_section_contents (cbfd, core_text_sect, core_text_space,
67cf9bc5 282 0, bfd_get_section_size (core_text_sect)))
252b5132
RH
283 {
284 bfd_perror ("bfd_get_section_contents");
285 free (core_text_space);
286 core_text_space = 0;
287 }
0eee5820 288
252b5132 289 if (!core_text_space)
ef368dac 290 fprintf (stderr, _("%s: can't do -c\n"), whoami);
252b5132
RH
291}
292
293
294void
3e8f6abf 295find_call (Sym *parent, bfd_vma p_lowpc, bfd_vma p_highpc)
252b5132 296{
b3296dc5
VP
297 if (core_text_space == 0)
298 return;
299
300 hist_clip_symbol_address (&p_lowpc, &p_highpc);
301
252b5132
RH
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
ec0806ec
JT
320 case bfd_arch_mips:
321 mips_find_call (parent, p_lowpc, p_highpc);
322 break;
323
cd2ae971
AM
324 case bfd_arch_aarch64:
325 aarch64_find_call (parent, p_lowpc, p_highpc);
326 break;
327
252b5132
RH
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. */
b34976b6 333 ignore_direct_calls = FALSE;
252b5132
RH
334 }
335}
336
ef368dac 337/* Return class of symbol SYM. The returned class can be any of:
0eee5820
AM
338 0 -> symbol is not interesting to us
339 'T' -> symbol is a global name
340 't' -> symbol is a local (static) name. */
ef368dac 341
252b5132 342static int
3e8f6abf 343core_sym_class (asymbol *sym)
252b5132
RH
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)
ef368dac 351 return 0;
252b5132 352
ef368dac
NC
353 /* Must be a text symbol, and static text symbols
354 don't qualify if ignore_static_funcs set. */
252b5132
RH
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')
ef368dac 366 return i; /* It's a global symbol. */
252b5132
RH
367
368 if (i == 'W')
ef368dac
NC
369 /* Treat weak symbols as text symbols. FIXME: a weak symbol may
370 also be a data symbol. */
371 return 'T';
252b5132
RH
372
373 if (i != 't')
374 {
ef368dac 375 /* Not a static text symbol. */
252b5132
RH
376 DBG (AOUTDEBUG, printf ("[core_sym_class] %s is of class %c\n",
377 sym->name, i));
378 return 0;
379 }
380
ef368dac 381 /* Do some more filtering on static function-names. */
252b5132 382 if (ignore_static_funcs)
ef368dac
NC
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). */
252b5132 387 if (!sym->name || sym->name[0] == '\0')
ef368dac 388 return 0;
252b5132
RH
389
390 for (name = sym->name; *name; ++name)
391 {
3289fe0c
NC
392 if (*name == '$')
393 return 0;
394
f36485f0 395 while (*name == '.')
183e4ed8 396 {
f36485f0
NC
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;
d165016d
AM
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
f36485f0
NC
407 if (strlen (name) > CLONE_NAME_LEN
408 && strncmp (name, CLONE_NAME, CLONE_NAME_LEN) == 0)
409 name += CLONE_NAME_LEN - 1;
183e4ed8 410
d165016d
AM
411 else if (strlen (name) > CONSTPROP_NAME_LEN
412 && strncmp (name, CONSTPROP_NAME, CONSTPROP_NAME_LEN) == 0)
413 name += CONSTPROP_NAME_LEN - 1;
414
183e4ed8 415 for (name++; *name; name++)
f36485f0
NC
416 if (digit_seen && *name == '.')
417 break;
418 else if (ISDIGIT (*name))
419 digit_seen = 1;
420 else
183e4ed8 421 return 0;
183e4ed8 422 }
ef368dac 423 }
0eee5820 424
ef368dac
NC
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. */
252b5132 432 sym_prefix = bfd_get_symbol_leading_char (core_bfd);
0eee5820 433
252b5132 434 if ((sym_prefix && sym_prefix != sym->name[0])
ef368dac 435 /* GCC may add special symbols to help gdb figure out the file
0eee5820 436 language. We want to ignore these, since sometimes they mask
ef368dac 437 the real function. (dj@ctron) */
252b5132
RH
438 || !strncmp (sym->name, "__gnu_compiled", 14)
439 || !strncmp (sym->name, "___gnu_compiled", 15))
440 {
441 return 0;
442 }
443
ef368dac
NC
444 /* If the object file supports marking of function symbols, then
445 we can zap anything that doesn't have BSF_FUNCTION set. */
252b5132
RH
446 if (ignore_non_functions && (sym->flags & BSF_FUNCTION) == 0)
447 return 0;
448
ef368dac 449 return 't'; /* It's a static text symbol. */
252b5132
RH
450}
451
ef368dac 452/* Get whatever source info we can get regarding address ADDR. */
252b5132 453
b34976b6 454static bfd_boolean
3e8f6abf 455get_src_info (bfd_vma addr, const char **filename, const char **name, int *line_num)
252b5132
RH
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",
fdcf7d43 466 (unsigned long) addr, fname, l, func_name));
252b5132
RH
467 *filename = fname;
468 *name = func_name;
469 *line_num = l;
b34976b6 470 return TRUE;
252b5132
RH
471 }
472 else
473 {
474 DBG (AOUTDEBUG, printf ("[get_src_info] no info for 0x%lx (%s:%d,%s)\n",
0af1713e
AM
475 (unsigned long) addr,
476 fname ? fname : "<unknown>", l,
252b5132 477 func_name ? func_name : "<unknown>"));
b34976b6 478 return FALSE;
252b5132
RH
479 }
480}
481
38334d6d
NC
482static char buf[BUFSIZE];
483static char address[BUFSIZE];
484static char name[BUFSIZE];
485
0e27a8f6
NC
486/* Return number of symbols in a symbol-table file. */
487
00927233 488static unsigned int
0e27a8f6
NC
489num_of_syms_in (FILE * f)
490{
0e27a8f6 491 char type;
00927233 492 unsigned int num = 0;
d165016d 493
0e27a8f6
NC
494 while (!feof (f) && fgets (buf, BUFSIZE - 1, f))
495 {
38334d6d 496 if (sscanf (buf, "%" STR_BUFSIZE "s %c %" STR_BUFSIZE "s", address, &type, name) == 3)
0e27a8f6 497 if (type == 't' || type == 'T')
c6165913
NC
498 {
499 /* PR 20499 - prevent integer overflow computing argument to xmalloc. */
500 if (++num >= UINT_MAX / sizeof (Sym))
501 return -1U;
502 }
0e27a8f6
NC
503 }
504
0e27a8f6
NC
505 return num;
506}
507
508/* Read symbol table from a file. */
509
510void
511core_create_syms_from (const char * sym_table_file)
512{
0e27a8f6 513 char type;
0e27a8f6
NC
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 }
c6165913 533 else if (symtab.len == -1U)
00927233 534 {
c6165913
NC
535 fprintf (stderr, _("%s: file `%s' has too many symbols\n"),
536 whoami, sym_table_file);
00927233
NC
537 done (1);
538 }
0e27a8f6
NC
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
1ad40a04 551 while (!feof (f) && fgets (buf, BUFSIZE - 1, f))
0e27a8f6 552 {
38334d6d
NC
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;
4ca0333f 557
0e27a8f6
NC
558 sym_init (symtab.limit);
559
f89ddd70 560 sscanf (address, "%" BFD_VMA_FMT "x", &(symtab.limit->addr) );
0e27a8f6
NC
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);
0e27a8f6
NC
577}
578
e7e981d6
NC
579static int
580search_mapped_symbol (const void * l, const void * r)
581{
582 return strcmp ((const char *) l, ((const struct function_map *) r)->function_name);
583}
584
ef368dac
NC
585/* Read in symbol table from core.
586 One symbol per function is entered. */
252b5132 587
252b5132 588void
e7e981d6 589core_create_function_syms (void)
252b5132 590{
e7e981d6 591 bfd_vma min_vma = ~ (bfd_vma) 0;
1355568a 592 bfd_vma max_vma = 0;
96d56e9f 593 int cxxclass;
e7e981d6 594 long i;
ca25b5ba 595 struct function_map * found = NULL;
02f2d833
AM
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_nlm_flavour:
607 case bfd_target_som_flavour:
608 core_has_func_syms = 1;
609 }
252b5132 610
ef368dac 611 /* Pass 1 - determine upper bound on number of function names. */
252b5132 612 symtab.len = 0;
0eee5820 613
252b5132
RH
614 for (i = 0; i < core_num_syms; ++i)
615 {
616 if (!core_sym_class (core_syms[i]))
ef368dac 617 continue;
252b5132 618
e7e981d6 619 /* Don't create a symtab entry for a function that has
252b5132
RH
620 a mapping to a file, unless it's the first function
621 in the file. */
ca25b5ba
TG
622 if (symbol_map_count != 0)
623 {
624 /* Note: some systems (SunOS 5.8) crash if bsearch base argument
625 is NULL. */
626 found = (struct function_map *) bsearch
627 (core_syms[i]->name, symbol_map, symbol_map_count,
628 sizeof (struct function_map), search_mapped_symbol);
629 }
e7e981d6 630 if (found == NULL || found->is_first)
0eee5820 631 ++symtab.len;
252b5132
RH
632 }
633
634 if (symtab.len == 0)
635 {
636 fprintf (stderr, _("%s: file `%s' has no symbols\n"), whoami, a_out_name);
637 done (1);
638 }
639
d401d98a 640 symtab.base = (Sym *) xmalloc (symtab.len * sizeof (Sym));
252b5132 641
ef368dac 642 /* Pass 2 - create symbols. */
252b5132 643 symtab.limit = symtab.base;
0eee5820 644
252b5132
RH
645 for (i = 0; i < core_num_syms; ++i)
646 {
c3fcc31e
AM
647 asection *sym_sec;
648
96d56e9f 649 cxxclass = core_sym_class (core_syms[i]);
0eee5820 650
96d56e9f 651 if (!cxxclass)
252b5132
RH
652 {
653 DBG (AOUTDEBUG,
654 printf ("[core_create_function_syms] rejecting: 0x%lx %s\n",
fdcf7d43
ILT
655 (unsigned long) core_syms[i]->value,
656 core_syms[i]->name));
252b5132
RH
657 continue;
658 }
0eee5820 659
ca25b5ba
TG
660 if (symbol_map_count != 0)
661 {
662 /* Note: some systems (SunOS 5.8) crash if bsearch base argument
663 is NULL. */
664 found = (struct function_map *) bsearch
665 (core_syms[i]->name, symbol_map, symbol_map_count,
666 sizeof (struct function_map), search_mapped_symbol);
667 }
e7e981d6 668 if (found && ! found->is_first)
252b5132
RH
669 continue;
670
671 sym_init (symtab.limit);
672
ef368dac 673 /* Symbol offsets are always section-relative. */
c3fcc31e
AM
674 sym_sec = core_syms[i]->section;
675 symtab.limit->addr = core_syms[i]->value;
676 if (sym_sec)
677 symtab.limit->addr += bfd_get_section_vma (sym_sec->owner, sym_sec);
0eee5820 678
e7e981d6 679 if (found)
252b5132 680 {
e7e981d6 681 symtab.limit->name = found->file_name;
252b5132
RH
682 symtab.limit->mapped = 1;
683 }
684 else
685 {
686 symtab.limit->name = core_syms[i]->name;
687 symtab.limit->mapped = 0;
688 }
689
ef368dac 690 /* Lookup filename and line number, if we can. */
252b5132 691 {
e7e981d6
NC
692 const char * filename;
693 const char * func_name;
0eee5820 694
e7e981d6
NC
695 if (get_src_info (symtab.limit->addr, & filename, & func_name,
696 & symtab.limit->line_num))
252b5132
RH
697 {
698 symtab.limit->file = source_file_lookup_path (filename);
699
700 /* FIXME: Checking __osf__ here does not work with a cross
0eee5820 701 gprof. */
252b5132 702#ifdef __osf__
ef368dac
NC
703 /* Suppress symbols that are not function names. This is
704 useful to suppress code-labels and aliases.
0eee5820 705
ef368dac
NC
706 This is known to be useful under DEC's OSF/1. Under SunOS 4.x,
707 labels do not appear in the symbol table info, so this isn't
708 necessary. */
252b5132
RH
709
710 if (strcmp (symtab.limit->name, func_name) != 0)
711 {
ef368dac
NC
712 /* The symbol's address maps to a different name, so
713 it can't be a function-entry point. This happens
714 for labels, for example. */
252b5132
RH
715 DBG (AOUTDEBUG,
716 printf ("[core_create_function_syms: rej %s (maps to %s)\n",
717 symtab.limit->name, func_name));
718 continue;
719 }
720#endif
721 }
722 }
723
02f2d833
AM
724 symtab.limit->is_func = (!core_has_func_syms
725 || (core_syms[i]->flags & BSF_FUNCTION) != 0);
b34976b6 726 symtab.limit->is_bb_head = TRUE;
0eee5820 727
96d56e9f 728 if (cxxclass == 't')
b34976b6 729 symtab.limit->is_static = TRUE;
252b5132 730
8e1a114b
DB
731 /* Keep track of the minimum and maximum vma addresses used by all
732 symbols. When computing the max_vma, use the ending address of the
733 section containing the symbol, if available. */
252b5132 734 min_vma = MIN (symtab.limit->addr, min_vma);
c3fcc31e
AM
735 if (sym_sec)
736 max_vma = MAX (bfd_get_section_vma (sym_sec->owner, sym_sec)
737 + bfd_section_size (sym_sec->owner, sym_sec) - 1,
738 max_vma);
8e1a114b
DB
739 else
740 max_vma = MAX (symtab.limit->addr, max_vma);
252b5132 741
252b5132
RH
742 DBG (AOUTDEBUG, printf ("[core_create_function_syms] %ld %s 0x%lx\n",
743 (long) (symtab.limit - symtab.base),
fdcf7d43
ILT
744 symtab.limit->name,
745 (unsigned long) symtab.limit->addr));
252b5132
RH
746 ++symtab.limit;
747 }
748
252b5132
RH
749 symtab.len = symtab.limit - symtab.base;
750 symtab_finalize (&symtab);
751}
752
ef368dac
NC
753/* Read in symbol table from core.
754 One symbol per line of source code is entered. */
252b5132 755
252b5132 756void
e7e981d6 757core_create_line_syms (void)
252b5132
RH
758{
759 char *prev_name, *prev_filename;
1355568a
AM
760 unsigned int prev_name_len, prev_filename_len;
761 bfd_vma vma, min_vma = ~(bfd_vma) 0, max_vma = 0;
d401d98a 762 Sym *prev, dummy, *sym;
252b5132
RH
763 const char *filename;
764 int prev_line_num;
765 Sym_Table ltab;
bb02f434 766 bfd_vma vma_high;
0eee5820 767
ef368dac
NC
768 /* Create symbols for functions as usual. This is necessary in
769 cases where parts of a program were not compiled with -g. For
770 those parts we still want to get info at the function level. */
37b1bfcd 771 core_create_function_syms ();
252b5132 772
37b1bfcd 773 /* Pass 1: count the number of symbols. */
ef368dac
NC
774
775 /* To find all line information, walk through all possible
776 text-space addresses (one by one!) and get the debugging
777 info for each address. When the debugging info changes,
778 it is time to create a new symbol.
0eee5820 779
ef368dac 780 Of course, this is rather slow and it would be better if
37b1bfcd 781 BFD would provide an iterator for enumerating all line infos. */
252b5132
RH
782 prev_name_len = PATH_MAX;
783 prev_filename_len = PATH_MAX;
1e9cc1c2
NC
784 prev_name = (char *) xmalloc (prev_name_len);
785 prev_filename = (char *) xmalloc (prev_filename_len);
252b5132
RH
786 ltab.len = 0;
787 prev_line_num = 0;
0eee5820 788
67cf9bc5 789 vma_high = core_text_sect->vma + bfd_get_section_size (core_text_sect);
37b1bfcd 790 for (vma = core_text_sect->vma; vma < vma_high; vma += min_insn_size)
252b5132 791 {
1355568a 792 unsigned int len;
252b5132 793
252b5132
RH
794 if (!get_src_info (vma, &filename, &dummy.name, &dummy.line_num)
795 || (prev_line_num == dummy.line_num
796 && prev_name != NULL
797 && strcmp (prev_name, dummy.name) == 0
aee9ba6f 798 && filename_cmp (prev_filename, filename) == 0))
ef368dac 799 continue;
252b5132
RH
800
801 ++ltab.len;
802 prev_line_num = dummy.line_num;
803
804 len = strlen (dummy.name);
805 if (len >= prev_name_len)
806 {
807 prev_name_len = len + 1024;
808 free (prev_name);
1e9cc1c2 809 prev_name = (char *) xmalloc (prev_name_len);
252b5132 810 }
0eee5820 811
252b5132 812 strcpy (prev_name, dummy.name);
252b5132 813 len = strlen (filename);
0eee5820 814
252b5132
RH
815 if (len >= prev_filename_len)
816 {
817 prev_filename_len = len + 1024;
818 free (prev_filename);
1e9cc1c2 819 prev_filename = (char *) xmalloc (prev_filename_len);
252b5132 820 }
0eee5820 821
252b5132
RH
822 strcpy (prev_filename, filename);
823
824 min_vma = MIN (vma, min_vma);
825 max_vma = MAX (vma, max_vma);
826 }
827
828 free (prev_name);
829 free (prev_filename);
830
ef368dac 831 /* Make room for function symbols, too. */
252b5132
RH
832 ltab.len += symtab.len;
833 ltab.base = (Sym *) xmalloc (ltab.len * sizeof (Sym));
834 ltab.limit = ltab.base;
835
ef368dac 836 /* Pass 2 - create symbols. */
252b5132
RH
837
838 /* We now set is_static as we go along, rather than by running
839 through the symbol table at the end.
840
841 The old way called symtab_finalize before the is_static pass,
842 causing a problem since symtab_finalize uses is_static as part of
843 its address conflict resolution algorithm. Since global symbols
576a6e4d 844 were preferred over static symbols, and all line symbols were
252b5132
RH
845 global at that point, static function names that conflicted with
846 their own line numbers (static, but labeled as global) were
847 rejected in favor of the line num.
848
849 This was not the desired functionality. We always want to keep
850 our function symbols and discard any conflicting line symbols.
851 Perhaps symtab_finalize should be modified to make this
852 distinction as well, but the current fix works and the code is a
853 lot cleaner now. */
252b5132 854 prev = 0;
0eee5820 855
37b1bfcd 856 for (vma = core_text_sect->vma; vma < vma_high; vma += min_insn_size)
252b5132
RH
857 {
858 sym_init (ltab.limit);
0eee5820 859
37b1bfcd 860 if (!get_src_info (vma, &filename, &ltab.limit->name, &ltab.limit->line_num)
252b5132
RH
861 || (prev && prev->line_num == ltab.limit->line_num
862 && strcmp (prev->name, ltab.limit->name) == 0
aee9ba6f 863 && filename_cmp (prev->file->name, filename) == 0))
ef368dac 864 continue;
252b5132 865
ef368dac 866 /* Make name pointer a malloc'ed string. */
252b5132
RH
867 ltab.limit->name = xstrdup (ltab.limit->name);
868 ltab.limit->file = source_file_lookup_path (filename);
869
37b1bfcd 870 ltab.limit->addr = vma;
252b5132
RH
871
872 /* Set is_static based on the enclosing function, using either:
0eee5820
AM
873 1) the previous symbol, if it's from the same function, or
874 2) a symtab lookup. */
252b5132
RH
875 if (prev && ltab.limit->file == prev->file &&
876 strcmp (ltab.limit->name, prev->name) == 0)
877 {
878 ltab.limit->is_static = prev->is_static;
879 }
880 else
881 {
882 sym = sym_lookup(&symtab, ltab.limit->addr);
d401d98a
AM
883 if (sym)
884 ltab.limit->is_static = sym->is_static;
252b5132
RH
885 }
886
887 prev = ltab.limit;
888
4a607dcc
ILT
889 DBG (AOUTDEBUG, printf ("[core_create_line_syms] %lu %s 0x%lx\n",
890 (unsigned long) (ltab.limit - ltab.base),
891 ltab.limit->name,
fdcf7d43 892 (unsigned long) ltab.limit->addr));
252b5132
RH
893 ++ltab.limit;
894 }
895
ef368dac 896 /* Copy in function symbols. */
252b5132
RH
897 memcpy (ltab.limit, symtab.base, symtab.len * sizeof (Sym));
898 ltab.limit += symtab.len;
899
900 if ((unsigned int) (ltab.limit - ltab.base) != ltab.len)
901 {
902 fprintf (stderr,
903 _("%s: somebody miscounted: ltab.len=%d instead of %ld\n"),
904 whoami, ltab.len, (long) (ltab.limit - ltab.base));
905 done (1);
906 }
907
ef368dac 908 /* Finalize ltab and make it symbol table. */
252b5132
RH
909 symtab_finalize (&ltab);
910 free (symtab.base);
911 symtab = ltab;
252b5132 912}
This page took 0.74628 seconds and 4 git commands to generate.