(scan_xcoff_symtab): Do not include global symbols
[external/binutils.git] / gdb / xcoffread.c
1 /* Read AIX xcoff symbol tables and convert to internal format, for GDB.
2    Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
3    1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2007, 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   struct gdbarch *gdbarch = get_objfile_arch (objfile);
2123   CORE_ADDR toc_offset = 0;     /* toc offset value in data section. */
2124   char *filestring = NULL;
2125
2126   char *namestring;
2127   int past_first_source_file = 0;
2128   bfd *abfd;
2129   asection *bfd_sect;
2130   unsigned int nsyms;
2131
2132   /* Current partial symtab */
2133   struct partial_symtab *pst;
2134
2135   /* List of current psymtab's include files */
2136   char **psymtab_include_list;
2137   int includes_allocated;
2138   int includes_used;
2139
2140   /* Index within current psymtab dependency list */
2141   struct partial_symtab **dependency_list;
2142   int dependencies_used, dependencies_allocated;
2143
2144   char *sraw_symbol;
2145   struct internal_syment symbol;
2146   union internal_auxent main_aux[5];
2147   unsigned int ssymnum;
2148
2149   char *last_csect_name = NULL; /* last seen csect's name and value */
2150   CORE_ADDR last_csect_val = 0;
2151   int last_csect_sec = 0;
2152   int misc_func_recorded = 0;   /* true if any misc. function */
2153   int textlow_not_set = 1;
2154
2155   pst = (struct partial_symtab *) 0;
2156
2157   includes_allocated = 30;
2158   includes_used = 0;
2159   psymtab_include_list = (char **) alloca (includes_allocated *
2160                                            sizeof (char *));
2161
2162   dependencies_allocated = 30;
2163   dependencies_used = 0;
2164   dependency_list =
2165     (struct partial_symtab **) alloca (dependencies_allocated *
2166                                        sizeof (struct partial_symtab *));
2167
2168   last_source_file = NULL;
2169
2170   abfd = objfile->obfd;
2171   next_symbol_text_func = xcoff_next_symbol_text;
2172
2173   sraw_symbol = ((struct coff_symfile_info *) objfile->deprecated_sym_private)->symtbl;
2174   nsyms = ((struct coff_symfile_info *) objfile->deprecated_sym_private)->symtbl_num_syms;
2175   ssymnum = 0;
2176   while (ssymnum < nsyms)
2177     {
2178       int sclass;
2179
2180       QUIT;
2181
2182       bfd_coff_swap_sym_in (abfd, sraw_symbol, &symbol);
2183       sclass = symbol.n_sclass;
2184
2185       switch (sclass)
2186         {
2187         case C_EXT:
2188         case C_HIDEXT:
2189           {
2190             /* The CSECT auxent--always the last auxent.  */
2191             union internal_auxent csect_aux;
2192             unsigned int symnum_before = ssymnum;
2193
2194             swap_sym (&symbol, &main_aux[0], &namestring, &sraw_symbol,
2195                       &ssymnum, objfile);
2196             if (symbol.n_numaux > 1)
2197               {
2198                 bfd_coff_swap_aux_in
2199                   (objfile->obfd,
2200                    sraw_symbol - coff_data (abfd)->local_symesz,
2201                    symbol.n_type,
2202                    symbol.n_sclass,
2203                    symbol.n_numaux - 1,
2204                    symbol.n_numaux,
2205                    &csect_aux);
2206               }
2207             else
2208               csect_aux = main_aux[0];
2209
2210             /* If symbol name starts with ".$" or "$", ignore it.  */
2211             if (namestring[0] == '$'
2212                 || (namestring[0] == '.' && namestring[1] == '$'))
2213               break;
2214
2215             switch (csect_aux.x_csect.x_smtyp & 0x7)
2216               {
2217               case XTY_SD:
2218                 switch (csect_aux.x_csect.x_smclas)
2219                   {
2220                   case XMC_PR:
2221                     if (last_csect_name)
2222                       {
2223                         /* If no misc. function recorded in the last
2224                            seen csect, enter it as a function. This
2225                            will take care of functions like strcmp()
2226                            compiled by xlc.  */
2227
2228                         if (!misc_func_recorded)
2229                           {
2230                             RECORD_MINIMAL_SYMBOL
2231                               (last_csect_name, last_csect_val,
2232                                mst_text, last_csect_sec,
2233                                objfile);
2234                           }
2235
2236                         if (pst != NULL)
2237                           {
2238                             /* We have to allocate one psymtab for
2239                                each program csect, because their text
2240                                sections need not be adjacent.  */
2241                             xcoff_end_psymtab
2242                               (pst, psymtab_include_list, includes_used,
2243                                symnum_before, dependency_list,
2244                                dependencies_used, textlow_not_set);
2245                             includes_used = 0;
2246                             dependencies_used = 0;
2247                             /* Give all psymtabs for this source file the same
2248                                name.  */
2249                             pst = xcoff_start_psymtab
2250                               (objfile,
2251                                filestring,
2252                                symnum_before,
2253                                objfile->global_psymbols.next,
2254                                objfile->static_psymbols.next);
2255                           }
2256                       }
2257                     /* Activate the misc_func_recorded mechanism for
2258                        compiler- and linker-generated CSECTs like ".strcmp"
2259                        and "@FIX1".  */ 
2260                     if (namestring && (namestring[0] == '.'
2261                                        || namestring[0] == '@'))
2262                       {
2263                         last_csect_name = namestring;
2264                         last_csect_val = symbol.n_value;
2265                         last_csect_sec =
2266                           secnum_to_section (symbol.n_scnum, objfile);
2267                       }
2268                     if (pst != NULL)
2269                       {
2270                         CORE_ADDR highval =
2271                         symbol.n_value + csect_aux.x_csect.x_scnlen.l;
2272                         if (highval > pst->texthigh)
2273                           pst->texthigh = highval;
2274                         if (pst->textlow == 0 || symbol.n_value < pst->textlow)
2275                           pst->textlow = symbol.n_value;
2276                       }
2277                     misc_func_recorded = 0;
2278                     break;
2279
2280                   case XMC_RW:
2281                   case XMC_TD:
2282                     /* Data variables are recorded in the minimal symbol
2283                        table, except for section symbols.  */
2284                     if (*namestring != '.')
2285                       prim_record_minimal_symbol_and_info
2286                         (namestring, symbol.n_value,
2287                          sclass == C_HIDEXT ? mst_file_data : mst_data,
2288                          NULL, secnum_to_section (symbol.n_scnum, objfile),
2289                          NULL, objfile);
2290                     break;
2291
2292                   case XMC_TC0:
2293                     if (toc_offset)
2294                       warning (_("More than one XMC_TC0 symbol found."));
2295                     toc_offset = symbol.n_value;
2296
2297                     /* Make TOC offset relative to start address of section.  */
2298                     bfd_sect = secnum_to_bfd_section (symbol.n_scnum, objfile);
2299                     if (bfd_sect)
2300                       toc_offset -= bfd_section_vma (objfile->obfd, bfd_sect);
2301                     break;
2302
2303                   case XMC_TC:
2304                     /* These symbols tell us where the TOC entry for a
2305                        variable is, not the variable itself.  */
2306                     break;
2307
2308                   default:
2309                     break;
2310                   }
2311                 break;
2312
2313               case XTY_LD:
2314                 switch (csect_aux.x_csect.x_smclas)
2315                   {
2316                   case XMC_PR:
2317                     /* A function entry point.  */
2318
2319                     if (first_fun_line_offset == 0 && symbol.n_numaux > 1)
2320                       first_fun_line_offset =
2321                         main_aux[0].x_sym.x_fcnary.x_fcn.x_lnnoptr;
2322                     RECORD_MINIMAL_SYMBOL
2323                       (namestring, symbol.n_value,
2324                        sclass == C_HIDEXT ? mst_file_text : mst_text,
2325                        secnum_to_section (symbol.n_scnum, objfile),
2326                        objfile);
2327                     break;
2328
2329                   case XMC_GL:
2330                     /* shared library function trampoline code entry
2331                        point. */
2332
2333                     /* record trampoline code entries as
2334                        mst_solib_trampoline symbol.  When we lookup mst
2335                        symbols, we will choose mst_text over
2336                        mst_solib_trampoline. */
2337                     RECORD_MINIMAL_SYMBOL
2338                       (namestring, symbol.n_value,
2339                        mst_solib_trampoline,
2340                        secnum_to_section (symbol.n_scnum, objfile),
2341                        objfile);
2342                     break;
2343
2344                   case XMC_DS:
2345                     /* The symbols often have the same names as
2346                        debug symbols for functions, and confuse
2347                        lookup_symbol.  */
2348                     break;
2349
2350                   default:
2351
2352                     /* xlc puts each variable in a separate csect,
2353                        so we get an XTY_SD for each variable.  But
2354                        gcc puts several variables in a csect, so
2355                        that each variable only gets an XTY_LD.  We
2356                        still need to record them.  This will
2357                        typically be XMC_RW; I suspect XMC_RO and
2358                        XMC_BS might be possible too.  */
2359                     if (*namestring != '.')
2360                       prim_record_minimal_symbol_and_info
2361                         (namestring, symbol.n_value,
2362                          sclass == C_HIDEXT ? mst_file_data : mst_data,
2363                          NULL, secnum_to_section (symbol.n_scnum, objfile),
2364                          NULL, objfile);
2365                     break;
2366                   }
2367                 break;
2368
2369               case XTY_CM:
2370                 switch (csect_aux.x_csect.x_smclas)
2371                   {
2372                   case XMC_RW:
2373                   case XMC_BS:
2374                     /* Common variables are recorded in the minimal symbol
2375                        table, except for section symbols.  */
2376                     if (*namestring != '.')
2377                       prim_record_minimal_symbol_and_info
2378                         (namestring, symbol.n_value,
2379                          sclass == C_HIDEXT ? mst_file_bss : mst_bss,
2380                          NULL, secnum_to_section (symbol.n_scnum, objfile),
2381                          NULL, objfile);
2382                     break;
2383                   }
2384                 break;
2385
2386               default:
2387                 break;
2388               }
2389           }
2390           break;
2391         case C_FILE:
2392           {
2393             unsigned int symnum_before;
2394
2395             symnum_before = ssymnum;
2396             swap_sym (&symbol, &main_aux[0], &namestring, &sraw_symbol,
2397                       &ssymnum, objfile);
2398
2399             /* See if the last csect needs to be recorded.  */
2400
2401             if (last_csect_name && !misc_func_recorded)
2402               {
2403
2404                 /* If no misc. function recorded in the last seen csect, enter
2405                    it as a function.  This will take care of functions like
2406                    strcmp() compiled by xlc.  */
2407
2408                 RECORD_MINIMAL_SYMBOL
2409                   (last_csect_name, last_csect_val,
2410                    mst_text, last_csect_sec, objfile);
2411               }
2412
2413             if (pst)
2414               {
2415                 xcoff_end_psymtab (pst, psymtab_include_list, includes_used,
2416                                    symnum_before, dependency_list,
2417                                    dependencies_used, textlow_not_set);
2418                 includes_used = 0;
2419                 dependencies_used = 0;
2420               }
2421             first_fun_line_offset = 0;
2422
2423             /* XCOFF, according to the AIX 3.2 documentation, puts the
2424                filename in cs->c_name.  But xlc 1.3.0.2 has decided to
2425                do things the standard COFF way and put it in the auxent.
2426                We use the auxent if the symbol is ".file" and an auxent
2427                exists, otherwise use the symbol itself.  */
2428             if (!strcmp (namestring, ".file") && symbol.n_numaux > 0)
2429               {
2430                 filestring = coff_getfilename (&main_aux[0], objfile);
2431               }
2432             else
2433               filestring = namestring;
2434
2435             pst = xcoff_start_psymtab (objfile,
2436                                        filestring,
2437                                        symnum_before,
2438                                        objfile->global_psymbols.next,
2439                                        objfile->static_psymbols.next);
2440             last_csect_name = NULL;
2441           }
2442           break;
2443
2444         default:
2445           {
2446             complaint (&symfile_complaints,
2447                        _("Storage class %d not recognized during scan"), sclass);
2448           }
2449           /* FALLTHROUGH */
2450
2451           /* C_FCN is .bf and .ef symbols.  I think it is sufficient
2452              to handle only the C_FUN and C_EXT.  */
2453         case C_FCN:
2454
2455         case C_BSTAT:
2456         case C_ESTAT:
2457         case C_ARG:
2458         case C_REGPARM:
2459         case C_REG:
2460         case C_TPDEF:
2461         case C_STRTAG:
2462         case C_UNTAG:
2463         case C_ENTAG:
2464         case C_LABEL:
2465         case C_NULL:
2466
2467           /* C_EINCL means we are switching back to the main file.  But there
2468              is no reason to care; the only thing we want to know about
2469              includes is the names of all the included (.h) files.  */
2470         case C_EINCL:
2471
2472         case C_BLOCK:
2473
2474           /* I don't think C_STAT is used in xcoff; C_HIDEXT appears to be
2475              used instead.  */
2476         case C_STAT:
2477
2478           /* I don't think the name of the common block (as opposed to the
2479              variables within it) is something which is user visible
2480              currently.  */
2481         case C_BCOMM:
2482         case C_ECOMM:
2483
2484         case C_PSYM:
2485         case C_RPSYM:
2486
2487           /* I think we can ignore C_LSYM; types on xcoff seem to use C_DECL
2488              so C_LSYM would appear to be only for locals.  */
2489         case C_LSYM:
2490
2491         case C_AUTO:
2492         case C_RSYM:
2493           {
2494             /* We probably could save a few instructions by assuming that
2495                C_LSYM, C_PSYM, etc., never have auxents.  */
2496             int naux1 = symbol.n_numaux + 1;
2497             ssymnum += naux1;
2498             sraw_symbol += bfd_coff_symesz (abfd) * naux1;
2499           }
2500           break;
2501
2502         case C_BINCL:
2503           {
2504             /* Mark down an include file in the current psymtab */
2505             enum language tmp_language;
2506             swap_sym (&symbol, &main_aux[0], &namestring, &sraw_symbol,
2507                       &ssymnum, objfile);
2508
2509             tmp_language = deduce_language_from_filename (namestring);
2510
2511             /* Only change the psymtab's language if we've learned
2512                something useful (eg. tmp_language is not language_unknown).
2513                In addition, to match what start_subfile does, never change
2514                from C++ to C.  */
2515             if (tmp_language != language_unknown
2516                 && (tmp_language != language_c
2517                     || psymtab_language != language_cplus))
2518               psymtab_language = tmp_language;
2519
2520             /* In C++, one may expect the same filename to come round many
2521                times, when code is coming alternately from the main file
2522                and from inline functions in other files. So I check to see
2523                if this is a file we've seen before -- either the main
2524                source file, or a previously included file.
2525
2526                This seems to be a lot of time to be spending on N_SOL, but
2527                things like "break c-exp.y:435" need to work (I
2528                suppose the psymtab_include_list could be hashed or put
2529                in a binary tree, if profiling shows this is a major hog).  */
2530             if (pst && strcmp (namestring, pst->filename) == 0)
2531               continue;
2532             {
2533               int i;
2534               for (i = 0; i < includes_used; i++)
2535                 if (strcmp (namestring, psymtab_include_list[i]) == 0)
2536                   {
2537                     i = -1;
2538                     break;
2539                   }
2540               if (i == -1)
2541                 continue;
2542             }
2543             psymtab_include_list[includes_used++] = namestring;
2544             if (includes_used >= includes_allocated)
2545               {
2546                 char **orig = psymtab_include_list;
2547
2548                 psymtab_include_list = (char **)
2549                   alloca ((includes_allocated *= 2) *
2550                           sizeof (char *));
2551                 memcpy (psymtab_include_list, orig,
2552                         includes_used * sizeof (char *));
2553               }
2554             continue;
2555           }
2556         case C_FUN:
2557           /* The value of the C_FUN is not the address of the function (it
2558              appears to be the address before linking), but as long as it
2559              is smaller than the actual address, then find_pc_partial_function
2560              will use the minimal symbols instead.  I hope.  */
2561
2562         case C_GSYM:
2563         case C_ECOML:
2564         case C_DECL:
2565         case C_STSYM:
2566           {
2567             char *p;
2568             swap_sym (&symbol, &main_aux[0], &namestring, &sraw_symbol,
2569                       &ssymnum, objfile);
2570
2571             p = (char *) strchr (namestring, ':');
2572             if (!p)
2573               continue;                 /* Not a debugging symbol.   */
2574
2575             /* Main processing section for debugging symbols which
2576                the initial read through the symbol tables needs to worry
2577                about.  If we reach this point, the symbol which we are
2578                considering is definitely one we are interested in.
2579                p must also contain the (valid) index into the namestring
2580                which indicates the debugging type symbol.  */
2581
2582             switch (p[1])
2583               {
2584               case 'S':
2585                 symbol.n_value += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
2586
2587                 if (gdbarch_static_transform_name_p (gdbarch))
2588                   namestring = gdbarch_static_transform_name
2589                                  (gdbarch, namestring);
2590
2591                 add_psymbol_to_list (namestring, p - namestring,
2592                                      VAR_DOMAIN, LOC_STATIC,
2593                                      &objfile->static_psymbols,
2594                                      0, symbol.n_value,
2595                                      psymtab_language, objfile);
2596                 continue;
2597
2598               case 'G':
2599                 symbol.n_value += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
2600                 /* The addresses in these entries are reported to be
2601                    wrong.  See the code that reads 'G's for symtabs. */
2602                 add_psymbol_to_list (namestring, p - namestring,
2603                                      VAR_DOMAIN, LOC_STATIC,
2604                                      &objfile->global_psymbols,
2605                                      0, symbol.n_value,
2606                                      psymtab_language, objfile);
2607                 continue;
2608
2609               case 'T':
2610                 /* When a 'T' entry is defining an anonymous enum, it
2611                    may have a name which is the empty string, or a
2612                    single space.  Since they're not really defining a
2613                    symbol, those shouldn't go in the partial symbol
2614                    table.  We do pick up the elements of such enums at
2615                    'check_enum:', below.  */
2616                 if (p >= namestring + 2
2617                     || (p == namestring + 1
2618                         && namestring[0] != ' '))
2619                   {
2620                     add_psymbol_to_list (namestring, p - namestring,
2621                                          STRUCT_DOMAIN, LOC_TYPEDEF,
2622                                          &objfile->static_psymbols,
2623                                          symbol.n_value, 0,
2624                                          psymtab_language, objfile);
2625                     if (p[2] == 't')
2626                       {
2627                         /* Also a typedef with the same name.  */
2628                         add_psymbol_to_list (namestring, p - namestring,
2629                                              VAR_DOMAIN, LOC_TYPEDEF,
2630                                              &objfile->static_psymbols,
2631                                              symbol.n_value, 0,
2632                                              psymtab_language, objfile);
2633                         p += 1;
2634                       }
2635                   }
2636                 goto check_enum;
2637
2638               case 't':
2639                 if (p != namestring)    /* a name is there, not just :T... */
2640                   {
2641                     add_psymbol_to_list (namestring, p - namestring,
2642                                          VAR_DOMAIN, LOC_TYPEDEF,
2643                                          &objfile->static_psymbols,
2644                                          symbol.n_value, 0,
2645                                          psymtab_language, objfile);
2646                   }
2647               check_enum:
2648                 /* If this is an enumerated type, we need to
2649                    add all the enum constants to the partial symbol
2650                    table.  This does not cover enums without names, e.g.
2651                    "enum {a, b} c;" in C, but fortunately those are
2652                    rare.  There is no way for GDB to find those from the
2653                    enum type without spending too much time on it.  Thus
2654                    to solve this problem, the compiler needs to put out the
2655                    enum in a nameless type.  GCC2 does this.  */
2656
2657                 /* We are looking for something of the form
2658                    <name> ":" ("t" | "T") [<number> "="] "e"
2659                    {<constant> ":" <value> ","} ";".  */
2660
2661                 /* Skip over the colon and the 't' or 'T'.  */
2662                 p += 2;
2663                 /* This type may be given a number.  Also, numbers can come
2664                    in pairs like (0,26).  Skip over it.  */
2665                 while ((*p >= '0' && *p <= '9')
2666                        || *p == '(' || *p == ',' || *p == ')'
2667                        || *p == '=')
2668                   p++;
2669
2670                 if (*p++ == 'e')
2671                   {
2672                     /* The aix4 compiler emits extra crud before the members.  */
2673                     if (*p == '-')
2674                       {
2675                         /* Skip over the type (?).  */
2676                         while (*p != ':')
2677                           p++;
2678
2679                         /* Skip over the colon.  */
2680                         p++;
2681                       }
2682
2683                     /* We have found an enumerated type.  */
2684                     /* According to comments in read_enum_type
2685                        a comma could end it instead of a semicolon.
2686                        I don't know where that happens.
2687                        Accept either.  */
2688                     while (*p && *p != ';' && *p != ',')
2689                       {
2690                         char *q;
2691
2692                         /* Check for and handle cretinous dbx symbol name
2693                            continuation!  */
2694                         if (*p == '\\' || (*p == '?' && p[1] == '\0'))
2695                           p = next_symbol_text (objfile);
2696
2697                         /* Point to the character after the name
2698                            of the enum constant.  */
2699                         for (q = p; *q && *q != ':'; q++)
2700                           ;
2701                         /* Note that the value doesn't matter for
2702                            enum constants in psymtabs, just in symtabs.  */
2703                         add_psymbol_to_list (p, q - p,
2704                                              VAR_DOMAIN, LOC_CONST,
2705                                              &objfile->static_psymbols, 0,
2706                                              0, psymtab_language, objfile);
2707                         /* Point past the name.  */
2708                         p = q;
2709                         /* Skip over the value.  */
2710                         while (*p && *p != ',')
2711                           p++;
2712                         /* Advance past the comma.  */
2713                         if (*p)
2714                           p++;
2715                       }
2716                   }
2717                 continue;
2718
2719               case 'c':
2720                 /* Constant, e.g. from "const" in Pascal.  */
2721                 add_psymbol_to_list (namestring, p - namestring,
2722                                      VAR_DOMAIN, LOC_CONST,
2723                                      &objfile->static_psymbols, symbol.n_value,
2724                                      0, psymtab_language, objfile);
2725                 continue;
2726
2727               case 'f':
2728                 if (! pst)
2729                   {
2730                     int name_len = p - namestring;
2731                     char *name = xmalloc (name_len + 1);
2732                     memcpy (name, namestring, name_len);
2733                     name[name_len] = '\0';
2734                     function_outside_compilation_unit_complaint (name);
2735                     xfree (name);
2736                   }
2737                 symbol.n_value += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
2738                 add_psymbol_to_list (namestring, p - namestring,
2739                                      VAR_DOMAIN, LOC_BLOCK,
2740                                      &objfile->static_psymbols,
2741                                      0, symbol.n_value,
2742                                      psymtab_language, objfile);
2743                 continue;
2744
2745                 /* Global functions were ignored here, but now they
2746                    are put into the global psymtab like one would expect.
2747                    They're also in the minimal symbol table.  */
2748               case 'F':
2749                 if (! pst)
2750                   {
2751                     int name_len = p - namestring;
2752                     char *name = xmalloc (name_len + 1);
2753                     memcpy (name, namestring, name_len);
2754                     name[name_len] = '\0';
2755                     function_outside_compilation_unit_complaint (name);
2756                     xfree (name);
2757                   }
2758
2759                 /* We need only the minimal symbols for these
2760                    loader-generated definitions.   Keeping the global
2761                    symbols leads to "in psymbols but not in symbols"
2762                    errors. */
2763                 if (strncmp (namestring, "@FIX", 4) == 0)
2764                   continue;
2765
2766                 symbol.n_value += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
2767                 add_psymbol_to_list (namestring, p - namestring,
2768                                      VAR_DOMAIN, LOC_BLOCK,
2769                                      &objfile->global_psymbols,
2770                                      0, symbol.n_value,
2771                                      psymtab_language, objfile);
2772                 continue;
2773
2774                 /* Two things show up here (hopefully); static symbols of
2775                    local scope (static used inside braces) or extensions
2776                    of structure symbols.  We can ignore both.  */
2777               case 'V':
2778               case '(':
2779               case '0':
2780               case '1':
2781               case '2':
2782               case '3':
2783               case '4':
2784               case '5':
2785               case '6':
2786               case '7':
2787               case '8':
2788               case '9':
2789               case '-':
2790               case '#':         /* for symbol identification (used in live ranges) */
2791                 continue;
2792
2793               case ':':
2794                 /* It is a C++ nested symbol.  We don't need to record it
2795                    (I don't think); if we try to look up foo::bar::baz,
2796                    then symbols for the symtab containing foo should get
2797                    read in, I think.  */
2798                 /* Someone says sun cc puts out symbols like
2799                    /foo/baz/maclib::/usr/local/bin/maclib,
2800                    which would get here with a symbol type of ':'.  */
2801                 continue;
2802
2803               default:
2804                 /* Unexpected symbol descriptor.  The second and subsequent stabs
2805                    of a continued stab can show up here.  The question is
2806                    whether they ever can mimic a normal stab--it would be
2807                    nice if not, since we certainly don't want to spend the
2808                    time searching to the end of every string looking for
2809                    a backslash.  */
2810
2811                 complaint (&symfile_complaints,
2812                            _("unknown symbol descriptor `%c'"), p[1]);
2813
2814                 /* Ignore it; perhaps it is an extension that we don't
2815                    know about.  */
2816                 continue;
2817               }
2818           }
2819         }
2820     }
2821
2822   if (pst)
2823     {
2824       xcoff_end_psymtab (pst, psymtab_include_list, includes_used,
2825                          ssymnum, dependency_list,
2826                          dependencies_used, textlow_not_set);
2827     }
2828
2829   /* Record the toc offset value of this symbol table into objfile structure.
2830      If no XMC_TC0 is found, toc_offset should be zero. Another place to obtain
2831      this information would be file auxiliary header. */
2832
2833   ((struct coff_symfile_info *) objfile->deprecated_sym_private)->toc_offset = toc_offset;
2834 }
2835
2836 /* Return the toc offset value for a given objfile.  */
2837
2838 CORE_ADDR
2839 get_toc_offset (struct objfile *objfile)
2840 {
2841   if (objfile)
2842     return ((struct coff_symfile_info *) objfile->deprecated_sym_private)->toc_offset;
2843   return 0;
2844 }
2845
2846 /* Scan and build partial symbols for a symbol file.
2847    We have been initialized by a call to dbx_symfile_init, which 
2848    put all the relevant info into a "struct dbx_symfile_info",
2849    hung off the objfile structure.
2850
2851    SECTION_OFFSETS contains offsets relative to which the symbols in the
2852    various sections are (depending where the sections were actually loaded).
2853    MAINLINE is true if we are reading the main symbol
2854    table (as opposed to a shared lib or dynamically loaded file).  */
2855
2856 static void
2857 xcoff_initial_scan (struct objfile *objfile, int mainline)
2858 {
2859   bfd *abfd;
2860   int val;
2861   struct cleanup *back_to;
2862   int num_symbols;              /* # of symbols */
2863   file_ptr symtab_offset;       /* symbol table and */
2864   file_ptr stringtab_offset;    /* string table file offsets */
2865   struct coff_symfile_info *info;
2866   char *name;
2867   unsigned int size;
2868
2869   info = (struct coff_symfile_info *) objfile->deprecated_sym_private;
2870   symfile_bfd = abfd = objfile->obfd;
2871   name = objfile->name;
2872
2873   num_symbols = bfd_get_symcount (abfd);        /* # of symbols */
2874   symtab_offset = obj_sym_filepos (abfd);       /* symbol table file offset */
2875   stringtab_offset = symtab_offset +
2876     num_symbols * coff_data (abfd)->local_symesz;
2877
2878   info->min_lineno_offset = 0;
2879   info->max_lineno_offset = 0;
2880   bfd_map_over_sections (abfd, find_linenos, info);
2881
2882   if (num_symbols > 0)
2883     {
2884       /* Read the string table.  */
2885       init_stringtab (abfd, stringtab_offset, objfile);
2886
2887       /* Read the .debug section, if present.  */
2888       {
2889         struct bfd_section *secp;
2890         bfd_size_type length;
2891         char *debugsec = NULL;
2892
2893         secp = bfd_get_section_by_name (abfd, ".debug");
2894         if (secp)
2895           {
2896             length = bfd_section_size (abfd, secp);
2897             if (length)
2898               {
2899                 debugsec =
2900                   (char *) obstack_alloc (&objfile->objfile_obstack, length);
2901
2902                 if (!bfd_get_section_contents (abfd, secp, debugsec,
2903                                                (file_ptr) 0, length))
2904                   {
2905                     error (_("Error reading .debug section of `%s': %s"),
2906                            name, bfd_errmsg (bfd_get_error ()));
2907                   }
2908               }
2909           }
2910         ((struct coff_symfile_info *) objfile->deprecated_sym_private)->debugsec =
2911           debugsec;
2912       }
2913     }
2914
2915   /* Read the symbols.  We keep them in core because we will want to
2916      access them randomly in read_symbol*.  */
2917   val = bfd_seek (abfd, symtab_offset, SEEK_SET);
2918   if (val < 0)
2919     error (_("Error reading symbols from %s: %s"),
2920            name, bfd_errmsg (bfd_get_error ()));
2921   size = coff_data (abfd)->local_symesz * num_symbols;
2922   ((struct coff_symfile_info *) objfile->deprecated_sym_private)->symtbl =
2923     obstack_alloc (&objfile->objfile_obstack, size);
2924   ((struct coff_symfile_info *) objfile->deprecated_sym_private)->symtbl_num_syms =
2925     num_symbols;
2926
2927   val = bfd_bread (((struct coff_symfile_info *) objfile->deprecated_sym_private)->symtbl,
2928                    size, abfd);
2929   if (val != size)
2930     perror_with_name (_("reading symbol table"));
2931
2932   /* If we are reinitializing, or if we have never loaded syms yet, init */
2933   if (mainline
2934       || (objfile->global_psymbols.size == 0
2935           && objfile->static_psymbols.size == 0))
2936     /* I'm not sure how how good num_symbols is; the rule of thumb in
2937        init_psymbol_list was developed for a.out.  On the one hand,
2938        num_symbols includes auxents.  On the other hand, it doesn't
2939        include N_SLINE.  */
2940     init_psymbol_list (objfile, num_symbols);
2941
2942   free_pending_blocks ();
2943   back_to = make_cleanup (really_free_pendings, 0);
2944
2945   init_minimal_symbol_collection ();
2946   make_cleanup_discard_minimal_symbols ();
2947
2948   /* Now that the symbol table data of the executable file are all in core,
2949      process them and define symbols accordingly.  */
2950
2951   scan_xcoff_symtab (objfile);
2952
2953   /* Install any minimal symbols that have been collected as the current
2954      minimal symbols for this objfile. */
2955
2956   install_minimal_symbols (objfile);
2957
2958   do_cleanups (back_to);
2959 }
2960 \f
2961 static void
2962 xcoff_symfile_offsets (struct objfile *objfile, struct section_addr_info *addrs)
2963 {
2964   asection *sect = NULL;
2965   int i;
2966
2967   objfile->num_sections = bfd_count_sections (objfile->obfd);
2968   objfile->section_offsets = (struct section_offsets *)
2969     obstack_alloc (&objfile->objfile_obstack, 
2970                    SIZEOF_N_SECTION_OFFSETS (objfile->num_sections));
2971
2972   /* Initialize the section indexes for future use. */
2973   sect = bfd_get_section_by_name (objfile->obfd, ".text");
2974   if (sect) 
2975     objfile->sect_index_text = sect->index;
2976
2977   sect = bfd_get_section_by_name (objfile->obfd, ".data");
2978   if (sect) 
2979     objfile->sect_index_data = sect->index;
2980
2981   sect = bfd_get_section_by_name (objfile->obfd, ".bss");
2982   if (sect) 
2983     objfile->sect_index_bss = sect->index;
2984
2985   sect = bfd_get_section_by_name (objfile->obfd, ".rodata");
2986   if (sect) 
2987     objfile->sect_index_rodata = sect->index;
2988
2989   for (i = 0; i < objfile->num_sections; ++i)
2990     {
2991       /* syms_from_objfile kindly subtracts from addr the
2992          bfd_section_vma of the .text section.  This strikes me as
2993          wrong--whether the offset to be applied to symbol reading is
2994          relative to the start address of the section depends on the
2995          symbol format.  In any event, this whole "addr" concept is
2996          pretty broken (it doesn't handle any section but .text
2997          sensibly), so just ignore the addr parameter and use 0.
2998          rs6000-nat.c will set the correct section offsets via
2999          objfile_relocate.  */
3000         (objfile->section_offsets)->offsets[i] = 0;
3001     }
3002 }
3003
3004 /* Register our ability to parse symbols for xcoff BFD files.  */
3005
3006 static struct sym_fns xcoff_sym_fns =
3007 {
3008
3009   /* It is possible that coff and xcoff should be merged as
3010      they do have fundamental similarities (for example, the extra storage
3011      classes used for stabs could presumably be recognized in any COFF file).
3012      However, in addition to obvious things like all the csect hair, there are
3013      some subtler differences between xcoffread.c and coffread.c, notably
3014      the fact that coffread.c has no need to read in all the symbols, but
3015      xcoffread.c reads all the symbols and does in fact randomly access them
3016      (in C_BSTAT and line number processing).  */
3017
3018   bfd_target_xcoff_flavour,
3019
3020   xcoff_new_init,               /* sym_new_init: init anything gbl to entire symtab */
3021   xcoff_symfile_init,           /* sym_init: read initial info, setup for sym_read() */
3022   xcoff_initial_scan,           /* sym_read: read a symbol file into symtab */
3023   xcoff_symfile_finish,         /* sym_finish: finished with file, cleanup */
3024   xcoff_symfile_offsets,        /* sym_offsets: xlate offsets ext->int form */
3025   default_symfile_segments,     /* sym_segments: Get segment information from
3026                                    a file.  */
3027   aix_process_linenos,          /* sym_read_linetable */
3028   NULL                          /* next: pointer to next struct sym_fns */
3029 };
3030
3031 void
3032 _initialize_xcoffread (void)
3033 {
3034   add_symtab_fns (&xcoff_sym_fns);
3035 }