Relocate symbols using an array of section_offsets, rather than a
[binutils-gdb.git] / gdb / xcoffread.c
1 /* Read AIXcoff symbol tables and convert to internal format, for GDB.
2 Copyright (C) 1986-1991 Free Software Foundation, Inc.
3 Derived from coffread.c, dbxread.c, and a lot of hacking.
4 Contributed by IBM Corporation.
5
6 This file is part of GDB.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
21
22 #include "defs.h"
23 #include "bfd.h"
24
25 #ifdef IBM6000_HOST
26 /* Native only: Need struct tbtable in <sys/debug.h>. */
27
28 /* AIX COFF names have a preceeding dot `.' */
29 #define NAMES_HAVE_DOT 1
30
31 #include <sys/types.h>
32 #include <fcntl.h>
33 #include <ctype.h>
34
35 #include "obstack.h"
36 #include <sys/param.h>
37 #ifndef NO_SYS_FILE
38 #include <sys/file.h>
39 #endif
40 #include <sys/stat.h>
41 #include <sys/debug.h>
42
43 #include "symtab.h"
44 #include "gdbtypes.h"
45 #include "symfile.h"
46 #include "objfiles.h"
47 #include "buildsym.h"
48 #include "gdb-stabs.h"
49
50 #include "coff/internal.h" /* FIXME, internal data from BFD */
51 #include "libcoff.h" /* FIXME, internal data from BFD */
52 #include "coff/rs6000.h" /* FIXME, raw file-format guts of xcoff */
53
54
55 /* Define this if you want gdb use the old xcoff symbol processing. This
56 way it won't use common `define_symbol()' function and Sun dbx stab
57 string grammar. And likely it won't be able to do G++ debugging. */
58
59 /* #define NO_DEFINE_SYMBOL 1 */
60
61 /* Define this if you want gdb to ignore typdef stabs. This was needed for
62 one of Transarc, to reduce the size of the symbol table. Types won't be
63 recognized, but tag names will be. */
64
65 /* #define NO_TYPEDEFS 1 */
66
67 /* Simplified internal version of coff symbol table information */
68
69 struct coff_symbol {
70 char *c_name;
71 int c_symnum; /* symbol number of this entry */
72 int c_nsyms; /* 0 if syment only, 1 if syment + auxent */
73 long c_value;
74 int c_sclass;
75 int c_secnum;
76 unsigned int c_type;
77 };
78
79 /* The COFF line table, in raw form. */
80 static char *linetab = NULL; /* Its actual contents */
81 static long linetab_offset; /* Its offset in the file */
82 static unsigned long linetab_size; /* Its size */
83
84 /* last function's saved coff symbol `cs' */
85
86 static struct coff_symbol fcn_cs_saved;
87
88 static bfd *symfile_bfd;
89
90 /* Core address of start and end of text of current source file.
91 This is calculated from the first function seen after a C_FILE
92 symbol. */
93
94
95 static CORE_ADDR cur_src_end_addr;
96
97 /* Core address of the end of the first object file. */
98
99 static CORE_ADDR first_object_file_end;
100
101 /* pointer to the string table */
102 static char *strtbl;
103
104 /* length of the string table */
105 static int strtbl_len;
106
107 /* pointer to debug section */
108 static char *debugsec;
109
110 /* pointer to the a.out symbol table */
111 static char *symtbl;
112
113 /* initial symbol-table-debug-string vector length */
114
115 #define INITIAL_STABVECTOR_LENGTH 40
116
117 struct pending_stabs *global_stabs;
118
119
120 /* Nonzero if within a function (so symbols should be local,
121 if nothing says specifically). */
122
123 int within_function;
124
125 /* Local variables that hold the shift and mask values for the
126 COFF file that we are currently reading. These come back to us
127 from BFD, and are referenced by their macro names, as well as
128 internally to the BTYPE, ISPTR, ISFCN, ISARY, ISTAG, and DECREF
129 macros from ../internalcoff.h . */
130
131 static unsigned local_n_btshft;
132 static unsigned local_n_tmask;
133
134 #undef N_BTSHFT
135 #define N_BTSHFT local_n_btshft
136 #undef N_TMASK
137 #define N_TMASK local_n_tmask
138
139 /* Local variables that hold the sizes in the file of various COFF structures.
140 (We only need to know this to read them from the file -- BFD will then
141 translate the data in them, into `internal_xxx' structs in the right
142 byte order, alignment, etc.) */
143
144 static unsigned local_symesz;
145
146
147 /* coff_symfile_init()
148 is the coff-specific initialization routine for reading symbols.
149 It is passed a struct sym_fns which contains, among other things,
150 the BFD for the file whose symbols are being read, and a slot for
151 a pointer to "private data" which we fill with cookies and other
152 treats for coff_symfile_read().
153
154 We will only be called if this is a COFF or COFF-like file.
155 BFD handles figuring out the format of the file, and code in symtab.c
156 uses BFD's determination to vector to us.
157
158 The ultimate result is a new symtab (or, FIXME, eventually a psymtab). */
159
160 struct coff_symfile_info {
161 file_ptr min_lineno_offset; /* Where in file lowest line#s are */
162 file_ptr max_lineno_offset; /* 1+last byte of line#s in file */
163 };
164
165
166 static void
167 enter_line_range PARAMS ((struct subfile *, unsigned, unsigned,
168 CORE_ADDR, CORE_ADDR, unsigned *));
169
170 static void
171 free_debugsection PARAMS ((void));
172
173 static int
174 init_debugsection PARAMS ((bfd *));
175
176 static int
177 init_stringtab PARAMS ((bfd *, long, struct objfile *));
178
179 static void
180 aixcoff_symfile_init PARAMS ((struct objfile *));
181
182 static void
183 aixcoff_new_init PARAMS ((struct objfile *));
184
185 static void
186 aixcoff_symfile_read PARAMS ((struct objfile *, struct section_offset *, int));
187
188 static void
189 aixcoff_symfile_finish PARAMS ((struct objfile *));
190
191 static struct section_offset *
192 aixcoff_symfile_offsets PARAMS ((struct objfile *, CORE_ADDR));
193
194 static int
195 init_lineno PARAMS ((bfd *, long, int));
196
197 static void
198 find_linenos PARAMS ((bfd *, sec_ptr, PTR));
199
200 static int
201 read_symbol_lineno PARAMS ((char *, int));
202
203 static int
204 read_symbol_nvalue PARAMS ((char *, int));
205
206 static struct symbol *
207 process_xcoff_symbol PARAMS ((struct coff_symbol *, struct objfile *));
208
209 static void
210 read_xcoff_symtab PARAMS ((struct objfile *, int));
211
212 static void
213 add_stab_to_list PARAMS ((char *, struct pending_stabs **));
214
215 static void
216 sort_syms PARAMS ((void));
217
218 static int
219 compare_symbols PARAMS ((const void *, const void *));
220
221 /* Call sort_syms to sort alphabetically
222 the symbols of each block of each symtab. */
223
224 static int
225 compare_symbols (s1p, s2p)
226 const PTR s1p;
227 const PTR s2p;
228 {
229 /* Names that are less should come first. */
230 register struct symbol **s1 = (struct symbol **) s1p;
231 register struct symbol **s2 = (struct symbol **) s2p;
232 register int namediff = strcmp (SYMBOL_NAME (*s1), SYMBOL_NAME (*s2));
233 if (namediff != 0)
234 return namediff;
235
236 /* For symbols of the same name, registers should come first. */
237 return ((SYMBOL_CLASS (*s2) == LOC_REGISTER)
238 - (SYMBOL_CLASS (*s1) == LOC_REGISTER));
239 }
240
241
242 /* Sort a vector of symbols by their value. */
243
244 static void
245 sort_syms ()
246 {
247 register struct symtab *s;
248 register struct objfile *objfile;
249 register int i, nbl;
250 register struct blockvector *bv;
251 register struct block *b;
252
253 for (objfile = object_files; objfile != NULL; objfile = objfile -> next)
254 {
255 for (s = objfile -> symtabs; s != NULL; s = s -> next)
256 {
257 bv = BLOCKVECTOR (s);
258 nbl = BLOCKVECTOR_NBLOCKS (bv);
259 for (i = 0; i < nbl; i++)
260 {
261 b = BLOCKVECTOR_BLOCK (bv, i);
262 if (BLOCK_SHOULD_SORT (b))
263 {
264 qsort (&BLOCK_SYM (b, 0), BLOCK_NSYMS (b),
265 sizeof (struct symbol *), compare_symbols);
266 }
267 }
268 }
269 }
270 }
271
272
273 /* add a given stab string into given stab vector. */
274
275 static void
276 add_stab_to_list (stabname, stabvector)
277 char *stabname;
278 struct pending_stabs **stabvector;
279 {
280 if ( *stabvector == NULL) {
281 *stabvector = (struct pending_stabs *)
282 xmalloc (sizeof (struct pending_stabs) +
283 INITIAL_STABVECTOR_LENGTH * sizeof (char*));
284 (*stabvector)->count = 0;
285 (*stabvector)->length = INITIAL_STABVECTOR_LENGTH;
286 }
287 else if ((*stabvector)->count >= (*stabvector)->length) {
288 (*stabvector)->length += INITIAL_STABVECTOR_LENGTH;
289 *stabvector = (struct pending_stabs *)
290 xrealloc ((char *) *stabvector, sizeof (struct pending_stabs) +
291 (*stabvector)->length * sizeof (char*));
292 }
293 (*stabvector)->stab [(*stabvector)->count++] = stabname;
294 }
295
296
297 #if 0
298 /* for all the stabs in a given stab vector, build appropriate types
299 and fix their symbols in given symbol vector. */
300
301 void
302 patch_block_stabs (symbols, stabs)
303 struct pending *symbols;
304 struct pending_stabs *stabs;
305 {
306 int ii;
307
308 if (!stabs)
309 return;
310
311 /* for all the stab entries, find their corresponding symbols and
312 patch their types! */
313
314 for (ii=0; ii < stabs->count; ++ii) {
315 char *name = stabs->stab[ii];
316 char *pp = (char*) index (name, ':');
317 struct symbol *sym = find_symbol_in_list (symbols, name, pp-name);
318 if (!sym) {
319 ;
320 /* printf ("ERROR! stab symbol not found!\n"); */ /* FIXME */
321 /* The above is a false alarm. There are cases the we can have
322 a stab, without its symbol. xlc generates this for the extern
323 definitions in inner blocks. */
324 }
325 else {
326 pp += 2;
327
328 if (*(pp-1) == 'F' || *(pp-1) == 'f')
329 SYMBOL_TYPE (sym) = lookup_function_type (read_type (&pp));
330 else
331 SYMBOL_TYPE (sym) = read_type (&pp, objfile);
332 }
333 }
334 }
335 #endif
336
337
338 /* compare line table entry addresses. */
339
340 static int
341 compare_lte (lte1, lte2)
342 struct linetable_entry *lte1, *lte2;
343 {
344 return lte1->pc - lte2->pc;
345 }
346
347 /* Give a line table with function entries are marked, arrange its functions
348 in assending order and strip off function entry markers and return it in
349 a newly created table. If the old one is good enough, return the old one. */
350
351 static struct linetable *
352 arrange_linetable (oldLineTb)
353 struct linetable *oldLineTb; /* old linetable */
354 {
355 int ii, jj,
356 newline, /* new line count */
357 function_count; /* # of functions */
358
359 struct linetable_entry *fentry; /* function entry vector */
360 int fentry_size; /* # of function entries */
361 struct linetable *newLineTb; /* new line table */
362
363 #define NUM_OF_FUNCTIONS 20
364
365 fentry_size = NUM_OF_FUNCTIONS;
366 fentry = (struct linetable_entry*)
367 malloc (fentry_size * sizeof (struct linetable_entry));
368
369 for (function_count=0, ii=0; ii <oldLineTb->nitems; ++ii) {
370
371 if (oldLineTb->item[ii].line == 0) { /* function entry found. */
372
373 if (function_count >= fentry_size) { /* make sure you have room. */
374 fentry_size *= 2;
375 fentry = (struct linetable_entry*)
376 realloc (fentry, fentry_size * sizeof (struct linetable_entry));
377 }
378 fentry[function_count].line = ii;
379 fentry[function_count].pc = oldLineTb->item[ii].pc;
380 ++function_count;
381 }
382 }
383
384 if (function_count == 0) {
385 free (fentry);
386 return oldLineTb;
387 }
388 else if (function_count > 1)
389 qsort (fentry, function_count, sizeof(struct linetable_entry), compare_lte);
390
391 /* allocate a new line table. */
392 newLineTb = (struct linetable*) malloc (sizeof (struct linetable) +
393 (oldLineTb->nitems - function_count) * sizeof (struct linetable_entry));
394
395 /* if line table does not start with a function beginning, copy up until
396 a function begin. */
397
398 newline = 0;
399 if (oldLineTb->item[0].line != 0)
400 for (newline=0;
401 newline < oldLineTb->nitems && oldLineTb->item[newline].line; ++newline)
402 newLineTb->item[newline] = oldLineTb->item[newline];
403
404 /* Now copy function lines one by one. */
405
406 for (ii=0; ii < function_count; ++ii) {
407 for (jj = fentry[ii].line + 1;
408 jj < oldLineTb->nitems && oldLineTb->item[jj].line != 0;
409 ++jj, ++newline)
410 newLineTb->item[newline] = oldLineTb->item[jj];
411 }
412 free (fentry);
413 newLineTb->nitems = oldLineTb->nitems - function_count;
414 return newLineTb;
415 }
416
417
418
419 /* We try to detect the beginning of a compilation unit. That info will
420 be used as an entry in line number recording routines (enter_line_range) */
421
422 static unsigned first_fun_line_offset;
423 static unsigned first_fun_bf;
424
425 #define mark_first_line(OFFSET, SYMNUM) \
426 if (!first_fun_line_offset) { \
427 first_fun_line_offset = OFFSET; \
428 first_fun_bf = SYMNUM; \
429 }
430
431
432 /* include file support: C_BINCL/C_EINCL pairs will be kept in the
433 following `IncludeChain'. At the end of each symtab (end_symtab),
434 we will determine if we should create additional symtab's to
435 represent if (the include files. */
436
437
438 typedef struct _inclTable {
439 char *name; /* include filename */
440 int begin, end; /* offsets to the line table */
441 struct subfile *subfile;
442 unsigned funStartLine; /* start line # of its function */
443 } InclTable;
444
445 #define INITIAL_INCLUDE_TABLE_LENGTH 20
446 static InclTable *inclTable; /* global include table */
447 static int inclIndx; /* last entry to table */
448 static int inclLength; /* table length */
449 static int inclDepth; /* nested include depth */
450
451
452 static void
453 record_include_begin (cs)
454 struct coff_symbol *cs;
455 {
456 /* In aixcoff, we assume include files cannot be nested (not in .c files
457 of course, but in corresponding .s files.) */
458
459 if (inclDepth)
460 fatal ("aix internal: pending include file exists.");
461
462 ++inclDepth;
463
464 /* allocate an include file, or make room for the new entry */
465 if (inclLength == 0) {
466 inclTable = (InclTable*)
467 xmalloc (sizeof (InclTable) * INITIAL_INCLUDE_TABLE_LENGTH);
468 bzero (inclTable, sizeof (InclTable) * INITIAL_INCLUDE_TABLE_LENGTH);
469 inclLength = INITIAL_INCLUDE_TABLE_LENGTH;
470 inclIndx = 0;
471 }
472 else if (inclIndx >= inclLength) {
473 inclLength += INITIAL_INCLUDE_TABLE_LENGTH;
474 inclTable = (InclTable*)
475 xrealloc (inclTable, sizeof (InclTable) * inclLength);
476 bzero (inclTable+inclLength-INITIAL_INCLUDE_TABLE_LENGTH,
477 sizeof (InclTable)*INITIAL_INCLUDE_TABLE_LENGTH);
478 }
479
480 inclTable [inclIndx].name = cs->c_name;
481 inclTable [inclIndx].begin = cs->c_value;
482 }
483
484
485 static void
486 record_include_end (cs)
487 struct coff_symbol *cs;
488 {
489 InclTable *pTbl;
490
491 if (inclDepth == 0)
492 fatal ("aix internal: Mismatch C_BINCL/C_EINCL pair found.");
493
494 pTbl = &inclTable [inclIndx];
495 pTbl->end = cs->c_value;
496
497 --inclDepth;
498 ++inclIndx;
499 }
500
501
502 /* given the start and end addresses of a compilation unit (or a csect, at times)
503 process its lines and create appropriate line vectors. */
504
505 static void
506 process_linenos (start, end)
507 CORE_ADDR start, end;
508 {
509 char *pp;
510 int offset, ii;
511
512 struct subfile main_subfile; /* subfile structure for the main
513 compilation unit. */
514
515 /* in the main source file, any time we see a function entry, we reset
516 this variable to function's absolute starting line number. All the
517 following line numbers in the function are relative to this, and
518 we record absolute line numbers in record_line(). */
519
520 int main_source_baseline = 0;
521
522
523 unsigned *firstLine;
524 CORE_ADDR addr;
525
526 if (!(offset = first_fun_line_offset))
527 goto return_after_cleanup;
528
529 bzero (&main_subfile, sizeof (main_subfile));
530 first_fun_line_offset = 0;
531
532 if (inclIndx == 0)
533 /* All source lines were in the main source file. None in include files. */
534
535 enter_line_range (&main_subfile, offset, 0, start, end,
536 &main_source_baseline);
537
538 /* else, there was source with line numbers in include files */
539 else {
540
541 main_source_baseline = 0;
542 for (ii=0; ii < inclIndx; ++ii) {
543
544 struct subfile *tmpSubfile;
545
546 /* if there is main file source before include file, enter it. */
547 if (offset < inclTable[ii].begin) {
548 enter_line_range
549 (&main_subfile, offset, inclTable[ii].begin - LINESZ, start, 0,
550 &main_source_baseline);
551 }
552
553 /* Have a new subfile for the include file */
554
555 tmpSubfile = inclTable[ii].subfile = (struct subfile*)
556 xmalloc (sizeof (struct subfile));
557
558 bzero (tmpSubfile, sizeof (struct subfile));
559 firstLine = &(inclTable[ii].funStartLine);
560
561 /* enter include file's lines now. */
562 enter_line_range (tmpSubfile, inclTable[ii].begin,
563 inclTable[ii].end, start, 0, firstLine);
564
565 offset = inclTable[ii].end + LINESZ;
566 }
567
568 /* all the include files' line have been processed at this point. Now,
569 enter remaining lines of the main file, if any left. */
570 if (offset < (linetab_offset + linetab_size + 1 - LINESZ)) {
571 enter_line_range (&main_subfile, offset, 0, start, end,
572 &main_source_baseline);
573 }
574 }
575
576 /* Process main file's line numbers. */
577 if (main_subfile.line_vector) {
578 struct linetable *lineTb, *lv;
579
580 lv = main_subfile.line_vector;
581
582 /* Line numbers are not necessarily ordered. xlc compilation will
583 put static function to the end. */
584
585 lineTb = arrange_linetable (lv);
586 if (lv == lineTb) {
587 current_subfile->line_vector = (struct linetable *)
588 xrealloc (lv, (sizeof (struct linetable)
589 + lv->nitems * sizeof (struct linetable_entry)));
590
591 }
592 else {
593 free (lv);
594 current_subfile->line_vector = lineTb;
595 }
596
597 current_subfile->line_vector_length =
598 current_subfile->line_vector->nitems;
599 }
600
601 /* Now, process included files' line numbers. */
602
603 for (ii=0; ii < inclIndx; ++ii) {
604
605 if ( (inclTable[ii].subfile)->line_vector) { /* Useless if!!! FIXMEmgo */
606 struct linetable *lineTb, *lv;
607
608 lv = (inclTable[ii].subfile)->line_vector;
609
610 /* Line numbers are not necessarily ordered. xlc compilation will
611 put static function to the end. */
612
613 lineTb = arrange_linetable (lv);
614
615 push_subfile ();
616
617 /* For the same include file, we might want to have more than one subfile.
618 This happens if we have something like:
619
620 ......
621 #include "foo.h"
622 ......
623 #include "foo.h"
624 ......
625
626 while foo.h including code in it. (stupid but possible)
627 Since start_subfile() looks at the name and uses an existing one if finds,
628 we need to provide a fake name and fool it. */
629
630 /* start_subfile (inclTable[ii].name, (char*)0); */
631 start_subfile (" ?", (char*)0);
632 current_subfile->name =
633 obsavestring (inclTable[ii].name, strlen (inclTable[ii].name),
634 &current_objfile->symbol_obstack);
635
636 if (lv == lineTb) {
637 current_subfile->line_vector = (struct linetable *)
638 xrealloc (lv, (sizeof (struct linetable)
639 + lv->nitems * sizeof (struct linetable_entry)));
640
641 }
642 else {
643 free (lv);
644 current_subfile->line_vector = lineTb;
645 }
646
647 current_subfile->line_vector_length =
648 current_subfile->line_vector->nitems;
649 start_subfile (pop_subfile (), (char*)0);
650 }
651 }
652
653 return_after_cleanup:
654
655 /* We don't want to keep alloc/free'ing the global include file table. */
656 inclIndx = 0;
657
658 /* start with a fresh subfile structure for the next file. */
659 bzero (&main_subfile, sizeof (struct subfile));
660 }
661
662 void
663 aix_process_linenos ()
664 {
665 /* process line numbers and enter them into line vector */
666 process_linenos (last_source_start_addr, cur_src_end_addr);
667 }
668
669
670 /* Enter a given range of lines into the line vector.
671 can be called in the following two ways:
672 enter_line_range (subfile, beginoffset, endoffset, startaddr, 0, firstLine) or
673 enter_line_range (subfile, beginoffset, 0, startaddr, endaddr, firstLine) */
674
675 static void
676 enter_line_range (subfile, beginoffset, endoffset, startaddr, endaddr, firstLine)
677 struct subfile *subfile;
678 unsigned beginoffset, endoffset; /* offsets to line table */
679 CORE_ADDR startaddr, endaddr;
680 unsigned *firstLine;
681 {
682 char *pp, *limit;
683 CORE_ADDR addr;
684
685 /* Do Byte swapping, if needed. FIXME! */
686 #define P_LINENO(PP) (*(unsigned short*)((struct external_lineno*)(PP))->l_lnno)
687 #define P_LINEADDR(PP) (*(long*)((struct external_lineno*)(PP))->l_addr.l_paddr)
688 #define P_LINESYM(PP) (*(long*)((struct external_lineno*)(PP))->l_addr.l_symndx)
689
690 pp = &linetab [beginoffset - linetab_offset];
691 limit = endoffset ? &linetab [endoffset - linetab_offset]
692 : &linetab [linetab_size -1];
693
694 while (pp <= limit) {
695
696 /* find the address this line represents */
697 addr = P_LINENO(pp) ?
698 P_LINEADDR(pp) : read_symbol_nvalue (symtbl, P_LINESYM(pp));
699
700 if (addr < startaddr || (endaddr && addr > endaddr))
701 return;
702
703 if (P_LINENO(pp) == 0) {
704 *firstLine = read_symbol_lineno (symtbl, P_LINESYM(pp));
705 record_line (subfile, 0, addr);
706 --(*firstLine);
707 }
708 else
709 record_line (subfile, *firstLine + P_LINENO(pp), addr);
710
711 pp += LINESZ;
712 }
713 }
714
715 typedef struct {
716 int fsize; /* file size */
717 int fixedparms; /* number of fixed parms */
718 int floatparms; /* number of float parms */
719 unsigned int parminfo; /* parameter info.
720 See /usr/include/sys/debug.h
721 tbtable_ext.parminfo */
722 int framesize; /* function frame size */
723 } TracebackInfo;
724
725
726 /* Given a function symbol, return its traceback information. */
727
728 TracebackInfo *
729 retrieve_tracebackinfo (abfd, textsec, cs)
730 bfd *abfd;
731 sec_ptr textsec;
732 struct coff_symbol *cs;
733 {
734 #define TBTABLE_BUFSIZ 2000
735 #define MIN_TBTABSIZ 50 /* minimum buffer size to hold a
736 traceback table. */
737
738 static TracebackInfo tbInfo;
739 struct tbtable *ptb;
740
741 static char buffer [TBTABLE_BUFSIZ];
742
743 int *pinsn;
744 int bytesread=0; /* total # of bytes read so far */
745 int bufferbytes; /* number of bytes in the buffer */
746
747 int functionstart = cs->c_value - textsec->vma;
748
749 bzero (&tbInfo, sizeof (tbInfo));
750
751 /* keep reading blocks of data from the text section, until finding a zero
752 word and a traceback table. */
753
754 while (
755 bufferbytes = (
756 (TBTABLE_BUFSIZ < (textsec->_raw_size - functionstart - bytesread)) ?
757 TBTABLE_BUFSIZ : (textsec->_raw_size - functionstart - bytesread))
758
759 && bfd_get_section_contents (abfd, textsec, buffer,
760 (file_ptr)(functionstart + bytesread), bufferbytes))
761 {
762 bytesread += bufferbytes;
763 pinsn = (int*) buffer;
764
765 /* if this is the first time we filled the buffer, retrieve function
766 framesize info. */
767
768 if (bytesread == bufferbytes) {
769
770 /* skip over unrelated instructions */
771
772 if (*pinsn == 0x7c0802a6) /* mflr r0 */
773 ++pinsn;
774 if ((*pinsn & 0xfc00003e) == 0x7c000026) /* mfcr Rx */
775 ++pinsn;
776 if ((*pinsn & 0xfc000000) == 0x48000000) /* bl foo, save fprs */
777 ++pinsn;
778 if ((*pinsn & 0xfc1f0000) == 0xbc010000) /* stm Rx, NUM(r1) */
779 ++pinsn;
780
781 do {
782 int tmp = (*pinsn >> 16) & 0xffff;
783
784 if (tmp == 0x9421) { /* stu r1, NUM(r1) */
785 tbInfo.framesize = 0x10000 - (*pinsn & 0xffff);
786 break;
787 }
788 else if ((*pinsn == 0x93e1fffc) || /* st r31,-4(r1) */
789 (tmp == 0x9001)) /* st r0, NUM(r1) */
790 ;
791 /* else, could not find a frame size. */
792 else
793 return NULL;
794
795 } while (++pinsn && *pinsn);
796
797 if (!tbInfo.framesize)
798 return NULL;
799 }
800
801 /* look for a zero word. */
802
803 while (*pinsn && (pinsn < (int*)(buffer + bufferbytes - sizeof(int))))
804 ++pinsn;
805
806 if (pinsn >= (int*)(buffer + bufferbytes))
807 continue;
808
809 if (*pinsn == 0) {
810
811 /* function size is the amount of bytes we have skipped so far. */
812 tbInfo.fsize = bytesread - (buffer + bufferbytes - (char*)pinsn);
813
814 ++pinsn;
815
816 /* if we don't have the whole traceback table in the buffer, re-read
817 the whole thing. */
818
819 if ((char*)pinsn > (buffer + bufferbytes - MIN_TBTABSIZ)) {
820
821 /* In case if we are *very* close to the end of the text section
822 and cannot read properly from that point on, abort by returning
823 NULL.
824 Handle this case more graciously -- FIXME */
825
826 if (!bfd_get_section_contents (
827 abfd, textsec, buffer,
828 (file_ptr)(functionstart +
829 bytesread - (buffer + bufferbytes - (char*)pinsn)),MIN_TBTABSIZ))
830 { printf ("Abnormal return!..\n"); return NULL; }
831
832 ptb = (struct tbtable *)buffer;
833 }
834 else
835 ptb = (struct tbtable *)pinsn;
836
837 tbInfo.fixedparms = ptb->tb.fixedparms;
838 tbInfo.floatparms = ptb->tb.floatparms;
839 tbInfo.parminfo = ptb->tb_ext.parminfo;
840 return &tbInfo;
841 }
842 }
843 return NULL;
844 }
845
846 #if 0
847 /* Given a function symbol, return a pointer to its traceback table. */
848
849 struct tbtable *
850 retrieve_traceback (abfd, textsec, cs, size)
851 bfd *abfd;
852 sec_ptr textsec;
853 struct coff_symbol *cs;
854 int *size; /* return function size */
855 {
856 #define TBTABLE_BUFSIZ 2000
857 #define MIN_TBTABSIZ 50 /* minimum buffer size to hold a
858 traceback table. */
859
860 static char buffer [TBTABLE_BUFSIZ];
861
862 int *pinsn;
863 int bytesread=0; /* total # of bytes read so far */
864 int bufferbytes; /* number of bytes in the buffer */
865
866 int functionstart = cs->c_value - textsec->filepos + textsec->vma;
867 *size = 0;
868
869 /* keep reading blocks of data from the text section, until finding a zero
870 word and a traceback table. */
871
872 while (bfd_get_section_contents (abfd, textsec, buffer,
873 (file_ptr)(functionstart + bytesread),
874 bufferbytes = (
875 (TBTABLE_BUFSIZ < (textsec->size - functionstart - bytesread)) ?
876 TBTABLE_BUFSIZ : (textsec->size - functionstart - bytesread))))
877 {
878 bytesread += bufferbytes;
879 pinsn = (int*) buffer;
880
881 /* look for a zero word. */
882
883 while (*pinsn && (pinsn < (int*)(buffer + bufferbytes - sizeof(int))))
884 ++pinsn;
885
886 if (pinsn >= (int*)(buffer + bufferbytes))
887 continue;
888
889 if (*pinsn == 0) {
890
891 /* function size is the amount of bytes we have skipped so far. */
892 *size = bytesread - (buffer + bufferbytes - pinsn);
893
894 ++pinsn;
895
896 /* if we don't have the whole traceback table in the buffer, re-read
897 the whole thing. */
898
899 if ((char*)pinsn > (buffer + bufferbytes - MIN_TBTABSIZ)) {
900
901 /* In case if we are *very* close to the end of the text section
902 and cannot read properly from that point on, abort for now.
903 Handle this case more graciously -- FIXME */
904
905 if (!bfd_get_section_contents (
906 abfd, textsec, buffer,
907 (file_ptr)(functionstart +
908 bytesread - (buffer + bufferbytes - pinsn)),MIN_TBTABSIZ))
909 /* abort (); */ { printf ("abort!!!\n"); return NULL; }
910
911 return (struct tbtable *)buffer;
912 }
913 else
914 return (struct tbtable *)pinsn;
915 }
916 }
917 return NULL;
918 }
919 #endif /* 0 */
920
921
922
923
924 /* Save the vital information for use when closing off the current file.
925 NAME is the file name the symbols came from, START_ADDR is the first
926 text address for the file, and SIZE is the number of bytes of text. */
927
928 #define complete_symtab(name, start_addr) { \
929 last_source_file = savestring (name, strlen (name)); \
930 last_source_start_addr = start_addr; \
931 }
932
933
934 /* Refill the symbol table input buffer
935 and set the variables that control fetching entries from it.
936 Reports an error if no data available.
937 This function can read past the end of the symbol table
938 (into the string table) but this does no harm. */
939
940 /* Reading symbol table has to be fast! Keep the followings as macros, rather
941 than functions. */
942
943 #define RECORD_MINIMAL_SYMBOL(NAME, ADDR, TYPE, ALLOCED) \
944 { \
945 char *namestr; \
946 if (ALLOCED) \
947 namestr = (NAME) + 1; \
948 else { \
949 (NAME) = namestr = \
950 obstack_copy0 (&objfile->symbol_obstack, (NAME) + 1, strlen ((NAME)+1)); \
951 (ALLOCED) = 1; \
952 } \
953 prim_record_minimal_symbol (namestr, (ADDR), (TYPE)); \
954 misc_func_recorded = 1; \
955 }
956
957
958 /* A parameter template, used by ADD_PARM_TO_PENDING. */
959
960 static struct symbol parmsym = { /* default parameter symbol */
961 "", /* name */
962 VAR_NAMESPACE, /* namespace */
963 LOC_ARG, /* class */
964 NULL, /* type */
965 0, /* line number */
966 0, /* value */
967 };
968
969 /* Add a parameter to a given pending symbol list. */
970
971 #define ADD_PARM_TO_PENDING(PARM, VALUE, PTYPE, PENDING_SYMBOLS) \
972 { \
973 PARM = (struct symbol *) \
974 obstack_alloc (&objfile->symbol_obstack, sizeof (struct symbol)); \
975 *(PARM) = parmsym; \
976 SYMBOL_TYPE (PARM) = PTYPE; \
977 SYMBOL_VALUE (PARM) = VALUE; \
978 add_symbol_to_list (PARM, &PENDING_SYMBOLS); \
979 }
980
981
982 /* aixcoff has static blocks marked in `.bs', `.es' pairs. They cannot be
983 nested. At any given time, a symbol can only be in one static block.
984 This is the base address of current static block, zero if non exists. */
985
986 static int static_block_base = 0;
987
988 /* true if space for symbol name has been allocated. */
989
990 static int symname_alloced = 0;
991
992 /* read the whole symbol table of a given bfd. */
993
994 static void
995 read_xcoff_symtab (objfile, nsyms)
996 struct objfile *objfile; /* Object file we're reading from */
997 int nsyms; /* # of symbols */
998 {
999 bfd *abfd = objfile->obfd;
1000 char *raw_symbol; /* Pointer into raw seething symbol table */
1001 char *raw_auxptr; /* Pointer to first raw aux entry for sym */
1002 sec_ptr textsec; /* Pointer to text section */
1003 TracebackInfo *ptb; /* Pointer to traceback table */
1004
1005 struct internal_syment symbol[1];
1006 union internal_auxent main_aux[1];
1007 struct coff_symbol cs[1];
1008 CORE_ADDR file_start_addr = 0;
1009 CORE_ADDR file_end_addr = 0;
1010
1011 int next_file_symnum = -1;
1012 int just_started = 1;
1013 int depth = 0;
1014 int toc_offset = 0; /* toc offset value in data section. */
1015 int val;
1016 int fcn_last_line;
1017 int fcn_start_addr;
1018 long fcn_line_offset;
1019 size_t size;
1020
1021 struct coff_symbol fcn_stab_saved;
1022
1023 /* fcn_cs_saved is global because process_xcoff_symbol needs it. */
1024 union internal_auxent fcn_aux_saved;
1025 struct type *fcn_type_saved = NULL;
1026 struct context_stack *new;
1027
1028 char *filestring = " _start_ "; /* Name of the current file. */
1029
1030 char *last_csect_name; /* last seen csect's name and value */
1031 CORE_ADDR last_csect_val;
1032 int misc_func_recorded; /* true if any misc. function */
1033
1034 current_objfile = objfile;
1035
1036 /* Get the appropriate COFF "constants" related to the file we're handling. */
1037 N_TMASK = coff_data (abfd)->local_n_tmask;
1038 N_BTSHFT = coff_data (abfd)->local_n_btshft;
1039 local_symesz = coff_data (abfd)->local_symesz;
1040
1041 last_source_file = 0;
1042 last_csect_name = 0;
1043 last_csect_val = 0;
1044 misc_func_recorded = 0;
1045
1046 start_symtab (filestring, (char *)NULL, file_start_addr);
1047 symnum = 0;
1048 first_object_file_end = 0;
1049
1050 /* Allocate space for the entire symbol table at once, and read it
1051 all in. The bfd is already positioned at the beginning of
1052 the symbol table. */
1053
1054 size = coff_data (abfd)->local_symesz * nsyms;
1055 symtbl = xmalloc (size);
1056
1057 val = bfd_read (symtbl, size, 1, abfd);
1058 if (val != size)
1059 perror_with_name ("reading symbol table");
1060
1061 raw_symbol = symtbl;
1062
1063 textsec = bfd_get_section_by_name (abfd, ".text");
1064 if (!textsec) {
1065 printf ("Unable to locate text section!\n");
1066 }
1067
1068 while (symnum < nsyms) {
1069
1070 QUIT; /* make this command interruptable. */
1071
1072 /* READ_ONE_SYMBOL (symbol, cs, symname_alloced); */
1073 /* read one symbol into `cs' structure. After processing the whole symbol
1074 table, only string table will be kept in memory, symbol table and debug
1075 section of aixcoff will be freed. Thus we can mark symbols with names
1076 in string table as `alloced'. */
1077 {
1078 int ii;
1079
1080 /* Swap and align the symbol into a reasonable C structure. */
1081 bfd_coff_swap_sym_in (abfd, raw_symbol, symbol);
1082
1083 cs->c_symnum = symnum;
1084 cs->c_nsyms = symbol->n_numaux;
1085 if (symbol->n_zeroes) {
1086 symname_alloced = 0;
1087 /* We must use the original, unswapped, name here so the name field
1088 pointed to by cs->c_name will persist throughout xcoffread. If
1089 we use the new field, it gets overwritten for each symbol. */
1090 cs->c_name = ((struct external_syment *)raw_symbol)->e.e_name;
1091 } else if (symbol->n_sclass & 0x80) {
1092 cs->c_name = debugsec + symbol->n_offset;
1093 symname_alloced = 0;
1094 } else { /* in string table */
1095 cs->c_name = strtbl + (int)symbol->n_offset;
1096 symname_alloced = 1;
1097 }
1098 cs->c_value = symbol->n_value;
1099 /* n_sclass is signed (FIXME), so we had better not mask off any
1100 high bits it contains, since the values we will be comparing
1101 it to are also signed (FIXME). Defined in <coff/internal.h>.
1102 At this point (3Jun92, gnu@cygnus.com) I think the fix is to
1103 make the fields and values unsigned chars, but changing the next
1104 line is a simple patch late in the release cycle, for now. */
1105 cs->c_sclass = symbol->n_sclass /* & 0xff */;
1106 cs->c_secnum = symbol->n_scnum;
1107 cs->c_type = (unsigned)symbol->n_type;
1108
1109 raw_symbol += coff_data (abfd)->local_symesz;
1110 ++symnum;
1111
1112 raw_auxptr = raw_symbol; /* Save addr of first aux entry */
1113
1114 /* Skip all the auxents associated with this symbol. */
1115 for (ii = symbol->n_numaux; ii; --ii ) {
1116 raw_symbol += coff_data (abfd)->local_auxesz;
1117 ++symnum;
1118 }
1119 }
1120
1121 /* if symbol name starts with ".$" or "$", ignore it. */
1122 if (cs->c_name[0] == '$' || (cs->c_name[1] == '$' && cs->c_name[0] == '.'))
1123 continue;
1124
1125 if (cs->c_symnum == next_file_symnum && cs->c_sclass != C_FILE) {
1126 if (last_source_file)
1127 end_symtab (cur_src_end_addr, 1, 0, objfile);
1128
1129 start_symtab ("_globals_", (char *)NULL, (CORE_ADDR)0);
1130 cur_src_end_addr = first_object_file_end;
1131 /* done with all files, everything from here on is globals */
1132 }
1133
1134 /* if explicitly specified as a function, treat is as one. */
1135 if (ISFCN(cs->c_type) && cs->c_sclass != C_TPDEF) {
1136 bfd_coff_swap_aux_in (abfd, raw_auxptr, cs->c_type, cs->c_sclass,
1137 main_aux);
1138 goto function_entry_point;
1139 }
1140
1141 if ((cs->c_sclass == C_EXT || cs->c_sclass == C_HIDEXT) && cs->c_nsyms == 1)
1142 {
1143 /* dealing with a symbol with a csect entry. */
1144
1145 # define CSECT(PP) ((PP)->x_csect)
1146 # define CSECT_LEN(PP) (CSECT(PP).x_scnlen)
1147 # define CSECT_ALIGN(PP) (SMTYP_ALIGN(CSECT(PP).x_smtyp))
1148 # define CSECT_SMTYP(PP) (SMTYP_SMTYP(CSECT(PP).x_smtyp))
1149 # define CSECT_SCLAS(PP) (CSECT(PP).x_smclas)
1150
1151 /* Convert the auxent to something we can access. */
1152 bfd_coff_swap_aux_in (abfd, raw_auxptr, cs->c_type, cs->c_sclass,
1153 main_aux);
1154
1155 switch (CSECT_SMTYP (main_aux)) {
1156
1157 case XTY_ER :
1158 continue; /* ignore all external references. */
1159
1160 case XTY_SD : /* a section description. */
1161 {
1162 switch (CSECT_SCLAS (main_aux)) {
1163
1164 case XMC_PR : /* a `.text' csect. */
1165 {
1166
1167 /* A program csect is seen.
1168
1169 We have to allocate one symbol table for each program csect. Normally
1170 gdb prefers one symtab for each compilation unit (CU). In case of AIX, one
1171 CU might include more than one prog csect, and they don't have to be
1172 adjacent in terms of the space they occupy in memory. Thus, one single
1173 CU might get fragmented in the memory and gdb's file start and end address
1174 approach does not work! */
1175
1176 if (last_csect_name) {
1177
1178 /* if no misc. function recorded in the last seen csect, enter
1179 it as a function. This will take care of functions like
1180 strcmp() compiled by xlc. */
1181
1182 if (!misc_func_recorded) {
1183 int alloced = 0;
1184 RECORD_MINIMAL_SYMBOL (last_csect_name, last_csect_val,
1185 mst_text, alloced);
1186 }
1187
1188
1189 complete_symtab (filestring, file_start_addr);
1190 cur_src_end_addr = file_end_addr;
1191 end_symtab (file_end_addr, 1, 0, objfile);
1192 start_symtab ((char *)NULL, (char *)NULL, (CORE_ADDR)0);
1193 }
1194
1195 /* If this is the very first csect seen, basically `__start'. */
1196 if (just_started) {
1197 first_object_file_end = cs->c_value + CSECT_LEN (main_aux);
1198 just_started = 0;
1199 }
1200
1201 file_start_addr = cs->c_value;
1202 file_end_addr = cs->c_value + CSECT_LEN (main_aux);
1203
1204 if (cs->c_name && cs->c_name[0] == '.') {
1205 last_csect_name = cs->c_name;
1206 last_csect_val = cs->c_value;
1207 }
1208 }
1209 misc_func_recorded = 0;
1210 continue;
1211
1212 case XMC_RW :
1213 break;
1214
1215 /* If the section is not a data description, ignore it. Note that
1216 uninitialized data will show up as XTY_CM/XMC_RW pair. */
1217
1218 case XMC_TC0:
1219 if (toc_offset)
1220 warning ("More than one xmc_tc0 symbol found.");
1221 toc_offset = cs->c_value;
1222 continue;
1223
1224 case XMC_TC : /* ignore toc entries */
1225 default : /* any other XMC_XXX */
1226 continue;
1227 }
1228 }
1229 break; /* switch CSECT_SCLAS() */
1230
1231 case XTY_LD :
1232
1233 /* a function entry point. */
1234 if (CSECT_SCLAS (main_aux) == XMC_PR) {
1235
1236 function_entry_point:
1237 RECORD_MINIMAL_SYMBOL (cs->c_name, cs->c_value, mst_text,
1238 symname_alloced);
1239
1240 fcn_line_offset = main_aux->x_sym.x_fcnary.x_fcn.x_lnnoptr;
1241 fcn_start_addr = cs->c_value;
1242
1243 /* save the function header info, which will be used
1244 when `.bf' is seen. */
1245 fcn_cs_saved = *cs;
1246 fcn_aux_saved = *main_aux;
1247
1248
1249 ptb = NULL;
1250
1251 /* If function has two auxent, then debugging information is
1252 already available for it. Process traceback table for
1253 functions with only one auxent. */
1254
1255 if (cs->c_nsyms == 1)
1256 ptb = retrieve_tracebackinfo (abfd, textsec, cs);
1257
1258 else if (cs->c_nsyms != 2)
1259 abort ();
1260
1261 /* If there is traceback info, create and add parameters for it. */
1262
1263 if (ptb && (ptb->fixedparms || ptb->floatparms)) {
1264
1265 int parmcnt = ptb->fixedparms + ptb->floatparms;
1266 char *parmcode = (char*) &ptb->parminfo;
1267 int parmvalue = ptb->framesize + 0x18; /* sizeof(LINK AREA) == 0x18 */
1268 unsigned int ii, mask;
1269
1270 for (ii=0, mask = 0x80000000; ii <parmcnt; ++ii) {
1271 struct symbol *parm;
1272
1273 if (ptb->parminfo & mask) { /* float or double */
1274 mask = mask >> 1;
1275 if (ptb->parminfo & mask) { /* double parm */
1276 ADD_PARM_TO_PENDING
1277 (parm, parmvalue, builtin_type_double, local_symbols);
1278 parmvalue += sizeof (double);
1279 }
1280 else { /* float parm */
1281 ADD_PARM_TO_PENDING
1282 (parm, parmvalue, builtin_type_float, local_symbols);
1283 parmvalue += sizeof (float);
1284 }
1285 }
1286 else { /* fixed parm, use (int*) for hex rep. */
1287 ADD_PARM_TO_PENDING (parm, parmvalue,
1288 lookup_pointer_type (builtin_type_int),
1289 local_symbols);
1290 parmvalue += sizeof (int);
1291 }
1292 mask = mask >> 1;
1293 }
1294
1295 /* Fake this as a function. Needed in process_xcoff_symbol() */
1296 cs->c_type = 32;
1297
1298 finish_block(process_xcoff_symbol (cs, objfile), &local_symbols,
1299 pending_blocks, cs->c_value,
1300 cs->c_value + ptb->fsize, objfile);
1301 }
1302 continue;
1303 }
1304 /* shared library function trampoline code entry point. */
1305 else if (CSECT_SCLAS (main_aux) == XMC_GL) {
1306
1307 /* record trampoline code entries as mst_unknown symbol. When we
1308 lookup mst symbols, we will choose mst_text over mst_unknown. */
1309
1310 #if 1
1311 /* After the implementation of incremental loading of shared
1312 libraries, we don't want to access trampoline entries. This
1313 approach has a consequence of the necessity to bring the whole
1314 shared library at first, in order do anything with it (putting
1315 breakpoints, using malloc, etc). On the other side, this is
1316 consistient with gdb's behaviour on a SUN platform. */
1317
1318 /* Trying to prefer *real* function entry over its trampoline,
1319 by assigning `mst_unknown' type to trampoline entries fails.
1320 Gdb treats those entries as chars. FIXME. */
1321
1322 /* Recording this entry is necessary. Single stepping relies on
1323 this vector to get an idea about function address boundaries. */
1324
1325 prim_record_minimal_symbol (0, cs->c_value, mst_unknown);
1326 #else
1327
1328 /* record trampoline code entries as mst_unknown symbol. When we
1329 lookup mst symbols, we will choose mst_text over mst_unknown. */
1330
1331 RECORD_MINIMAL_SYMBOL (cs->c_name, cs->c_value, mst_unknown,
1332 symname_alloced);
1333 #endif
1334 continue;
1335 }
1336 break;
1337
1338 default : /* all other XTY_XXXs */
1339 break;
1340 } /* switch CSECT_SMTYP() */ }
1341
1342 switch (cs->c_sclass) {
1343
1344 case C_FILE:
1345
1346 /* see if the last csect needs to be recorded. */
1347
1348 if (last_csect_name && !misc_func_recorded) {
1349
1350 /* if no misc. function recorded in the last seen csect, enter
1351 it as a function. This will take care of functions like
1352 strcmp() compiled by xlc. */
1353
1354 int alloced = 0;
1355 RECORD_MINIMAL_SYMBOL (last_csect_name, last_csect_val,
1356 mst_text, alloced);
1357 }
1358
1359 /* c_value field contains symnum of next .file entry in table
1360 or symnum of first global after last .file. */
1361
1362 next_file_symnum = cs->c_value;
1363
1364 /* complete symbol table for last object file containing
1365 debugging information. */
1366
1367 /* Whether or not there was a csect in the previous file, we have
1368 to call `end_symtab' and `start_symtab' to reset type_vector,
1369 line_vector, etc. structures. */
1370
1371 complete_symtab (filestring, file_start_addr);
1372 cur_src_end_addr = file_end_addr;
1373 end_symtab (file_end_addr, 1, 0, objfile);
1374 start_symtab (cs->c_name, (char *)NULL, (CORE_ADDR)0);
1375 last_csect_name = 0;
1376
1377 /* reset file start and end addresses. A compilation unit with no text
1378 (only data) should have zero file boundaries. */
1379 file_start_addr = file_end_addr = 0;
1380
1381 filestring = cs->c_name;
1382 break;
1383
1384
1385 case C_FUN:
1386
1387 #ifdef NO_DEFINE_SYMBOL
1388 /* For a function stab, just save its type in `fcn_type_saved', and leave
1389 it for the `.bf' processing. */
1390 {
1391 char *pp = (char*) index (cs->c_name, ':');
1392
1393 if (!pp || ( *(pp+1) != 'F' && *(pp+1) != 'f'))
1394 fatal ("Unrecognized stab");
1395 pp += 2;
1396
1397 if (fcn_type_saved)
1398 fatal ("Unprocessed function type");
1399
1400 fcn_type_saved = lookup_function_type (read_type (&pp, objfile));
1401 }
1402 #else
1403 fcn_stab_saved = *cs;
1404 #endif
1405 break;
1406
1407
1408 case C_FCN:
1409 if (strcmp (cs->c_name, ".bf") == 0) {
1410
1411 bfd_coff_swap_aux_in (abfd, raw_auxptr, cs->c_type, cs->c_sclass,
1412 main_aux);
1413
1414 within_function = 1;
1415
1416 /* Linenos are now processed on a file-by-file, not fn-by-fn, basis.
1417 Metin did it, I'm not sure why. FIXME. -- gnu@cygnus.com */
1418
1419 /* Two reasons:
1420
1421 1) xlc (IBM's native c compiler) postpones static function code
1422 emission to the end of a compilation unit. This way it can
1423 determine if those functions (statics) are needed or not, and
1424 can do some garbage collection (I think). This makes line
1425 numbers and corresponding addresses unordered, and we end up
1426 with a line table like:
1427
1428
1429 lineno addr
1430 foo() 10 0x100
1431 20 0x200
1432 30 0x300
1433
1434 foo3() 70 0x400
1435 80 0x500
1436 90 0x600
1437
1438 static foo2()
1439 40 0x700
1440 50 0x800
1441 60 0x900
1442
1443 and that breaks gdb's binary search on line numbers, if the
1444 above table is not sorted on line numbers. And that sort
1445 should be on function based, since gcc can emit line numbers
1446 like:
1447
1448 10 0x100 - for the init/test part of a for stmt.
1449 20 0x200
1450 30 0x300
1451 10 0x400 - for the increment part of a for stmt.
1452
1453 arrange_linenos() will do this sorting.
1454
1455
1456 2) aix symbol table might look like:
1457
1458 c_file // beginning of a new file
1459 .bi // beginning of include file
1460 .ei // end of include file
1461 .bi
1462 .ei
1463
1464 basically, .bi/.ei pairs do not necessarily encapsulate
1465 their scope. They need to be recorded, and processed later
1466 on when we come the end of the compilation unit.
1467 Include table (inclTable) and process_linenos() handle
1468 that.
1469 */
1470 mark_first_line (fcn_line_offset, cs->c_symnum);
1471
1472 new = push_context (0, fcn_start_addr);
1473
1474 #ifdef NO_DEFINE_SYMBOL
1475 new->name = process_xcoff_symbol (&fcn_cs_saved, objfile);
1476
1477 /* Between a function symbol and `.bf', there always will be a function
1478 stab. We save function type when processing that stab. */
1479
1480 if (fcn_type_saved == NULL) {
1481 printf ("Unknown function type: symbol 0x%x\n", cs->c_symnum);
1482 SYMBOL_TYPE (new->name) = lookup_function_type (builtin_type_int);
1483 }
1484 else {
1485 SYMBOL_TYPE (new->name) = fcn_type_saved;
1486 fcn_type_saved = NULL;
1487 }
1488 #else
1489 new->name = define_symbol
1490 (fcn_cs_saved.c_value, fcn_stab_saved.c_name, 0, 0, objfile);
1491 #endif
1492 }
1493 else if (strcmp (cs->c_name, ".ef") == 0) {
1494
1495 bfd_coff_swap_aux_in (abfd, raw_auxptr, cs->c_type, cs->c_sclass,
1496 main_aux);
1497
1498 /* the value of .ef is the address of epilogue code;
1499 not useful for gdb */
1500 /* { main_aux.x_sym.x_misc.x_lnsz.x_lnno
1501 contains number of lines to '}' */
1502
1503 fcn_last_line = main_aux->x_sym.x_misc.x_lnsz.x_lnno;
1504 new = pop_context ();
1505 if (context_stack_depth != 0)
1506 error ("invalid symbol data; .bf/.ef/.bb/.eb symbol mismatch, at symbol %d.",
1507 symnum);
1508
1509 finish_block (new->name, &local_symbols, new->old_blocks,
1510 new->start_addr,
1511 fcn_cs_saved.c_value +
1512 fcn_aux_saved.x_sym.x_misc.x_fsize, objfile);
1513 within_function = 0;
1514 }
1515 break;
1516
1517 case C_BSTAT : /* begin static block */
1518 static_block_base = read_symbol_nvalue (symtbl, cs->c_value);
1519 break;
1520
1521 case C_ESTAT : /* end of static block */
1522 static_block_base = 0;
1523 break;
1524
1525 case C_ARG : /* These are not implemented. */
1526 case C_REGPARM :
1527 case C_TPDEF :
1528 case C_STRTAG :
1529 case C_UNTAG :
1530 case C_ENTAG :
1531 printf ("ERROR: Unimplemented storage class: %d.\n", cs->c_sclass);
1532 break;
1533
1534 case C_HIDEXT : /* ignore these.. */
1535 case C_LABEL :
1536 case C_NULL :
1537 break;
1538
1539 case C_BINCL : /* beginning of include file */
1540
1541 /* In xlc output, C_BINCL/C_EINCL pair doesn't show up in sorted
1542 order. Thus, when wee see them, we might not know enough info
1543 to process them. Thus, we'll be saving them into a table
1544 (inclTable) and postpone their processing. */
1545
1546 record_include_begin (cs);
1547 break;
1548
1549 case C_EINCL : /* end of include file */
1550 /* see the comment after case C_BINCL. */
1551 record_include_end (cs);
1552 break;
1553
1554 case C_BLOCK :
1555 if (strcmp (cs->c_name, ".bb") == 0) {
1556 depth++;
1557 new = push_context (depth, cs->c_value);
1558 }
1559 else if (strcmp (cs->c_name, ".eb") == 0) {
1560 new = pop_context ();
1561 if (depth != new->depth)
1562 error ("Invalid symbol data: .bb/.eb symbol mismatch at symbol %d.",
1563 symnum);
1564
1565 depth--;
1566 if (local_symbols && context_stack_depth > 0) {
1567 /* Make a block for the local symbols within. */
1568 finish_block (new->name, &local_symbols, new->old_blocks,
1569 new->start_addr, cs->c_value, objfile);
1570 }
1571 local_symbols = new->locals;
1572 }
1573 break;
1574
1575 default :
1576 process_xcoff_symbol (cs, objfile);
1577 break;
1578 }
1579
1580 } /* while */
1581
1582 if (last_source_file)
1583 end_symtab (cur_src_end_addr, 1, 0, objfile);
1584
1585 free (symtbl);
1586 current_objfile = NULL;
1587
1588 /* Record the toc offset value of this symbol table into ldinfo structure.
1589 If no XMC_TC0 is found, toc_offset should be zero. Another place to obtain
1590 this information would be file auxiliary header. */
1591
1592 xcoff_add_toc_to_loadinfo (toc_offset);
1593 }
1594
1595 #define SYMBOL_DUP(SYMBOL1, SYMBOL2) \
1596 (SYMBOL2) = (struct symbol *) \
1597 obstack_alloc (&objfile->symbol_obstack, sizeof (struct symbol)); \
1598 *(SYMBOL2) = *(SYMBOL1);
1599
1600
1601 #define SYMNAME_ALLOC(NAME, ALLOCED) \
1602 (ALLOCED) ? (NAME) : obstack_copy0 (&objfile->symbol_obstack, (NAME), strlen (NAME));
1603
1604
1605 /* process one xcoff symbol. */
1606
1607 static struct symbol *
1608 process_xcoff_symbol (cs, objfile)
1609 register struct coff_symbol *cs;
1610 struct objfile *objfile;
1611 {
1612 struct symbol onesymbol;
1613 register struct symbol *sym = &onesymbol;
1614 struct symbol *sym2 = NULL;
1615 struct type *ttype;
1616 char *name, *pp, *qq;
1617 int struct_and_type_combined;
1618 int nameless;
1619
1620 name = cs->c_name;
1621 if (name[0] == '.')
1622 ++name;
1623
1624 bzero (sym, sizeof (struct symbol));
1625
1626 /* default assumptions */
1627 SYMBOL_VALUE (sym) = cs->c_value;
1628 SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
1629
1630 if (ISFCN (cs->c_type)) {
1631
1632 /* At this point, we don't know the type of the function and assume it
1633 is int. This will be patched with the type from its stab entry later
1634 on in patch_block_stabs () */
1635
1636 SYMBOL_NAME (sym) = SYMNAME_ALLOC (name, symname_alloced);
1637 SYMBOL_TYPE (sym) = lookup_function_type (lookup_fundamental_type (objfile, FT_INTEGER));
1638
1639 SYMBOL_CLASS (sym) = LOC_BLOCK;
1640 SYMBOL_DUP (sym, sym2);
1641
1642 if (cs->c_sclass == C_EXT)
1643 add_symbol_to_list (sym2, &global_symbols);
1644 else if (cs->c_sclass == C_HIDEXT || cs->c_sclass == C_STAT)
1645 add_symbol_to_list (sym2, &file_symbols);
1646 }
1647
1648 else {
1649
1650 /* in case we can't figure out the type, default is `int'. */
1651 SYMBOL_TYPE (sym) = lookup_fundamental_type (objfile, FT_INTEGER);
1652
1653 switch (cs->c_sclass)
1654 {
1655 #if 0
1656 case C_FUN:
1657 if (fcn_cs_saved.c_sclass == C_EXT)
1658 add_stab_to_list (name, &global_stabs);
1659 else
1660 add_stab_to_list (name, &file_stabs);
1661 break;
1662 #endif
1663
1664 case C_DECL: /* a type decleration?? */
1665
1666 #if defined(NO_TYPEDEFS) || defined(NO_DEFINE_SYMBOL)
1667 qq = (char*) strchr (name, ':');
1668 if (!qq) /* skip if there is no ':' */
1669 return NULL;
1670
1671 nameless = (qq == name);
1672
1673 struct_and_type_combined = (qq[1] == 'T' && qq[2] == 't');
1674 pp = qq + (struct_and_type_combined ? 3 : 2);
1675
1676
1677 /* To handle GNU C++ typename abbreviation, we need to be able to fill
1678 in a type's name as soon as space for that type is allocated. */
1679
1680 if (struct_and_type_combined && name != qq) {
1681
1682 int typenums[2];
1683 struct type *tmp_type;
1684 char *tmp_pp = pp;
1685
1686 read_type_number (&tmp_pp, typenums);
1687 tmp_type = dbx_alloc_type (typenums, objfile);
1688
1689 if (tmp_type && !TYPE_NAME (tmp_type) && !nameless)
1690 TYPE_NAME (tmp_type) = SYMBOL_NAME (sym) =
1691 obsavestring (name, qq-name,
1692 &objfile->symbol_obstack);
1693 }
1694 ttype = SYMBOL_TYPE (sym) = read_type (&pp);
1695
1696 /* if there is no name for this typedef, you don't have to keep its
1697 symbol, since nobody could ask for it. Otherwise, build a symbol
1698 and add it into symbol_list. */
1699
1700 if (nameless)
1701 return;
1702
1703 #ifdef NO_TYPEDEFS
1704 /* Transarc wants to eliminate type definitions from the symbol table.
1705 Limited debugging capabilities, but faster symbol table processing
1706 and less memory usage. Note that tag definitions (starting with
1707 'T') will remain intact. */
1708
1709 if (qq[1] != 'T' && (!TYPE_NAME (ttype) || *(TYPE_NAME (ttype)) == '\0')) {
1710
1711 if (SYMBOL_NAME (sym))
1712 TYPE_NAME (ttype) = SYMBOL_NAME (sym);
1713 else
1714 TYPE_NAME (ttype) = obsavestring (name, qq-name);
1715
1716 return;
1717 }
1718
1719 #endif /* !NO_TYPEDEFS */
1720
1721 /* read_type() will return null if type (or tag) definition was
1722 unnnecessarily duplicated. Also, if the symbol doesn't have a name,
1723 there is no need to keep it in symbol table. */
1724 /* The above argument no longer valid. read_type() never returns NULL. */
1725
1726 if (!ttype)
1727 return NULL;
1728
1729 /* if there is no name for this typedef, you don't have to keep its
1730 symbol, since nobody could ask for it. Otherwise, build a symbol
1731 and add it into symbol_list. */
1732
1733 if (qq[1] == 'T')
1734 SYMBOL_NAMESPACE (sym) = STRUCT_NAMESPACE;
1735 else if (qq[1] == 't')
1736 SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
1737 else {
1738 warning ("Unrecognized stab string.\n");
1739 return NULL;
1740 }
1741
1742 SYMBOL_CLASS (sym) = LOC_TYPEDEF;
1743 if (!SYMBOL_NAME (sym))
1744 SYMBOL_NAME (sym) = obsavestring (name, qq-name);
1745
1746 SYMBOL_DUP (sym, sym2);
1747 add_symbol_to_list
1748 (sym2, within_function ? &local_symbols : &file_symbols);
1749
1750 /* For a combination of struct and type, add one more symbol
1751 for the type. */
1752
1753 if (struct_and_type_combined) {
1754 SYMBOL_DUP (sym, sym2);
1755 SYMBOL_NAMESPACE (sym2) = VAR_NAMESPACE;
1756 add_symbol_to_list
1757 (sym2, within_function ? &local_symbols : &file_symbols);
1758 }
1759
1760 /* assign a name to the type node. */
1761
1762 if (!TYPE_NAME (ttype) || *(TYPE_NAME (ttype)) == '\0') {
1763 if (struct_and_type_combined)
1764 TYPE_NAME (ttype) = SYMBOL_NAME (sym);
1765 else if (qq[1] == 'T') /* struct namespace */
1766 TYPE_NAME (ttype) = concat (
1767 TYPE_CODE (ttype) == TYPE_CODE_UNION ? "union " :
1768 TYPE_CODE (ttype) == TYPE_CODE_STRUCT? "struct " : "enum ",
1769 SYMBOL_NAME (sym), NULL);
1770 }
1771 break;
1772
1773 #else /* !NO_DEFINE_SYMBOL */
1774 return define_symbol (cs->c_value, cs->c_name, 0, 0, objfile);
1775 #endif
1776
1777 case C_GSYM:
1778 add_stab_to_list (name, &global_stabs);
1779 break;
1780
1781 case C_PSYM:
1782 case C_RPSYM:
1783
1784 #ifdef NO_DEFINE_SYMBOL
1785 if (*name == ':' || (pp = (char *) strchr (name, ':')) == NULL)
1786 return NULL;
1787 SYMBOL_NAME (sym) = obsavestring (name, pp-name, &objfile -> symbol_obstack);
1788 SYMBOL_CLASS (sym) = (cs->c_sclass == C_PSYM) ? LOC_ARG : LOC_REGPARM;
1789 pp += 2;
1790 SYMBOL_TYPE (sym) = read_type (&pp, objfile);
1791 SYMBOL_DUP (sym, sym2);
1792 add_symbol_to_list (sym2, &local_symbols);
1793 break;
1794 #else
1795 sym = define_symbol (cs->c_value, cs->c_name, 0, 0, objfile);
1796 SYMBOL_CLASS (sym) = (cs->c_sclass == C_PSYM) ? LOC_ARG : LOC_REGPARM;
1797 return sym;
1798 #endif
1799
1800 case C_STSYM:
1801
1802 #ifdef NO_DEFINE_SYMBOL
1803 if (*name == ':' || (pp = (char *) strchr (name, ':')) == NULL)
1804 return NULL;
1805 SYMBOL_NAME (sym) = obsavestring (name, pp-name, &objfile -> symbol_obstack);
1806 SYMBOL_CLASS (sym) = LOC_STATIC;
1807 SYMBOL_VALUE (sym) += static_block_base;
1808 pp += 2;
1809 SYMBOL_TYPE (sym) = read_type (&pp, objfile);
1810 SYMBOL_DUP (sym, sym2);
1811 add_symbol_to_list
1812 (sym2, within_function ? &local_symbols : &file_symbols);
1813 break;
1814 #else
1815 /* If we are going to use Sun dbx's define_symbol(), we need to
1816 massage our stab string a little. Change 'V' type to 'S' to be
1817 comparible with Sun. */
1818
1819 if (*name == ':' || (pp = (char *) index (name, ':')) == NULL)
1820 return NULL;
1821
1822 ++pp;
1823 if (*pp == 'V') *pp = 'S';
1824 sym = define_symbol (cs->c_value, cs->c_name, 0, 0, objfile);
1825 SYMBOL_VALUE (sym) += static_block_base;
1826 return sym;
1827 #endif
1828
1829 case C_LSYM:
1830 if (*name == ':' || (pp = (char *) strchr (name, ':')) == NULL)
1831 return NULL;
1832 SYMBOL_NAME (sym) = obsavestring (name, pp-name, &objfile -> symbol_obstack);
1833 SYMBOL_CLASS (sym) = LOC_LOCAL;
1834 pp += 1;
1835 SYMBOL_TYPE (sym) = read_type (&pp, objfile);
1836 SYMBOL_DUP (sym, sym2);
1837 add_symbol_to_list (sym2, &local_symbols);
1838 break;
1839
1840 case C_AUTO:
1841 SYMBOL_CLASS (sym) = LOC_LOCAL;
1842 SYMBOL_NAME (sym) = SYMNAME_ALLOC (name, symname_alloced);
1843 SYMBOL_DUP (sym, sym2);
1844 add_symbol_to_list (sym2, &local_symbols);
1845 break;
1846
1847 case C_EXT:
1848 SYMBOL_CLASS (sym) = LOC_STATIC;
1849 SYMBOL_NAME (sym) = SYMNAME_ALLOC (name, symname_alloced);
1850 SYMBOL_DUP (sym, sym2);
1851 add_symbol_to_list (sym2, &global_symbols);
1852 break;
1853
1854 case C_STAT:
1855 SYMBOL_CLASS (sym) = LOC_STATIC;
1856 SYMBOL_NAME (sym) = SYMNAME_ALLOC (name, symname_alloced);
1857 SYMBOL_DUP (sym, sym2);
1858 add_symbol_to_list
1859 (sym2, within_function ? &local_symbols : &file_symbols);
1860 break;
1861
1862 case C_REG:
1863 printf ("ERROR! C_REG is not fully implemented!\n");
1864 SYMBOL_CLASS (sym) = LOC_REGISTER;
1865 SYMBOL_NAME (sym) = SYMNAME_ALLOC (name, symname_alloced);
1866 SYMBOL_DUP (sym, sym2);
1867 add_symbol_to_list (sym2, &local_symbols);
1868 break;
1869
1870 case C_RSYM:
1871
1872 #ifdef NO_DEFINE_SYMBOL
1873 pp = (char*) strchr (name, ':');
1874 SYMBOL_CLASS (sym) = LOC_REGISTER;
1875 SYMBOL_VALUE (sym) = STAB_REG_TO_REGNUM (cs->c_value);
1876 if (pp) {
1877 SYMBOL_NAME (sym) = obsavestring (name, pp-name, &objfile -> symbol_obstack);
1878 pp += 2;
1879 if (*pp)
1880 SYMBOL_TYPE (sym) = read_type (&pp, objfile);
1881 }
1882 else
1883 /* else this is not a stab entry, suppose the type is either
1884 `int' or `float', depending on the register class. */
1885
1886 SYMBOL_TYPE (sym) = (SYMBOL_VALUE (sym) < 32)
1887 ? lookup_fundamental_type (objfile, FT_INTEGER)
1888 : lookup_fundamental_type (objfile, FT_FLOAT);
1889
1890 SYMBOL_DUP (sym, sym2);
1891 add_symbol_to_list (sym2, &local_symbols);
1892 break;
1893 #else
1894 if (pp) {
1895 sym = define_symbol (cs->c_value, cs->c_name, 0, 0, objfile);
1896 return sym;
1897 }
1898 else {
1899 warning ("A non-stab C_RSYM needs special handling.");
1900 return NULL;
1901 }
1902 #endif
1903
1904 default :
1905 warning ("Unexpected storage class: %d.", cs->c_sclass);
1906 return NULL;
1907 }
1908 }
1909 return sym2;
1910 }
1911
1912
1913 static int
1914 read_symbol_nvalue (symtable, symno)
1915 char *symtable;
1916 int symno;
1917 {
1918 struct internal_syment symbol[1];
1919
1920 bfd_coff_swap_sym_in (symfile_bfd, symtable + (symno*local_symesz), symbol);
1921 return symbol->n_value;
1922 }
1923
1924
1925 static int
1926 read_symbol_lineno (symtable, symno)
1927 char *symtable;
1928 int symno;
1929 {
1930 struct internal_syment symbol[1];
1931 union internal_auxent main_aux[1];
1932
1933 int ii;
1934
1935 for (ii = 0; ii < 50; ii++) {
1936 bfd_coff_swap_sym_in (symfile_bfd,
1937 symtable + (symno*local_symesz), symbol);
1938 if (symbol->n_sclass == C_FCN && 0 == strcmp (symbol->n_name, ".bf"))
1939 goto gotit;
1940 symno += symbol->n_numaux+1;
1941 }
1942
1943 printf ("GDB Error: `.bf' not found.\n");
1944 return 0;
1945
1946 gotit:
1947 /* take aux entry and return its lineno */
1948 symno++;
1949 bfd_coff_swap_aux_in (symfile_bfd, symtable+(symno*local_symesz),
1950 symbol->n_type, symbol->n_sclass, main_aux);
1951
1952 return main_aux->x_sym.x_misc.x_lnsz.x_lnno;
1953 }
1954
1955 /* Support for line number handling */
1956
1957 /* This function is called for every section; it finds the outer limits
1958 * of the line table (minimum and maximum file offset) so that the
1959 * mainline code can read the whole thing for efficiency.
1960 */
1961 static void
1962 find_linenos(abfd, asect, vpinfo)
1963 bfd *abfd;
1964 sec_ptr asect;
1965 PTR vpinfo;
1966 {
1967 struct coff_symfile_info *info;
1968 int size, count;
1969 file_ptr offset, maxoff;
1970
1971 count = asect->lineno_count;
1972
1973 if (strcmp (asect->name, ".text") || count == 0)
1974 return;
1975
1976 size = count * coff_data (symfile_bfd)->local_linesz;
1977 info = (struct coff_symfile_info *)vpinfo;
1978 offset = asect->line_filepos;
1979 maxoff = offset + size;
1980
1981 if (offset < info->min_lineno_offset || info->min_lineno_offset == 0)
1982 info->min_lineno_offset = offset;
1983
1984 if (maxoff > info->max_lineno_offset)
1985 info->max_lineno_offset = maxoff;
1986 }
1987
1988
1989 /* Read in all the line numbers for fast lookups later. Leave them in
1990 external (unswapped) format in memory; we'll swap them as we enter
1991 them into GDB's data structures. */
1992
1993 static int
1994 init_lineno (abfd, offset, size)
1995 bfd *abfd;
1996 long offset;
1997 int size;
1998 {
1999 int val;
2000
2001 if (bfd_seek(abfd, offset, 0) < 0)
2002 return -1;
2003
2004 linetab = (char *) xmalloc(size);
2005
2006 val = bfd_read(linetab, 1, size, abfd);
2007 if (val != size)
2008 return -1;
2009
2010 linetab_offset = offset;
2011 linetab_size = size;
2012 make_cleanup (free, linetab); /* Be sure it gets de-allocated. */
2013 return 0;
2014 }
2015 \f
2016 /* dbx allows the text of a symbol name to be continued into the
2017 next symbol name! When such a continuation is encountered
2018 (a \ at the end of the text of a name)
2019 call this function to get the continuation. */
2020 /* So far, I haven't seen this happenning xlc output. I doubt we'll need this
2021 for aixcoff. */
2022
2023 #undef next_symbol_text
2024 #define next_symbol_text() \
2025 printf ("Gdb Error: symbol names on multiple lines not implemented.\n")
2026
2027
2028 /* xlc/dbx combination uses a set of builtin types, starting from -1. return
2029 the proper type node fora given builtin type #. */
2030
2031 struct type *
2032 builtin_type (pp)
2033 char **pp;
2034 {
2035 int typenums[2];
2036
2037 if (**pp != '-') {
2038 printf ("ERROR!, unknown built-in type!\n");
2039 return NULL;
2040 }
2041 *pp += 1;
2042 read_type_number (pp, typenums);
2043
2044 /* default types are defined in dbxstclass.h. */
2045 switch ( typenums[1] ) {
2046 case 1:
2047 return lookup_fundamental_type (current_objfile, FT_INTEGER);
2048 case 2:
2049 return lookup_fundamental_type (current_objfile, FT_CHAR);
2050 case 3:
2051 return lookup_fundamental_type (current_objfile, FT_SHORT);
2052 case 4:
2053 return lookup_fundamental_type (current_objfile, FT_LONG);
2054 case 5:
2055 return lookup_fundamental_type (current_objfile, FT_UNSIGNED_CHAR);
2056 case 6:
2057 return lookup_fundamental_type (current_objfile, FT_SIGNED_CHAR);
2058 case 7:
2059 return lookup_fundamental_type (current_objfile, FT_UNSIGNED_SHORT);
2060 case 8:
2061 return lookup_fundamental_type (current_objfile, FT_UNSIGNED_INTEGER);
2062 case 9:
2063 return lookup_fundamental_type (current_objfile, FT_UNSIGNED_INTEGER);
2064 case 10:
2065 return lookup_fundamental_type (current_objfile, FT_UNSIGNED_LONG);
2066 case 11:
2067 return lookup_fundamental_type (current_objfile, FT_VOID);
2068 case 12:
2069 return lookup_fundamental_type (current_objfile, FT_FLOAT);
2070 case 13:
2071 return lookup_fundamental_type (current_objfile, FT_DBL_PREC_FLOAT);
2072 case 14:
2073 return lookup_fundamental_type (current_objfile, FT_EXT_PREC_FLOAT);
2074 case 15:
2075 /* requires a builtin `integer' */
2076 return lookup_fundamental_type (current_objfile, FT_INTEGER);
2077 case 16:
2078 return lookup_fundamental_type (current_objfile, FT_BOOLEAN);
2079 case 17:
2080 /* requires builtin `short real' */
2081 return lookup_fundamental_type (current_objfile, FT_FLOAT);
2082 case 18:
2083 /* requires builtin `real' */
2084 return lookup_fundamental_type (current_objfile, FT_FLOAT);
2085 default :
2086 printf ("ERROR! Unknown builtin type -%d\n", typenums[1]);
2087 return NULL;
2088 }
2089 }
2090
2091 #if 0 /* Seems to be unused, don't bother converting from old misc function
2092 vector usage to new minimal symbol tables. FIXME: Delete this? */
2093
2094 /* if we now nothing about a function but its address, make a function symbol
2095 out of it with the limited knowladge you have. This will be used when
2096 somebody refers to a function, which doesn't exist in the symbol table,
2097 but is in the minimal symbol table. */
2098
2099 struct symbol *
2100 build_function_symbol (ind, objfile)
2101 int ind;
2102 struct objfile *objfile;
2103 {
2104 struct symbol *sym =
2105 (struct symbol *) obstack_alloc (&objfile->symbol_obstack, sizeof (struct symbol));
2106 SYMBOL_NAME (sym) = misc_function_vector[ind].name;
2107 /* SYMBOL_VALUE (sym) = misc_function_vector[ind].address; */
2108 SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
2109 SYMBOL_CLASS (sym) = LOC_BLOCK;
2110 SYMBOL_TYPE (sym) = lookup_function_type (lookup_fundamental_type (current_objfile, FT_INTEGER));
2111 SYMBOL_BLOCK_VALUE (sym) = (struct block *)
2112 obstack_alloc (&objfile->symbol_obstack, sizeof (struct block));
2113 BLOCK_START (SYMBOL_BLOCK_VALUE (sym)) = misc_function_vector[ind].address;
2114 return sym;
2115 }
2116
2117 #endif
2118
2119 static void
2120 aixcoff_new_init (objfile)
2121 struct objfile *objfile;
2122 {
2123 }
2124
2125 static void
2126 aixcoff_symfile_init (objfile)
2127 struct objfile *objfile;
2128 {
2129 bfd *abfd = objfile->obfd;
2130
2131 /* Allocate struct to keep track of the symfile */
2132 objfile -> sym_private = xmmalloc (objfile -> md,
2133 sizeof (struct coff_symfile_info));
2134 init_entry_point_info (objfile);
2135 }
2136
2137 /* Perform any local cleanups required when we are done with a particular
2138 objfile. I.E, we are in the process of discarding all symbol information
2139 for an objfile, freeing up all memory held for it, and unlinking the
2140 objfile struct from the global list of known objfiles. */
2141
2142 static void
2143 aixcoff_symfile_finish (objfile)
2144 struct objfile *objfile;
2145 {
2146 if (objfile -> sym_private != NULL)
2147 {
2148 mfree (objfile -> md, objfile -> sym_private);
2149 }
2150
2151 /* Start with a fresh include table for the next objfile. */
2152
2153 if (inclTable)
2154 {
2155 free (inclTable);
2156 inclTable = NULL;
2157 }
2158 inclIndx = inclLength = inclDepth = 0;
2159 }
2160
2161
2162 static int
2163 init_stringtab(abfd, offset, objfile)
2164 bfd *abfd;
2165 long offset;
2166 struct objfile *objfile;
2167 {
2168 long length;
2169 int val;
2170 unsigned char lengthbuf[4];
2171
2172 if (bfd_seek(abfd, offset, 0) < 0)
2173 return -1;
2174
2175 val = bfd_read((char *)lengthbuf, 1, sizeof lengthbuf, abfd);
2176 length = bfd_h_get_32(abfd, lengthbuf);
2177
2178 /* If no string table is needed, then the file may end immediately
2179 after the symbols. Just return with `strtbl' set to null. */
2180
2181 if (val != sizeof length || length < sizeof length)
2182 return 0;
2183
2184 /* Allocate string table from symbol_obstack. We will need this table
2185 as long as we have its symbol table around. */
2186
2187 strtbl = (char*) obstack_alloc (&objfile->symbol_obstack, length);
2188 if (strtbl == NULL)
2189 return -1;
2190
2191 bcopy(&length, strtbl, sizeof length);
2192 if (length == sizeof length)
2193 return 0;
2194
2195 val = bfd_read(strtbl + sizeof length, 1, length - sizeof length, abfd);
2196
2197 if (val != length - sizeof length || strtbl[length - 1] != '\0')
2198 return -1;
2199
2200 return 0;
2201 }
2202
2203 static int
2204 init_debugsection(abfd)
2205 bfd *abfd;
2206 {
2207 register sec_ptr secp;
2208 bfd_size_type length;
2209
2210 if (debugsec) {
2211 free(debugsec);
2212 debugsec = NULL;
2213 }
2214
2215 secp = bfd_get_section_by_name(abfd, ".debug");
2216 if (!secp)
2217 return 0;
2218
2219 if (!(length = bfd_section_size(abfd, secp)))
2220 return 0;
2221
2222 debugsec = (char *) xmalloc ((unsigned)length);
2223 if (debugsec == NULL)
2224 return -1;
2225
2226 if (!bfd_get_section_contents(abfd, secp, debugsec, (file_ptr) 0, length)) {
2227 printf ("Can't read .debug section from symbol file\n");
2228 return -1;
2229 }
2230 return 0;
2231 }
2232
2233 static void
2234 free_debugsection()
2235 {
2236 if (debugsec)
2237 free(debugsec);
2238 debugsec = NULL;
2239 }
2240
2241
2242 /* aixcoff version of symbol file read. */
2243
2244 static void
2245 aixcoff_symfile_read (objfile, section_offset, mainline)
2246 struct objfile *objfile;
2247 struct section_offset *section_offset;
2248 int mainline;
2249 {
2250 int num_symbols; /* # of symbols */
2251 int symtab_offset; /* symbol table and */
2252 int stringtab_offset; /* string table file offsets */
2253 int val;
2254 bfd *abfd;
2255 struct coff_symfile_info *info;
2256 char *name;
2257
2258 info = (struct coff_symfile_info *) objfile -> sym_private;
2259 symfile_bfd = abfd = objfile->obfd;
2260 name = objfile->name;
2261
2262 num_symbols = bfd_get_symcount (abfd); /* # of symbols */
2263 symtab_offset = obj_sym_filepos (abfd); /* symbol table file offset */
2264 stringtab_offset = symtab_offset +
2265 num_symbols * coff_data(abfd)->local_symesz;
2266
2267 info->min_lineno_offset = 0;
2268 info->max_lineno_offset = 0;
2269 bfd_map_over_sections (abfd, find_linenos, info);
2270
2271 /* FIXME! This stuff should move into symfile_init */
2272 if (info->min_lineno_offset != 0
2273 && info->max_lineno_offset > info->min_lineno_offset) {
2274
2275 /* only read in the line # table if one exists */
2276 val = init_lineno(abfd, info->min_lineno_offset,
2277 info->max_lineno_offset - info->min_lineno_offset);
2278
2279 if (val < 0)
2280 error("\"%s\": error reading line numbers\n", name);
2281 }
2282
2283 val = init_stringtab(abfd, stringtab_offset, objfile);
2284 if (val < 0) {
2285 error ("\"%s\": can't get string table", name);
2286 }
2287
2288 if (init_debugsection(abfd) < 0) {
2289 error ("Error reading .debug section of `%s'\n", name);
2290 }
2291
2292 /* Position to read the symbol table. Do not read it all at once. */
2293 val = bfd_seek(abfd, (long)symtab_offset, 0);
2294 if (val < 0)
2295 perror_with_name(name);
2296
2297 if (bfd_tell(abfd) != symtab_offset)
2298 fatal("bfd? BFD!");
2299
2300 init_minimal_symbol_collection ();
2301 make_cleanup (discard_minimal_symbols, 0);
2302
2303 /* Initialize load info structure. */
2304 if (mainline)
2305 xcoff_init_loadinfo ();
2306
2307 /* Now that the executable file is positioned at symbol table,
2308 process it and define symbols accordingly. */
2309
2310 read_xcoff_symtab(objfile, num_symbols);
2311
2312 /* Free debug section. */
2313 free_debugsection ();
2314
2315 /* Sort symbols alphabetically within each block. */
2316 sort_syms ();
2317
2318 /* Install any minimal symbols that have been collected as the current
2319 minimal symbols for this objfile. */
2320
2321 install_minimal_symbols (objfile);
2322
2323 /* Make a default for file to list. */
2324 select_source_symtab (0);
2325 }
2326
2327 /* XCOFF-specific parsing routine for section offsets.
2328 Plain and simple for now. */
2329
2330 static
2331 struct section_offsets *
2332 aixcoff_symfile_offsets (objfile, addr)
2333 struct objfile *objfile;
2334 CORE_ADDR addr;
2335 {
2336 struct section_offsets *section_offsets;
2337 int i;
2338
2339 section_offsets = (struct section_offsets *)
2340 obstack_alloc (&objfile -> psymbol_obstack,
2341 sizeof (struct section_offsets) +
2342 sizeof (section_offsets->offsets) * (SECT_OFF_MAX-1));
2343
2344 for (i = 0; i < SECT_OFF_MAX; i++)
2345 ANOFFSET (section_offsets, i) = addr;
2346
2347 return section_offsets;
2348 }
2349 /* Register our ability to parse symbols for aixcoff BFD files. */
2350
2351 static struct sym_fns aixcoff_sym_fns =
2352 {
2353 "aixcoff-rs6000", /* sym_name: name or name prefix of BFD target type */
2354 15, /* sym_namelen: number of significant sym_name chars */
2355 aixcoff_new_init, /* sym_new_init: init anything gbl to entire symtab */
2356 aixcoff_symfile_init, /* sym_init: read initial info, setup for sym_read() */
2357 aixcoff_symfile_read, /* sym_read: read a symbol file into symtab */
2358 aixcoff_symfile_finish, /* sym_finish: finished with file, cleanup */
2359 aixcoff_symfile_offsets, /* sym_offsets: xlate offsets ext->int form */
2360 NULL /* next: pointer to next struct sym_fns */
2361 };
2362
2363 void
2364 _initialize_xcoffread ()
2365 {
2366 add_symtab_fns(&aixcoff_sym_fns);
2367 }
2368
2369 #else /* IBM6000_HOST */
2370 struct type *
2371 builtin_type (ignore)
2372 char **ignore;
2373 {
2374 fatal ("GDB internal eror: builtin_type called on non-RS/6000!");
2375 }
2376 #endif /* IBM6000_HOST */