* inftarg.c (child_thread_alive): New function to see if a
[deliverable/binutils-gdb.git] / gdb / xcoffread.c
1 /* Read AIX xcoff symbol tables and convert to internal format, for GDB.
2 Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995
3 Free Software Foundation, Inc.
4 Derived from coffread.c, dbxread.c, and a lot of hacking.
5 Contributed by IBM Corporation.
6
7 This file is part of GDB.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
22
23 /* Native only: Need struct tbtable in <sys/debug.h> from host, and
24 need xcoff_add_toc_to_loadinfo in rs6000-tdep.c from target.
25 need xcoff_init_loadinfo ditto.
26 However, if you grab <sys/debug.h> and make it available on your
27 host, and define FAKING_RS6000, then this code will compile. */
28
29 #include "defs.h"
30 #include "bfd.h"
31
32 #include <sys/types.h>
33 #include <fcntl.h>
34 #include <ctype.h>
35 #include <string.h>
36
37 #include "obstack.h"
38 #include <sys/param.h>
39 #ifndef NO_SYS_FILE
40 #include <sys/file.h>
41 #endif
42 #include <sys/stat.h>
43 #include <sys/debug.h>
44
45 #include "coff/internal.h"
46 #include "libcoff.h" /* FIXME, internal data from BFD */
47 #include "coff/rs6000.h"
48
49 #include "symtab.h"
50 #include "gdbtypes.h"
51 #include "symfile.h"
52 #include "objfiles.h"
53 #include "buildsym.h"
54 #include "stabsread.h"
55 #include "complaints.h"
56
57 #include "gdb-stabs.h"
58
59 /* For interface with stabsread.c. */
60 #include "aout/stab_gnu.h"
61
62 /* For interface with partial-stab.h. */
63 #define N_UNDF 0 /* Undefined symbol */
64 #undef N_ABS
65 #define N_ABS 2
66 #define N_TEXT 4 /* Text sym -- defined at offset in text seg */
67 #define N_DATA 6 /* Data sym -- defined at offset in data seg */
68 #define N_BSS 8 /* BSS sym -- defined at offset in zero'd seg */
69 #define N_COMM 0x12 /* Common symbol (visible after shared lib dynlink) */
70 #define N_FN 0x1f /* File name of .o file */
71 #define N_FN_SEQ 0x0C /* N_FN from Sequent compilers (sigh) */
72 /* Note: N_EXT can only be usefully OR-ed with N_UNDF, N_ABS, N_TEXT,
73 N_DATA, or N_BSS. When the low-order bit of other types is set,
74 (e.g. N_WARNING versus N_FN), they are two different types. */
75 #define N_EXT 1 /* External symbol (as opposed to local-to-this-file) */
76 #define N_INDR 0x0a
77
78 /* The following symbols refer to set elements.
79 All the N_SET[ATDB] symbols with the same name form one set.
80 Space is allocated for the set in the text section, and each set
81 elements value is stored into one word of the space.
82 The first word of the space is the length of the set (number of elements).
83
84 The address of the set is made into an N_SETV symbol
85 whose name is the same as the name of the set.
86 This symbol acts like a N_DATA global symbol
87 in that it can satisfy undefined external references. */
88
89 /* These appear as input to LD, in a .o file. */
90 #define N_SETA 0x14 /* Absolute set element symbol */
91 #define N_SETT 0x16 /* Text set element symbol */
92 #define N_SETD 0x18 /* Data set element symbol */
93 #define N_SETB 0x1A /* Bss set element symbol */
94
95 /* This is output from LD. */
96 #define N_SETV 0x1C /* Pointer to set vector in data area. */
97 \f
98 /* We put a pointer to this structure in the read_symtab_private field
99 of the psymtab. */
100
101 struct symloc {
102
103 /* First symbol number for this file. */
104
105 int first_symnum;
106
107 /* Number of symbols in the section of the symbol table devoted to
108 this file's symbols (actually, the section bracketed may contain
109 more than just this file's symbols). If numsyms is 0, the only
110 reason for this thing's existence is the dependency list. Nothing
111 else will happen when it is read in. */
112
113 int numsyms;
114
115 /* Position of the start of the line number information for this psymtab. */
116 unsigned int lineno_off;
117 };
118
119 /* Remember what we deduced to be the source language of this psymtab. */
120
121 static enum language psymtab_language = language_unknown;
122
123 \f
124 /* Simplified internal version of coff symbol table information */
125
126 struct coff_symbol {
127 char *c_name;
128 int c_symnum; /* symbol number of this entry */
129 int c_naux; /* 0 if syment only, 1 if syment + auxent */
130 long c_value;
131 unsigned char c_sclass;
132 int c_secnum;
133 unsigned int c_type;
134 };
135
136 /* The COFF line table, in raw form. */
137 static char *linetab = NULL; /* Its actual contents */
138 static long linetab_offset; /* Its offset in the file */
139 static unsigned long linetab_size; /* Its size */
140
141 /* last function's saved coff symbol `cs' */
142
143 static struct coff_symbol fcn_cs_saved;
144
145 static bfd *symfile_bfd;
146
147 /* Core address of start and end of text of current source file.
148 This is calculated from the first function seen after a C_FILE
149 symbol. */
150
151
152 static CORE_ADDR cur_src_end_addr;
153
154 /* Core address of the end of the first object file. */
155
156 static CORE_ADDR first_object_file_end;
157
158 /* initial symbol-table-debug-string vector length */
159
160 #define INITIAL_STABVECTOR_LENGTH 40
161
162 /* Nonzero if within a function (so symbols should be local,
163 if nothing says specifically). */
164
165 int within_function;
166
167 /* Size of a COFF symbol. I think it is always 18, so I'm not sure
168 there is any reason not to just use a #define, but might as well
169 ask BFD for the size and store it here, I guess. */
170
171 static unsigned local_symesz;
172
173 struct coff_symfile_info {
174 file_ptr min_lineno_offset; /* Where in file lowest line#s are */
175 file_ptr max_lineno_offset; /* 1+last byte of line#s in file */
176
177 /* Pointer to the string table. */
178 char *strtbl;
179
180 /* Pointer to debug section. */
181 char *debugsec;
182
183 /* Pointer to the a.out symbol table. */
184 char *symtbl;
185
186 /* Number of symbols in symtbl. */
187 int symtbl_num_syms;
188 };
189
190 static struct complaint rsym_complaint =
191 {"Non-stab C_RSYM `%s' needs special handling", 0, 0};
192
193 static struct complaint storclass_complaint =
194 {"Unexpected storage class: %d", 0, 0};
195
196 static struct complaint bf_notfound_complaint =
197 {"line numbers off, `.bf' symbol not found", 0, 0};
198
199 extern struct complaint ef_complaint;
200 extern struct complaint eb_complaint;
201
202 static void
203 enter_line_range PARAMS ((struct subfile *, unsigned, unsigned,
204 CORE_ADDR, CORE_ADDR, unsigned *));
205
206 static void
207 init_stringtab PARAMS ((bfd *, file_ptr, struct objfile *));
208
209 static void
210 xcoff_symfile_init PARAMS ((struct objfile *));
211
212 static void
213 xcoff_new_init PARAMS ((struct objfile *));
214
215 static void
216 xcoff_symfile_finish PARAMS ((struct objfile *));
217
218 static struct section_offsets *
219 xcoff_symfile_offsets PARAMS ((struct objfile *, CORE_ADDR));
220
221 static void
222 find_linenos PARAMS ((bfd *, sec_ptr, PTR));
223
224 static char *
225 coff_getfilename PARAMS ((union internal_auxent *, struct objfile *));
226
227 static void
228 read_symbol PARAMS ((struct internal_syment *, int));
229
230 static int
231 read_symbol_lineno PARAMS ((int));
232
233 static int
234 read_symbol_nvalue PARAMS ((int));
235
236 static struct symbol *
237 process_xcoff_symbol PARAMS ((struct coff_symbol *, struct objfile *));
238
239 static void
240 read_xcoff_symtab PARAMS ((struct partial_symtab *));
241
242 static void
243 add_stab_to_list PARAMS ((char *, struct pending_stabs **));
244
245 \f
246 /* Translate from a COFF section number (target_index) to a SECT_OFF_*
247 code. */
248 static int secnum_to_section PARAMS ((int, struct objfile *));
249
250 struct find_targ_sec_arg {
251 int targ_index;
252 int *resultp;
253 };
254
255 static void find_targ_sec PARAMS ((bfd *, asection *, void *));
256
257 static void find_targ_sec (abfd, sect, obj)
258 bfd *abfd;
259 asection *sect;
260 PTR obj;
261 {
262 struct find_targ_sec_arg *args = (struct find_targ_sec_arg *)obj;
263 if (sect->target_index == args->targ_index)
264 {
265 /* This is the section. Figure out what SECT_OFF_* code it is. */
266 if (bfd_get_section_flags (abfd, sect) & SEC_CODE)
267 *args->resultp = SECT_OFF_TEXT;
268 else if (bfd_get_section_flags (abfd, sect) & SEC_LOAD)
269 *args->resultp = SECT_OFF_DATA;
270 else
271 *args->resultp = SECT_OFF_BSS;
272 }
273 }
274
275 /* Return the section number (SECT_OFF_*) that CS points to. */
276 static int
277 secnum_to_section (secnum, objfile)
278 int secnum;
279 struct objfile *objfile;
280 {
281 int off = SECT_OFF_TEXT;
282 struct find_targ_sec_arg args;
283 args.targ_index = secnum;
284 args.resultp = &off;
285 bfd_map_over_sections (objfile->obfd, find_targ_sec, &args);
286 return off;
287 }
288 \f
289 /* add a given stab string into given stab vector. */
290
291 static void
292 add_stab_to_list (stabname, stabvector)
293 char *stabname;
294 struct pending_stabs **stabvector;
295 {
296 if ( *stabvector == NULL) {
297 *stabvector = (struct pending_stabs *)
298 xmalloc (sizeof (struct pending_stabs) +
299 INITIAL_STABVECTOR_LENGTH * sizeof (char*));
300 (*stabvector)->count = 0;
301 (*stabvector)->length = INITIAL_STABVECTOR_LENGTH;
302 }
303 else if ((*stabvector)->count >= (*stabvector)->length) {
304 (*stabvector)->length += INITIAL_STABVECTOR_LENGTH;
305 *stabvector = (struct pending_stabs *)
306 xrealloc ((char *) *stabvector, sizeof (struct pending_stabs) +
307 (*stabvector)->length * sizeof (char*));
308 }
309 (*stabvector)->stab [(*stabvector)->count++] = stabname;
310 }
311 \f
312 /* Linenos are processed on a file-by-file basis.
313
314 Two reasons:
315
316 1) xlc (IBM's native c compiler) postpones static function code
317 emission to the end of a compilation unit. This way it can
318 determine if those functions (statics) are needed or not, and
319 can do some garbage collection (I think). This makes line
320 numbers and corresponding addresses unordered, and we end up
321 with a line table like:
322
323
324 lineno addr
325 foo() 10 0x100
326 20 0x200
327 30 0x300
328
329 foo3() 70 0x400
330 80 0x500
331 90 0x600
332
333 static foo2()
334 40 0x700
335 50 0x800
336 60 0x900
337
338 and that breaks gdb's binary search on line numbers, if the
339 above table is not sorted on line numbers. And that sort
340 should be on function based, since gcc can emit line numbers
341 like:
342
343 10 0x100 - for the init/test part of a for stmt.
344 20 0x200
345 30 0x300
346 10 0x400 - for the increment part of a for stmt.
347
348 arrange_linetable() will do this sorting.
349
350 2) aix symbol table might look like:
351
352 c_file // beginning of a new file
353 .bi // beginning of include file
354 .ei // end of include file
355 .bi
356 .ei
357
358 basically, .bi/.ei pairs do not necessarily encapsulate
359 their scope. They need to be recorded, and processed later
360 on when we come the end of the compilation unit.
361 Include table (inclTable) and process_linenos() handle
362 that. */
363
364 /* compare line table entry addresses. */
365
366 static int
367 compare_lte (lte1, lte2)
368 struct linetable_entry *lte1, *lte2;
369 {
370 return lte1->pc - lte2->pc;
371 }
372
373 /* Give a line table with function entries are marked, arrange its functions
374 in assending order and strip off function entry markers and return it in
375 a newly created table. If the old one is good enough, return the old one. */
376 /* FIXME: I think all this stuff can be replaced by just passing
377 sort_linevec = 1 to end_symtab. */
378
379 static struct linetable *
380 arrange_linetable (oldLineTb)
381 struct linetable *oldLineTb; /* old linetable */
382 {
383 int ii, jj,
384 newline, /* new line count */
385 function_count; /* # of functions */
386
387 struct linetable_entry *fentry; /* function entry vector */
388 int fentry_size; /* # of function entries */
389 struct linetable *newLineTb; /* new line table */
390
391 #define NUM_OF_FUNCTIONS 20
392
393 fentry_size = NUM_OF_FUNCTIONS;
394 fentry = (struct linetable_entry*)
395 xmalloc (fentry_size * sizeof (struct linetable_entry));
396
397 for (function_count=0, ii=0; ii <oldLineTb->nitems; ++ii) {
398
399 if (oldLineTb->item[ii].line == 0) { /* function entry found. */
400
401 if (function_count >= fentry_size) { /* make sure you have room. */
402 fentry_size *= 2;
403 fentry = (struct linetable_entry*)
404 xrealloc (fentry, fentry_size * sizeof (struct linetable_entry));
405 }
406 fentry[function_count].line = ii;
407 fentry[function_count].pc = oldLineTb->item[ii].pc;
408 ++function_count;
409 }
410 }
411
412 if (function_count == 0) {
413 free (fentry);
414 return oldLineTb;
415 }
416 else if (function_count > 1)
417 qsort (fentry, function_count, sizeof(struct linetable_entry), compare_lte);
418
419 /* allocate a new line table. */
420 newLineTb = (struct linetable *)
421 xmalloc
422 (sizeof (struct linetable) +
423 (oldLineTb->nitems - function_count) * sizeof (struct linetable_entry));
424
425 /* if line table does not start with a function beginning, copy up until
426 a function begin. */
427
428 newline = 0;
429 if (oldLineTb->item[0].line != 0)
430 for (newline=0;
431 newline < oldLineTb->nitems && oldLineTb->item[newline].line; ++newline)
432 newLineTb->item[newline] = oldLineTb->item[newline];
433
434 /* Now copy function lines one by one. */
435
436 for (ii=0; ii < function_count; ++ii) {
437 for (jj = fentry[ii].line + 1;
438 jj < oldLineTb->nitems && oldLineTb->item[jj].line != 0;
439 ++jj, ++newline)
440 newLineTb->item[newline] = oldLineTb->item[jj];
441 }
442 free (fentry);
443 newLineTb->nitems = oldLineTb->nitems - function_count;
444 return newLineTb;
445 }
446
447 /* include file support: C_BINCL/C_EINCL pairs will be kept in the
448 following `IncludeChain'. At the end of each symtab (end_symtab),
449 we will determine if we should create additional symtab's to
450 represent if (the include files. */
451
452
453 typedef struct _inclTable {
454 char *name; /* include filename */
455
456 /* Offsets to the line table. end points to the last entry which is
457 part of this include file. */
458 int begin, end;
459
460 struct subfile *subfile;
461 unsigned funStartLine; /* start line # of its function */
462 } InclTable;
463
464 #define INITIAL_INCLUDE_TABLE_LENGTH 20
465 static InclTable *inclTable; /* global include table */
466 static int inclIndx; /* last entry to table */
467 static int inclLength; /* table length */
468 static int inclDepth; /* nested include depth */
469
470 static void allocate_include_entry PARAMS ((void));
471
472 static void
473 record_include_begin (cs)
474 struct coff_symbol *cs;
475 {
476 if (inclDepth)
477 {
478 /* In xcoff, we assume include files cannot be nested (not in .c files
479 of course, but in corresponding .s files.). */
480
481 /* This can happen with old versions of GCC.
482 GCC 2.3.3-930426 does not exhibit this on a test case which
483 a user said produced the message for him. */
484 static struct complaint msg = {"Nested C_BINCL symbols", 0, 0};
485 complain (&msg);
486 }
487 ++inclDepth;
488
489 allocate_include_entry ();
490
491 inclTable [inclIndx].name = cs->c_name;
492 inclTable [inclIndx].begin = cs->c_value;
493 }
494
495 static void
496 record_include_end (cs)
497 struct coff_symbol *cs;
498 {
499 InclTable *pTbl;
500
501 if (inclDepth == 0)
502 {
503 static struct complaint msg = {"Mismatched C_BINCL/C_EINCL pair", 0, 0};
504 complain (&msg);
505 }
506
507 allocate_include_entry ();
508
509 pTbl = &inclTable [inclIndx];
510 pTbl->end = cs->c_value;
511
512 --inclDepth;
513 ++inclIndx;
514 }
515
516 static void
517 allocate_include_entry ()
518 {
519 if (inclTable == NULL)
520 {
521 inclTable = (InclTable *)
522 xmalloc (sizeof (InclTable) * INITIAL_INCLUDE_TABLE_LENGTH);
523 memset (inclTable,
524 '\0', sizeof (InclTable) * INITIAL_INCLUDE_TABLE_LENGTH);
525 inclLength = INITIAL_INCLUDE_TABLE_LENGTH;
526 inclIndx = 0;
527 }
528 else if (inclIndx >= inclLength)
529 {
530 inclLength += INITIAL_INCLUDE_TABLE_LENGTH;
531 inclTable = (InclTable *)
532 xrealloc (inclTable, sizeof (InclTable) * inclLength);
533 memset (inclTable + inclLength - INITIAL_INCLUDE_TABLE_LENGTH,
534 '\0', sizeof (InclTable)*INITIAL_INCLUDE_TABLE_LENGTH);
535 }
536 }
537
538 /* Global variable to pass the psymtab down to all the routines involved
539 in psymtab to symtab processing. */
540 static struct partial_symtab *this_symtab_psymtab;
541
542 /* given the start and end addresses of a compilation unit (or a csect,
543 at times) process its lines and create appropriate line vectors. */
544
545 static void
546 process_linenos (start, end)
547 CORE_ADDR start, end;
548 {
549 char *pp;
550 int offset, ii;
551 file_ptr max_offset =
552 ((struct coff_symfile_info *)this_symtab_psymtab->objfile->sym_private)
553 ->max_lineno_offset;
554
555 /* subfile structure for the main compilation unit. */
556 struct subfile main_subfile;
557
558 /* In the main source file, any time we see a function entry, we
559 reset this variable to function's absolute starting line number.
560 All the following line numbers in the function are relative to
561 this, and we record absolute line numbers in record_line(). */
562
563 int main_source_baseline = 0;
564
565 unsigned *firstLine;
566 CORE_ADDR addr;
567
568 offset =
569 ((struct symloc *)this_symtab_psymtab->read_symtab_private)->lineno_off;
570 if (offset == 0)
571 goto return_after_cleanup;
572
573 memset (&main_subfile, '\0', sizeof (main_subfile));
574
575 if (inclIndx == 0)
576 /* All source lines were in the main source file. None in include files. */
577
578 enter_line_range (&main_subfile, offset, 0, start, end,
579 &main_source_baseline);
580
581 else
582 {
583 /* There was source with line numbers in include files. */
584 main_source_baseline = 0;
585 for (ii=0; ii < inclIndx; ++ii)
586 {
587 struct subfile *tmpSubfile;
588
589 /* If there is main file source before include file, enter it. */
590 if (offset < inclTable[ii].begin)
591 {
592 enter_line_range
593 (&main_subfile, offset, inclTable[ii].begin - LINESZ,
594 start, 0, &main_source_baseline);
595 }
596
597 /* Have a new subfile for the include file. */
598
599 tmpSubfile = inclTable[ii].subfile =
600 (struct subfile *) xmalloc (sizeof (struct subfile));
601
602 memset (tmpSubfile, '\0', sizeof (struct subfile));
603 firstLine = &(inclTable[ii].funStartLine);
604
605 /* Enter include file's lines now. */
606 enter_line_range (tmpSubfile, inclTable[ii].begin,
607 inclTable[ii].end, start, 0, firstLine);
608
609 offset = inclTable[ii].end + LINESZ;
610 }
611
612 /* All the include files' line have been processed at this point. Now,
613 enter remaining lines of the main file, if any left. */
614 if (offset < max_offset + 1 - LINESZ)
615 {
616 enter_line_range (&main_subfile, offset, 0, start, end,
617 &main_source_baseline);
618 }
619 }
620
621 /* Process main file's line numbers. */
622 if (main_subfile.line_vector)
623 {
624 struct linetable *lineTb, *lv;
625
626 lv = main_subfile.line_vector;
627
628 /* Line numbers are not necessarily ordered. xlc compilation will
629 put static function to the end. */
630
631 lineTb = arrange_linetable (lv);
632 if (lv == lineTb)
633 {
634 current_subfile->line_vector = (struct linetable *)
635 xrealloc (lv, (sizeof (struct linetable)
636 + lv->nitems * sizeof (struct linetable_entry)));
637 }
638 else
639 {
640 free (lv);
641 current_subfile->line_vector = lineTb;
642 }
643
644 current_subfile->line_vector_length =
645 current_subfile->line_vector->nitems;
646 }
647
648 /* Now, process included files' line numbers. */
649
650 for (ii=0; ii < inclIndx; ++ii)
651 {
652 if ((inclTable[ii].subfile)->line_vector) /* Useless if!!! FIXMEmgo */
653 {
654 struct linetable *lineTb, *lv;
655
656 lv = (inclTable[ii].subfile)->line_vector;
657
658 /* Line numbers are not necessarily ordered. xlc compilation will
659 put static function to the end. */
660
661 lineTb = arrange_linetable (lv);
662
663 push_subfile ();
664
665 /* For the same include file, we might want to have more than one
666 subfile. This happens if we have something like:
667
668 ......
669 #include "foo.h"
670 ......
671 #include "foo.h"
672 ......
673
674 while foo.h including code in it. (stupid but possible)
675 Since start_subfile() looks at the name and uses an
676 existing one if finds, we need to provide a fake name and
677 fool it. */
678
679 #if 0
680 start_subfile (inclTable[ii].name, (char*)0);
681 #else
682 {
683 /* Pick a fake name that will produce the same results as this
684 one when passed to deduce_language_from_filename. Kludge on
685 top of kludge. */
686 char *fakename = strrchr (inclTable[ii].name, '.');
687 if (fakename == NULL)
688 fakename = " ?";
689 start_subfile (fakename, (char*)0);
690 free (current_subfile->name);
691 }
692 current_subfile->name = strdup (inclTable[ii].name);
693 #endif
694
695 if (lv == lineTb)
696 {
697 current_subfile->line_vector =
698 (struct linetable *) xrealloc
699 (lv, (sizeof (struct linetable)
700 + lv->nitems * sizeof (struct linetable_entry)));
701
702 }
703 else
704 {
705 free (lv);
706 current_subfile->line_vector = lineTb;
707 }
708
709 current_subfile->line_vector_length =
710 current_subfile->line_vector->nitems;
711 start_subfile (pop_subfile (), (char*)0);
712 }
713 }
714
715 return_after_cleanup:
716
717 /* We don't want to keep alloc/free'ing the global include file table. */
718 inclIndx = 0;
719
720 /* Start with a fresh subfile structure for the next file. */
721 memset (&main_subfile, '\0', sizeof (struct subfile));
722 }
723
724 void
725 aix_process_linenos ()
726 {
727 /* process line numbers and enter them into line vector */
728 process_linenos (last_source_start_addr, cur_src_end_addr);
729 }
730
731
732 /* Enter a given range of lines into the line vector.
733 can be called in the following two ways:
734 enter_line_range (subfile, beginoffset, endoffset, startaddr, 0, firstLine) or
735 enter_line_range (subfile, beginoffset, 0, startaddr, endaddr, firstLine)
736
737 endoffset points to the last line table entry that we should pay
738 attention to. */
739
740 static void
741 enter_line_range (subfile, beginoffset, endoffset, startaddr, endaddr,
742 firstLine)
743 struct subfile *subfile;
744 unsigned beginoffset, endoffset; /* offsets to line table */
745 CORE_ADDR startaddr, endaddr;
746 unsigned *firstLine;
747 {
748 unsigned int curoffset;
749 CORE_ADDR addr;
750 struct external_lineno ext_lnno;
751 struct internal_lineno int_lnno;
752 unsigned int limit_offset;
753 bfd *abfd;
754
755 if (endoffset == 0 && startaddr == 0 && endaddr == 0)
756 return;
757 curoffset = beginoffset;
758 limit_offset =
759 ((struct coff_symfile_info *)this_symtab_psymtab->objfile->sym_private)
760 ->max_lineno_offset;
761
762 if (endoffset != 0)
763 {
764 if (endoffset >= limit_offset)
765 {
766 static struct complaint msg =
767 {"Bad line table offset in C_EINCL directive", 0, 0};
768 complain (&msg);
769 return;
770 }
771 limit_offset = endoffset;
772 }
773 else
774 limit_offset -= 1;
775 abfd = this_symtab_psymtab->objfile->obfd;
776
777 while (curoffset <= limit_offset)
778 {
779 bfd_seek (abfd, curoffset, SEEK_SET);
780 bfd_read (&ext_lnno, sizeof (struct external_lineno), 1, abfd);
781 bfd_coff_swap_lineno_in (abfd, &ext_lnno, &int_lnno);
782
783 /* Find the address this line represents. */
784 addr = (int_lnno.l_lnno
785 ? int_lnno.l_addr.l_paddr
786 : read_symbol_nvalue (int_lnno.l_addr.l_symndx));
787 addr += ANOFFSET (this_symtab_psymtab->objfile->section_offsets,
788 SECT_OFF_TEXT);
789
790 if (addr < startaddr || (endaddr && addr >= endaddr))
791 return;
792
793 if (int_lnno.l_lnno == 0)
794 {
795 *firstLine = read_symbol_lineno (int_lnno.l_addr.l_symndx);
796 record_line (subfile, 0, addr);
797 --(*firstLine);
798 }
799 else
800 record_line (subfile, *firstLine + int_lnno.l_lnno, addr);
801 curoffset += LINESZ;
802 }
803 }
804
805 typedef struct {
806 int fsize; /* file size */
807 int fixedparms; /* number of fixed parms */
808 int floatparms; /* number of float parms */
809 unsigned int parminfo; /* parameter info.
810 See /usr/include/sys/debug.h
811 tbtable_ext.parminfo */
812 int framesize; /* function frame size */
813 } TracebackInfo;
814
815 static TracebackInfo *retrieve_tracebackinfo
816 PARAMS ((bfd *, struct coff_symbol *));
817
818 /* Given a function symbol, return its traceback information. */
819
820 static TracebackInfo *
821 retrieve_tracebackinfo (abfd, cs)
822 bfd *abfd;
823 struct coff_symbol *cs;
824 {
825 #define TBTABLE_BUFSIZ 2000
826
827 static TracebackInfo tbInfo;
828 struct tbtable *ptb;
829
830 static char buffer [TBTABLE_BUFSIZ];
831
832 int *pinsn;
833 int bytesread=0; /* total # of bytes read so far */
834 int bufferbytes; /* number of bytes in the buffer */
835 int functionstart;
836
837 asection *textsec;
838
839 /* FIXME: Should be looking through all sections, based on the
840 address we are considering. Just using ".text" loses if more
841 than one section has code in it. */
842 textsec = bfd_get_section_by_name (abfd, ".text");
843 if (!textsec)
844 {
845 #if 0
846 /* If there is only data, no text, that is OK. */
847 printf_unfiltered ("Unable to locate text section!\n");
848 #endif
849 return;
850 }
851
852 functionstart = cs->c_value - textsec->vma;
853
854 memset (&tbInfo, '\0', sizeof (tbInfo));
855
856 /* keep reading blocks of data from the text section, until finding a zero
857 word and a traceback table. */
858
859 /* Note: The logical thing way to write this code would be to assign
860 to bufferbytes within the while condition. But that triggers a
861 compiler (xlc in AIX 3.2) bug, so simplify it... */
862 bufferbytes =
863 (TBTABLE_BUFSIZ < (textsec->_raw_size - functionstart - bytesread) ?
864 TBTABLE_BUFSIZ : (textsec->_raw_size - functionstart - bytesread));
865 while (bufferbytes
866 && (bfd_get_section_contents
867 (abfd, textsec, buffer,
868 (file_ptr)(functionstart + bytesread), bufferbytes)))
869 {
870 bytesread += bufferbytes;
871 pinsn = (int*) buffer;
872
873 /* If this is the first time we filled the buffer, retrieve function
874 framesize info. */
875
876 if (bytesread == bufferbytes) {
877
878 /* skip over unrelated instructions */
879
880 if (*pinsn == 0x7c0802a6) /* mflr r0 */
881 ++pinsn;
882 if ((*pinsn & 0xfc00003e) == 0x7c000026) /* mfcr Rx */
883 ++pinsn;
884 if ((*pinsn & 0xfc000000) == 0x48000000) /* bl foo, save fprs */
885 ++pinsn;
886 if ((*pinsn & 0xfc1f0000) == 0xbc010000) /* stm Rx, NUM(r1) */
887 ++pinsn;
888
889 do {
890 int tmp = (*pinsn >> 16) & 0xffff;
891
892 if (tmp == 0x9421) { /* stu r1, NUM(r1) */
893 tbInfo.framesize = 0x10000 - (*pinsn & 0xffff);
894 break;
895 }
896 else if ((*pinsn == 0x93e1fffc) || /* st r31,-4(r1) */
897 (tmp == 0x9001)) /* st r0, NUM(r1) */
898 ;
899 /* else, could not find a frame size. */
900 else
901 return NULL;
902
903 } while (++pinsn && *pinsn);
904
905 if (!tbInfo.framesize)
906 return NULL;
907
908 }
909
910 /* look for a zero word. */
911
912 while (*pinsn && (pinsn < (int*)(buffer + bufferbytes - sizeof(int))))
913 ++pinsn;
914
915 if (pinsn >= (int*)(buffer + bufferbytes))
916 continue;
917
918 if (*pinsn == 0) {
919
920 /* function size is the amount of bytes we have skipped so far. */
921 tbInfo.fsize = bytesread - (buffer + bufferbytes - (char*)pinsn);
922
923 ++pinsn;
924
925 /* if we don't have the whole traceback table in the buffer, re-read
926 the whole thing. */
927
928 /* This is how much to read to get the traceback table.
929 8 bytes of the traceback table are always present, plus we
930 look at parminfo. */
931 #define MIN_TBTABSIZ 12
932
933 if ((char*)pinsn > (buffer + bufferbytes - MIN_TBTABSIZ)) {
934
935 /* In case if we are *very* close to the end of the text section
936 and cannot read properly from that point on, abort by returning
937 NULL.
938
939 This could happen if the traceback table is only 8 bytes,
940 but we try to read 12 bytes of it.
941 Handle this case more graciously -- FIXME */
942
943 if (!bfd_get_section_contents (
944 abfd, textsec, buffer,
945 (file_ptr)(functionstart +
946 bytesread - (buffer + bufferbytes - (char*)pinsn)),MIN_TBTABSIZ))
947 { printf_unfiltered ("Abnormal return!..\n"); return NULL; }
948
949 ptb = (struct tbtable *)buffer;
950 }
951 else
952 ptb = (struct tbtable *)pinsn;
953
954 tbInfo.fixedparms = ptb->tb.fixedparms;
955 tbInfo.floatparms = ptb->tb.floatparms;
956 tbInfo.parminfo = ptb->tb_ext.parminfo;
957 return &tbInfo;
958 }
959 bufferbytes =
960 (TBTABLE_BUFSIZ < (textsec->_raw_size - functionstart - bytesread) ?
961 TBTABLE_BUFSIZ : (textsec->_raw_size - functionstart - bytesread));
962 }
963 return NULL;
964 }
965
966 /* Save the vital information for use when closing off the current file.
967 NAME is the file name the symbols came from, START_ADDR is the first
968 text address for the file, and SIZE is the number of bytes of text. */
969
970 #define complete_symtab(name, start_addr) { \
971 last_source_file = savestring (name, strlen (name)); \
972 last_source_start_addr = start_addr; \
973 }
974
975
976 /* Refill the symbol table input buffer
977 and set the variables that control fetching entries from it.
978 Reports an error if no data available.
979 This function can read past the end of the symbol table
980 (into the string table) but this does no harm. */
981
982 /* Reading symbol table has to be fast! Keep the followings as macros, rather
983 than functions. */
984
985 #define RECORD_MINIMAL_SYMBOL(NAME, ADDR, TYPE, SECTION, OBJFILE) \
986 { \
987 char *namestr; \
988 namestr = (NAME); \
989 if (namestr[0] == '.') ++namestr; \
990 prim_record_minimal_symbol_and_info (namestr, (ADDR), (TYPE), \
991 (char *)NULL, (SECTION), (OBJFILE)); \
992 misc_func_recorded = 1; \
993 }
994
995
996 /* A parameter template, used by ADD_PARM_TO_PENDING. It is initialized
997 in our initializer function at the bottom of the file, to avoid
998 dependencies on the exact "struct symbol" format. */
999
1000 static struct symbol parmsym;
1001
1002 /* Add a parameter to a given pending symbol list. */
1003
1004 #define ADD_PARM_TO_PENDING(PARM, VALUE, PTYPE, PENDING_SYMBOLS) \
1005 { \
1006 PARM = (struct symbol *) \
1007 obstack_alloc (&objfile->symbol_obstack, sizeof (struct symbol)); \
1008 *(PARM) = parmsym; \
1009 SYMBOL_TYPE (PARM) = PTYPE; \
1010 SYMBOL_VALUE (PARM) = VALUE; \
1011 add_symbol_to_list (PARM, &PENDING_SYMBOLS); \
1012 }
1013
1014
1015 /* xcoff has static blocks marked in `.bs', `.es' pairs. They cannot be
1016 nested. At any given time, a symbol can only be in one static block.
1017 This is the base address of current static block, zero if non exists. */
1018
1019 static int static_block_base = 0;
1020
1021 /* Section number for the current static block. */
1022
1023 static int static_block_section = -1;
1024
1025 /* true if space for symbol name has been allocated. */
1026
1027 static int symname_alloced = 0;
1028
1029 /* Next symbol to read. Pointer into raw seething symbol table. */
1030
1031 static char *raw_symbol;
1032
1033 /* This is the function which stabsread.c calls to get symbol
1034 continuations. */
1035 static char *
1036 xcoff_next_symbol_text ()
1037 {
1038 struct internal_syment symbol;
1039 static struct complaint msg =
1040 {"Unexpected symbol continuation", 0, 0};
1041 char *retval;
1042 struct objfile *objfile = this_symtab_psymtab->objfile;
1043
1044 bfd_coff_swap_sym_in (objfile->obfd, raw_symbol, &symbol);
1045 if (symbol.n_zeroes)
1046 {
1047 complain (&msg);
1048
1049 /* Return something which points to '\0' and hope the symbol reading
1050 code does something reasonable. */
1051 retval = "";
1052 }
1053 else if (symbol.n_sclass & 0x80)
1054 {
1055 retval =
1056 ((struct coff_symfile_info *)objfile->sym_private)->debugsec
1057 + symbol.n_offset;
1058 raw_symbol +=
1059 coff_data (objfile->obfd)->local_symesz;
1060 ++symnum;
1061 }
1062 else
1063 {
1064 complain (&msg);
1065
1066 /* Return something which points to '\0' and hope the symbol reading
1067 code does something reasonable. */
1068 retval = "";
1069 }
1070 return retval;
1071 }
1072
1073 /* Read symbols for a given partial symbol table. */
1074
1075 static void
1076 read_xcoff_symtab (pst)
1077 struct partial_symtab *pst;
1078 {
1079 struct objfile *objfile = pst->objfile;
1080 bfd *abfd = objfile->obfd;
1081 char *raw_auxptr; /* Pointer to first raw aux entry for sym */
1082 TracebackInfo *ptb; /* Pointer to traceback table */
1083 char *strtbl = ((struct coff_symfile_info *)objfile->sym_private)->strtbl;
1084 char *debugsec =
1085 ((struct coff_symfile_info *)objfile->sym_private)->debugsec;
1086
1087 struct internal_syment symbol[1];
1088 union internal_auxent main_aux;
1089 struct coff_symbol cs[1];
1090 CORE_ADDR file_start_addr = 0;
1091 CORE_ADDR file_end_addr = 0;
1092
1093 int next_file_symnum = -1;
1094 unsigned int max_symnum;
1095 int just_started = 1;
1096 int depth = 0;
1097 int val;
1098 int fcn_start_addr;
1099 size_t size;
1100
1101 struct coff_symbol fcn_stab_saved;
1102
1103 /* fcn_cs_saved is global because process_xcoff_symbol needs it. */
1104 union internal_auxent fcn_aux_saved;
1105 struct type *fcn_type_saved = NULL;
1106 struct context_stack *new;
1107
1108 char *filestring = " _start_ "; /* Name of the current file. */
1109
1110 char *last_csect_name; /* last seen csect's name and value */
1111 CORE_ADDR last_csect_val;
1112 int last_csect_sec;
1113 int misc_func_recorded; /* true if any misc. function */
1114
1115 this_symtab_psymtab = pst;
1116
1117 /* Get the appropriate COFF "constants" related to the file we're
1118 handling. */
1119 local_symesz = coff_data (abfd)->local_symesz;
1120
1121 last_source_file = NULL;
1122 last_csect_name = 0;
1123 last_csect_val = 0;
1124 misc_func_recorded = 0;
1125
1126 start_stabs ();
1127 start_symtab (filestring, (char *)NULL, file_start_addr);
1128 symnum = ((struct symloc *)pst->read_symtab_private)->first_symnum;
1129 max_symnum =
1130 symnum + ((struct symloc *)pst->read_symtab_private)->numsyms;
1131 first_object_file_end = 0;
1132
1133 raw_symbol =
1134 ((struct coff_symfile_info *) objfile->sym_private)->symtbl
1135 + symnum * local_symesz;
1136
1137 while (symnum < max_symnum)
1138 {
1139
1140 QUIT; /* make this command interruptable. */
1141
1142 /* READ_ONE_SYMBOL (symbol, cs, symname_alloced); */
1143 /* read one symbol into `cs' structure. After processing the
1144 whole symbol table, only string table will be kept in memory,
1145 symbol table and debug section of xcoff will be freed. Thus
1146 we can mark symbols with names in string table as
1147 `alloced'. */
1148 {
1149 int ii;
1150
1151 /* Swap and align the symbol into a reasonable C structure. */
1152 bfd_coff_swap_sym_in (abfd, raw_symbol, symbol);
1153
1154 cs->c_symnum = symnum;
1155 cs->c_naux = symbol->n_numaux;
1156 if (symbol->n_zeroes)
1157 {
1158 symname_alloced = 0;
1159 /* We must use the original, unswapped, name here so the name field
1160 pointed to by cs->c_name will persist throughout xcoffread. If
1161 we use the new field, it gets overwritten for each symbol. */
1162 cs->c_name = ((struct external_syment *)raw_symbol)->e.e_name;
1163 /* If it's exactly E_SYMNMLEN characters long it isn't
1164 '\0'-terminated. */
1165 if (cs->c_name[E_SYMNMLEN - 1] != '\0')
1166 {
1167 char *p;
1168 p = obstack_alloc (&objfile->symbol_obstack, E_SYMNMLEN + 1);
1169 strncpy (p, cs->c_name, E_SYMNMLEN);
1170 p[E_SYMNMLEN] = '\0';
1171 cs->c_name = p;
1172 symname_alloced = 1;
1173 }
1174 }
1175 else if (symbol->n_sclass & 0x80)
1176 {
1177 cs->c_name = debugsec + symbol->n_offset;
1178 symname_alloced = 0;
1179 }
1180 else
1181 {
1182 /* in string table */
1183 cs->c_name = strtbl + (int)symbol->n_offset;
1184 symname_alloced = 1;
1185 }
1186 cs->c_value = symbol->n_value;
1187 cs->c_sclass = symbol->n_sclass;
1188 cs->c_secnum = symbol->n_scnum;
1189 cs->c_type = (unsigned)symbol->n_type;
1190
1191 raw_symbol += coff_data (abfd)->local_symesz;
1192 ++symnum;
1193
1194 /* Save addr of first aux entry. */
1195 raw_auxptr = raw_symbol;
1196
1197 /* Skip all the auxents associated with this symbol. */
1198 for (ii = symbol->n_numaux; ii; --ii)
1199 {
1200 raw_symbol += coff_data (abfd)->local_auxesz;
1201 ++symnum;
1202 }
1203 }
1204
1205 /* if symbol name starts with ".$" or "$", ignore it. */
1206 if (cs->c_name[0] == '$'
1207 || (cs->c_name[1] == '$' && cs->c_name[0] == '.'))
1208 continue;
1209
1210 if (cs->c_symnum == next_file_symnum && cs->c_sclass != C_FILE)
1211 {
1212 if (last_source_file)
1213 {
1214 pst->symtab =
1215 end_symtab (cur_src_end_addr, 1, 0, objfile, SECT_OFF_TEXT);
1216 end_stabs ();
1217 }
1218
1219 start_stabs ();
1220 start_symtab ("_globals_", (char *)NULL, (CORE_ADDR)0);
1221 cur_src_end_addr = first_object_file_end;
1222 /* done with all files, everything from here on is globals */
1223 }
1224
1225 /* if explicitly specified as a function, treat is as one. */
1226 if (ISFCN(cs->c_type) && cs->c_sclass != C_TPDEF)
1227 {
1228 bfd_coff_swap_aux_in (abfd, raw_auxptr, cs->c_type, cs->c_sclass,
1229 0, cs->c_naux, &main_aux);
1230 goto function_entry_point;
1231 }
1232
1233 if ((cs->c_sclass == C_EXT || cs->c_sclass == C_HIDEXT)
1234 && cs->c_naux == 1)
1235 {
1236 /* Dealing with a symbol with a csect entry. */
1237
1238 #define CSECT(PP) ((PP)->x_csect)
1239 #define CSECT_LEN(PP) (CSECT(PP).x_scnlen.l)
1240 #define CSECT_ALIGN(PP) (SMTYP_ALIGN(CSECT(PP).x_smtyp))
1241 #define CSECT_SMTYP(PP) (SMTYP_SMTYP(CSECT(PP).x_smtyp))
1242 #define CSECT_SCLAS(PP) (CSECT(PP).x_smclas)
1243
1244 /* Convert the auxent to something we can access. */
1245 bfd_coff_swap_aux_in (abfd, raw_auxptr, cs->c_type, cs->c_sclass,
1246 0, cs->c_naux, &main_aux);
1247
1248 switch (CSECT_SMTYP (&main_aux))
1249 {
1250
1251 case XTY_ER:
1252 /* Ignore all external references. */
1253 continue;
1254
1255 case XTY_SD:
1256 /* A section description. */
1257 {
1258 switch (CSECT_SCLAS (&main_aux))
1259 {
1260
1261 case XMC_PR:
1262 {
1263
1264 /* A program csect is seen. We have to allocate one
1265 symbol table for each program csect. Normally gdb
1266 prefers one symtab for each source file. In case
1267 of AIX, one source file might include more than one
1268 [PR] csect, and they don't have to be adjacent in
1269 terms of the space they occupy in memory. Thus, one
1270 single source file might get fragmented in the
1271 memory and gdb's file start and end address
1272 approach does not work! GCC (and I think xlc) seem
1273 to put all the code in the unnamed program csect. */
1274
1275 if (last_csect_name)
1276 {
1277 complete_symtab (filestring, file_start_addr);
1278 cur_src_end_addr = file_end_addr;
1279 end_symtab (file_end_addr, 1, 0, objfile,
1280 SECT_OFF_TEXT);
1281 end_stabs ();
1282 start_stabs ();
1283 /* Give all csects for this source file the same
1284 name. */
1285 start_symtab (filestring, NULL, (CORE_ADDR)0);
1286 }
1287
1288 /* If this is the very first csect seen,
1289 basically `__start'. */
1290 if (just_started)
1291 {
1292 first_object_file_end
1293 = cs->c_value + CSECT_LEN (&main_aux);
1294 just_started = 0;
1295 }
1296
1297 file_start_addr =
1298 cs->c_value + ANOFFSET (objfile->section_offsets,
1299 SECT_OFF_TEXT);
1300 file_end_addr = file_start_addr + CSECT_LEN (&main_aux);
1301
1302 if (cs->c_name && cs->c_name[0] == '.')
1303 {
1304 last_csect_name = cs->c_name;
1305 last_csect_val = cs->c_value;
1306 last_csect_sec = secnum_to_section (cs->c_secnum, objfile);
1307 }
1308 }
1309 misc_func_recorded = 0;
1310 continue;
1311
1312 case XMC_RW :
1313 break;
1314
1315 /* If the section is not a data description,
1316 ignore it. Note that uninitialized data will
1317 show up as XTY_CM/XMC_RW pair. */
1318
1319 case XMC_TC0:
1320 continue;
1321
1322 case XMC_TC:
1323 continue;
1324
1325 default:
1326 /* Ignore the symbol. */
1327 continue;
1328 }
1329 }
1330 break;
1331
1332 case XTY_LD:
1333
1334 switch (CSECT_SCLAS (&main_aux))
1335 {
1336 case XMC_PR:
1337 /* a function entry point. */
1338 function_entry_point:
1339
1340 fcn_start_addr = cs->c_value;
1341
1342 /* save the function header info, which will be used
1343 when `.bf' is seen. */
1344 fcn_cs_saved = *cs;
1345 fcn_aux_saved = main_aux;
1346
1347 ptb = NULL;
1348
1349 /* If function has two auxent, then debugging information is
1350 already available for it. Process traceback table for
1351 functions with only one auxent. */
1352
1353 if (cs->c_naux == 1)
1354 ptb = retrieve_tracebackinfo (abfd, cs);
1355
1356 else if (cs->c_naux != 2)
1357 {
1358 static struct complaint msg =
1359 {"Expected one or two auxents for function", 0, 0};
1360 complain (&msg);
1361 }
1362
1363 /* If there is traceback info, create and add parameters
1364 for it. */
1365
1366 if (ptb && (ptb->fixedparms || ptb->floatparms))
1367 {
1368
1369 int parmcnt = ptb->fixedparms + ptb->floatparms;
1370 char *parmcode = (char*) &ptb->parminfo;
1371
1372 /* The link area is 0x18 bytes. */
1373 int parmvalue = ptb->framesize + 0x18;
1374 unsigned int ii, mask;
1375
1376 for (ii=0, mask = 0x80000000; ii <parmcnt; ++ii)
1377 {
1378 struct symbol *parm;
1379
1380 if (ptb->parminfo & mask)
1381 {
1382 /* float or double */
1383 mask = mask >> 1;
1384 if (ptb->parminfo & mask)
1385 {
1386 /* double parm */
1387 ADD_PARM_TO_PENDING
1388 (parm, parmvalue, builtin_type_double,
1389 local_symbols);
1390 parmvalue += sizeof (double);
1391 }
1392 else
1393 {
1394 /* float parm */
1395 ADD_PARM_TO_PENDING
1396 (parm, parmvalue, builtin_type_float,
1397 local_symbols);
1398 parmvalue += sizeof (float);
1399 }
1400 }
1401 else
1402 {
1403 static struct type *intparm_type;
1404 if (intparm_type == NULL)
1405 {
1406
1407 /* Create a type, which is a pointer
1408 type (a kludge to make it print
1409 in hex), but which has a name
1410 indicating we don't know the real
1411 type. */
1412
1413 intparm_type =
1414 init_type
1415 (TYPE_CODE_PTR,
1416 TARGET_PTR_BIT / HOST_CHAR_BIT,
1417 0,
1418 "<non-float parameter>",
1419 NULL);
1420 TYPE_TARGET_TYPE (intparm_type) =
1421 builtin_type_void;
1422 }
1423 ADD_PARM_TO_PENDING
1424 (parm, parmvalue,
1425 intparm_type,
1426 local_symbols);
1427 parmvalue += sizeof (int);
1428 }
1429 mask = mask >> 1;
1430 }
1431
1432 /* Fake this as a function. Needed in
1433 process_xcoff_symbol(). */
1434 cs->c_type = 32;
1435
1436 finish_block
1437 (process_xcoff_symbol (cs, objfile), &local_symbols,
1438 pending_blocks, cs->c_value,
1439 cs->c_value + ptb->fsize, objfile);
1440 }
1441 continue;
1442
1443 case XMC_GL:
1444 /* shared library function trampoline code entry point. */
1445 continue;
1446
1447 case XMC_DS:
1448 /* The symbols often have the same names as debug symbols for
1449 functions, and confuse lookup_symbol. */
1450 continue;
1451
1452 default:
1453 /* xlc puts each variable in a separate csect, so we get
1454 an XTY_SD for each variable. But gcc puts several
1455 variables in a csect, so that each variable only gets
1456 an XTY_LD. We still need to record them. This will
1457 typically be XMC_RW; I suspect XMC_RO and XMC_BS might
1458 be possible too. */
1459 break;
1460 }
1461
1462 default:
1463 break;
1464 }
1465 }
1466
1467 switch (cs->c_sclass)
1468 {
1469
1470 case C_FILE:
1471
1472 /* c_value field contains symnum of next .file entry in table
1473 or symnum of first global after last .file. */
1474
1475 next_file_symnum = cs->c_value;
1476
1477 /* Complete symbol table for last object file containing
1478 debugging information. */
1479
1480 /* Whether or not there was a csect in the previous file, we
1481 have to call `end_stabs' and `start_stabs' to reset
1482 type_vector, line_vector, etc. structures. */
1483
1484 complete_symtab (filestring, file_start_addr);
1485 cur_src_end_addr = file_end_addr;
1486 end_symtab (file_end_addr, 1, 0, objfile, SECT_OFF_TEXT);
1487 end_stabs ();
1488
1489 /* XCOFF, according to the AIX 3.2 documentation, puts the filename
1490 in cs->c_name. But xlc 1.3.0.2 has decided to do things the
1491 standard COFF way and put it in the auxent. We use the auxent if
1492 the symbol is ".file" and an auxent exists, otherwise use the symbol
1493 itself. Simple enough. */
1494 if (!strcmp (cs->c_name, ".file") && cs->c_naux > 0)
1495 {
1496 bfd_coff_swap_aux_in (abfd, raw_auxptr, cs->c_type, cs->c_sclass,
1497 0, cs->c_naux, &main_aux);
1498 filestring = coff_getfilename (&main_aux, objfile);
1499 }
1500 else
1501 filestring = cs->c_name;
1502
1503 start_stabs ();
1504 start_symtab (filestring, (char *)NULL, (CORE_ADDR)0);
1505 last_csect_name = 0;
1506
1507 /* reset file start and end addresses. A compilation unit with no text
1508 (only data) should have zero file boundaries. */
1509 file_start_addr = file_end_addr = 0;
1510 break;
1511
1512 case C_FUN:
1513 fcn_stab_saved = *cs;
1514 break;
1515
1516 case C_FCN:
1517 if (STREQ (cs->c_name, ".bf"))
1518 {
1519 CORE_ADDR off = ANOFFSET (objfile->section_offsets,
1520 SECT_OFF_TEXT);
1521 bfd_coff_swap_aux_in (abfd, raw_auxptr, cs->c_type, cs->c_sclass,
1522 0, cs->c_naux, &main_aux);
1523
1524 within_function = 1;
1525
1526 new = push_context (0, fcn_start_addr + off);
1527
1528 new->name = define_symbol
1529 (fcn_cs_saved.c_value + off,
1530 fcn_stab_saved.c_name, 0, 0, objfile);
1531 if (new->name != NULL)
1532 SYMBOL_SECTION (new->name) = SECT_OFF_TEXT;
1533 }
1534 else if (STREQ (cs->c_name, ".ef"))
1535 {
1536
1537 bfd_coff_swap_aux_in (abfd, raw_auxptr, cs->c_type, cs->c_sclass,
1538 0, cs->c_naux, &main_aux);
1539
1540 /* The value of .ef is the address of epilogue code;
1541 not useful for gdb. */
1542 /* { main_aux.x_sym.x_misc.x_lnsz.x_lnno
1543 contains number of lines to '}' */
1544
1545 new = pop_context ();
1546 /* Stack must be empty now. */
1547 if (context_stack_depth > 0 || new == NULL)
1548 {
1549 complain (&ef_complaint, cs->c_symnum);
1550 within_function = 0;
1551 break;
1552 }
1553
1554 finish_block (new->name, &local_symbols, new->old_blocks,
1555 new->start_addr,
1556 (fcn_cs_saved.c_value
1557 + fcn_aux_saved.x_sym.x_misc.x_fsize
1558 + ANOFFSET (objfile->section_offsets,
1559 SECT_OFF_TEXT)),
1560 objfile);
1561 within_function = 0;
1562 }
1563 break;
1564
1565 case C_BSTAT:
1566 /* Begin static block. */
1567 {
1568 struct internal_syment symbol;
1569
1570 read_symbol (&symbol, cs->c_value);
1571 static_block_base = symbol.n_value;
1572 static_block_section =
1573 secnum_to_section (symbol.n_scnum, objfile);
1574 }
1575 break;
1576
1577 case C_ESTAT:
1578 /* End of static block. */
1579 static_block_base = 0;
1580 static_block_section = -1;
1581 break;
1582
1583 case C_ARG:
1584 case C_REGPARM:
1585 case C_REG:
1586 case C_TPDEF:
1587 case C_STRTAG:
1588 case C_UNTAG:
1589 case C_ENTAG:
1590 {
1591 static struct complaint msg =
1592 {"Unrecognized storage class %d.", 0, 0};
1593 complain (&msg, cs->c_sclass);
1594 }
1595 break;
1596
1597 case C_LABEL:
1598 case C_NULL:
1599 /* Ignore these. */
1600 break;
1601
1602 case C_HIDEXT:
1603 break;
1604
1605 case C_BINCL:
1606 /* beginning of include file */
1607 /* In xlc output, C_BINCL/C_EINCL pair doesn't show up in sorted
1608 order. Thus, when wee see them, we might not know enough info
1609 to process them. Thus, we'll be saving them into a table
1610 (inclTable) and postpone their processing. */
1611
1612 record_include_begin (cs);
1613 break;
1614
1615 case C_EINCL:
1616 /* End of include file. */
1617 /* See the comment after case C_BINCL. */
1618 record_include_end (cs);
1619 break;
1620
1621 case C_BLOCK:
1622 if (STREQ (cs->c_name, ".bb"))
1623 {
1624 depth++;
1625 new = push_context (depth,
1626 (cs->c_value
1627 + ANOFFSET (objfile->section_offsets,
1628 SECT_OFF_TEXT)));
1629 }
1630 else if (STREQ (cs->c_name, ".eb"))
1631 {
1632 new = pop_context ();
1633 if (depth-- != new->depth)
1634 {
1635 complain (&eb_complaint, symnum);
1636 break;
1637 }
1638 if (local_symbols && context_stack_depth > 0)
1639 {
1640 /* Make a block for the local symbols within. */
1641 finish_block (new->name, &local_symbols, new->old_blocks,
1642 new->start_addr,
1643 (cs->c_value
1644 + ANOFFSET (objfile->section_offsets,
1645 SECT_OFF_TEXT)),
1646 objfile);
1647 }
1648 local_symbols = new->locals;
1649 }
1650 break;
1651
1652 default:
1653 process_xcoff_symbol (cs, objfile);
1654 break;
1655 }
1656 }
1657
1658 if (last_source_file)
1659 {
1660 struct symtab *s;
1661
1662 complete_symtab (filestring, file_start_addr);
1663 cur_src_end_addr = file_end_addr;
1664 s = end_symtab (file_end_addr, 1, 0, objfile, SECT_OFF_TEXT);
1665 /* When reading symbols for the last C_FILE of the objfile, try
1666 to make sure that we set pst->symtab to the symtab for the
1667 file, not to the _globals_ symtab. I'm not sure whether this
1668 actually works right or when/if it comes up. */
1669 if (pst->symtab == NULL)
1670 pst->symtab = s;
1671 end_stabs ();
1672 }
1673 }
1674
1675 #define SYMBOL_DUP(SYMBOL1, SYMBOL2) \
1676 (SYMBOL2) = (struct symbol *) \
1677 obstack_alloc (&objfile->symbol_obstack, sizeof (struct symbol)); \
1678 *(SYMBOL2) = *(SYMBOL1);
1679
1680
1681 #define SYMNAME_ALLOC(NAME, ALLOCED) \
1682 (ALLOCED) ? (NAME) : obstack_copy0 (&objfile->symbol_obstack, (NAME), strlen (NAME));
1683
1684
1685 static struct type *func_symbol_type;
1686 static struct type *var_symbol_type;
1687
1688 /* process one xcoff symbol. */
1689
1690 static struct symbol *
1691 process_xcoff_symbol (cs, objfile)
1692 register struct coff_symbol *cs;
1693 struct objfile *objfile;
1694 {
1695 struct symbol onesymbol;
1696 register struct symbol *sym = &onesymbol;
1697 struct symbol *sym2 = NULL;
1698 struct type *ttype;
1699 char *name, *pp, *qq;
1700 int struct_and_type_combined;
1701 int nameless;
1702
1703 int sec;
1704 CORE_ADDR off;
1705
1706 if (cs->c_secnum < 0)
1707 {
1708 /* The value is a register number, offset within a frame, etc.,
1709 and does not get relocated. */
1710 off = 0;
1711 sec = -1;
1712 }
1713 else
1714 {
1715 sec = secnum_to_section (cs->c_secnum, objfile);
1716 off = ANOFFSET (objfile->section_offsets, sec);
1717 }
1718
1719 name = cs->c_name;
1720 if (name[0] == '.')
1721 ++name;
1722
1723 memset (sym, '\0', sizeof (struct symbol));
1724
1725 /* default assumptions */
1726 SYMBOL_VALUE (sym) = cs->c_value + off;
1727 SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
1728 SYMBOL_SECTION (sym) = secnum_to_section (cs->c_secnum, objfile);
1729
1730 if (ISFCN (cs->c_type))
1731 {
1732 /* At this point, we don't know the type of the function. This
1733 will be patched with the type from its stab entry later on in
1734 patch_block_stabs (), unless the file was compiled without -g. */
1735
1736 SYMBOL_NAME (sym) = SYMNAME_ALLOC (name, symname_alloced);
1737 SYMBOL_TYPE (sym) = func_symbol_type;
1738
1739 SYMBOL_CLASS (sym) = LOC_BLOCK;
1740 SYMBOL_DUP (sym, sym2);
1741
1742 if (cs->c_sclass == C_EXT)
1743 add_symbol_to_list (sym2, &global_symbols);
1744 else if (cs->c_sclass == C_HIDEXT || cs->c_sclass == C_STAT)
1745 add_symbol_to_list (sym2, &file_symbols);
1746 }
1747 else
1748 {
1749 /* In case we can't figure out the type, provide default. */
1750 SYMBOL_TYPE (sym) = var_symbol_type;
1751
1752 switch (cs->c_sclass)
1753 {
1754 #if 0
1755 case C_FUN:
1756 if (fcn_cs_saved.c_sclass == C_EXT)
1757 add_stab_to_list (name, &global_stabs);
1758 else
1759 add_stab_to_list (name, &file_stabs);
1760 break;
1761 #endif
1762
1763 case C_GSYM:
1764 add_stab_to_list (name, &global_stabs);
1765 break;
1766
1767 case C_BCOMM:
1768 common_block_start (cs->c_name, objfile);
1769 break;
1770
1771 case C_ECOMM:
1772 common_block_end (objfile);
1773 break;
1774
1775 default:
1776 complain (&storclass_complaint, cs->c_sclass);
1777 /* FALLTHROUGH */
1778
1779 case C_DECL:
1780 case C_PSYM:
1781 case C_RPSYM:
1782 case C_ECOML:
1783 case C_LSYM:
1784 case C_RSYM:
1785
1786 {
1787 sym = define_symbol (cs->c_value + off, cs->c_name, 0, 0, objfile);
1788 if (sym != NULL)
1789 {
1790 SYMBOL_SECTION (sym) = sec;
1791 }
1792 return sym;
1793 }
1794
1795 case C_STSYM:
1796
1797 /* For xlc (not GCC), the 'V' symbol descriptor is used for
1798 all statics and we need to distinguish file-scope versus
1799 function-scope using within_function. We do this by
1800 changing the string we pass to define_symbol to use 'S'
1801 where we need to, which is not necessarily super-clean,
1802 but seems workable enough. */
1803
1804 if (*name == ':' || (pp = (char *) strchr(name, ':')) == NULL)
1805 return NULL;
1806
1807 ++pp;
1808 if (*pp == 'V' && !within_function)
1809 *pp = 'S';
1810 sym = define_symbol ((cs->c_value
1811 + ANOFFSET (objfile->section_offsets,
1812 static_block_section)),
1813 cs->c_name, 0, 0, objfile);
1814 if (sym != NULL)
1815 {
1816 SYMBOL_VALUE (sym) += static_block_base;
1817 SYMBOL_SECTION (sym) = static_block_section;
1818 }
1819 return sym;
1820
1821 #if 0
1822 /* These appear to be vestigial remnants of coffread.c; I don't
1823 think any of them are used for xcoff. */
1824
1825 case C_AUTO:
1826 SYMBOL_CLASS (sym) = LOC_LOCAL;
1827 SYMBOL_NAME (sym) = SYMNAME_ALLOC (name, symname_alloced);
1828 SYMBOL_SECTION (sym) = secnum_to_section (cs->c_secnum, objfile);
1829 SYMBOL_DUP (sym, sym2);
1830 add_symbol_to_list (sym2, &local_symbols);
1831 break;
1832
1833 case C_STAT:
1834 SYMBOL_CLASS (sym) = LOC_STATIC;
1835 SYMBOL_NAME (sym) = SYMNAME_ALLOC (name, symname_alloced);
1836 SYMBOL_SECTION (sym) = secnum_to_section (cs->c_secnum, objfile);
1837 SYMBOL_DUP (sym, sym2);
1838 add_symbol_to_list
1839 (sym2, within_function ? &local_symbols : &file_symbols);
1840 break;
1841
1842 case C_RSYM:
1843 pp = (char*) strchr (name, ':');
1844 if (pp)
1845 {
1846 sym = define_symbol (cs->c_value, cs->c_name, 0, 0, objfile);
1847 if (sym != NULL)
1848 SYMBOL_SECTION (sym) = secnum_to_section (cs->c_secnum, objfile);
1849 return sym;
1850 }
1851 else
1852 {
1853 complain (&rsym_complaint, name);
1854 return NULL;
1855 }
1856 #endif /* 0 */
1857
1858 /* I think this one is used (dubious, I think, shouldn't
1859 it go into the msyms only?). */
1860 case C_EXT:
1861 SYMBOL_CLASS (sym) = LOC_STATIC;
1862 SYMBOL_NAME (sym) = SYMNAME_ALLOC (name, symname_alloced);
1863 SYMBOL_SECTION (sym) = secnum_to_section (cs->c_secnum, objfile);
1864 SYMBOL_DUP (sym, sym2);
1865 add_symbol_to_list (sym2, &global_symbols);
1866 break;
1867
1868 }
1869 }
1870 return sym2;
1871 }
1872
1873 /* Extract the file name from the aux entry of a C_FILE symbol. Return
1874 only the last component of the name. Result is in static storage and
1875 is only good for temporary use. */
1876
1877 static char *
1878 coff_getfilename (aux_entry, objfile)
1879 union internal_auxent *aux_entry;
1880 struct objfile *objfile;
1881 {
1882 static char buffer[BUFSIZ];
1883 register char *temp;
1884 char *result;
1885
1886 if (aux_entry->x_file.x_n.x_zeroes == 0)
1887 strcpy (buffer,
1888 ((struct coff_symfile_info *)objfile->sym_private)->strtbl
1889 + aux_entry->x_file.x_n.x_offset);
1890 else
1891 {
1892 strncpy (buffer, aux_entry->x_file.x_fname, FILNMLEN);
1893 buffer[FILNMLEN] = '\0';
1894 }
1895 result = buffer;
1896
1897 /* FIXME: We should not be throwing away the information about what
1898 directory. It should go into dirname of the symtab, or some such
1899 place. */
1900 if ((temp = strrchr (result, '/')) != NULL)
1901 result = temp + 1;
1902 return (result);
1903 }
1904
1905 /* Set *SYMBOL to symbol number symno in symtbl. */
1906 static void
1907 read_symbol (symbol, symno)
1908 struct internal_syment *symbol;
1909 int symno;
1910 {
1911 int nsyms =
1912 ((struct coff_symfile_info *)this_symtab_psymtab->objfile->sym_private)
1913 ->symtbl_num_syms;
1914 char *stbl =
1915 ((struct coff_symfile_info *)this_symtab_psymtab->objfile->sym_private)
1916 ->symtbl;
1917 if (symno < 0 || symno >= nsyms)
1918 {
1919 static struct complaint msg =
1920 {"Invalid symbol offset", 0, 0};
1921 complain (&msg);
1922 symbol->n_value = 0;
1923 symbol->n_scnum = -1;
1924 return;
1925 }
1926 bfd_coff_swap_sym_in (this_symtab_psymtab->objfile->obfd,
1927 stbl + (symno*local_symesz),
1928 symbol);
1929 }
1930
1931 /* Get value corresponding to symbol number symno in symtbl. */
1932
1933 static int
1934 read_symbol_nvalue (symno)
1935 int symno;
1936 {
1937 struct internal_syment symbol[1];
1938
1939 read_symbol (symbol, symno);
1940 return symbol->n_value;
1941 }
1942
1943
1944 /* Find the address of the function corresponding to symno, where
1945 symno is the symbol pointed to by the linetable. */
1946
1947 static int
1948 read_symbol_lineno (symno)
1949 int symno;
1950 {
1951 int nsyms =
1952 ((struct coff_symfile_info *)this_symtab_psymtab->objfile->sym_private)
1953 ->symtbl_num_syms;
1954 char *stbl =
1955 ((struct coff_symfile_info *)this_symtab_psymtab->objfile->sym_private)
1956 ->symtbl;
1957 struct internal_syment symbol[1];
1958 union internal_auxent main_aux[1];
1959
1960 if (symno < 0)
1961 {
1962 complain (&bf_notfound_complaint);
1963 return 0;
1964 }
1965
1966 /* Note that just searching for a short distance (e.g. 50 symbols)
1967 is not enough, at least in the following case.
1968
1969 .extern foo
1970 [many .stabx entries]
1971 [a few functions, referring to foo]
1972 .globl foo
1973 .bf
1974
1975 What happens here is that the assembler moves the .stabx entries
1976 to right before the ".bf" for foo, but the symbol for "foo" is before
1977 all the stabx entries. See PR gdb/2222. */
1978
1979 /* Maintaining a table of .bf entries might be preferable to this search.
1980 If I understand things correctly it would need to be done only for
1981 the duration of a single psymtab to symtab conversion. */
1982 while (symno < nsyms)
1983 {
1984 bfd_coff_swap_sym_in (symfile_bfd,
1985 stbl + (symno * local_symesz), symbol);
1986 if (symbol->n_sclass == C_FCN && STREQ (symbol->n_name, ".bf"))
1987 goto gotit;
1988 symno += symbol->n_numaux + 1;
1989 }
1990
1991 complain (&bf_notfound_complaint);
1992 return 0;
1993
1994 gotit:
1995 /* take aux entry and return its lineno */
1996 symno++;
1997 bfd_coff_swap_aux_in (this_symtab_psymtab->objfile->obfd,
1998 stbl + symno * local_symesz,
1999 symbol->n_type, symbol->n_sclass,
2000 0, symbol->n_numaux, main_aux);
2001
2002 return main_aux->x_sym.x_misc.x_lnsz.x_lnno;
2003 }
2004
2005 /* Support for line number handling */
2006
2007 /* This function is called for every section; it finds the outer limits
2008 * of the line table (minimum and maximum file offset) so that the
2009 * mainline code can read the whole thing for efficiency.
2010 */
2011 static void
2012 find_linenos (abfd, asect, vpinfo)
2013 bfd *abfd;
2014 sec_ptr asect;
2015 PTR vpinfo;
2016 {
2017 struct coff_symfile_info *info;
2018 int size, count;
2019 file_ptr offset, maxoff;
2020
2021 count = asect->lineno_count;
2022
2023 if (!STREQ (asect->name, ".text") || count == 0)
2024 return;
2025
2026 size = count * coff_data (abfd)->local_linesz;
2027 info = (struct coff_symfile_info *)vpinfo;
2028 offset = asect->line_filepos;
2029 maxoff = offset + size;
2030
2031 if (offset < info->min_lineno_offset || info->min_lineno_offset == 0)
2032 info->min_lineno_offset = offset;
2033
2034 if (maxoff > info->max_lineno_offset)
2035 info->max_lineno_offset = maxoff;
2036 }
2037 \f
2038 static void xcoff_psymtab_to_symtab_1 PARAMS ((struct partial_symtab *));
2039
2040 static void
2041 xcoff_psymtab_to_symtab_1 (pst)
2042 struct partial_symtab *pst;
2043 {
2044 struct cleanup *old_chain;
2045 int i;
2046
2047 if (!pst)
2048 return;
2049
2050 if (pst->readin)
2051 {
2052 fprintf_unfiltered
2053 (gdb_stderr, "Psymtab for %s already read in. Shouldn't happen.\n",
2054 pst->filename);
2055 return;
2056 }
2057
2058 /* Read in all partial symtabs on which this one is dependent */
2059 for (i = 0; i < pst->number_of_dependencies; i++)
2060 if (!pst->dependencies[i]->readin)
2061 {
2062 /* Inform about additional files that need to be read in. */
2063 if (info_verbose)
2064 {
2065 fputs_filtered (" ", gdb_stdout);
2066 wrap_here ("");
2067 fputs_filtered ("and ", gdb_stdout);
2068 wrap_here ("");
2069 printf_filtered ("%s...", pst->dependencies[i]->filename);
2070 wrap_here (""); /* Flush output */
2071 gdb_flush (gdb_stdout);
2072 }
2073 xcoff_psymtab_to_symtab_1 (pst->dependencies[i]);
2074 }
2075
2076 if (((struct symloc *)pst->read_symtab_private)->numsyms != 0)
2077 {
2078 /* Init stuff necessary for reading in symbols. */
2079 stabsread_init ();
2080 buildsym_init ();
2081 old_chain = make_cleanup (really_free_pendings, 0);
2082
2083 read_xcoff_symtab (pst);
2084 sort_symtab_syms (pst->symtab);
2085
2086 do_cleanups (old_chain);
2087 }
2088
2089 pst->readin = 1;
2090 }
2091
2092 static void xcoff_psymtab_to_symtab PARAMS ((struct partial_symtab *));
2093
2094 /* Read in all of the symbols for a given psymtab for real.
2095 Be verbose about it if the user wants that. */
2096
2097 static void
2098 xcoff_psymtab_to_symtab (pst)
2099 struct partial_symtab *pst;
2100 {
2101 bfd *sym_bfd;
2102
2103 if (!pst)
2104 return;
2105
2106 if (pst->readin)
2107 {
2108 fprintf_unfiltered
2109 (gdb_stderr, "Psymtab for %s already read in. Shouldn't happen.\n",
2110 pst->filename);
2111 return;
2112 }
2113
2114 if (((struct symloc *)pst->read_symtab_private)->numsyms != 0
2115 || pst->number_of_dependencies)
2116 {
2117 /* Print the message now, before reading the string table,
2118 to avoid disconcerting pauses. */
2119 if (info_verbose)
2120 {
2121 printf_filtered ("Reading in symbols for %s...", pst->filename);
2122 gdb_flush (gdb_stdout);
2123 }
2124
2125 sym_bfd = pst->objfile->obfd;
2126
2127 next_symbol_text_func = xcoff_next_symbol_text;
2128
2129 xcoff_psymtab_to_symtab_1 (pst);
2130
2131 /* Match with global symbols. This only needs to be done once,
2132 after all of the symtabs and dependencies have been read in. */
2133 scan_file_globals (pst->objfile);
2134
2135 /* Finish up the debug error message. */
2136 if (info_verbose)
2137 printf_filtered ("done.\n");
2138 }
2139 }
2140 \f
2141 static void
2142 xcoff_new_init (objfile)
2143 struct objfile *objfile;
2144 {
2145 }
2146
2147 /* Do initialization in preparation for reading symbols from OBJFILE.
2148
2149 We will only be called if this is an XCOFF or XCOFF-like file.
2150 BFD handles figuring out the format of the file, and code in symfile.c
2151 uses BFD's determination to vector to us. */
2152
2153 static void
2154 xcoff_symfile_init (objfile)
2155 struct objfile *objfile;
2156 {
2157 /* Allocate struct to keep track of the symfile */
2158 objfile -> sym_private = xmmalloc (objfile -> md,
2159 sizeof (struct coff_symfile_info));
2160 init_entry_point_info (objfile);
2161 }
2162
2163 /* Perform any local cleanups required when we are done with a particular
2164 objfile. I.E, we are in the process of discarding all symbol information
2165 for an objfile, freeing up all memory held for it, and unlinking the
2166 objfile struct from the global list of known objfiles. */
2167
2168 static void
2169 xcoff_symfile_finish (objfile)
2170 struct objfile *objfile;
2171 {
2172 if (objfile -> sym_private != NULL)
2173 {
2174 mfree (objfile -> md, objfile -> sym_private);
2175 }
2176
2177 /* Start with a fresh include table for the next objfile. */
2178 if (inclTable)
2179 {
2180 free (inclTable);
2181 inclTable = NULL;
2182 }
2183 inclIndx = inclLength = inclDepth = 0;
2184 }
2185
2186
2187 static void
2188 init_stringtab (abfd, offset, objfile)
2189 bfd *abfd;
2190 file_ptr offset;
2191 struct objfile *objfile;
2192 {
2193 long length;
2194 int val;
2195 unsigned char lengthbuf[4];
2196 char *strtbl;
2197
2198 ((struct coff_symfile_info *)objfile->sym_private)->strtbl = NULL;
2199
2200 if (bfd_seek (abfd, offset, L_SET) < 0)
2201 error ("cannot seek to string table in %s: %s",
2202 bfd_get_filename (abfd), bfd_errmsg (bfd_get_error ()));
2203
2204 val = bfd_read ((char *)lengthbuf, 1, sizeof lengthbuf, abfd);
2205 length = bfd_h_get_32 (abfd, lengthbuf);
2206
2207 /* If no string table is needed, then the file may end immediately
2208 after the symbols. Just return with `strtbl' set to NULL. */
2209
2210 if (val != sizeof lengthbuf || length < sizeof lengthbuf)
2211 return;
2212
2213 /* Allocate string table from symbol_obstack. We will need this table
2214 as long as we have its symbol table around. */
2215
2216 strtbl = (char *) obstack_alloc (&objfile->symbol_obstack, length);
2217 ((struct coff_symfile_info *)objfile->sym_private)->strtbl = strtbl;
2218
2219 if (length == sizeof lengthbuf)
2220 return;
2221
2222 val = bfd_read (strtbl + sizeof lengthbuf, 1, length - sizeof lengthbuf,
2223 abfd);
2224
2225 if (val != length - sizeof lengthbuf)
2226 error ("cannot read string table from %s: %s",
2227 bfd_get_filename (abfd), bfd_errmsg (bfd_get_error ()));
2228 if (strtbl[length - 1] != '\0')
2229 error ("bad symbol file: string table does not end with null character");
2230
2231 return;
2232 }
2233 \f
2234 /* If we have not yet seen a function for this psymtab, this is 0. If we
2235 have seen one, it is the offset in the line numbers of the line numbers
2236 for the psymtab. */
2237 static unsigned int first_fun_line_offset;
2238
2239 static struct partial_symtab *xcoff_start_psymtab
2240 PARAMS ((struct objfile *, struct section_offsets *, char *, int,
2241 struct partial_symbol *, struct partial_symbol *));
2242
2243 /* Allocate and partially fill a partial symtab. It will be
2244 completely filled at the end of the symbol list.
2245
2246 SYMFILE_NAME is the name of the symbol-file we are reading from, and ADDR
2247 is the address relative to which its symbols are (incremental) or 0
2248 (normal). */
2249
2250 static struct partial_symtab *
2251 xcoff_start_psymtab (objfile, section_offsets,
2252 filename, first_symnum, global_syms, static_syms)
2253 struct objfile *objfile;
2254 struct section_offsets *section_offsets;
2255 char *filename;
2256 int first_symnum;
2257 struct partial_symbol *global_syms;
2258 struct partial_symbol *static_syms;
2259 {
2260 struct partial_symtab *result =
2261 start_psymtab_common (objfile, section_offsets,
2262 filename,
2263 /* We fill in textlow later. */
2264 0,
2265 global_syms, static_syms);
2266
2267 result->read_symtab_private = (char *)
2268 obstack_alloc (&objfile -> psymbol_obstack, sizeof (struct symloc));
2269 ((struct symloc *)result->read_symtab_private)->first_symnum = first_symnum;
2270 result->read_symtab = xcoff_psymtab_to_symtab;
2271
2272 /* Deduce the source language from the filename for this psymtab. */
2273 psymtab_language = deduce_language_from_filename (filename);
2274
2275 return result;
2276 }
2277
2278 static struct partial_symtab *xcoff_end_psymtab
2279 PARAMS ((struct partial_symtab *, char **, int, int,
2280 struct partial_symtab **, int));
2281
2282 /* Close off the current usage of PST.
2283 Returns PST, or NULL if the partial symtab was empty and thrown away.
2284
2285 CAPPING_SYMBOL_NUMBER is the end of pst (exclusive).
2286
2287 INCLUDE_LIST, NUM_INCLUDES, DEPENDENCY_LIST, and NUMBER_DEPENDENCIES
2288 are the information for includes and dependencies. */
2289
2290 static struct partial_symtab *
2291 xcoff_end_psymtab (pst, include_list, num_includes, capping_symbol_number,
2292 dependency_list, number_dependencies)
2293 struct partial_symtab *pst;
2294 char **include_list;
2295 int num_includes;
2296 int capping_symbol_number;
2297 struct partial_symtab **dependency_list;
2298 int number_dependencies;
2299 {
2300 int i;
2301 struct objfile *objfile = pst -> objfile;
2302
2303 if (capping_symbol_number != -1)
2304 ((struct symloc *)pst->read_symtab_private)->numsyms =
2305 capping_symbol_number
2306 - ((struct symloc *)pst->read_symtab_private)->first_symnum;
2307 ((struct symloc *)pst->read_symtab_private)->lineno_off =
2308 first_fun_line_offset;
2309 first_fun_line_offset = 0;
2310 pst->n_global_syms =
2311 objfile->global_psymbols.next - (objfile->global_psymbols.list + pst->globals_offset);
2312 pst->n_static_syms =
2313 objfile->static_psymbols.next - (objfile->static_psymbols.list + pst->statics_offset);
2314
2315 pst->number_of_dependencies = number_dependencies;
2316 if (number_dependencies)
2317 {
2318 pst->dependencies = (struct partial_symtab **)
2319 obstack_alloc (&objfile->psymbol_obstack,
2320 number_dependencies * sizeof (struct partial_symtab *));
2321 memcpy (pst->dependencies, dependency_list,
2322 number_dependencies * sizeof (struct partial_symtab *));
2323 }
2324 else
2325 pst->dependencies = 0;
2326
2327 for (i = 0; i < num_includes; i++)
2328 {
2329 struct partial_symtab *subpst =
2330 allocate_psymtab (include_list[i], objfile);
2331
2332 subpst->section_offsets = pst->section_offsets;
2333 subpst->read_symtab_private =
2334 (char *) obstack_alloc (&objfile->psymbol_obstack,
2335 sizeof (struct symloc));
2336 ((struct symloc *)subpst->read_symtab_private)->first_symnum = 0;
2337 ((struct symloc *)subpst->read_symtab_private)->numsyms = 0;
2338 subpst->textlow = 0;
2339 subpst->texthigh = 0;
2340
2341 /* We could save slight bits of space by only making one of these,
2342 shared by the entire set of include files. FIXME-someday. */
2343 subpst->dependencies = (struct partial_symtab **)
2344 obstack_alloc (&objfile->psymbol_obstack,
2345 sizeof (struct partial_symtab *));
2346 subpst->dependencies[0] = pst;
2347 subpst->number_of_dependencies = 1;
2348
2349 subpst->globals_offset =
2350 subpst->n_global_syms =
2351 subpst->statics_offset =
2352 subpst->n_static_syms = 0;
2353
2354 subpst->readin = 0;
2355 subpst->symtab = 0;
2356 subpst->read_symtab = pst->read_symtab;
2357 }
2358
2359 sort_pst_symbols (pst);
2360
2361 /* If there is already a psymtab or symtab for a file of this name,
2362 remove it. (If there is a symtab, more drastic things also
2363 happen.) This happens in VxWorks. */
2364 free_named_symtabs (pst->filename);
2365
2366 if (num_includes == 0
2367 && number_dependencies == 0
2368 && pst->n_global_syms == 0
2369 && pst->n_static_syms == 0)
2370 {
2371 /* Throw away this psymtab, it's empty. We can't deallocate it, since
2372 it is on the obstack, but we can forget to chain it on the list. */
2373 /* Empty psymtabs happen as a result of header files which don't have
2374 any symbols in them. There can be a lot of them. But this check
2375 is wrong, in that a psymtab with N_SLINE entries but nothing else
2376 is not empty, but we don't realize that. Fixing that without slowing
2377 things down might be tricky. (FIXME: For XCOFF, it shouldn't be
2378 tricky at all). */
2379 struct partial_symtab *prev_pst;
2380
2381 /* First, snip it out of the psymtab chain */
2382
2383 if (pst->objfile->psymtabs == pst)
2384 pst->objfile->psymtabs = pst->next;
2385 else
2386 for (prev_pst = pst->objfile->psymtabs; prev_pst; prev_pst = pst->next)
2387 if (prev_pst->next == pst)
2388 prev_pst->next = pst->next;
2389
2390 /* Next, put it on a free list for recycling */
2391
2392 pst->next = pst->objfile->free_psymtabs;
2393 pst->objfile->free_psymtabs = pst;
2394
2395 /* Indicate that psymtab was thrown away. */
2396 pst = (struct partial_symtab *)NULL;
2397 }
2398 return pst;
2399 }
2400
2401 static void swap_sym PARAMS ((struct internal_syment *,
2402 union internal_auxent *, char **, char **,
2403 unsigned int *,
2404 struct objfile *));
2405
2406 /* Swap raw symbol at *RAW and put the name in *NAME, the symbol in
2407 *SYMBOL, the first auxent in *AUX. Advance *RAW and *SYMNUMP over
2408 the symbol and its auxents. */
2409
2410 static void
2411 swap_sym (symbol, aux, name, raw, symnump, objfile)
2412 struct internal_syment *symbol;
2413 union internal_auxent *aux;
2414 char **name;
2415 char **raw;
2416 unsigned int *symnump;
2417 struct objfile *objfile;
2418 {
2419 bfd_coff_swap_sym_in (objfile->obfd, *raw, symbol);
2420 if (symbol->n_zeroes)
2421 {
2422 /* If it's exactly E_SYMNMLEN characters long it isn't
2423 '\0'-terminated. */
2424 if (symbol->n_name[E_SYMNMLEN - 1] != '\0')
2425 {
2426 /* FIXME: wastes memory for symbols which we don't end up putting
2427 into the minimal symbols. */
2428 char *p;
2429 p = obstack_alloc (&objfile->psymbol_obstack, E_SYMNMLEN + 1);
2430 strncpy (p, symbol->n_name, E_SYMNMLEN);
2431 p[E_SYMNMLEN] = '\0';
2432 *name = p;
2433 }
2434 else
2435 /* Point to the unswapped name as that persists as long as the
2436 objfile does. */
2437 *name = ((struct external_syment *)*raw)->e.e_name;
2438 }
2439 else if (symbol->n_sclass & 0x80)
2440 {
2441 *name = ((struct coff_symfile_info *)objfile->sym_private)->debugsec
2442 + symbol->n_offset;
2443 }
2444 else
2445 {
2446 *name = ((struct coff_symfile_info *)objfile->sym_private)->strtbl
2447 + symbol->n_offset;
2448 }
2449 ++*symnump;
2450 *raw += coff_data (objfile->obfd)->local_symesz;
2451 if (symbol->n_numaux > 0)
2452 {
2453 bfd_coff_swap_aux_in (objfile->obfd, *raw, symbol->n_type,
2454 symbol->n_sclass, 0, symbol->n_numaux, aux);
2455
2456 *symnump += symbol->n_numaux;
2457 *raw += coff_data (objfile->obfd)->local_symesz * symbol->n_numaux;
2458 }
2459 }
2460
2461 static void
2462 scan_xcoff_symtab (section_offsets, objfile)
2463 struct section_offsets *section_offsets;
2464 struct objfile *objfile;
2465 {
2466 int toc_offset = 0; /* toc offset value in data section. */
2467 char *filestring;
2468
2469 char *namestring;
2470 int nsl;
2471 int past_first_source_file = 0;
2472 CORE_ADDR last_o_file_start = 0;
2473 struct cleanup *back_to;
2474 bfd *abfd;
2475 unsigned int nsyms;
2476
2477 /* Current partial symtab */
2478 struct partial_symtab *pst;
2479
2480 /* List of current psymtab's include files */
2481 char **psymtab_include_list;
2482 int includes_allocated;
2483 int includes_used;
2484
2485 /* Index within current psymtab dependency list */
2486 struct partial_symtab **dependency_list;
2487 int dependencies_used, dependencies_allocated;
2488
2489 char *sraw_symbol;
2490 struct internal_syment symbol;
2491 union internal_auxent main_aux;
2492 unsigned int ssymnum;
2493
2494 char *last_csect_name = NULL; /* last seen csect's name and value */
2495 CORE_ADDR last_csect_val;
2496 int last_csect_sec;
2497 int misc_func_recorded; /* true if any misc. function */
2498
2499 pst = (struct partial_symtab *) 0;
2500
2501 includes_allocated = 30;
2502 includes_used = 0;
2503 psymtab_include_list = (char **) alloca (includes_allocated *
2504 sizeof (char *));
2505
2506 dependencies_allocated = 30;
2507 dependencies_used = 0;
2508 dependency_list =
2509 (struct partial_symtab **) alloca (dependencies_allocated *
2510 sizeof (struct partial_symtab *));
2511
2512 last_source_file = NULL;
2513
2514 abfd = objfile->obfd;
2515
2516 sraw_symbol = ((struct coff_symfile_info *)objfile->sym_private)->symtbl;
2517 nsyms = ((struct coff_symfile_info *)objfile->sym_private)->symtbl_num_syms;
2518 ssymnum = 0;
2519 while (ssymnum < nsyms)
2520 {
2521 int sclass = ((struct external_syment *)sraw_symbol)->e_sclass[0];
2522 /* This is the type we pass to partial-stab.h. A less kludgy solution
2523 would be to break out partial-stab.h into its various parts--shuffle
2524 off the DBXREAD_ONLY stuff to dbxread.c, and make separate
2525 pstab-norm.h (for most types), pstab-sol.h (for N_SOL), etc. */
2526 int stype;
2527
2528 QUIT;
2529
2530 switch (sclass)
2531 {
2532 case C_EXT:
2533 case C_HIDEXT:
2534 {
2535 /* The CSECT auxent--always the last auxent. */
2536 union internal_auxent csect_aux;
2537 unsigned int symnum_before = ssymnum;
2538
2539 swap_sym (&symbol, &main_aux, &namestring, &sraw_symbol,
2540 &ssymnum, objfile);
2541 if (symbol.n_numaux > 1)
2542 {
2543 bfd_coff_swap_aux_in
2544 (objfile->obfd,
2545 sraw_symbol - coff_data(abfd)->local_symesz,
2546 symbol.n_type,
2547 symbol.n_sclass,
2548 symbol.n_numaux - 1,
2549 symbol.n_numaux,
2550 &csect_aux);
2551 }
2552 else
2553 csect_aux = main_aux;
2554
2555 switch (csect_aux.x_csect.x_smtyp & 0x7)
2556 {
2557 case XTY_SD:
2558 switch (csect_aux.x_csect.x_smclas)
2559 {
2560 case XMC_PR:
2561 if (last_csect_name)
2562 {
2563 /* If no misc. function recorded in the last
2564 seen csect, enter it as a function. This
2565 will take care of functions like strcmp()
2566 compiled by xlc. */
2567
2568 if (!misc_func_recorded)
2569 {
2570 RECORD_MINIMAL_SYMBOL
2571 (last_csect_name, last_csect_val,
2572 mst_text, last_csect_sec,
2573 objfile);
2574 }
2575
2576 if (pst != NULL)
2577 {
2578 /* We have to allocate one psymtab for
2579 each program csect, because their text
2580 sections need not be adjacent. */
2581 xcoff_end_psymtab
2582 (pst, psymtab_include_list,
2583 includes_used,
2584 symnum_before,
2585 dependency_list, dependencies_used);
2586 includes_used = 0;
2587 dependencies_used = 0;
2588 /* Give all psymtabs for this source file the same
2589 name. */
2590 pst = xcoff_start_psymtab
2591 (objfile, section_offsets,
2592 filestring,
2593 symnum_before,
2594 objfile->global_psymbols.next,
2595 objfile->static_psymbols.next);
2596 }
2597 }
2598 if (namestring && namestring[0] == '.')
2599 {
2600 last_csect_name = namestring;
2601 last_csect_val = symbol.n_value;
2602 last_csect_sec =
2603 secnum_to_section (symbol.n_scnum, objfile);
2604 }
2605 if (pst != NULL)
2606 {
2607 CORE_ADDR highval =
2608 symbol.n_value + csect_aux.x_csect.x_scnlen.l;
2609 if (highval > pst->texthigh)
2610 pst->texthigh = highval;
2611 if (pst->textlow == 0 || symbol.n_value < pst->textlow)
2612 pst->textlow = symbol.n_value;
2613 }
2614 misc_func_recorded = 0;
2615 break;
2616 case XMC_RW:
2617 break;
2618 case XMC_TC0:
2619 if (toc_offset)
2620 warning ("More than one XMC_TC0 symbol found.");
2621 toc_offset = symbol.n_value;
2622 break;
2623 case XMC_TC:
2624 /* These symbols tell us where the TOC entry for a
2625 variable is, not the variable itself. */
2626 break;
2627 default:
2628 break;
2629 }
2630 break;
2631
2632 case XTY_LD:
2633 switch (csect_aux.x_csect.x_smclas)
2634 {
2635 case XMC_PR:
2636 {
2637 /* A function entry point. */
2638 char *namestr = namestring;
2639
2640 if (first_fun_line_offset == 0)
2641 first_fun_line_offset =
2642 main_aux.x_sym.x_fcnary.x_fcn.x_lnnoptr;
2643 if (namestr[0] == '.')
2644 ++namestr;
2645 prim_record_minimal_symbol_and_info
2646 (namestr, symbol.n_value, mst_text,
2647 NULL, secnum_to_section (symbol.n_scnum, objfile),
2648 objfile);
2649 misc_func_recorded = 1;
2650
2651 /* We also create full symbols for these, so
2652 better make a partial symbol. This seems bogus
2653 to me, but I'm not going to try to fix it now.
2654 (Note that allocate_space_in_inferior can't
2655 yet deal with a minimal symbol for malloc on xcoff
2656 because it doesn't understand the fact that
2657 function pointers don't just contain the address of
2658 the function). */
2659 ADD_PSYMBOL_ADDR_TO_LIST (namestr, strlen (namestr),
2660 VAR_NAMESPACE, LOC_BLOCK,
2661 objfile->global_psymbols,
2662 symbol.n_value,
2663 psymtab_language, objfile);
2664 }
2665 break;
2666 case XMC_GL:
2667 /* shared library function trampoline code entry
2668 point. */
2669
2670 /* record trampoline code entries as
2671 mst_solib_trampoline symbol. When we lookup mst
2672 symbols, we will choose mst_text over
2673 mst_solib_trampoline. */
2674 RECORD_MINIMAL_SYMBOL
2675 (namestring, symbol.n_value,
2676 mst_solib_trampoline,
2677 secnum_to_section (symbol.n_scnum, objfile),
2678 objfile);
2679 break;
2680
2681 case XMC_DS:
2682 /* The symbols often have the same names as
2683 debug symbols for functions, and confuse
2684 lookup_symbol. */
2685 break;
2686
2687 default:
2688
2689 /* xlc puts each variable in a separate csect,
2690 so we get an XTY_SD for each variable. But
2691 gcc puts several variables in a csect, so
2692 that each variable only gets an XTY_LD. We
2693 still need to record them. This will
2694 typically be XMC_RW; I suspect XMC_RO and
2695 XMC_BS might be possible too. */
2696
2697 /* FIXME: Shouldn't these be going into the minimal
2698 symbols instead of partial/full symbols? */
2699
2700 ADD_PSYMBOL_ADDR_TO_LIST (namestring, strlen (namestring),
2701 VAR_NAMESPACE, LOC_STATIC,
2702 objfile->global_psymbols,
2703 symbol.n_value,
2704 psymtab_language, objfile);
2705 break;
2706 }
2707 default:
2708 break;
2709 }
2710 }
2711 break;
2712 case C_FILE:
2713 {
2714 unsigned int symnum_before;
2715
2716 symnum_before = ssymnum;
2717 swap_sym (&symbol, &main_aux, &namestring, &sraw_symbol,
2718 &ssymnum, objfile);
2719
2720 /* See if the last csect needs to be recorded. */
2721
2722 if (last_csect_name && !misc_func_recorded)
2723 {
2724
2725 /* If no misc. function recorded in the last seen csect, enter
2726 it as a function. This will take care of functions like
2727 strcmp() compiled by xlc. */
2728
2729 RECORD_MINIMAL_SYMBOL
2730 (last_csect_name, last_csect_val,
2731 mst_text, last_csect_sec, objfile);
2732 }
2733
2734 if (pst)
2735 {
2736 xcoff_end_psymtab (pst, psymtab_include_list, includes_used,
2737 symnum_before,
2738 dependency_list, dependencies_used);
2739 includes_used = 0;
2740 dependencies_used = 0;
2741 }
2742 first_fun_line_offset = 0;
2743
2744 /* XCOFF, according to the AIX 3.2 documentation, puts the
2745 filename in cs->c_name. But xlc 1.3.0.2 has decided to
2746 do things the standard COFF way and put it in the auxent.
2747 We use the auxent if the symbol is ".file" and an auxent
2748 exists, otherwise use the symbol itself. */
2749 if (!strcmp (namestring, ".file") && symbol.n_numaux > 0)
2750 {
2751 filestring = coff_getfilename (&main_aux, objfile);
2752 }
2753 else
2754 filestring = namestring;
2755
2756 pst = xcoff_start_psymtab (objfile, section_offsets,
2757 filestring,
2758 symnum_before,
2759 objfile->global_psymbols.next,
2760 objfile->static_psymbols.next);
2761 last_csect_name = NULL;
2762 }
2763 break;
2764
2765 default:
2766 {
2767 static struct complaint msg =
2768 {"Storage class %d not recognized during scan", 0, 0};
2769 complain (&msg, sclass);
2770 }
2771 /* FALLTHROUGH */
2772
2773 /* C_FCN is .bf and .ef symbols. I think it is sufficient
2774 to handle only the C_FUN and C_EXT. */
2775 case C_FCN:
2776
2777 case C_BSTAT:
2778 case C_ESTAT:
2779 case C_ARG:
2780 case C_REGPARM:
2781 case C_REG:
2782 case C_TPDEF:
2783 case C_STRTAG:
2784 case C_UNTAG:
2785 case C_ENTAG:
2786 case C_LABEL:
2787 case C_NULL:
2788
2789 /* C_EINCL means we are switching back to the main file. But there
2790 is no reason to care; the only thing we want to know about
2791 includes is the names of all the included (.h) files. */
2792 case C_EINCL:
2793
2794 case C_BLOCK:
2795
2796 /* I don't think C_STAT is used in xcoff; C_HIDEXT appears to be
2797 used instead. */
2798 case C_STAT:
2799
2800 /* I don't think the name of the common block (as opposed to the
2801 variables within it) is something which is user visible
2802 currently. */
2803 case C_BCOMM:
2804 case C_ECOMM:
2805
2806 case C_PSYM:
2807 case C_RPSYM:
2808
2809 /* I think we can ignore C_LSYM; types on xcoff seem to use C_DECL
2810 so C_LSYM would appear to be only for locals. */
2811 case C_LSYM:
2812
2813 case C_AUTO:
2814 case C_RSYM:
2815 {
2816 /* We probably could save a few instructions by assuming that
2817 C_LSYM, C_PSYM, etc., never have auxents. */
2818 int naux1 =
2819 ((struct external_syment *)sraw_symbol)->e_numaux[0] + 1;
2820 ssymnum += naux1;
2821 sraw_symbol += sizeof (struct external_syment) * naux1;
2822 }
2823 break;
2824
2825 case C_BINCL:
2826 stype = N_SOL;
2827 goto pstab;
2828
2829 case C_FUN:
2830 /* The value of the C_FUN is not the address of the function (it
2831 appears to be the address before linking), but as long as it
2832 is smaller than the actual address, then find_pc_partial_function
2833 will use the minimal symbols instead. I hope. */
2834
2835 case C_GSYM:
2836 case C_ECOML:
2837 case C_DECL:
2838 case C_STSYM:
2839 stype = N_LSYM;
2840 pstab:;
2841 swap_sym (&symbol, &main_aux, &namestring, &sraw_symbol,
2842 &ssymnum, objfile);
2843 #define CUR_SYMBOL_TYPE stype
2844 #define CUR_SYMBOL_VALUE symbol.n_value
2845
2846 /* START_PSYMTAB and END_PSYMTAB are never used, because they are only
2847 called from DBXREAD_ONLY or N_SO code. Likewise for the symnum
2848 variable. */
2849 #define START_PSYMTAB(ofile,secoff,fname,low,symoff,global_syms,static_syms) 0
2850 #define END_PSYMTAB(pst,ilist,ninc,c_off,c_text,dep_list,n_deps)\
2851 do {} while (0)
2852 /* We have already set the namestring. */
2853 #define SET_NAMESTRING() 0
2854
2855 #include "partial-stab.h"
2856 }
2857 }
2858 #if 0
2859 /* What is this? */
2860 /* If there's stuff to be cleaned up, clean it up. */
2861 if (DBX_SYMCOUNT (objfile) > 0 /* We have some syms */
2862 /*FIXME, does this have a bug at start address 0? */
2863 && last_o_file_start
2864 && objfile -> ei.entry_point < bufp->n_value
2865 && objfile -> ei.entry_point >= last_o_file_start)
2866 {
2867 objfile -> ei.entry_file_lowpc = last_o_file_start;
2868 objfile -> ei.entry_file_highpc = bufp->n_value;
2869 }
2870 #endif
2871
2872 if (pst)
2873 {
2874 xcoff_end_psymtab (pst, psymtab_include_list, includes_used,
2875 ssymnum,
2876 dependency_list, dependencies_used);
2877 }
2878
2879 /* Record the toc offset value of this symbol table into ldinfo structure.
2880 If no XMC_TC0 is found, toc_offset should be zero. Another place to obtain
2881 this information would be file auxiliary header. */
2882
2883 #ifndef FAKING_RS6000
2884 xcoff_add_toc_to_loadinfo (toc_offset);
2885 #endif
2886 }
2887
2888 /* Scan and build partial symbols for a symbol file.
2889 We have been initialized by a call to dbx_symfile_init, which
2890 put all the relevant info into a "struct dbx_symfile_info",
2891 hung off the objfile structure.
2892
2893 SECTION_OFFSETS contains offsets relative to which the symbols in the
2894 various sections are (depending where the sections were actually loaded).
2895 MAINLINE is true if we are reading the main symbol
2896 table (as opposed to a shared lib or dynamically loaded file). */
2897
2898 static void
2899 xcoff_initial_scan (objfile, section_offsets, mainline)
2900 struct objfile *objfile;
2901 struct section_offsets *section_offsets;
2902 int mainline; /* FIXME comments above */
2903 {
2904 bfd *abfd;
2905 int val;
2906 struct cleanup *back_to;
2907 int num_symbols; /* # of symbols */
2908 file_ptr symtab_offset; /* symbol table and */
2909 file_ptr stringtab_offset; /* string table file offsets */
2910 struct coff_symfile_info *info;
2911 char *name;
2912 unsigned int size;
2913
2914 #ifndef FAKING_RS6000
2915 /* Initialize load info structure. */
2916 if (mainline)
2917 xcoff_init_loadinfo ();
2918 #endif
2919
2920 info = (struct coff_symfile_info *) objfile -> sym_private;
2921 symfile_bfd = abfd = objfile->obfd;
2922 name = objfile->name;
2923
2924 num_symbols = bfd_get_symcount (abfd); /* # of symbols */
2925 symtab_offset = obj_sym_filepos (abfd); /* symbol table file offset */
2926 stringtab_offset = symtab_offset +
2927 num_symbols * coff_data(abfd)->local_symesz;
2928
2929 info->min_lineno_offset = 0;
2930 info->max_lineno_offset = 0;
2931 bfd_map_over_sections (abfd, find_linenos, info);
2932
2933 if (num_symbols > 0)
2934 {
2935 /* Read the string table. */
2936 init_stringtab (abfd, stringtab_offset, objfile);
2937
2938 /* Read the .debug section, if present. */
2939 {
2940 sec_ptr secp;
2941 bfd_size_type length;
2942 char *debugsec = NULL;
2943
2944 secp = bfd_get_section_by_name (abfd, ".debug");
2945 if (secp)
2946 {
2947 length = bfd_section_size (abfd, secp);
2948 if (length)
2949 {
2950 debugsec =
2951 (char *) obstack_alloc (&objfile->symbol_obstack, length);
2952
2953 if (!bfd_get_section_contents (abfd, secp, debugsec,
2954 (file_ptr) 0, length))
2955 {
2956 error ("Error reading .debug section of `%s': %s",
2957 name, bfd_errmsg (bfd_get_error ()));
2958 }
2959 }
2960 }
2961 ((struct coff_symfile_info *)objfile->sym_private)->debugsec =
2962 debugsec;
2963 }
2964 }
2965
2966 /* Read the symbols. We keep them in core because we will want to
2967 access them randomly in read_symbol*. */
2968 val = bfd_seek (abfd, symtab_offset, L_SET);
2969 if (val < 0)
2970 error ("Error reading symbols from %s: %s",
2971 name, bfd_errmsg (bfd_get_error ()));
2972 size = coff_data (abfd)->local_symesz * num_symbols;
2973 ((struct coff_symfile_info *)objfile->sym_private)->symtbl =
2974 obstack_alloc (&objfile->symbol_obstack, size);
2975 ((struct coff_symfile_info *)objfile->sym_private)->symtbl_num_syms =
2976 num_symbols;
2977
2978 val = bfd_read (((struct coff_symfile_info *)objfile->sym_private)->symtbl,
2979 size, 1, abfd);
2980 if (val != size)
2981 perror_with_name ("reading symbol table");
2982
2983 /* If we are reinitializing, or if we have never loaded syms yet, init */
2984 if (mainline
2985 || objfile->global_psymbols.size == 0
2986 || objfile->static_psymbols.size == 0)
2987 /* I'm not sure how how good num_symbols is; the rule of thumb in
2988 init_psymbol_list was developed for a.out. On the one hand,
2989 num_symbols includes auxents. On the other hand, it doesn't
2990 include N_SLINE. */
2991 init_psymbol_list (objfile, num_symbols);
2992
2993 pending_blocks = 0;
2994 back_to = make_cleanup (really_free_pendings, 0);
2995
2996 init_minimal_symbol_collection ();
2997 make_cleanup (discard_minimal_symbols, 0);
2998
2999 /* Now that the symbol table data of the executable file are all in core,
3000 process them and define symbols accordingly. */
3001
3002 scan_xcoff_symtab (section_offsets, objfile);
3003
3004 /* Install any minimal symbols that have been collected as the current
3005 minimal symbols for this objfile. */
3006
3007 install_minimal_symbols (objfile);
3008
3009 do_cleanups (back_to);
3010 }
3011 \f
3012 static struct section_offsets *
3013 xcoff_symfile_offsets (objfile, addr)
3014 struct objfile *objfile;
3015 CORE_ADDR addr;
3016 {
3017 struct section_offsets *section_offsets;
3018 int i;
3019
3020 objfile->num_sections = SECT_OFF_MAX;
3021 section_offsets = (struct section_offsets *)
3022 obstack_alloc
3023 (&objfile -> psymbol_obstack,
3024 sizeof (struct section_offsets)
3025 + sizeof (section_offsets->offsets) * objfile->num_sections);
3026
3027 /* syms_from_objfile kindly subtracts from addr the bfd_section_vma
3028 of the .text section. This strikes me as wrong--whether the
3029 offset to be applied to symbol reading is relative to the start
3030 address of the section depends on the symbol format. In any
3031 event, this whole "addr" concept is pretty broken (it doesn't
3032 handle any section but .text sensibly), so just ignore the addr
3033 parameter and use 0. rs6000-nat.c will set the correct section
3034 offsets via objfile_relocate. */
3035 for (i = 0; i < objfile->num_sections; ++i)
3036 ANOFFSET (section_offsets, i) = 0;
3037
3038 return section_offsets;
3039 }
3040
3041 /* Register our ability to parse symbols for xcoff BFD files. */
3042
3043 static struct sym_fns xcoff_sym_fns =
3044 {
3045
3046 /* Because the bfd uses coff_flavour, we need to specially kludge
3047 the flavour. It is possible that coff and xcoff should be merged as
3048 they do have fundamental similarities (for example, the extra storage
3049 classes used for stabs could presumably be recognized in any COFF file).
3050 However, in addition to obvious things like all the csect hair, there are
3051 some subtler differences between xcoffread.c and coffread.c, notably
3052 the fact that coffread.c has no need to read in all the symbols, but
3053 xcoffread.c reads all the symbols and does in fact randomly access them
3054 (in C_BSTAT and line number processing). */
3055
3056 (enum bfd_flavour)-1,
3057
3058 xcoff_new_init, /* sym_new_init: init anything gbl to entire symtab */
3059 xcoff_symfile_init, /* sym_init: read initial info, setup for sym_read() */
3060 xcoff_initial_scan, /* sym_read: read a symbol file into symtab */
3061 xcoff_symfile_finish, /* sym_finish: finished with file, cleanup */
3062 xcoff_symfile_offsets, /* sym_offsets: xlate offsets ext->int form */
3063 NULL /* next: pointer to next struct sym_fns */
3064 };
3065
3066 void
3067 _initialize_xcoffread ()
3068 {
3069 add_symtab_fns(&xcoff_sym_fns);
3070
3071 /* Initialize symbol template later used for arguments. Its other
3072 fields are zero, or are filled in later. */
3073 SYMBOL_NAME (&parmsym) = "";
3074 SYMBOL_INIT_LANGUAGE_SPECIFIC (&parmsym, language_c);
3075 SYMBOL_NAMESPACE (&parmsym) = VAR_NAMESPACE;
3076 SYMBOL_CLASS (&parmsym) = LOC_ARG;
3077
3078 func_symbol_type = init_type (TYPE_CODE_FUNC, 1, 0,
3079 "<function, no debug info>", NULL);
3080 TYPE_TARGET_TYPE (func_symbol_type) = builtin_type_int;
3081 var_symbol_type =
3082 init_type (TYPE_CODE_INT, TARGET_INT_BIT / HOST_CHAR_BIT, 0,
3083 "<variable, no debug info>", NULL);
3084 }
This page took 0.093135 seconds and 4 git commands to generate.