* objfiles.h (struct objfile): New GDBARCH member.
[platform/upstream/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, 2008
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 static 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 (strcmp (cs->c_name, ".bf") == 0)
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 (strcmp (cs->c_name, ".ef") == 0)
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 (strcmp (cs->c_name, ".bb") == 0)
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 (strcmp (cs->c_name, ".eb") == 0)
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 gdbarch *gdbarch = get_objfile_arch (objfile);
1439   struct symbol onesymbol;
1440   struct symbol *sym = &onesymbol;
1441   struct symbol *sym2 = NULL;
1442   char *name, *pp;
1443
1444   int sec;
1445   CORE_ADDR off;
1446
1447   if (cs->c_secnum < 0)
1448     {
1449       /* The value is a register number, offset within a frame, etc.,
1450          and does not get relocated.  */
1451       off = 0;
1452       sec = -1;
1453     }
1454   else
1455     {
1456       sec = secnum_to_section (cs->c_secnum, objfile);
1457       off = ANOFFSET (objfile->section_offsets, sec);
1458     }
1459
1460   name = cs->c_name;
1461   if (name[0] == '.')
1462     ++name;
1463
1464   memset (sym, '\0', sizeof (struct symbol));
1465
1466   /* default assumptions */
1467   SYMBOL_VALUE_ADDRESS (sym) = cs->c_value + off;
1468   SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
1469   SYMBOL_SECTION (sym) = secnum_to_section (cs->c_secnum, objfile);
1470
1471   if (ISFCN (cs->c_type))
1472     {
1473       /* At this point, we don't know the type of the function.  This
1474          will be patched with the type from its stab entry later on in
1475          patch_block_stabs (), unless the file was compiled without -g.  */
1476
1477       DEPRECATED_SYMBOL_NAME (sym) = SYMNAME_ALLOC (name, symname_alloced);
1478       SYMBOL_TYPE (sym) = builtin_type (gdbarch)->nodebug_text_symbol;
1479
1480       SYMBOL_CLASS (sym) = LOC_BLOCK;
1481       SYMBOL_DUP (sym, sym2);
1482
1483       if (cs->c_sclass == C_EXT)
1484         add_symbol_to_list (sym2, &global_symbols);
1485       else if (cs->c_sclass == C_HIDEXT || cs->c_sclass == C_STAT)
1486         add_symbol_to_list (sym2, &file_symbols);
1487     }
1488   else
1489     {
1490       /* In case we can't figure out the type, provide default. */
1491       SYMBOL_TYPE (sym) = builtin_type (gdbarch)->nodebug_data_symbol;
1492
1493       switch (cs->c_sclass)
1494         {
1495 #if 0
1496           /* The values of functions and global symbols are now resolved
1497              via the global_sym_chain in stabsread.c.  */
1498         case C_FUN:
1499           if (fcn_cs_saved.c_sclass == C_EXT)
1500             add_stab_to_list (name, &global_stabs);
1501           else
1502             add_stab_to_list (name, &file_stabs);
1503           break;
1504
1505         case C_GSYM:
1506           add_stab_to_list (name, &global_stabs);
1507           break;
1508 #endif
1509
1510         case C_BCOMM:
1511           common_block_start (cs->c_name, objfile);
1512           break;
1513
1514         case C_ECOMM:
1515           common_block_end (objfile);
1516           break;
1517
1518         default:
1519           complaint (&symfile_complaints, _("Unexpected storage class: %d"),
1520                      cs->c_sclass);
1521           /* FALLTHROUGH */
1522
1523         case C_DECL:
1524         case C_PSYM:
1525         case C_RPSYM:
1526         case C_ECOML:
1527         case C_LSYM:
1528         case C_RSYM:
1529         case C_GSYM:
1530
1531           {
1532             sym = define_symbol (cs->c_value + off, cs->c_name, 0, 0, objfile);
1533             if (sym != NULL)
1534               {
1535                 SYMBOL_SECTION (sym) = sec;
1536               }
1537             return sym;
1538           }
1539
1540         case C_STSYM:
1541
1542           /* For xlc (not GCC), the 'V' symbol descriptor is used for
1543              all statics and we need to distinguish file-scope versus
1544              function-scope using within_function.  We do this by
1545              changing the string we pass to define_symbol to use 'S'
1546              where we need to, which is not necessarily super-clean,
1547              but seems workable enough.  */
1548
1549           if (*name == ':' || (pp = (char *) strchr (name, ':')) == NULL)
1550             return NULL;
1551
1552           ++pp;
1553           if (*pp == 'V' && !within_function)
1554             *pp = 'S';
1555           sym = define_symbol ((cs->c_value
1556                                 + ANOFFSET (objfile->section_offsets,
1557                                             static_block_section)),
1558                                cs->c_name, 0, 0, objfile);
1559           if (sym != NULL)
1560             {
1561               SYMBOL_VALUE_ADDRESS (sym) += static_block_base;
1562               SYMBOL_SECTION (sym) = static_block_section;
1563             }
1564           return sym;
1565
1566         }
1567     }
1568   return sym2;
1569 }
1570
1571 /* Extract the file name from the aux entry of a C_FILE symbol.
1572    Result is in static storage and is only good for temporary use.  */
1573
1574 static char *
1575 coff_getfilename (union internal_auxent *aux_entry, struct objfile *objfile)
1576 {
1577   static char buffer[BUFSIZ];
1578
1579   if (aux_entry->x_file.x_n.x_zeroes == 0)
1580     strcpy (buffer,
1581             ((struct coff_symfile_info *) objfile->deprecated_sym_private)->strtbl
1582             + aux_entry->x_file.x_n.x_offset);
1583   else
1584     {
1585       strncpy (buffer, aux_entry->x_file.x_fname, FILNMLEN);
1586       buffer[FILNMLEN] = '\0';
1587     }
1588   return (buffer);
1589 }
1590
1591 /* Set *SYMBOL to symbol number symno in symtbl.  */
1592 static void
1593 read_symbol (struct internal_syment *symbol, int symno)
1594 {
1595   int nsyms =
1596   ((struct coff_symfile_info *) this_symtab_psymtab->objfile->deprecated_sym_private)->symtbl_num_syms;
1597   char *stbl =
1598   ((struct coff_symfile_info *) this_symtab_psymtab->objfile->deprecated_sym_private)->symtbl;
1599   if (symno < 0 || symno >= nsyms)
1600     {
1601       complaint (&symfile_complaints, _("Invalid symbol offset"));
1602       symbol->n_value = 0;
1603       symbol->n_scnum = -1;
1604       return;
1605     }
1606   bfd_coff_swap_sym_in (this_symtab_psymtab->objfile->obfd,
1607                         stbl + (symno * local_symesz),
1608                         symbol);
1609 }
1610
1611 /* Get value corresponding to symbol number symno in symtbl.  */
1612
1613 static CORE_ADDR
1614 read_symbol_nvalue (int symno)
1615 {
1616   struct internal_syment symbol[1];
1617
1618   read_symbol (symbol, symno);
1619   return symbol->n_value;
1620 }
1621
1622
1623 /* Find the address of the function corresponding to symno, where
1624    symno is the symbol pointed to by the linetable.  */
1625
1626 static int
1627 read_symbol_lineno (int symno)
1628 {
1629   struct objfile *objfile = this_symtab_psymtab->objfile;
1630   int xcoff64 = bfd_xcoff_is_xcoff64 (objfile->obfd);
1631
1632   struct coff_symfile_info *info =
1633     (struct coff_symfile_info *)objfile->deprecated_sym_private;
1634   int nsyms = info->symtbl_num_syms;
1635   char *stbl = info->symtbl;
1636   char *strtbl = info->strtbl;
1637
1638   struct internal_syment symbol[1];
1639   union internal_auxent main_aux[1];
1640
1641   if (symno < 0)
1642     {
1643       bf_notfound_complaint ();
1644       return 0;
1645     }
1646
1647   /* Note that just searching for a short distance (e.g. 50 symbols)
1648      is not enough, at least in the following case.
1649
1650      .extern foo
1651      [many .stabx entries]
1652      [a few functions, referring to foo]
1653      .globl foo
1654      .bf
1655
1656      What happens here is that the assembler moves the .stabx entries
1657      to right before the ".bf" for foo, but the symbol for "foo" is before
1658      all the stabx entries.  See PR gdb/2222.  */
1659
1660   /* Maintaining a table of .bf entries might be preferable to this search.
1661      If I understand things correctly it would need to be done only for
1662      the duration of a single psymtab to symtab conversion.  */
1663   while (symno < nsyms)
1664     {
1665       bfd_coff_swap_sym_in (symfile_bfd,
1666                             stbl + (symno * local_symesz), symbol);
1667       if (symbol->n_sclass == C_FCN)
1668         {
1669           char *name = xcoff64 ? strtbl + symbol->n_offset : symbol->n_name;
1670           if (strcmp (name, ".bf") == 0)
1671             goto gotit;
1672         }
1673       symno += symbol->n_numaux + 1;
1674     }
1675
1676   bf_notfound_complaint ();
1677   return 0;
1678
1679 gotit:
1680   /* take aux entry and return its lineno */
1681   symno++;
1682   bfd_coff_swap_aux_in (objfile->obfd, stbl + symno * local_symesz,
1683                         symbol->n_type, symbol->n_sclass,
1684                         0, symbol->n_numaux, main_aux);
1685
1686   return main_aux->x_sym.x_misc.x_lnsz.x_lnno;
1687 }
1688
1689 /* Support for line number handling */
1690
1691 /* This function is called for every section; it finds the outer limits
1692  * of the line table (minimum and maximum file offset) so that the
1693  * mainline code can read the whole thing for efficiency.
1694  */
1695 static void
1696 find_linenos (struct bfd *abfd, struct bfd_section *asect, void *vpinfo)
1697 {
1698   struct coff_symfile_info *info;
1699   int size, count;
1700   file_ptr offset, maxoff;
1701
1702   count = asect->lineno_count;
1703
1704   if (strcmp (asect->name, ".text") != 0 || count == 0)
1705     return;
1706
1707   size = count * coff_data (abfd)->local_linesz;
1708   info = (struct coff_symfile_info *) vpinfo;
1709   offset = asect->line_filepos;
1710   maxoff = offset + size;
1711
1712   if (offset < info->min_lineno_offset || info->min_lineno_offset == 0)
1713     info->min_lineno_offset = offset;
1714
1715   if (maxoff > info->max_lineno_offset)
1716     info->max_lineno_offset = maxoff;
1717 }
1718 \f
1719 static void xcoff_psymtab_to_symtab_1 (struct partial_symtab *);
1720
1721 static void
1722 xcoff_psymtab_to_symtab_1 (struct partial_symtab *pst)
1723 {
1724   struct cleanup *old_chain;
1725   int i;
1726
1727   if (!pst)
1728     return;
1729
1730   if (pst->readin)
1731     {
1732       fprintf_unfiltered
1733         (gdb_stderr, "Psymtab for %s already read in.  Shouldn't happen.\n",
1734          pst->filename);
1735       return;
1736     }
1737
1738   /* Read in all partial symtabs on which this one is dependent */
1739   for (i = 0; i < pst->number_of_dependencies; i++)
1740     if (!pst->dependencies[i]->readin)
1741       {
1742         /* Inform about additional files that need to be read in.  */
1743         if (info_verbose)
1744           {
1745             fputs_filtered (" ", gdb_stdout);
1746             wrap_here ("");
1747             fputs_filtered ("and ", gdb_stdout);
1748             wrap_here ("");
1749             printf_filtered ("%s...", pst->dependencies[i]->filename);
1750             wrap_here ("");     /* Flush output */
1751             gdb_flush (gdb_stdout);
1752           }
1753         xcoff_psymtab_to_symtab_1 (pst->dependencies[i]);
1754       }
1755
1756   if (((struct symloc *) pst->read_symtab_private)->numsyms != 0)
1757     {
1758       /* Init stuff necessary for reading in symbols.  */
1759       stabsread_init ();
1760       buildsym_init ();
1761       old_chain = make_cleanup (really_free_pendings, 0);
1762
1763       read_xcoff_symtab (pst);
1764
1765       do_cleanups (old_chain);
1766     }
1767
1768   pst->readin = 1;
1769 }
1770
1771 static void xcoff_psymtab_to_symtab (struct partial_symtab *);
1772
1773 /* Read in all of the symbols for a given psymtab for real.
1774    Be verbose about it if the user wants that.  */
1775
1776 static void
1777 xcoff_psymtab_to_symtab (struct partial_symtab *pst)
1778 {
1779   bfd *sym_bfd;
1780
1781   if (!pst)
1782     return;
1783
1784   if (pst->readin)
1785     {
1786       fprintf_unfiltered
1787         (gdb_stderr, "Psymtab for %s already read in.  Shouldn't happen.\n",
1788          pst->filename);
1789       return;
1790     }
1791
1792   if (((struct symloc *) pst->read_symtab_private)->numsyms != 0
1793       || pst->number_of_dependencies)
1794     {
1795       /* Print the message now, before reading the string table,
1796          to avoid disconcerting pauses.  */
1797       if (info_verbose)
1798         {
1799           printf_filtered ("Reading in symbols for %s...", pst->filename);
1800           gdb_flush (gdb_stdout);
1801         }
1802
1803       sym_bfd = pst->objfile->obfd;
1804
1805       next_symbol_text_func = xcoff_next_symbol_text;
1806
1807       xcoff_psymtab_to_symtab_1 (pst);
1808
1809       /* Match with global symbols.  This only needs to be done once,
1810          after all of the symtabs and dependencies have been read in.   */
1811       scan_file_globals (pst->objfile);
1812
1813       /* Finish up the debug error message.  */
1814       if (info_verbose)
1815         printf_filtered ("done.\n");
1816     }
1817 }
1818 \f
1819 static void
1820 xcoff_new_init (struct objfile *objfile)
1821 {
1822   stabsread_new_init ();
1823   buildsym_new_init ();
1824 }
1825
1826 /* Do initialization in preparation for reading symbols from OBJFILE.
1827
1828    We will only be called if this is an XCOFF or XCOFF-like file.
1829    BFD handles figuring out the format of the file, and code in symfile.c
1830    uses BFD's determination to vector to us.  */
1831
1832 static void
1833 xcoff_symfile_init (struct objfile *objfile)
1834 {
1835   /* Allocate struct to keep track of the symfile */
1836   objfile->deprecated_sym_private = xmalloc (sizeof (struct coff_symfile_info));
1837
1838   /* XCOFF objects may be reordered, so set OBJF_REORDERED.  If we
1839      find this causes a significant slowdown in gdb then we could
1840      set it in the debug symbol readers only when necessary.  */
1841   objfile->flags |= OBJF_REORDERED;
1842
1843   init_entry_point_info (objfile);
1844 }
1845
1846 /* Perform any local cleanups required when we are done with a particular
1847    objfile.  I.E, we are in the process of discarding all symbol information
1848    for an objfile, freeing up all memory held for it, and unlinking the
1849    objfile struct from the global list of known objfiles. */
1850
1851 static void
1852 xcoff_symfile_finish (struct objfile *objfile)
1853 {
1854   if (objfile->deprecated_sym_private != NULL)
1855     {
1856       xfree (objfile->deprecated_sym_private);
1857     }
1858
1859   /* Start with a fresh include table for the next objfile.  */
1860   if (inclTable)
1861     {
1862       xfree (inclTable);
1863       inclTable = NULL;
1864     }
1865   inclIndx = inclLength = inclDepth = 0;
1866 }
1867
1868
1869 static void
1870 init_stringtab (bfd *abfd, file_ptr offset, struct objfile *objfile)
1871 {
1872   long length;
1873   int val;
1874   unsigned char lengthbuf[4];
1875   char *strtbl;
1876
1877   ((struct coff_symfile_info *) objfile->deprecated_sym_private)->strtbl = NULL;
1878
1879   if (bfd_seek (abfd, offset, SEEK_SET) < 0)
1880     error (_("cannot seek to string table in %s: %s"),
1881            bfd_get_filename (abfd), bfd_errmsg (bfd_get_error ()));
1882
1883   val = bfd_bread ((char *) lengthbuf, sizeof lengthbuf, abfd);
1884   length = bfd_h_get_32 (abfd, lengthbuf);
1885
1886   /* If no string table is needed, then the file may end immediately
1887      after the symbols.  Just return with `strtbl' set to NULL.  */
1888
1889   if (val != sizeof lengthbuf || length < sizeof lengthbuf)
1890     return;
1891
1892   /* Allocate string table from objfile_obstack. We will need this table
1893      as long as we have its symbol table around. */
1894
1895   strtbl = (char *) obstack_alloc (&objfile->objfile_obstack, length);
1896   ((struct coff_symfile_info *) objfile->deprecated_sym_private)->strtbl = strtbl;
1897
1898   /* Copy length buffer, the first byte is usually zero and is
1899      used for stabs with a name length of zero.  */
1900   memcpy (strtbl, lengthbuf, sizeof lengthbuf);
1901   if (length == sizeof lengthbuf)
1902     return;
1903
1904   val = bfd_bread (strtbl + sizeof lengthbuf, length - sizeof lengthbuf, abfd);
1905
1906   if (val != length - sizeof lengthbuf)
1907     error (_("cannot read string table from %s: %s"),
1908            bfd_get_filename (abfd), bfd_errmsg (bfd_get_error ()));
1909   if (strtbl[length - 1] != '\0')
1910     error (_("bad symbol file: string table does not end with null character"));
1911
1912   return;
1913 }
1914 \f
1915 /* If we have not yet seen a function for this psymtab, this is 0.  If we
1916    have seen one, it is the offset in the line numbers of the line numbers
1917    for the psymtab.  */
1918 static unsigned int first_fun_line_offset;
1919
1920 static struct partial_symtab *xcoff_start_psymtab
1921   (struct objfile *, char *, int,
1922    struct partial_symbol **, struct partial_symbol **);
1923
1924 /* Allocate and partially fill a partial symtab.  It will be
1925    completely filled at the end of the symbol list.
1926
1927    SYMFILE_NAME is the name of the symbol-file we are reading from, and ADDR
1928    is the address relative to which its symbols are (incremental) or 0
1929    (normal). */
1930
1931 static struct partial_symtab *
1932 xcoff_start_psymtab (struct objfile *objfile, char *filename, int first_symnum,
1933                      struct partial_symbol **global_syms,
1934                      struct partial_symbol **static_syms)
1935 {
1936   struct partial_symtab *result =
1937   start_psymtab_common (objfile, objfile->section_offsets,
1938                         filename,
1939                         /* We fill in textlow later.  */
1940                         0,
1941                         global_syms, static_syms);
1942
1943   result->read_symtab_private = (char *)
1944     obstack_alloc (&objfile->objfile_obstack, sizeof (struct symloc));
1945   ((struct symloc *) result->read_symtab_private)->first_symnum = first_symnum;
1946   result->read_symtab = xcoff_psymtab_to_symtab;
1947
1948   /* Deduce the source language from the filename for this psymtab. */
1949   psymtab_language = deduce_language_from_filename (filename);
1950
1951   return result;
1952 }
1953
1954 static struct partial_symtab *xcoff_end_psymtab
1955   (struct partial_symtab *, char **, int, int,
1956    struct partial_symtab **, int, int);
1957
1958 /* Close off the current usage of PST.  
1959    Returns PST, or NULL if the partial symtab was empty and thrown away.
1960
1961    CAPPING_SYMBOL_NUMBER is the end of pst (exclusive).
1962
1963    INCLUDE_LIST, NUM_INCLUDES, DEPENDENCY_LIST, and NUMBER_DEPENDENCIES
1964    are the information for includes and dependencies.  */
1965
1966 static struct partial_symtab *
1967 xcoff_end_psymtab (struct partial_symtab *pst, char **include_list,
1968                    int num_includes, int capping_symbol_number,
1969                    struct partial_symtab **dependency_list,
1970                    int number_dependencies, int textlow_not_set)
1971 {
1972   int i;
1973   struct objfile *objfile = pst->objfile;
1974
1975   if (capping_symbol_number != -1)
1976     ((struct symloc *) pst->read_symtab_private)->numsyms =
1977       capping_symbol_number
1978       - ((struct symloc *) pst->read_symtab_private)->first_symnum;
1979   ((struct symloc *) pst->read_symtab_private)->lineno_off =
1980     first_fun_line_offset;
1981   first_fun_line_offset = 0;
1982   pst->n_global_syms =
1983     objfile->global_psymbols.next - (objfile->global_psymbols.list + pst->globals_offset);
1984   pst->n_static_syms =
1985     objfile->static_psymbols.next - (objfile->static_psymbols.list + pst->statics_offset);
1986
1987   pst->number_of_dependencies = number_dependencies;
1988   if (number_dependencies)
1989     {
1990       pst->dependencies = (struct partial_symtab **)
1991         obstack_alloc (&objfile->objfile_obstack,
1992                     number_dependencies * sizeof (struct partial_symtab *));
1993       memcpy (pst->dependencies, dependency_list,
1994               number_dependencies * sizeof (struct partial_symtab *));
1995     }
1996   else
1997     pst->dependencies = 0;
1998
1999   for (i = 0; i < num_includes; i++)
2000     {
2001       struct partial_symtab *subpst =
2002       allocate_psymtab (include_list[i], objfile);
2003
2004       subpst->section_offsets = pst->section_offsets;
2005       subpst->read_symtab_private =
2006         (char *) obstack_alloc (&objfile->objfile_obstack,
2007                                 sizeof (struct symloc));
2008       ((struct symloc *) subpst->read_symtab_private)->first_symnum = 0;
2009       ((struct symloc *) subpst->read_symtab_private)->numsyms = 0;
2010       subpst->textlow = 0;
2011       subpst->texthigh = 0;
2012
2013       /* We could save slight bits of space by only making one of these,
2014          shared by the entire set of include files.  FIXME-someday.  */
2015       subpst->dependencies = (struct partial_symtab **)
2016         obstack_alloc (&objfile->objfile_obstack,
2017                        sizeof (struct partial_symtab *));
2018       subpst->dependencies[0] = pst;
2019       subpst->number_of_dependencies = 1;
2020
2021       subpst->globals_offset =
2022         subpst->n_global_syms =
2023         subpst->statics_offset =
2024         subpst->n_static_syms = 0;
2025
2026       subpst->readin = 0;
2027       subpst->symtab = 0;
2028       subpst->read_symtab = pst->read_symtab;
2029     }
2030
2031   sort_pst_symbols (pst);
2032
2033   /* If there is already a psymtab or symtab for a file of this name,
2034      remove it.  (If there is a symtab, more drastic things also
2035      happen.)  This happens in VxWorks.  */
2036   free_named_symtabs (pst->filename);
2037
2038   if (num_includes == 0
2039       && number_dependencies == 0
2040       && pst->n_global_syms == 0
2041       && pst->n_static_syms == 0)
2042     {
2043       /* Throw away this psymtab, it's empty.  We can't deallocate it, since
2044          it is on the obstack, but we can forget to chain it on the list.  */
2045       /* Empty psymtabs happen as a result of header files which don't have
2046          any symbols in them.  There can be a lot of them.  */
2047
2048       discard_psymtab (pst);
2049
2050       /* Indicate that psymtab was thrown away.  */
2051       pst = (struct partial_symtab *) NULL;
2052     }
2053   return pst;
2054 }
2055
2056 static void swap_sym (struct internal_syment *,
2057                       union internal_auxent *, char **, char **,
2058                       unsigned int *, struct objfile *);
2059
2060 /* Swap raw symbol at *RAW and put the name in *NAME, the symbol in
2061    *SYMBOL, the first auxent in *AUX.  Advance *RAW and *SYMNUMP over
2062    the symbol and its auxents.  */
2063
2064 static void
2065 swap_sym (struct internal_syment *symbol, union internal_auxent *aux,
2066           char **name, char **raw, unsigned int *symnump,
2067           struct objfile *objfile)
2068 {
2069   bfd_coff_swap_sym_in (objfile->obfd, *raw, symbol);
2070   if (symbol->n_zeroes)
2071     {
2072       /* If it's exactly E_SYMNMLEN characters long it isn't
2073          '\0'-terminated.  */
2074       if (symbol->n_name[E_SYMNMLEN - 1] != '\0')
2075         {
2076           /* FIXME: wastes memory for symbols which we don't end up putting
2077              into the minimal symbols.  */
2078           char *p;
2079           p = obstack_alloc (&objfile->objfile_obstack, E_SYMNMLEN + 1);
2080           strncpy (p, symbol->n_name, E_SYMNMLEN);
2081           p[E_SYMNMLEN] = '\0';
2082           *name = p;
2083         }
2084       else
2085         /* Point to the unswapped name as that persists as long as the
2086            objfile does.  */
2087         *name = ((struct external_syment *) *raw)->e.e_name;
2088     }
2089   else if (symbol->n_sclass & 0x80)
2090     {
2091       *name = ((struct coff_symfile_info *) objfile->deprecated_sym_private)->debugsec
2092         + symbol->n_offset;
2093     }
2094   else
2095     {
2096       *name = ((struct coff_symfile_info *) objfile->deprecated_sym_private)->strtbl
2097         + symbol->n_offset;
2098     }
2099   ++*symnump;
2100   *raw += coff_data (objfile->obfd)->local_symesz;
2101   if (symbol->n_numaux > 0)
2102     {
2103       bfd_coff_swap_aux_in (objfile->obfd, *raw, symbol->n_type,
2104                             symbol->n_sclass, 0, symbol->n_numaux, aux);
2105
2106       *symnump += symbol->n_numaux;
2107       *raw += coff_data (objfile->obfd)->local_symesz * symbol->n_numaux;
2108     }
2109 }
2110
2111 static void
2112 function_outside_compilation_unit_complaint (const char *arg1)
2113 {
2114   complaint (&symfile_complaints,
2115              _("function `%s' appears to be defined outside of all compilation units"),
2116              arg1);
2117 }
2118
2119 static void
2120 scan_xcoff_symtab (struct objfile *objfile)
2121 {
2122   CORE_ADDR toc_offset = 0;     /* toc offset value in data section. */
2123   char *filestring = NULL;
2124
2125   char *namestring;
2126   int past_first_source_file = 0;
2127   bfd *abfd;
2128   asection *bfd_sect;
2129   unsigned int nsyms;
2130
2131   /* Current partial symtab */
2132   struct partial_symtab *pst;
2133
2134   /* List of current psymtab's include files */
2135   char **psymtab_include_list;
2136   int includes_allocated;
2137   int includes_used;
2138
2139   /* Index within current psymtab dependency list */
2140   struct partial_symtab **dependency_list;
2141   int dependencies_used, dependencies_allocated;
2142
2143   char *sraw_symbol;
2144   struct internal_syment symbol;
2145   union internal_auxent main_aux[5];
2146   unsigned int ssymnum;
2147
2148   char *last_csect_name = NULL; /* last seen csect's name and value */
2149   CORE_ADDR last_csect_val = 0;
2150   int last_csect_sec = 0;
2151   int misc_func_recorded = 0;   /* true if any misc. function */
2152   int textlow_not_set = 1;
2153
2154   pst = (struct partial_symtab *) 0;
2155
2156   includes_allocated = 30;
2157   includes_used = 0;
2158   psymtab_include_list = (char **) alloca (includes_allocated *
2159                                            sizeof (char *));
2160
2161   dependencies_allocated = 30;
2162   dependencies_used = 0;
2163   dependency_list =
2164     (struct partial_symtab **) alloca (dependencies_allocated *
2165                                        sizeof (struct partial_symtab *));
2166
2167   last_source_file = NULL;
2168
2169   abfd = objfile->obfd;
2170   next_symbol_text_func = xcoff_next_symbol_text;
2171
2172   sraw_symbol = ((struct coff_symfile_info *) objfile->deprecated_sym_private)->symtbl;
2173   nsyms = ((struct coff_symfile_info *) objfile->deprecated_sym_private)->symtbl_num_syms;
2174   ssymnum = 0;
2175   while (ssymnum < nsyms)
2176     {
2177       int sclass;
2178
2179       QUIT;
2180
2181       bfd_coff_swap_sym_in (abfd, sraw_symbol, &symbol);
2182       sclass = symbol.n_sclass;
2183
2184       switch (sclass)
2185         {
2186         case C_EXT:
2187         case C_HIDEXT:
2188           {
2189             /* The CSECT auxent--always the last auxent.  */
2190             union internal_auxent csect_aux;
2191             unsigned int symnum_before = ssymnum;
2192
2193             swap_sym (&symbol, &main_aux[0], &namestring, &sraw_symbol,
2194                       &ssymnum, objfile);
2195             if (symbol.n_numaux > 1)
2196               {
2197                 bfd_coff_swap_aux_in
2198                   (objfile->obfd,
2199                    sraw_symbol - coff_data (abfd)->local_symesz,
2200                    symbol.n_type,
2201                    symbol.n_sclass,
2202                    symbol.n_numaux - 1,
2203                    symbol.n_numaux,
2204                    &csect_aux);
2205               }
2206             else
2207               csect_aux = main_aux[0];
2208
2209             /* If symbol name starts with ".$" or "$", ignore it.  */
2210             if (namestring[0] == '$'
2211                 || (namestring[0] == '.' && namestring[1] == '$'))
2212               break;
2213
2214             switch (csect_aux.x_csect.x_smtyp & 0x7)
2215               {
2216               case XTY_SD:
2217                 switch (csect_aux.x_csect.x_smclas)
2218                   {
2219                   case XMC_PR:
2220                     if (last_csect_name)
2221                       {
2222                         /* If no misc. function recorded in the last
2223                            seen csect, enter it as a function. This
2224                            will take care of functions like strcmp()
2225                            compiled by xlc.  */
2226
2227                         if (!misc_func_recorded)
2228                           {
2229                             RECORD_MINIMAL_SYMBOL
2230                               (last_csect_name, last_csect_val,
2231                                mst_text, last_csect_sec,
2232                                objfile);
2233                           }
2234
2235                         if (pst != NULL)
2236                           {
2237                             /* We have to allocate one psymtab for
2238                                each program csect, because their text
2239                                sections need not be adjacent.  */
2240                             xcoff_end_psymtab
2241                               (pst, psymtab_include_list, includes_used,
2242                                symnum_before, dependency_list,
2243                                dependencies_used, textlow_not_set);
2244                             includes_used = 0;
2245                             dependencies_used = 0;
2246                             /* Give all psymtabs for this source file the same
2247                                name.  */
2248                             pst = xcoff_start_psymtab
2249                               (objfile,
2250                                filestring,
2251                                symnum_before,
2252                                objfile->global_psymbols.next,
2253                                objfile->static_psymbols.next);
2254                           }
2255                       }
2256                     /* Activate the misc_func_recorded mechanism for
2257                        compiler- and linker-generated CSECTs like ".strcmp"
2258                        and "@FIX1".  */ 
2259                     if (namestring && (namestring[0] == '.'
2260                                        || namestring[0] == '@'))
2261                       {
2262                         last_csect_name = namestring;
2263                         last_csect_val = symbol.n_value;
2264                         last_csect_sec =
2265                           secnum_to_section (symbol.n_scnum, objfile);
2266                       }
2267                     if (pst != NULL)
2268                       {
2269                         CORE_ADDR highval =
2270                         symbol.n_value + csect_aux.x_csect.x_scnlen.l;
2271                         if (highval > pst->texthigh)
2272                           pst->texthigh = highval;
2273                         if (pst->textlow == 0 || symbol.n_value < pst->textlow)
2274                           pst->textlow = symbol.n_value;
2275                       }
2276                     misc_func_recorded = 0;
2277                     break;
2278
2279                   case XMC_RW:
2280                   case XMC_TD:
2281                     /* Data variables are recorded in the minimal symbol
2282                        table, except for section symbols.  */
2283                     if (*namestring != '.')
2284                       prim_record_minimal_symbol_and_info
2285                         (namestring, symbol.n_value,
2286                          sclass == C_HIDEXT ? mst_file_data : mst_data,
2287                          NULL, secnum_to_section (symbol.n_scnum, objfile),
2288                          NULL, objfile);
2289                     break;
2290
2291                   case XMC_TC0:
2292                     if (toc_offset)
2293                       warning (_("More than one XMC_TC0 symbol found."));
2294                     toc_offset = symbol.n_value;
2295
2296                     /* Make TOC offset relative to start address of section.  */
2297                     bfd_sect = secnum_to_bfd_section (symbol.n_scnum, objfile);
2298                     if (bfd_sect)
2299                       toc_offset -= bfd_section_vma (objfile->obfd, bfd_sect);
2300                     break;
2301
2302                   case XMC_TC:
2303                     /* These symbols tell us where the TOC entry for a
2304                        variable is, not the variable itself.  */
2305                     break;
2306
2307                   default:
2308                     break;
2309                   }
2310                 break;
2311
2312               case XTY_LD:
2313                 switch (csect_aux.x_csect.x_smclas)
2314                   {
2315                   case XMC_PR:
2316                     /* A function entry point.  */
2317
2318                     if (first_fun_line_offset == 0 && symbol.n_numaux > 1)
2319                       first_fun_line_offset =
2320                         main_aux[0].x_sym.x_fcnary.x_fcn.x_lnnoptr;
2321                     RECORD_MINIMAL_SYMBOL
2322                       (namestring, symbol.n_value,
2323                        sclass == C_HIDEXT ? mst_file_text : mst_text,
2324                        secnum_to_section (symbol.n_scnum, objfile),
2325                        objfile);
2326                     break;
2327
2328                   case XMC_GL:
2329                     /* shared library function trampoline code entry
2330                        point. */
2331
2332                     /* record trampoline code entries as
2333                        mst_solib_trampoline symbol.  When we lookup mst
2334                        symbols, we will choose mst_text over
2335                        mst_solib_trampoline. */
2336                     RECORD_MINIMAL_SYMBOL
2337                       (namestring, symbol.n_value,
2338                        mst_solib_trampoline,
2339                        secnum_to_section (symbol.n_scnum, objfile),
2340                        objfile);
2341                     break;
2342
2343                   case XMC_DS:
2344                     /* The symbols often have the same names as
2345                        debug symbols for functions, and confuse
2346                        lookup_symbol.  */
2347                     break;
2348
2349                   default:
2350
2351                     /* xlc puts each variable in a separate csect,
2352                        so we get an XTY_SD for each variable.  But
2353                        gcc puts several variables in a csect, so
2354                        that each variable only gets an XTY_LD.  We
2355                        still need to record them.  This will
2356                        typically be XMC_RW; I suspect XMC_RO and
2357                        XMC_BS might be possible too.  */
2358                     if (*namestring != '.')
2359                       prim_record_minimal_symbol_and_info
2360                         (namestring, symbol.n_value,
2361                          sclass == C_HIDEXT ? mst_file_data : mst_data,
2362                          NULL, secnum_to_section (symbol.n_scnum, objfile),
2363                          NULL, objfile);
2364                     break;
2365                   }
2366                 break;
2367
2368               case XTY_CM:
2369                 switch (csect_aux.x_csect.x_smclas)
2370                   {
2371                   case XMC_RW:
2372                   case XMC_BS:
2373                     /* Common variables are recorded in the minimal symbol
2374                        table, except for section symbols.  */
2375                     if (*namestring != '.')
2376                       prim_record_minimal_symbol_and_info
2377                         (namestring, symbol.n_value,
2378                          sclass == C_HIDEXT ? mst_file_bss : mst_bss,
2379                          NULL, secnum_to_section (symbol.n_scnum, objfile),
2380                          NULL, objfile);
2381                     break;
2382                   }
2383                 break;
2384
2385               default:
2386                 break;
2387               }
2388           }
2389           break;
2390         case C_FILE:
2391           {
2392             unsigned int symnum_before;
2393
2394             symnum_before = ssymnum;
2395             swap_sym (&symbol, &main_aux[0], &namestring, &sraw_symbol,
2396                       &ssymnum, objfile);
2397
2398             /* See if the last csect needs to be recorded.  */
2399
2400             if (last_csect_name && !misc_func_recorded)
2401               {
2402
2403                 /* If no misc. function recorded in the last seen csect, enter
2404                    it as a function.  This will take care of functions like
2405                    strcmp() compiled by xlc.  */
2406
2407                 RECORD_MINIMAL_SYMBOL
2408                   (last_csect_name, last_csect_val,
2409                    mst_text, last_csect_sec, objfile);
2410               }
2411
2412             if (pst)
2413               {
2414                 xcoff_end_psymtab (pst, psymtab_include_list, includes_used,
2415                                    symnum_before, dependency_list,
2416                                    dependencies_used, textlow_not_set);
2417                 includes_used = 0;
2418                 dependencies_used = 0;
2419               }
2420             first_fun_line_offset = 0;
2421
2422             /* XCOFF, according to the AIX 3.2 documentation, puts the
2423                filename in cs->c_name.  But xlc 1.3.0.2 has decided to
2424                do things the standard COFF way and put it in the auxent.
2425                We use the auxent if the symbol is ".file" and an auxent
2426                exists, otherwise use the symbol itself.  */
2427             if (!strcmp (namestring, ".file") && symbol.n_numaux > 0)
2428               {
2429                 filestring = coff_getfilename (&main_aux[0], objfile);
2430               }
2431             else
2432               filestring = namestring;
2433
2434             pst = xcoff_start_psymtab (objfile,
2435                                        filestring,
2436                                        symnum_before,
2437                                        objfile->global_psymbols.next,
2438                                        objfile->static_psymbols.next);
2439             last_csect_name = NULL;
2440           }
2441           break;
2442
2443         default:
2444           {
2445             complaint (&symfile_complaints,
2446                        _("Storage class %d not recognized during scan"), sclass);
2447           }
2448           /* FALLTHROUGH */
2449
2450           /* C_FCN is .bf and .ef symbols.  I think it is sufficient
2451              to handle only the C_FUN and C_EXT.  */
2452         case C_FCN:
2453
2454         case C_BSTAT:
2455         case C_ESTAT:
2456         case C_ARG:
2457         case C_REGPARM:
2458         case C_REG:
2459         case C_TPDEF:
2460         case C_STRTAG:
2461         case C_UNTAG:
2462         case C_ENTAG:
2463         case C_LABEL:
2464         case C_NULL:
2465
2466           /* C_EINCL means we are switching back to the main file.  But there
2467              is no reason to care; the only thing we want to know about
2468              includes is the names of all the included (.h) files.  */
2469         case C_EINCL:
2470
2471         case C_BLOCK:
2472
2473           /* I don't think C_STAT is used in xcoff; C_HIDEXT appears to be
2474              used instead.  */
2475         case C_STAT:
2476
2477           /* I don't think the name of the common block (as opposed to the
2478              variables within it) is something which is user visible
2479              currently.  */
2480         case C_BCOMM:
2481         case C_ECOMM:
2482
2483         case C_PSYM:
2484         case C_RPSYM:
2485
2486           /* I think we can ignore C_LSYM; types on xcoff seem to use C_DECL
2487              so C_LSYM would appear to be only for locals.  */
2488         case C_LSYM:
2489
2490         case C_AUTO:
2491         case C_RSYM:
2492           {
2493             /* We probably could save a few instructions by assuming that
2494                C_LSYM, C_PSYM, etc., never have auxents.  */
2495             int naux1 = symbol.n_numaux + 1;
2496             ssymnum += naux1;
2497             sraw_symbol += bfd_coff_symesz (abfd) * naux1;
2498           }
2499           break;
2500
2501         case C_BINCL:
2502           {
2503             /* Mark down an include file in the current psymtab */
2504             enum language tmp_language;
2505             swap_sym (&symbol, &main_aux[0], &namestring, &sraw_symbol,
2506                       &ssymnum, objfile);
2507
2508             tmp_language = deduce_language_from_filename (namestring);
2509
2510             /* Only change the psymtab's language if we've learned
2511                something useful (eg. tmp_language is not language_unknown).
2512                In addition, to match what start_subfile does, never change
2513                from C++ to C.  */
2514             if (tmp_language != language_unknown
2515                 && (tmp_language != language_c
2516                     || psymtab_language != language_cplus))
2517               psymtab_language = tmp_language;
2518
2519             /* In C++, one may expect the same filename to come round many
2520                times, when code is coming alternately from the main file
2521                and from inline functions in other files. So I check to see
2522                if this is a file we've seen before -- either the main
2523                source file, or a previously included file.
2524
2525                This seems to be a lot of time to be spending on N_SOL, but
2526                things like "break c-exp.y:435" need to work (I
2527                suppose the psymtab_include_list could be hashed or put
2528                in a binary tree, if profiling shows this is a major hog).  */
2529             if (pst && strcmp (namestring, pst->filename) == 0)
2530               continue;
2531             {
2532               int i;
2533               for (i = 0; i < includes_used; i++)
2534                 if (strcmp (namestring, psymtab_include_list[i]) == 0)
2535                   {
2536                     i = -1;
2537                     break;
2538                   }
2539               if (i == -1)
2540                 continue;
2541             }
2542             psymtab_include_list[includes_used++] = namestring;
2543             if (includes_used >= includes_allocated)
2544               {
2545                 char **orig = psymtab_include_list;
2546
2547                 psymtab_include_list = (char **)
2548                   alloca ((includes_allocated *= 2) *
2549                           sizeof (char *));
2550                 memcpy (psymtab_include_list, orig,
2551                         includes_used * sizeof (char *));
2552               }
2553             continue;
2554           }
2555         case C_FUN:
2556           /* The value of the C_FUN is not the address of the function (it
2557              appears to be the address before linking), but as long as it
2558              is smaller than the actual address, then find_pc_partial_function
2559              will use the minimal symbols instead.  I hope.  */
2560
2561         case C_GSYM:
2562         case C_ECOML:
2563         case C_DECL:
2564         case C_STSYM:
2565           {
2566             char *p;
2567             swap_sym (&symbol, &main_aux[0], &namestring, &sraw_symbol,
2568                       &ssymnum, objfile);
2569
2570             p = (char *) strchr (namestring, ':');
2571             if (!p)
2572               continue;                 /* Not a debugging symbol.   */
2573
2574             /* Main processing section for debugging symbols which
2575                the initial read through the symbol tables needs to worry
2576                about.  If we reach this point, the symbol which we are
2577                considering is definitely one we are interested in.
2578                p must also contain the (valid) index into the namestring
2579                which indicates the debugging type symbol.  */
2580
2581             switch (p[1])
2582               {
2583               case 'S':
2584                 symbol.n_value += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
2585
2586                 if (gdbarch_static_transform_name_p (gdbarch))
2587                   namestring = gdbarch_static_transform_name
2588                                  (gdbarch, namestring);
2589
2590                 add_psymbol_to_list (namestring, p - namestring,
2591                                      VAR_DOMAIN, LOC_STATIC,
2592                                      &objfile->static_psymbols,
2593                                      0, symbol.n_value,
2594                                      psymtab_language, objfile);
2595                 continue;
2596
2597               case 'G':
2598                 symbol.n_value += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
2599                 /* The addresses in these entries are reported to be
2600                    wrong.  See the code that reads 'G's for symtabs. */
2601                 add_psymbol_to_list (namestring, p - namestring,
2602                                      VAR_DOMAIN, LOC_STATIC,
2603                                      &objfile->global_psymbols,
2604                                      0, symbol.n_value,
2605                                      psymtab_language, objfile);
2606                 continue;
2607
2608               case 'T':
2609                 /* When a 'T' entry is defining an anonymous enum, it
2610                    may have a name which is the empty string, or a
2611                    single space.  Since they're not really defining a
2612                    symbol, those shouldn't go in the partial symbol
2613                    table.  We do pick up the elements of such enums at
2614                    'check_enum:', below.  */
2615                 if (p >= namestring + 2
2616                     || (p == namestring + 1
2617                         && namestring[0] != ' '))
2618                   {
2619                     add_psymbol_to_list (namestring, p - namestring,
2620                                          STRUCT_DOMAIN, LOC_TYPEDEF,
2621                                          &objfile->static_psymbols,
2622                                          symbol.n_value, 0,
2623                                          psymtab_language, objfile);
2624                     if (p[2] == 't')
2625                       {
2626                         /* Also a typedef with the same name.  */
2627                         add_psymbol_to_list (namestring, p - namestring,
2628                                              VAR_DOMAIN, LOC_TYPEDEF,
2629                                              &objfile->static_psymbols,
2630                                              symbol.n_value, 0,
2631                                              psymtab_language, objfile);
2632                         p += 1;
2633                       }
2634                   }
2635                 goto check_enum;
2636
2637               case 't':
2638                 if (p != namestring)    /* a name is there, not just :T... */
2639                   {
2640                     add_psymbol_to_list (namestring, p - namestring,
2641                                          VAR_DOMAIN, LOC_TYPEDEF,
2642                                          &objfile->static_psymbols,
2643                                          symbol.n_value, 0,
2644                                          psymtab_language, objfile);
2645                   }
2646               check_enum:
2647                 /* If this is an enumerated type, we need to
2648                    add all the enum constants to the partial symbol
2649                    table.  This does not cover enums without names, e.g.
2650                    "enum {a, b} c;" in C, but fortunately those are
2651                    rare.  There is no way for GDB to find those from the
2652                    enum type without spending too much time on it.  Thus
2653                    to solve this problem, the compiler needs to put out the
2654                    enum in a nameless type.  GCC2 does this.  */
2655
2656                 /* We are looking for something of the form
2657                    <name> ":" ("t" | "T") [<number> "="] "e"
2658                    {<constant> ":" <value> ","} ";".  */
2659
2660                 /* Skip over the colon and the 't' or 'T'.  */
2661                 p += 2;
2662                 /* This type may be given a number.  Also, numbers can come
2663                    in pairs like (0,26).  Skip over it.  */
2664                 while ((*p >= '0' && *p <= '9')
2665                        || *p == '(' || *p == ',' || *p == ')'
2666                        || *p == '=')
2667                   p++;
2668
2669                 if (*p++ == 'e')
2670                   {
2671                     /* The aix4 compiler emits extra crud before the members.  */
2672                     if (*p == '-')
2673                       {
2674                         /* Skip over the type (?).  */
2675                         while (*p != ':')
2676                           p++;
2677
2678                         /* Skip over the colon.  */
2679                         p++;
2680                       }
2681
2682                     /* We have found an enumerated type.  */
2683                     /* According to comments in read_enum_type
2684                        a comma could end it instead of a semicolon.
2685                        I don't know where that happens.
2686                        Accept either.  */
2687                     while (*p && *p != ';' && *p != ',')
2688                       {
2689                         char *q;
2690
2691                         /* Check for and handle cretinous dbx symbol name
2692                            continuation!  */
2693                         if (*p == '\\' || (*p == '?' && p[1] == '\0'))
2694                           p = next_symbol_text (objfile);
2695
2696                         /* Point to the character after the name
2697                            of the enum constant.  */
2698                         for (q = p; *q && *q != ':'; q++)
2699                           ;
2700                         /* Note that the value doesn't matter for
2701                            enum constants in psymtabs, just in symtabs.  */
2702                         add_psymbol_to_list (p, q - p,
2703                                              VAR_DOMAIN, LOC_CONST,
2704                                              &objfile->static_psymbols, 0,
2705                                              0, psymtab_language, objfile);
2706                         /* Point past the name.  */
2707                         p = q;
2708                         /* Skip over the value.  */
2709                         while (*p && *p != ',')
2710                           p++;
2711                         /* Advance past the comma.  */
2712                         if (*p)
2713                           p++;
2714                       }
2715                   }
2716                 continue;
2717
2718               case 'c':
2719                 /* Constant, e.g. from "const" in Pascal.  */
2720                 add_psymbol_to_list (namestring, p - namestring,
2721                                      VAR_DOMAIN, LOC_CONST,
2722                                      &objfile->static_psymbols, symbol.n_value,
2723                                      0, psymtab_language, objfile);
2724                 continue;
2725
2726               case 'f':
2727                 if (! pst)
2728                   {
2729                     int name_len = p - namestring;
2730                     char *name = xmalloc (name_len + 1);
2731                     memcpy (name, namestring, name_len);
2732                     name[name_len] = '\0';
2733                     function_outside_compilation_unit_complaint (name);
2734                     xfree (name);
2735                   }
2736                 symbol.n_value += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
2737                 add_psymbol_to_list (namestring, p - namestring,
2738                                      VAR_DOMAIN, LOC_BLOCK,
2739                                      &objfile->static_psymbols,
2740                                      0, symbol.n_value,
2741                                      psymtab_language, objfile);
2742                 continue;
2743
2744                 /* Global functions were ignored here, but now they
2745                    are put into the global psymtab like one would expect.
2746                    They're also in the minimal symbol table.  */
2747               case 'F':
2748                 if (! pst)
2749                   {
2750                     int name_len = p - namestring;
2751                     char *name = xmalloc (name_len + 1);
2752                     memcpy (name, namestring, name_len);
2753                     name[name_len] = '\0';
2754                     function_outside_compilation_unit_complaint (name);
2755                     xfree (name);
2756                   }
2757                 symbol.n_value += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
2758                 add_psymbol_to_list (namestring, p - namestring,
2759                                      VAR_DOMAIN, LOC_BLOCK,
2760                                      &objfile->global_psymbols,
2761                                      0, symbol.n_value,
2762                                      psymtab_language, objfile);
2763                 continue;
2764
2765                 /* Two things show up here (hopefully); static symbols of
2766                    local scope (static used inside braces) or extensions
2767                    of structure symbols.  We can ignore both.  */
2768               case 'V':
2769               case '(':
2770               case '0':
2771               case '1':
2772               case '2':
2773               case '3':
2774               case '4':
2775               case '5':
2776               case '6':
2777               case '7':
2778               case '8':
2779               case '9':
2780               case '-':
2781               case '#':         /* for symbol identification (used in live ranges) */
2782                 continue;
2783
2784               case ':':
2785                 /* It is a C++ nested symbol.  We don't need to record it
2786                    (I don't think); if we try to look up foo::bar::baz,
2787                    then symbols for the symtab containing foo should get
2788                    read in, I think.  */
2789                 /* Someone says sun cc puts out symbols like
2790                    /foo/baz/maclib::/usr/local/bin/maclib,
2791                    which would get here with a symbol type of ':'.  */
2792                 continue;
2793
2794               default:
2795                 /* Unexpected symbol descriptor.  The second and subsequent stabs
2796                    of a continued stab can show up here.  The question is
2797                    whether they ever can mimic a normal stab--it would be
2798                    nice if not, since we certainly don't want to spend the
2799                    time searching to the end of every string looking for
2800                    a backslash.  */
2801
2802                 complaint (&symfile_complaints,
2803                            _("unknown symbol descriptor `%c'"), p[1]);
2804
2805                 /* Ignore it; perhaps it is an extension that we don't
2806                    know about.  */
2807                 continue;
2808               }
2809           }
2810         }
2811     }
2812
2813   if (pst)
2814     {
2815       xcoff_end_psymtab (pst, psymtab_include_list, includes_used,
2816                          ssymnum, dependency_list,
2817                          dependencies_used, textlow_not_set);
2818     }
2819
2820   /* Record the toc offset value of this symbol table into objfile structure.
2821      If no XMC_TC0 is found, toc_offset should be zero. Another place to obtain
2822      this information would be file auxiliary header. */
2823
2824   ((struct coff_symfile_info *) objfile->deprecated_sym_private)->toc_offset = toc_offset;
2825 }
2826
2827 /* Return the toc offset value for a given objfile.  */
2828
2829 CORE_ADDR
2830 get_toc_offset (struct objfile *objfile)
2831 {
2832   if (objfile)
2833     return ((struct coff_symfile_info *) objfile->deprecated_sym_private)->toc_offset;
2834   return 0;
2835 }
2836
2837 /* Scan and build partial symbols for a symbol file.
2838    We have been initialized by a call to dbx_symfile_init, which 
2839    put all the relevant info into a "struct dbx_symfile_info",
2840    hung off the objfile structure.
2841
2842    SECTION_OFFSETS contains offsets relative to which the symbols in the
2843    various sections are (depending where the sections were actually loaded).
2844    MAINLINE is true if we are reading the main symbol
2845    table (as opposed to a shared lib or dynamically loaded file).  */
2846
2847 static void
2848 xcoff_initial_scan (struct objfile *objfile, int mainline)
2849 {
2850   bfd *abfd;
2851   int val;
2852   struct cleanup *back_to;
2853   int num_symbols;              /* # of symbols */
2854   file_ptr symtab_offset;       /* symbol table and */
2855   file_ptr stringtab_offset;    /* string table file offsets */
2856   struct coff_symfile_info *info;
2857   char *name;
2858   unsigned int size;
2859
2860   info = (struct coff_symfile_info *) objfile->deprecated_sym_private;
2861   symfile_bfd = abfd = objfile->obfd;
2862   name = objfile->name;
2863
2864   num_symbols = bfd_get_symcount (abfd);        /* # of symbols */
2865   symtab_offset = obj_sym_filepos (abfd);       /* symbol table file offset */
2866   stringtab_offset = symtab_offset +
2867     num_symbols * coff_data (abfd)->local_symesz;
2868
2869   info->min_lineno_offset = 0;
2870   info->max_lineno_offset = 0;
2871   bfd_map_over_sections (abfd, find_linenos, info);
2872
2873   if (num_symbols > 0)
2874     {
2875       /* Read the string table.  */
2876       init_stringtab (abfd, stringtab_offset, objfile);
2877
2878       /* Read the .debug section, if present.  */
2879       {
2880         struct bfd_section *secp;
2881         bfd_size_type length;
2882         char *debugsec = NULL;
2883
2884         secp = bfd_get_section_by_name (abfd, ".debug");
2885         if (secp)
2886           {
2887             length = bfd_section_size (abfd, secp);
2888             if (length)
2889               {
2890                 debugsec =
2891                   (char *) obstack_alloc (&objfile->objfile_obstack, length);
2892
2893                 if (!bfd_get_section_contents (abfd, secp, debugsec,
2894                                                (file_ptr) 0, length))
2895                   {
2896                     error (_("Error reading .debug section of `%s': %s"),
2897                            name, bfd_errmsg (bfd_get_error ()));
2898                   }
2899               }
2900           }
2901         ((struct coff_symfile_info *) objfile->deprecated_sym_private)->debugsec =
2902           debugsec;
2903       }
2904     }
2905
2906   /* Read the symbols.  We keep them in core because we will want to
2907      access them randomly in read_symbol*.  */
2908   val = bfd_seek (abfd, symtab_offset, SEEK_SET);
2909   if (val < 0)
2910     error (_("Error reading symbols from %s: %s"),
2911            name, bfd_errmsg (bfd_get_error ()));
2912   size = coff_data (abfd)->local_symesz * num_symbols;
2913   ((struct coff_symfile_info *) objfile->deprecated_sym_private)->symtbl =
2914     obstack_alloc (&objfile->objfile_obstack, size);
2915   ((struct coff_symfile_info *) objfile->deprecated_sym_private)->symtbl_num_syms =
2916     num_symbols;
2917
2918   val = bfd_bread (((struct coff_symfile_info *) objfile->deprecated_sym_private)->symtbl,
2919                    size, abfd);
2920   if (val != size)
2921     perror_with_name (_("reading symbol table"));
2922
2923   /* If we are reinitializing, or if we have never loaded syms yet, init */
2924   if (mainline
2925       || (objfile->global_psymbols.size == 0
2926           && objfile->static_psymbols.size == 0))
2927     /* I'm not sure how how good num_symbols is; the rule of thumb in
2928        init_psymbol_list was developed for a.out.  On the one hand,
2929        num_symbols includes auxents.  On the other hand, it doesn't
2930        include N_SLINE.  */
2931     init_psymbol_list (objfile, num_symbols);
2932
2933   free_pending_blocks ();
2934   back_to = make_cleanup (really_free_pendings, 0);
2935
2936   init_minimal_symbol_collection ();
2937   make_cleanup_discard_minimal_symbols ();
2938
2939   /* Now that the symbol table data of the executable file are all in core,
2940      process them and define symbols accordingly.  */
2941
2942   scan_xcoff_symtab (objfile);
2943
2944   /* Install any minimal symbols that have been collected as the current
2945      minimal symbols for this objfile. */
2946
2947   install_minimal_symbols (objfile);
2948
2949   do_cleanups (back_to);
2950 }
2951 \f
2952 static void
2953 xcoff_symfile_offsets (struct objfile *objfile, struct section_addr_info *addrs)
2954 {
2955   asection *sect = NULL;
2956   int i;
2957
2958   objfile->num_sections = bfd_count_sections (objfile->obfd);
2959   objfile->section_offsets = (struct section_offsets *)
2960     obstack_alloc (&objfile->objfile_obstack, 
2961                    SIZEOF_N_SECTION_OFFSETS (objfile->num_sections));
2962
2963   /* Initialize the section indexes for future use. */
2964   sect = bfd_get_section_by_name (objfile->obfd, ".text");
2965   if (sect) 
2966     objfile->sect_index_text = sect->index;
2967
2968   sect = bfd_get_section_by_name (objfile->obfd, ".data");
2969   if (sect) 
2970     objfile->sect_index_data = sect->index;
2971
2972   sect = bfd_get_section_by_name (objfile->obfd, ".bss");
2973   if (sect) 
2974     objfile->sect_index_bss = sect->index;
2975
2976   sect = bfd_get_section_by_name (objfile->obfd, ".rodata");
2977   if (sect) 
2978     objfile->sect_index_rodata = sect->index;
2979
2980   for (i = 0; i < objfile->num_sections; ++i)
2981     {
2982       /* syms_from_objfile kindly subtracts from addr the
2983          bfd_section_vma of the .text section.  This strikes me as
2984          wrong--whether the offset to be applied to symbol reading is
2985          relative to the start address of the section depends on the
2986          symbol format.  In any event, this whole "addr" concept is
2987          pretty broken (it doesn't handle any section but .text
2988          sensibly), so just ignore the addr parameter and use 0.
2989          rs6000-nat.c will set the correct section offsets via
2990          objfile_relocate.  */
2991         (objfile->section_offsets)->offsets[i] = 0;
2992     }
2993 }
2994
2995 /* Register our ability to parse symbols for xcoff BFD files.  */
2996
2997 static struct sym_fns xcoff_sym_fns =
2998 {
2999
3000   /* It is possible that coff and xcoff should be merged as
3001      they do have fundamental similarities (for example, the extra storage
3002      classes used for stabs could presumably be recognized in any COFF file).
3003      However, in addition to obvious things like all the csect hair, there are
3004      some subtler differences between xcoffread.c and coffread.c, notably
3005      the fact that coffread.c has no need to read in all the symbols, but
3006      xcoffread.c reads all the symbols and does in fact randomly access them
3007      (in C_BSTAT and line number processing).  */
3008
3009   bfd_target_xcoff_flavour,
3010
3011   xcoff_new_init,               /* sym_new_init: init anything gbl to entire symtab */
3012   xcoff_symfile_init,           /* sym_init: read initial info, setup for sym_read() */
3013   xcoff_initial_scan,           /* sym_read: read a symbol file into symtab */
3014   xcoff_symfile_finish,         /* sym_finish: finished with file, cleanup */
3015   xcoff_symfile_offsets,        /* sym_offsets: xlate offsets ext->int form */
3016   default_symfile_segments,     /* sym_segments: Get segment information from
3017                                    a file.  */
3018   aix_process_linenos,          /* sym_read_linetable */
3019   NULL                          /* next: pointer to next struct sym_fns */
3020 };
3021
3022 void
3023 _initialize_xcoffread (void)
3024 {
3025   add_symtab_fns (&xcoff_sym_fns);
3026 }