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