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