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