* alpha.c (alpha_Instruction): Don't use.
[deliverable/binutils-gdb.git] / gprof / corefile.c
CommitLineData
ef368dac
NC
1/* corefile.c
2
ec0806ec 3 Copyright 2000, 2001, 2002 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
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA. */
21\f
252b5132
RH
22#include "libiberty.h"
23#include "gprof.h"
6d9c411a
AM
24#include "search_list.h"
25#include "source.h"
252b5132 26#include "symtab.h"
6d9c411a 27#include "corefile.h"
252b5132
RH
28
29bfd *core_bfd;
30int core_num_syms;
31asymbol **core_syms;
32asection *core_text_sect;
33PTR core_text_space;
34
35int min_insn_size;
36int offset_to_code;
37
38/* For mapping symbols to specific .o files during file ordering. */
ef368dac
NC
39struct function_map
40{
252b5132
RH
41 char *function_name;
42 char *file_name;
43};
44
45struct function_map *symbol_map;
46unsigned int symbol_map_count;
47
ef368dac 48extern void i386_find_call PARAMS ((Sym *, bfd_vma, bfd_vma));
252b5132 49extern void alpha_find_call PARAMS ((Sym *, bfd_vma, bfd_vma));
ef368dac 50extern void vax_find_call PARAMS ((Sym *, bfd_vma, bfd_vma));
252b5132
RH
51extern void tahoe_find_call PARAMS ((Sym *, bfd_vma, bfd_vma));
52extern void sparc_find_call PARAMS ((Sym *, bfd_vma, bfd_vma));
ec0806ec 53extern void mips_find_call PARAMS ((Sym *, bfd_vma, bfd_vma));
252b5132
RH
54
55static void
56DEFUN (read_function_mappings, (filename), const char *filename)
57{
58 FILE *file = fopen (filename, "r");
59 char dummy[1024];
60 int count = 0;
61
62 if (!file)
63 {
64 fprintf (stderr, _("%s: could not open %s.\n"), whoami, filename);
65 done (1);
66 }
67
68 /* First parse the mapping file so we know how big we need to
69 make our tables. We also do some sanity checks at this
70 time. */
71 while (!feof (file))
72 {
73 int matches;
74
75 matches = fscanf (file, "%[^\n:]", dummy);
76 if (!matches)
77 {
78 fprintf (stderr, _("%s: unable to parse mapping file %s.\n"),
79 whoami, filename);
80 done (1);
81 }
82
83 /* Just skip messages about files with no symbols. */
84 if (!strncmp (dummy, "No symbols in ", 14))
85 {
86 fscanf (file, "\n");
87 continue;
88 }
89
90 /* Don't care what else is on this line at this point. */
91 fscanf (file, "%[^\n]\n", dummy);
92 count++;
93 }
94
95 /* Now we know how big we need to make our table. */
96 symbol_map = ((struct function_map *)
97 xmalloc (count * sizeof (struct function_map)));
98
99 /* Rewind the input file so we can read it again. */
100 rewind (file);
101
102 /* Read each entry and put it into the table. */
103 count = 0;
104 while (!feof (file))
105 {
106 int matches;
107 char *tmp;
108
109 matches = fscanf (file, "%[^\n:]", dummy);
110 if (!matches)
111 {
112 fprintf (stderr, _("%s: unable to parse mapping file %s.\n"),
113 whoami, filename);
114 done (1);
115 }
116
117 /* Just skip messages about files with no symbols. */
118 if (!strncmp (dummy, "No symbols in ", 14))
119 {
120 fscanf (file, "\n");
121 continue;
122 }
123
124 /* dummy has the filename, go ahead and copy it. */
125 symbol_map[count].file_name = xmalloc (strlen (dummy) + 1);
126 strcpy (symbol_map[count].file_name, dummy);
127
128 /* Now we need the function name. */
129 fscanf (file, "%[^\n]\n", dummy);
130 tmp = strrchr (dummy, ' ') + 1;
131 symbol_map[count].function_name = xmalloc (strlen (tmp) + 1);
132 strcpy (symbol_map[count].function_name, tmp);
133 count++;
134 }
135
136 /* Record the size of the map table for future reference. */
137 symbol_map_count = count;
138}
139
ef368dac 140
252b5132
RH
141void
142DEFUN (core_init, (a_out_name), const char *a_out_name)
143{
144 core_bfd = bfd_openr (a_out_name, 0);
145
146 if (!core_bfd)
147 {
148 perror (a_out_name);
149 done (1);
150 }
151
152 if (!bfd_check_format (core_bfd, bfd_object))
153 {
154 fprintf (stderr, _("%s: %s: not in a.out format\n"), whoami, a_out_name);
155 done (1);
156 }
157
ef368dac 158 /* Get core's text section. */
252b5132
RH
159 core_text_sect = bfd_get_section_by_name (core_bfd, ".text");
160 if (!core_text_sect)
161 {
162 core_text_sect = bfd_get_section_by_name (core_bfd, "$CODE$");
163 if (!core_text_sect)
164 {
165 fprintf (stderr, _("%s: can't find .text section in %s\n"),
166 whoami, a_out_name);
167 done (1);
168 }
169 }
170
ef368dac 171 /* Read core's symbol table. */
252b5132 172
ef368dac 173 /* This will probably give us more than we need, but that's ok. */
252b5132
RH
174 core_num_syms = bfd_get_symtab_upper_bound (core_bfd);
175 if (core_num_syms < 0)
176 {
177 fprintf (stderr, "%s: %s: %s\n", whoami, a_out_name,
178 bfd_errmsg (bfd_get_error ()));
179 done (1);
180 }
181
182 core_syms = (asymbol **) xmalloc (core_num_syms);
183 core_num_syms = bfd_canonicalize_symtab (core_bfd, core_syms);
0eee5820 184
252b5132
RH
185 if (core_num_syms < 0)
186 {
187 fprintf (stderr, "%s: %s: %s\n", whoami, a_out_name,
188 bfd_errmsg (bfd_get_error ()));
189 done (1);
190 }
191
192 min_insn_size = 1;
193 offset_to_code = 0;
194
195 switch (bfd_get_arch (core_bfd))
196 {
197 case bfd_arch_vax:
198 case bfd_arch_tahoe:
199 offset_to_code = 2;
200 break;
201
202 case bfd_arch_alpha:
203 min_insn_size = 4;
204 break;
205
206 default:
207 break;
208 }
209
210 if (function_mapping_file)
211 read_function_mappings (function_mapping_file);
212}
213
ef368dac 214/* Read in the text space of an a.out file. */
252b5132 215
252b5132
RH
216void
217DEFUN (core_get_text_space, (core_bfd), bfd * core_bfd)
218{
219 core_text_space = (PTR) malloc (core_text_sect->_raw_size);
220
221 if (!core_text_space)
222 {
fdcf7d43
ILT
223 fprintf (stderr, _("%s: ran out room for %lu bytes of text space\n"),
224 whoami, (unsigned long) core_text_sect->_raw_size);
252b5132
RH
225 done (1);
226 }
0eee5820 227
252b5132
RH
228 if (!bfd_get_section_contents (core_bfd, core_text_sect, core_text_space,
229 0, core_text_sect->_raw_size))
230 {
231 bfd_perror ("bfd_get_section_contents");
232 free (core_text_space);
233 core_text_space = 0;
234 }
0eee5820 235
252b5132 236 if (!core_text_space)
ef368dac 237 fprintf (stderr, _("%s: can't do -c\n"), whoami);
252b5132
RH
238}
239
240
241void
242DEFUN (find_call, (parent, p_lowpc, p_highpc),
243 Sym * parent AND bfd_vma p_lowpc AND bfd_vma p_highpc)
244{
245 switch (bfd_get_arch (core_bfd))
246 {
247 case bfd_arch_i386:
248 i386_find_call (parent, p_lowpc, p_highpc);
249 break;
250
251 case bfd_arch_alpha:
252 alpha_find_call (parent, p_lowpc, p_highpc);
253 break;
254
255 case bfd_arch_vax:
256 vax_find_call (parent, p_lowpc, p_highpc);
257 break;
258
259 case bfd_arch_sparc:
260 sparc_find_call (parent, p_lowpc, p_highpc);
261 break;
262
263 case bfd_arch_tahoe:
264 tahoe_find_call (parent, p_lowpc, p_highpc);
265 break;
266
ec0806ec
JT
267 case bfd_arch_mips:
268 mips_find_call (parent, p_lowpc, p_highpc);
269 break;
270
252b5132
RH
271 default:
272 fprintf (stderr, _("%s: -c not supported on architecture %s\n"),
273 whoami, bfd_printable_name(core_bfd));
274
275 /* Don't give the error more than once. */
276 ignore_direct_calls = FALSE;
277 }
278}
279
ef368dac 280/* Return class of symbol SYM. The returned class can be any of:
0eee5820
AM
281 0 -> symbol is not interesting to us
282 'T' -> symbol is a global name
283 't' -> symbol is a local (static) name. */
ef368dac 284
252b5132
RH
285static int
286DEFUN (core_sym_class, (sym), asymbol * sym)
287{
288 symbol_info syminfo;
289 const char *name;
290 char sym_prefix;
291 int i;
292
293 if (sym->section == NULL || (sym->flags & BSF_DEBUGGING) != 0)
ef368dac 294 return 0;
252b5132 295
ef368dac
NC
296 /* Must be a text symbol, and static text symbols
297 don't qualify if ignore_static_funcs set. */
252b5132
RH
298 if (ignore_static_funcs && (sym->flags & BSF_LOCAL))
299 {
300 DBG (AOUTDEBUG, printf ("[core_sym_class] %s: not a function\n",
301 sym->name));
302 return 0;
303 }
304
305 bfd_get_symbol_info (core_bfd, sym, &syminfo);
306 i = syminfo.type;
307
308 if (i == 'T')
ef368dac 309 return i; /* It's a global symbol. */
252b5132
RH
310
311 if (i == 'W')
ef368dac
NC
312 /* Treat weak symbols as text symbols. FIXME: a weak symbol may
313 also be a data symbol. */
314 return 'T';
252b5132
RH
315
316 if (i != 't')
317 {
ef368dac 318 /* Not a static text symbol. */
252b5132
RH
319 DBG (AOUTDEBUG, printf ("[core_sym_class] %s is of class %c\n",
320 sym->name, i));
321 return 0;
322 }
323
ef368dac 324 /* Do some more filtering on static function-names. */
252b5132 325 if (ignore_static_funcs)
ef368dac
NC
326 return 0;
327
328 /* Can't zero-length name or funny characters in name, where
329 `funny' includes: `.' (.o file names) and `$' (Pascal labels). */
252b5132 330 if (!sym->name || sym->name[0] == '\0')
ef368dac 331 return 0;
252b5132
RH
332
333 for (name = sym->name; *name; ++name)
334 {
335 if (*name == '.' || *name == '$')
ef368dac
NC
336 return 0;
337 }
0eee5820 338
ef368dac
NC
339 /* On systems where the C compiler adds an underscore to all
340 names, static names without underscores seem usually to be
341 labels in hand written assembler in the library. We don't want
342 these names. This is certainly necessary on a Sparc running
343 SunOS 4.1 (try profiling a program that does a lot of
344 division). I don't know whether it has harmful side effects on
345 other systems. Perhaps it should be made configurable. */
252b5132 346 sym_prefix = bfd_get_symbol_leading_char (core_bfd);
0eee5820 347
252b5132 348 if ((sym_prefix && sym_prefix != sym->name[0])
ef368dac 349 /* GCC may add special symbols to help gdb figure out the file
0eee5820 350 language. We want to ignore these, since sometimes they mask
ef368dac 351 the real function. (dj@ctron) */
252b5132
RH
352 || !strncmp (sym->name, "__gnu_compiled", 14)
353 || !strncmp (sym->name, "___gnu_compiled", 15))
354 {
355 return 0;
356 }
357
ef368dac
NC
358 /* If the object file supports marking of function symbols, then
359 we can zap anything that doesn't have BSF_FUNCTION set. */
252b5132
RH
360 if (ignore_non_functions && (sym->flags & BSF_FUNCTION) == 0)
361 return 0;
362
ef368dac 363 return 't'; /* It's a static text symbol. */
252b5132
RH
364}
365
ef368dac 366/* Get whatever source info we can get regarding address ADDR. */
252b5132 367
252b5132
RH
368static bool
369DEFUN (get_src_info, (addr, filename, name, line_num),
370 bfd_vma addr AND const char **filename AND const char **name
371 AND int *line_num)
372{
373 const char *fname = 0, *func_name = 0;
374 int l = 0;
375
376 if (bfd_find_nearest_line (core_bfd, core_text_sect, core_syms,
377 addr - core_text_sect->vma,
378 &fname, &func_name, (unsigned int *) &l)
379 && fname && func_name && l)
380 {
381 DBG (AOUTDEBUG, printf ("[get_src_info] 0x%lx -> %s:%d (%s)\n",
fdcf7d43 382 (unsigned long) addr, fname, l, func_name));
252b5132
RH
383 *filename = fname;
384 *name = func_name;
385 *line_num = l;
386 return TRUE;
387 }
388 else
389 {
390 DBG (AOUTDEBUG, printf ("[get_src_info] no info for 0x%lx (%s:%d,%s)\n",
391 (long) addr, fname ? fname : "<unknown>", l,
392 func_name ? func_name : "<unknown>"));
393 return FALSE;
394 }
395}
396
ef368dac
NC
397/* Read in symbol table from core.
398 One symbol per function is entered. */
252b5132 399
252b5132 400void
8622e41b
ILT
401core_create_function_syms (core_bfd)
402 bfd *core_bfd ATTRIBUTE_UNUSED;
252b5132
RH
403{
404 bfd_vma min_vma = ~0, max_vma = 0;
405 int class;
406 long i, found, skip;
407 unsigned int j;
408
ef368dac 409 /* Pass 1 - determine upper bound on number of function names. */
252b5132 410 symtab.len = 0;
0eee5820 411
252b5132
RH
412 for (i = 0; i < core_num_syms; ++i)
413 {
414 if (!core_sym_class (core_syms[i]))
ef368dac 415 continue;
252b5132
RH
416
417 /* This should be replaced with a binary search or hashed
0eee5820 418 search. Gross.
252b5132
RH
419
420 Don't create a symtab entry for a function that has
421 a mapping to a file, unless it's the first function
422 in the file. */
423 skip = 0;
424 for (j = 0; j < symbol_map_count; j++)
425 if (!strcmp (core_syms[i]->name, symbol_map[j].function_name))
426 {
427 if (j > 0 && ! strcmp (symbol_map [j].file_name,
0eee5820 428 symbol_map [j - 1].file_name))
252b5132
RH
429 skip = 1;
430 break;
431 }
0eee5820 432
252b5132 433 if (!skip)
0eee5820 434 ++symtab.len;
252b5132
RH
435 }
436
437 if (symtab.len == 0)
438 {
439 fprintf (stderr, _("%s: file `%s' has no symbols\n"), whoami, a_out_name);
440 done (1);
441 }
442
ef368dac 443 /* The "+ 2" is for the sentinels. */
252b5132
RH
444 symtab.base = (Sym *) xmalloc ((symtab.len + 2) * sizeof (Sym));
445
ef368dac 446 /* Pass 2 - create symbols. */
252b5132 447 symtab.limit = symtab.base;
0eee5820 448
252b5132
RH
449 for (i = 0; i < core_num_syms; ++i)
450 {
451 class = core_sym_class (core_syms[i]);
0eee5820 452
252b5132
RH
453 if (!class)
454 {
455 DBG (AOUTDEBUG,
456 printf ("[core_create_function_syms] rejecting: 0x%lx %s\n",
fdcf7d43
ILT
457 (unsigned long) core_syms[i]->value,
458 core_syms[i]->name));
252b5132
RH
459 continue;
460 }
0eee5820 461
252b5132
RH
462 /* This should be replaced with a binary search or hashed
463 search. Gross. */
252b5132
RH
464 skip = 0;
465 found = 0;
0eee5820 466
252b5132
RH
467 for (j = 0; j < symbol_map_count; j++)
468 if (!strcmp (core_syms[i]->name, symbol_map[j].function_name))
469 {
470 if (j > 0 && ! strcmp (symbol_map [j].file_name,
0eee5820 471 symbol_map [j - 1].file_name))
252b5132
RH
472 skip = 1;
473 else
474 found = j;
475 break;
476 }
477
478 if (skip)
479 continue;
480
481 sym_init (symtab.limit);
482
ef368dac 483 /* Symbol offsets are always section-relative. */
252b5132 484 symtab.limit->addr = core_syms[i]->value + core_syms[i]->section->vma;
0eee5820 485
252b5132
RH
486 if (symbol_map_count
487 && !strcmp (core_syms[i]->name, symbol_map[found].function_name))
488 {
489 symtab.limit->name = symbol_map[found].file_name;
490 symtab.limit->mapped = 1;
491 }
492 else
493 {
494 symtab.limit->name = core_syms[i]->name;
495 symtab.limit->mapped = 0;
496 }
497
ef368dac 498 /* Lookup filename and line number, if we can. */
252b5132
RH
499 {
500 const char *filename, *func_name;
0eee5820 501
252b5132
RH
502 if (get_src_info (symtab.limit->addr, &filename, &func_name,
503 &symtab.limit->line_num))
504 {
505 symtab.limit->file = source_file_lookup_path (filename);
506
507 /* FIXME: Checking __osf__ here does not work with a cross
0eee5820 508 gprof. */
252b5132 509#ifdef __osf__
ef368dac
NC
510 /* Suppress symbols that are not function names. This is
511 useful to suppress code-labels and aliases.
0eee5820 512
ef368dac
NC
513 This is known to be useful under DEC's OSF/1. Under SunOS 4.x,
514 labels do not appear in the symbol table info, so this isn't
515 necessary. */
252b5132
RH
516
517 if (strcmp (symtab.limit->name, func_name) != 0)
518 {
ef368dac
NC
519 /* The symbol's address maps to a different name, so
520 it can't be a function-entry point. This happens
521 for labels, for example. */
252b5132
RH
522 DBG (AOUTDEBUG,
523 printf ("[core_create_function_syms: rej %s (maps to %s)\n",
524 symtab.limit->name, func_name));
525 continue;
526 }
527#endif
528 }
529 }
530
531 symtab.limit->is_func = TRUE;
532 symtab.limit->is_bb_head = TRUE;
0eee5820 533
252b5132 534 if (class == 't')
ef368dac 535 symtab.limit->is_static = TRUE;
252b5132
RH
536
537 min_vma = MIN (symtab.limit->addr, min_vma);
538 max_vma = MAX (symtab.limit->addr, max_vma);
539
ef368dac 540 /* If we see "main" without an initial '_', we assume names
0eee5820 541 are *not* prefixed by '_'. */
252b5132
RH
542 if (symtab.limit->name[0] == 'm' && discard_underscores
543 && strcmp (symtab.limit->name, "main") == 0)
ef368dac 544 discard_underscores = 0;
252b5132
RH
545
546 DBG (AOUTDEBUG, printf ("[core_create_function_syms] %ld %s 0x%lx\n",
547 (long) (symtab.limit - symtab.base),
fdcf7d43
ILT
548 symtab.limit->name,
549 (unsigned long) symtab.limit->addr));
252b5132
RH
550 ++symtab.limit;
551 }
552
ef368dac 553 /* Create sentinels. */
252b5132
RH
554 sym_init (symtab.limit);
555 symtab.limit->name = "<locore>";
556 symtab.limit->addr = 0;
557 symtab.limit->end_addr = min_vma - 1;
558 ++symtab.limit;
559
560 sym_init (symtab.limit);
561 symtab.limit->name = "<hicore>";
562 symtab.limit->addr = max_vma + 1;
563 symtab.limit->end_addr = ~0;
564 ++symtab.limit;
565
566 symtab.len = symtab.limit - symtab.base;
567 symtab_finalize (&symtab);
568}
569
ef368dac
NC
570/* Read in symbol table from core.
571 One symbol per line of source code is entered. */
252b5132 572
252b5132
RH
573void
574DEFUN (core_create_line_syms, (core_bfd), bfd * core_bfd)
575{
576 char *prev_name, *prev_filename;
577 int prev_name_len, prev_filename_len;
578 bfd_vma vma, min_vma = ~0, max_vma = 0;
579 bfd_vma offset;
580 Sym *prev, dummy, *sentinel, *sym;
581 const char *filename;
582 int prev_line_num;
583 Sym_Table ltab;
0eee5820 584
ef368dac
NC
585 /* Create symbols for functions as usual. This is necessary in
586 cases where parts of a program were not compiled with -g. For
587 those parts we still want to get info at the function level. */
252b5132
RH
588 core_create_function_syms (core_bfd);
589
ef368dac
NC
590 /* Pass 1 - counter number of symbols. */
591
592 /* To find all line information, walk through all possible
593 text-space addresses (one by one!) and get the debugging
594 info for each address. When the debugging info changes,
595 it is time to create a new symbol.
0eee5820 596
ef368dac
NC
597 Of course, this is rather slow and it would be better if
598 bfd would provide an iterator for enumerating all line infos. */
252b5132
RH
599 prev_name_len = PATH_MAX;
600 prev_filename_len = PATH_MAX;
601 prev_name = xmalloc (prev_name_len);
602 prev_filename = xmalloc (prev_filename_len);
603 ltab.len = 0;
604 prev_line_num = 0;
0eee5820 605
252b5132
RH
606 for (offset = 0; offset < core_text_sect->_raw_size; offset += min_insn_size)
607 {
608 int len;
609
610 vma = core_text_sect->vma + offset;
0eee5820 611
252b5132
RH
612 if (!get_src_info (vma, &filename, &dummy.name, &dummy.line_num)
613 || (prev_line_num == dummy.line_num
614 && prev_name != NULL
615 && strcmp (prev_name, dummy.name) == 0
616 && strcmp (prev_filename, filename) == 0))
ef368dac 617 continue;
252b5132
RH
618
619 ++ltab.len;
620 prev_line_num = dummy.line_num;
621
622 len = strlen (dummy.name);
623 if (len >= prev_name_len)
624 {
625 prev_name_len = len + 1024;
626 free (prev_name);
627 prev_name = xmalloc (prev_name_len);
628 }
0eee5820 629
252b5132 630 strcpy (prev_name, dummy.name);
252b5132 631 len = strlen (filename);
0eee5820 632
252b5132
RH
633 if (len >= prev_filename_len)
634 {
635 prev_filename_len = len + 1024;
636 free (prev_filename);
637 prev_filename = xmalloc (prev_filename_len);
638 }
0eee5820 639
252b5132
RH
640 strcpy (prev_filename, filename);
641
642 min_vma = MIN (vma, min_vma);
643 max_vma = MAX (vma, max_vma);
644 }
645
646 free (prev_name);
647 free (prev_filename);
648
ef368dac 649 /* Make room for function symbols, too. */
252b5132
RH
650 ltab.len += symtab.len;
651 ltab.base = (Sym *) xmalloc (ltab.len * sizeof (Sym));
652 ltab.limit = ltab.base;
653
ef368dac 654 /* Pass 2 - create symbols. */
252b5132
RH
655
656 /* We now set is_static as we go along, rather than by running
657 through the symbol table at the end.
658
659 The old way called symtab_finalize before the is_static pass,
660 causing a problem since symtab_finalize uses is_static as part of
661 its address conflict resolution algorithm. Since global symbols
662 were prefered over static symbols, and all line symbols were
663 global at that point, static function names that conflicted with
664 their own line numbers (static, but labeled as global) were
665 rejected in favor of the line num.
666
667 This was not the desired functionality. We always want to keep
668 our function symbols and discard any conflicting line symbols.
669 Perhaps symtab_finalize should be modified to make this
670 distinction as well, but the current fix works and the code is a
671 lot cleaner now. */
252b5132 672 prev = 0;
0eee5820 673
252b5132
RH
674 for (offset = 0; offset < core_text_sect->_raw_size; offset += min_insn_size)
675 {
676 sym_init (ltab.limit);
0eee5820 677
252b5132
RH
678 if (!get_src_info (core_text_sect->vma + offset, &filename,
679 &ltab.limit->name, &ltab.limit->line_num)
680 || (prev && prev->line_num == ltab.limit->line_num
681 && strcmp (prev->name, ltab.limit->name) == 0
682 && strcmp (prev->file->name, filename) == 0))
ef368dac 683 continue;
252b5132 684
ef368dac 685 /* Make name pointer a malloc'ed string. */
252b5132
RH
686 ltab.limit->name = xstrdup (ltab.limit->name);
687 ltab.limit->file = source_file_lookup_path (filename);
688
689 ltab.limit->addr = core_text_sect->vma + offset;
690
691 /* Set is_static based on the enclosing function, using either:
0eee5820
AM
692 1) the previous symbol, if it's from the same function, or
693 2) a symtab lookup. */
252b5132
RH
694 if (prev && ltab.limit->file == prev->file &&
695 strcmp (ltab.limit->name, prev->name) == 0)
696 {
697 ltab.limit->is_static = prev->is_static;
698 }
699 else
700 {
701 sym = sym_lookup(&symtab, ltab.limit->addr);
702 ltab.limit->is_static = sym->is_static;
703 }
704
705 prev = ltab.limit;
706
ef368dac 707 /* If we see "main" without an initial '_', we assume names
0eee5820 708 are *not* prefixed by '_'. */
252b5132
RH
709 if (ltab.limit->name[0] == 'm' && discard_underscores
710 && strcmp (ltab.limit->name, "main") == 0)
ef368dac 711 discard_underscores = 0;
252b5132 712
4a607dcc
ILT
713 DBG (AOUTDEBUG, printf ("[core_create_line_syms] %lu %s 0x%lx\n",
714 (unsigned long) (ltab.limit - ltab.base),
715 ltab.limit->name,
fdcf7d43 716 (unsigned long) ltab.limit->addr));
252b5132
RH
717 ++ltab.limit;
718 }
719
ef368dac 720 /* Update sentinels. */
252b5132 721 sentinel = sym_lookup (&symtab, 0);
0eee5820 722
252b5132
RH
723 if (strcmp (sentinel->name, "<locore>") == 0
724 && min_vma <= sentinel->end_addr)
ef368dac 725 sentinel->end_addr = min_vma - 1;
252b5132
RH
726
727 sentinel = sym_lookup (&symtab, ~0);
0eee5820 728
252b5132 729 if (strcmp (sentinel->name, "<hicore>") == 0 && max_vma >= sentinel->addr)
ef368dac 730 sentinel->addr = max_vma + 1;
252b5132 731
ef368dac 732 /* Copy in function symbols. */
252b5132
RH
733 memcpy (ltab.limit, symtab.base, symtab.len * sizeof (Sym));
734 ltab.limit += symtab.len;
735
736 if ((unsigned int) (ltab.limit - ltab.base) != ltab.len)
737 {
738 fprintf (stderr,
739 _("%s: somebody miscounted: ltab.len=%d instead of %ld\n"),
740 whoami, ltab.len, (long) (ltab.limit - ltab.base));
741 done (1);
742 }
743
ef368dac 744 /* Finalize ltab and make it symbol table. */
252b5132
RH
745 symtab_finalize (&ltab);
746 free (symtab.base);
747 symtab = ltab;
252b5132 748}
This page took 0.128409 seconds and 4 git commands to generate.