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