]> Git Repo - binutils.git/blob - gdb/xcoffread.c
* inferior.h, infrun.c, thread.c, infcmd.c: Remove all uses of
[binutils.git] / gdb / xcoffread.c
1 /* Read AIX xcoff symbol tables and convert to internal format, for GDB.
2    Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993
3              Free Software Foundation, Inc.
4    Derived from coffread.c, dbxread.c, and a lot of hacking.
5    Contributed by IBM Corporation.
6
7 This file is part of GDB.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
22
23 /* Native only:  Need struct tbtable in <sys/debug.h> from host, and 
24                  need xcoff_add_toc_to_loadinfo in rs6000-tdep.c from target.
25                  need xcoff_init_loadinfo ditto.  
26    However, if you grab <sys/debug.h> and make it available on your
27    host, and define FAKING_RS6000, then this code will compile.  */
28
29 #include "defs.h"
30 #include "bfd.h"
31
32 #include <sys/types.h>
33 #include <fcntl.h>
34 #include <ctype.h>
35
36 #include "obstack.h"
37 #include <sys/param.h>
38 #ifndef NO_SYS_FILE
39 #include <sys/file.h>
40 #endif
41 #include <sys/stat.h>
42 #include <sys/debug.h>
43
44 #include "symtab.h"
45 #include "gdbtypes.h"
46 #include "symfile.h"
47 #include "objfiles.h"
48 #include "buildsym.h"
49 #include "stabsread.h"
50 #include "complaints.h"
51
52 #include "coff/internal.h"      /* FIXME, internal data from BFD */
53 #include "libcoff.h"            /* FIXME, internal data from BFD */
54 #include "coff/rs6000.h"        /* FIXME, raw file-format guts of xcoff */
55
56 /* For interface with stabsread.c.  */
57 #include "aout/stab_gnu.h"
58
59 /* Simplified internal version of coff symbol table information */
60
61 struct coff_symbol {
62   char *c_name;
63   int c_symnum;         /* symbol number of this entry */
64   int c_nsyms;          /* 0 if syment only, 1 if syment + auxent */
65   long c_value;
66   unsigned char c_sclass;
67   int c_secnum;
68   unsigned int c_type;
69 };
70
71 /* The COFF line table, in raw form.  */
72 static char *linetab = NULL;            /* Its actual contents */
73 static long linetab_offset;             /* Its offset in the file */
74 static unsigned long linetab_size;      /* Its size */
75
76 /* last function's saved coff symbol `cs' */
77
78 static struct coff_symbol fcn_cs_saved;
79
80 static bfd *symfile_bfd;
81
82 /* Core address of start and end of text of current source file.
83    This is calculated from the first function seen after a C_FILE
84    symbol. */
85
86
87 static CORE_ADDR cur_src_end_addr;
88
89 /* Core address of the end of the first object file.  */
90
91 static CORE_ADDR first_object_file_end;
92
93 /* pointer to the string table */
94 static char *strtbl;
95
96 /* length of the string table */
97 static int  strtbl_len;
98
99 /* pointer to debug section */
100 static char *debugsec;
101
102 /* pointer to the a.out symbol table */
103 static char *symtbl;
104
105 /* Number of symbols in symtbl.  */
106 static int symtbl_num_syms;
107
108 /* initial symbol-table-debug-string vector length */
109
110 #define INITIAL_STABVECTOR_LENGTH       40
111
112 /* Nonzero if within a function (so symbols should be local,
113    if nothing says specifically).  */
114
115 int within_function;
116
117 /* Local variables that hold the shift and mask values for the
118    COFF file that we are currently reading.  These come back to us
119    from BFD, and are referenced by their macro names, as well as
120    internally to the BTYPE, ISPTR, ISFCN, ISARY, ISTAG, and DECREF
121    macros from ../internalcoff.h .  */
122
123 static unsigned local_n_btshft;
124 static unsigned local_n_tmask;
125
126 #undef  N_BTSHFT
127 #define N_BTSHFT        local_n_btshft
128 #undef  N_TMASK
129 #define N_TMASK         local_n_tmask
130  
131 /* Local variables that hold the sizes in the file of various COFF structures.
132    (We only need to know this to read them from the file -- BFD will then
133    translate the data in them, into `internal_xxx' structs in the right
134    byte order, alignment, etc.)  */
135
136 static unsigned local_symesz;
137
138 struct coff_symfile_info {
139   file_ptr min_lineno_offset;           /* Where in file lowest line#s are */
140   file_ptr max_lineno_offset;           /* 1+last byte of line#s in file */
141 };
142
143 static struct complaint rsym_complaint = 
144   {"Non-stab C_RSYM `%s' needs special handling", 0, 0};
145
146 static struct complaint storclass_complaint =
147   {"Unexpected storage class: %d", 0, 0};
148
149 static struct complaint bf_notfound_complaint =
150   {"line numbers off, `.bf' symbol not found", 0, 0};
151
152 static void
153 enter_line_range PARAMS ((struct subfile *, unsigned, unsigned,
154                           CORE_ADDR, CORE_ADDR, unsigned *));
155
156 static void
157 free_debugsection PARAMS ((void));
158
159 static int
160 init_debugsection PARAMS ((bfd *));
161
162 static int
163 init_stringtab PARAMS ((bfd *, file_ptr, struct objfile *));
164
165 static void
166 xcoff_symfile_init PARAMS ((struct objfile *));
167
168 static void
169 xcoff_new_init PARAMS ((struct objfile *));
170
171 #ifdef __STDC__
172 struct section_offset;
173 #endif
174
175 static void
176 xcoff_symfile_read PARAMS ((struct objfile *, struct section_offset *, int));
177
178 static void
179 xcoff_symfile_finish PARAMS ((struct objfile *));
180
181 static struct section_offsets *
182 xcoff_symfile_offsets PARAMS ((struct objfile *, CORE_ADDR));
183
184 static int
185 init_lineno PARAMS ((bfd *, file_ptr, int));
186
187 static void
188 free_linetab PARAMS ((void));
189
190 static void
191 find_linenos PARAMS ((bfd *, sec_ptr, PTR));
192
193 static void
194 read_symbol PARAMS ((struct internal_syment *, int));
195
196 static int
197 read_symbol_lineno PARAMS ((int));
198
199 static int
200 read_symbol_nvalue PARAMS ((int));
201
202 static struct symbol *
203 process_xcoff_symbol PARAMS ((struct coff_symbol *, struct objfile *));
204
205 static void
206 read_xcoff_symtab PARAMS ((struct objfile *, int));
207
208 static void
209 add_stab_to_list PARAMS ((char *, struct pending_stabs **));
210
211 /* add a given stab string into given stab vector. */
212
213 static void
214 add_stab_to_list (stabname, stabvector)
215 char *stabname;
216 struct pending_stabs **stabvector;
217 {
218   if ( *stabvector == NULL) {
219     *stabvector = (struct pending_stabs *)
220         xmalloc (sizeof (struct pending_stabs) + 
221                         INITIAL_STABVECTOR_LENGTH * sizeof (char*));
222     (*stabvector)->count = 0;
223     (*stabvector)->length = INITIAL_STABVECTOR_LENGTH;
224   }
225   else if ((*stabvector)->count >= (*stabvector)->length) {
226     (*stabvector)->length += INITIAL_STABVECTOR_LENGTH;
227     *stabvector = (struct pending_stabs *)
228         xrealloc ((char *) *stabvector, sizeof (struct pending_stabs) + 
229         (*stabvector)->length * sizeof (char*));
230   }
231   (*stabvector)->stab [(*stabvector)->count++] = stabname;
232 }
233 \f
234 /* Linenos are processed on a file-by-file basis.
235
236    Two reasons:
237
238     1) xlc (IBM's native c compiler) postpones static function code
239        emission to the end of a compilation unit. This way it can
240        determine if those functions (statics) are needed or not, and
241        can do some garbage collection (I think). This makes line
242        numbers and corresponding addresses unordered, and we end up
243        with a line table like:
244        
245
246                 lineno  addr
247         foo()     10    0x100
248                   20    0x200
249                   30    0x300
250
251         foo3()    70    0x400
252                   80    0x500
253                   90    0x600
254
255         static foo2()
256                   40    0x700
257                   50    0x800
258                   60    0x900           
259
260         and that breaks gdb's binary search on line numbers, if the
261         above table is not sorted on line numbers. And that sort
262         should be on function based, since gcc can emit line numbers
263         like:
264         
265                 10      0x100   - for the init/test part of a for stmt.
266                 20      0x200
267                 30      0x300
268                 10      0x400   - for the increment part of a for stmt.
269
270         arrange_linetable() will do this sorting.               
271
272      2) aix symbol table might look like:
273
274                 c_file          // beginning of a new file
275                 .bi             // beginning of include file
276                 .ei             // end of include file
277                 .bi
278                 .ei
279
280         basically, .bi/.ei pairs do not necessarily encapsulate
281         their scope. They need to be recorded, and processed later
282         on when we come the end of the compilation unit.
283         Include table (inclTable) and process_linenos() handle
284         that.  */
285
286 /* compare line table entry addresses. */
287
288 static int
289 compare_lte (lte1, lte2)
290      struct linetable_entry *lte1, *lte2;
291 {
292   return lte1->pc - lte2->pc;
293 }
294
295 /* Give a line table with function entries are marked, arrange its functions
296    in assending order and strip off function entry markers and return it in
297    a newly created table. If the old one is good enough, return the old one. */
298 /* FIXME: I think all this stuff can be replaced by just passing
299    sort_linevec = 1 to end_symtab.  */
300
301 static struct linetable *
302 arrange_linetable (oldLineTb)
303   struct linetable *oldLineTb;                  /* old linetable */
304 {
305   int ii, jj, 
306       newline,                                  /* new line count */
307       function_count;                           /* # of functions */
308
309   struct linetable_entry *fentry;               /* function entry vector */
310   int fentry_size;                              /* # of function entries */
311   struct linetable *newLineTb;                  /* new line table */
312
313 #define NUM_OF_FUNCTIONS 20
314
315   fentry_size = NUM_OF_FUNCTIONS;
316   fentry = (struct linetable_entry*)
317     xmalloc (fentry_size * sizeof (struct linetable_entry));
318
319   for (function_count=0, ii=0; ii <oldLineTb->nitems; ++ii) {
320
321     if (oldLineTb->item[ii].line == 0) {        /* function entry found. */
322
323       if (function_count >= fentry_size) {      /* make sure you have room. */
324         fentry_size *= 2;
325         fentry = (struct linetable_entry*) 
326           xrealloc (fentry, fentry_size * sizeof (struct linetable_entry));
327       }
328       fentry[function_count].line = ii;
329       fentry[function_count].pc = oldLineTb->item[ii].pc;
330       ++function_count;
331     }
332   }
333
334   if (function_count == 0) {
335     free (fentry);
336     return oldLineTb;
337   }
338   else if (function_count > 1)
339     qsort (fentry, function_count, sizeof(struct linetable_entry), compare_lte);
340
341   /* allocate a new line table. */
342   newLineTb = (struct linetable *)
343     xmalloc
344       (sizeof (struct linetable) + 
345        (oldLineTb->nitems - function_count) * sizeof (struct linetable_entry));
346
347   /* if line table does not start with a function beginning, copy up until
348      a function begin. */
349
350   newline = 0;
351   if (oldLineTb->item[0].line != 0)
352     for (newline=0; 
353         newline < oldLineTb->nitems && oldLineTb->item[newline].line; ++newline)
354       newLineTb->item[newline] = oldLineTb->item[newline];
355
356   /* Now copy function lines one by one. */
357
358   for (ii=0; ii < function_count; ++ii) {
359     for (jj = fentry[ii].line + 1;
360                  jj < oldLineTb->nitems && oldLineTb->item[jj].line != 0; 
361                                                          ++jj, ++newline)
362       newLineTb->item[newline] = oldLineTb->item[jj];
363   }
364   free (fentry);
365   newLineTb->nitems = oldLineTb->nitems - function_count;
366   return newLineTb;  
367 }     
368
369
370
371 /* We try to detect the beginning of a compilation unit. That info will
372    be used as an entry in line number recording routines (enter_line_range) */
373
374 static unsigned first_fun_line_offset;
375 static unsigned first_fun_bf;
376
377 #define mark_first_line(OFFSET, SYMNUM) \
378   if (!first_fun_line_offset) {         \
379     first_fun_line_offset = OFFSET;     \
380     first_fun_bf = SYMNUM;              \
381   }
382   
383
384 /* include file support: C_BINCL/C_EINCL pairs will be kept in the 
385    following `IncludeChain'. At the end of each symtab (end_symtab),
386    we will determine if we should create additional symtab's to
387    represent if (the include files. */
388
389
390 typedef struct _inclTable {
391   char          *name;                          /* include filename */
392
393   /* Offsets to the line table.  end points to the last entry which is
394      part of this include file.  */
395   int           begin, end;
396   
397   struct subfile *subfile;
398   unsigned      funStartLine;                   /* start line # of its function */
399 } InclTable;
400
401 #define INITIAL_INCLUDE_TABLE_LENGTH    20
402 static InclTable  *inclTable;                   /* global include table */
403 static int        inclIndx;                     /* last entry to table */
404 static int        inclLength;                   /* table length */
405 static int        inclDepth;                    /* nested include depth */
406
407
408 static void
409 record_include_begin (cs)
410 struct coff_symbol *cs;
411 {
412   if (inclDepth)
413     {
414       /* In xcoff, we assume include files cannot be nested (not in .c files
415          of course, but in corresponding .s files.).  */
416
417       /* This can happen with old versions of GCC.
418          GCC 2.3.3-930426 does not exhibit this on a test case which
419          a user said produced the message for him.  */
420       static struct complaint msg = {"Nested C_BINCL symbols", 0, 0};
421       complain (&msg);
422     }
423   ++inclDepth;
424
425   /* allocate an include file, or make room for the new entry */
426   if (inclLength == 0) {
427     inclTable = (InclTable*) 
428         xmalloc (sizeof (InclTable) * INITIAL_INCLUDE_TABLE_LENGTH);
429     memset (inclTable, '\0', sizeof (InclTable) * INITIAL_INCLUDE_TABLE_LENGTH);
430     inclLength = INITIAL_INCLUDE_TABLE_LENGTH;
431     inclIndx = 0;
432   }
433   else if (inclIndx >= inclLength) {
434     inclLength += INITIAL_INCLUDE_TABLE_LENGTH;
435     inclTable = (InclTable*) 
436         xrealloc (inclTable, sizeof (InclTable) * inclLength);
437     memset (inclTable+inclLength-INITIAL_INCLUDE_TABLE_LENGTH, 
438                         '\0', sizeof (InclTable)*INITIAL_INCLUDE_TABLE_LENGTH);
439   }
440
441   inclTable [inclIndx].name  = cs->c_name;
442   inclTable [inclIndx].begin = cs->c_value;
443 }
444
445
446 static void
447 record_include_end (cs)
448 struct coff_symbol *cs;
449 {
450   InclTable *pTbl;  
451
452   if (inclDepth == 0)
453     {
454       static struct complaint msg = {"Mismatched C_BINCL/C_EINCL pair", 0, 0};
455       complain (&msg);
456     }
457
458   pTbl = &inclTable [inclIndx];
459   pTbl->end = cs->c_value;
460
461   --inclDepth;
462   ++inclIndx;
463 }
464
465
466 /* given the start and end addresses of a compilation unit (or a csect, at times)
467    process its lines and create appropriate line vectors. */
468
469 static void
470 process_linenos (start, end)
471   CORE_ADDR start, end;
472 {
473   char *pp;
474   int offset, ii;
475
476   struct subfile main_subfile;          /* subfile structure for the main
477                                            compilation unit. */
478
479   /* in the main source file, any time we see a function entry, we reset
480      this variable to function's absolute starting line number. All the
481      following line numbers in the function are relative to this, and
482      we record absolute line numbers in record_line(). */
483
484   int main_source_baseline = 0;
485
486   
487   unsigned *firstLine;
488   CORE_ADDR addr;
489
490   if (!(offset = first_fun_line_offset))
491     goto return_after_cleanup;
492
493   memset (&main_subfile, '\0', sizeof (main_subfile));
494   first_fun_line_offset = 0;
495
496   if (inclIndx == 0)
497     /* All source lines were in the main source file. None in include files. */
498
499     enter_line_range (&main_subfile, offset, 0, start, end, 
500                                                 &main_source_baseline);
501
502   /* else, there was source with line numbers in include files */
503   else {
504
505     main_source_baseline = 0;
506     for (ii=0; ii < inclIndx; ++ii) {
507
508       struct subfile *tmpSubfile;
509
510       /* if there is main file source before include file, enter it. */
511       if (offset < inclTable[ii].begin) {
512         enter_line_range
513           (&main_subfile, offset, inclTable[ii].begin - LINESZ, start, 0, 
514                                                 &main_source_baseline);
515       }
516
517       /* Have a new subfile for the include file */
518
519       tmpSubfile = inclTable[ii].subfile = (struct subfile*) 
520                                 xmalloc (sizeof (struct subfile));
521
522       memset (tmpSubfile, '\0', sizeof (struct subfile));
523       firstLine = &(inclTable[ii].funStartLine);
524
525       /* enter include file's lines now. */
526       enter_line_range (tmpSubfile, inclTable[ii].begin, 
527                                 inclTable[ii].end, start, 0, firstLine);
528
529       offset = inclTable[ii].end + LINESZ;
530     }
531
532     /* all the include files' line have been processed at this point. Now,
533        enter remaining lines of the main file, if any left. */
534     if (offset < (linetab_offset + linetab_size + 1 - LINESZ)) {
535       enter_line_range (&main_subfile, offset, 0, start, end, 
536                                                 &main_source_baseline);
537     }
538   }
539
540   /* Process main file's line numbers. */
541   if (main_subfile.line_vector) {
542     struct linetable *lineTb, *lv;
543
544     lv = main_subfile.line_vector;
545
546     /* Line numbers are not necessarily ordered. xlc compilation will
547        put static function to the end. */
548
549     lineTb = arrange_linetable (lv);
550     if (lv == lineTb) {
551       current_subfile->line_vector = (struct linetable *)
552         xrealloc (lv, (sizeof (struct linetable)
553                         + lv->nitems * sizeof (struct linetable_entry)));
554
555     }
556     else {
557         free (lv);
558         current_subfile->line_vector = lineTb;
559     }
560
561     current_subfile->line_vector_length = 
562                         current_subfile->line_vector->nitems;
563   }
564
565     /* Now, process included files' line numbers. */
566
567     for (ii=0; ii < inclIndx; ++ii) {
568
569       if ( (inclTable[ii].subfile)->line_vector) { /* Useless if!!! FIXMEmgo */
570         struct linetable *lineTb, *lv;
571
572         lv = (inclTable[ii].subfile)->line_vector;
573
574         /* Line numbers are not necessarily ordered. xlc compilation will
575            put static function to the end. */
576
577         lineTb = arrange_linetable (lv);
578
579         push_subfile ();
580
581         /* For the same include file, we might want to have more than one subfile.
582            This happens if we have something like:
583    
584                 ......
585                 #include "foo.h"
586                 ......
587                 #include "foo.h"
588                 ......
589
590            while foo.h including code in it. (stupid but possible)
591            Since start_subfile() looks at the name and uses an existing one if finds,
592            we need to provide a fake name and fool it. */
593
594 /*      start_subfile (inclTable[ii].name, (char*)0);  */
595         start_subfile (" ?", (char*)0);
596         free (current_subfile->name);
597         current_subfile->name = strdup (inclTable[ii].name);
598
599         if (lv == lineTb) {
600           current_subfile->line_vector = (struct linetable *)
601                 xrealloc (lv, (sizeof (struct linetable)
602                         + lv->nitems * sizeof (struct linetable_entry)));
603
604         }
605         else {
606           free (lv);
607           current_subfile->line_vector = lineTb;
608         }
609
610         current_subfile->line_vector_length = 
611                         current_subfile->line_vector->nitems;
612         start_subfile (pop_subfile (), (char*)0);
613       }
614     }
615
616 return_after_cleanup:
617
618   /* We don't want to keep alloc/free'ing the global include file table. */
619   inclIndx = 0;
620
621   /* start with a fresh subfile structure for the next file. */
622   memset (&main_subfile, '\0', sizeof (struct subfile));
623 }
624
625 void
626 aix_process_linenos ()
627 {
628   /* process line numbers and enter them into line vector */
629   process_linenos (last_source_start_addr, cur_src_end_addr);
630 }
631
632
633 /* Enter a given range of lines into the line vector.
634    can be called in the following two ways:
635      enter_line_range (subfile, beginoffset, endoffset, startaddr, 0, firstLine)  or
636      enter_line_range (subfile, beginoffset, 0, startaddr, endaddr, firstLine)
637
638    endoffset points to the last line table entry that we should pay
639    attention to.  */
640
641 static void
642 enter_line_range (subfile, beginoffset, endoffset, startaddr, endaddr, firstLine)
643   struct subfile *subfile;
644   unsigned   beginoffset, endoffset;    /* offsets to line table */
645   CORE_ADDR  startaddr, endaddr;
646   unsigned   *firstLine;
647 {
648   char          *pp, *limit;
649   CORE_ADDR     addr;
650
651 /* Do Byte swapping, if needed. FIXME! */
652 #define P_LINENO(PP)  (*(unsigned short*)((struct external_lineno*)(PP))->l_lnno)
653 #define P_LINEADDR(PP)  (*(long*)((struct external_lineno*)(PP))->l_addr.l_paddr)
654 #define P_LINESYM(PP)       (*(long*)((struct external_lineno*)(PP))->l_addr.l_symndx)
655
656   pp = &linetab [beginoffset - linetab_offset];
657   if (endoffset != 0 && endoffset - linetab_offset >= linetab_size)
658     {
659       static struct complaint msg =
660         {"Bad line table offset in C_EINCL directive", 0, 0};
661       complain (&msg);
662       return;
663     }
664   limit = endoffset ? &linetab [endoffset - linetab_offset]
665                       : &linetab [linetab_size -1];
666
667   while (pp <= limit) {
668
669     /* find the address this line represents */
670     addr = P_LINENO(pp) ? 
671       P_LINEADDR(pp) : read_symbol_nvalue (P_LINESYM(pp)); 
672
673     if (addr < startaddr || (endaddr && addr >= endaddr))
674       return;
675
676     if (P_LINENO(pp) == 0) {
677       *firstLine = read_symbol_lineno (P_LINESYM(pp));
678       record_line (subfile, 0, addr);
679       --(*firstLine);
680     }
681     else
682       record_line (subfile, *firstLine + P_LINENO(pp), addr);
683
684     pp += LINESZ;
685   }
686 }
687
688 typedef struct {
689   int fsize;                            /* file size */
690   int fixedparms;                       /* number of fixed parms */
691   int floatparms;                       /* number of float parms */
692   unsigned int parminfo;                /* parameter info. 
693                                            See /usr/include/sys/debug.h
694                                            tbtable_ext.parminfo */
695   int framesize;                        /* function frame size */
696 } TracebackInfo;
697
698
699 /* Given a function symbol, return its traceback information. */
700
701   TracebackInfo *
702 retrieve_tracebackinfo (abfd, textsec, cs)
703   bfd *abfd;
704   sec_ptr textsec;
705   struct coff_symbol *cs;
706 {
707 #define TBTABLE_BUFSIZ  2000
708
709   static TracebackInfo tbInfo;
710   struct tbtable *ptb;
711
712   static char buffer [TBTABLE_BUFSIZ];
713
714   int  *pinsn;
715   int  bytesread=0;                     /* total # of bytes read so far */
716   int  bufferbytes;                     /* number of bytes in the buffer */
717
718   int functionstart = cs->c_value - textsec->vma;
719
720   memset (&tbInfo, '\0', sizeof (tbInfo));
721
722   /* keep reading blocks of data from the text section, until finding a zero
723      word and a traceback table. */
724
725   /* Note: The logical thing way to write this code would be to assign
726      to bufferbytes within the while condition.  But that triggers a
727      compiler (xlc in AIX 3.2) bug, so simplify it...  */
728   bufferbytes = 
729     (TBTABLE_BUFSIZ < (textsec->_raw_size - functionstart - bytesread) ? 
730      TBTABLE_BUFSIZ : (textsec->_raw_size - functionstart - bytesread));
731   while (bufferbytes 
732          && (bfd_get_section_contents
733              (abfd, textsec, buffer, 
734               (file_ptr)(functionstart + bytesread), bufferbytes)))
735   {
736     bytesread += bufferbytes;
737     pinsn = (int*) buffer;
738
739     /* if this is the first time we filled the buffer, retrieve function
740        framesize info. */
741
742     if (bytesread == bufferbytes) {
743
744       /* skip over unrelated instructions */
745
746       if (*pinsn == 0x7c0802a6)                 /* mflr r0 */
747         ++pinsn;
748       if ((*pinsn & 0xfc00003e) == 0x7c000026)  /* mfcr Rx */
749         ++pinsn;
750       if ((*pinsn & 0xfc000000) == 0x48000000)  /* bl foo, save fprs */
751         ++pinsn;
752       if ((*pinsn  & 0xfc1f0000) == 0xbc010000) /* stm Rx, NUM(r1) */
753         ++pinsn;
754
755       do {
756         int tmp = (*pinsn >> 16) & 0xffff;
757
758         if (tmp ==  0x9421) {                   /* stu  r1, NUM(r1) */
759           tbInfo.framesize = 0x10000 - (*pinsn & 0xffff);
760           break;
761         }
762         else if ((*pinsn == 0x93e1fffc) ||      /* st   r31,-4(r1) */
763                  (tmp == 0x9001))               /* st   r0, NUM(r1) */
764         ;
765         /* else, could not find a frame size. */
766         else
767           return NULL;
768
769       } while (++pinsn && *pinsn);
770
771       if (!tbInfo.framesize)
772         return NULL;      
773
774     }
775
776     /* look for a zero word. */
777
778     while (*pinsn && (pinsn < (int*)(buffer + bufferbytes - sizeof(int))))
779       ++pinsn;
780
781     if (pinsn >= (int*)(buffer + bufferbytes))
782       continue;
783
784     if (*pinsn == 0) {
785
786       /* function size is the amount of bytes we have skipped so far. */
787       tbInfo.fsize = bytesread - (buffer + bufferbytes - (char*)pinsn);
788
789       ++pinsn;
790
791       /* if we don't have the whole traceback table in the buffer, re-read
792          the whole thing. */
793
794       /* This is how much to read to get the traceback table.
795          8 bytes of the traceback table are always present, plus we
796          look at parminfo.  */
797 #define MIN_TBTABSIZ    12
798                                 
799       if ((char*)pinsn > (buffer + bufferbytes - MIN_TBTABSIZ)) {
800
801         /* In case if we are *very* close to the end of the text section
802            and cannot read properly from that point on, abort by returning
803            NULL.
804
805            This could happen if the traceback table is only 8 bytes,
806            but we try to read 12 bytes of it.
807            Handle this case more graciously -- FIXME */
808
809         if (!bfd_get_section_contents (
810                 abfd, textsec, buffer, 
811                 (file_ptr)(functionstart + 
812                  bytesread - (buffer + bufferbytes - (char*)pinsn)),MIN_TBTABSIZ))
813           { printf ("Abnormal return!..\n"); return NULL; }
814
815         ptb = (struct tbtable *)buffer;
816       }
817       else
818         ptb = (struct tbtable *)pinsn;
819
820       tbInfo.fixedparms = ptb->tb.fixedparms;
821       tbInfo.floatparms = ptb->tb.floatparms;
822       tbInfo.parminfo = ptb->tb_ext.parminfo;
823       return &tbInfo;
824     }
825     bufferbytes = 
826       (TBTABLE_BUFSIZ < (textsec->_raw_size - functionstart - bytesread) ? 
827        TBTABLE_BUFSIZ : (textsec->_raw_size - functionstart - bytesread));
828   }
829   return NULL;
830 }
831
832 #if 0
833 /* Given a function symbol, return a pointer to its traceback table. */
834
835   struct tbtable *
836 retrieve_traceback (abfd, textsec, cs, size)
837   bfd *abfd;
838   sec_ptr textsec;
839   struct coff_symbol *cs;
840   int *size;                            /* return function size */
841 {
842 #define TBTABLE_BUFSIZ  2000
843 #define MIN_TBTABSIZ    50              /* minimum buffer size to hold a
844                                            traceback table. */
845
846   static char buffer [TBTABLE_BUFSIZ];
847
848   int  *pinsn;
849   int  bytesread=0;                     /* total # of bytes read so far */
850   int  bufferbytes;                     /* number of bytes in the buffer */
851
852   int functionstart = cs->c_value - textsec->filepos + textsec->vma;
853   *size = 0;
854
855   /* keep reading blocks of data from the text section, until finding a zero
856      word and a traceback table. */
857
858   while (bfd_get_section_contents (abfd, textsec, buffer, 
859         (file_ptr)(functionstart + bytesread), 
860         bufferbytes = (
861                 (TBTABLE_BUFSIZ < (textsec->size - functionstart - bytesread)) ? 
862                  TBTABLE_BUFSIZ : (textsec->size - functionstart - bytesread))))
863   {
864     bytesread += bufferbytes;
865     pinsn = (int*) buffer;
866
867     /* look for a zero word. */
868
869     while (*pinsn && (pinsn < (int*)(buffer + bufferbytes - sizeof(int))))
870       ++pinsn;
871
872     if (pinsn >= (int*)(buffer + bufferbytes))
873       continue;
874
875     if (*pinsn == 0) {
876
877       /* function size is the amount of bytes we have skipped so far. */
878       *size = bytesread - (buffer + bufferbytes - pinsn);
879
880       ++pinsn;
881
882       /* if we don't have the whole traceback table in the buffer, re-read
883          the whole thing. */
884
885       if ((char*)pinsn > (buffer + bufferbytes - MIN_TBTABSIZ)) {
886
887         /* In case if we are *very* close to the end of the text section
888            and cannot read properly from that point on, abort for now.
889            Handle this case more graciously -- FIXME */
890
891         if (!bfd_get_section_contents (
892                 abfd, textsec, buffer, 
893                 (file_ptr)(functionstart + 
894                  bytesread - (buffer + bufferbytes - pinsn)),MIN_TBTABSIZ))
895         /*   abort (); */ { printf ("abort!!!\n"); return NULL; }
896
897         return (struct tbtable *)buffer;
898       }
899       else
900         return (struct tbtable *)pinsn;
901     }
902   }
903   return NULL;
904 }
905 #endif /* 0 */
906
907
908
909
910 /* Save the vital information for use when closing off the current file.
911    NAME is the file name the symbols came from, START_ADDR is the first
912    text address for the file, and SIZE is the number of bytes of text.  */
913
914 #define complete_symtab(name, start_addr) {     \
915   last_source_file = savestring (name, strlen (name));  \
916   last_source_start_addr = start_addr;                  \
917 }
918
919
920 /* Refill the symbol table input buffer
921    and set the variables that control fetching entries from it.
922    Reports an error if no data available.
923    This function can read past the end of the symbol table
924    (into the string table) but this does no harm.  */
925
926 /* Reading symbol table has to be fast! Keep the followings as macros, rather
927    than functions. */
928
929 #define RECORD_MINIMAL_SYMBOL(NAME, ADDR, TYPE, ALLOCED, SECTION)       \
930 {                                               \
931   char *namestr;                                \
932   if (ALLOCED)                                  \
933     namestr = (NAME) + 1;                       \
934   else {                                        \
935     (NAME) = namestr =                          \
936     obstack_copy0 (&objfile->symbol_obstack, (NAME) + 1, strlen ((NAME)+1)); \
937     (ALLOCED) = 1;                                              \
938   }                                                             \
939   prim_record_minimal_symbol_and_info (namestr, (ADDR), (TYPE), \
940                                        (char *)NULL, (SECTION));        \
941   misc_func_recorded = 1;                                       \
942 }
943
944
945 /* A parameter template, used by ADD_PARM_TO_PENDING.  It is initialized
946    in our initializer function at the bottom of the file, to avoid
947    dependencies on the exact "struct symbol" format.  */
948
949 static struct symbol parmsym;
950
951 /* Add a parameter to a given pending symbol list. */ 
952
953 #define ADD_PARM_TO_PENDING(PARM, VALUE, PTYPE, PENDING_SYMBOLS)        \
954 {                                                                       \
955   PARM = (struct symbol *)                                              \
956       obstack_alloc (&objfile->symbol_obstack, sizeof (struct symbol)); \
957   *(PARM) = parmsym;                                                    \
958   SYMBOL_TYPE (PARM) = PTYPE;                                           \
959   SYMBOL_VALUE (PARM) = VALUE;                                          \
960   add_symbol_to_list (PARM, &PENDING_SYMBOLS);                          \
961 }
962
963
964 /* xcoff has static blocks marked in `.bs', `.es' pairs. They cannot be
965    nested. At any given time, a symbol can only be in one static block.
966    This is the base address of current static block, zero if non exists. */
967    
968 static int static_block_base = 0;
969
970 /* Section number for the current static block.  */
971
972 static int static_block_section = -1;
973
974 /* true if space for symbol name has been allocated. */
975
976 static int symname_alloced = 0;
977
978 /* read the whole symbol table of a given bfd. */
979
980 static void
981 read_xcoff_symtab (objfile, nsyms)
982      struct objfile *objfile;   /* Object file we're reading from */
983      int nsyms;                 /* # of symbols */
984 {
985   bfd *abfd = objfile->obfd;
986   char *raw_symbol;             /* Pointer into raw seething symbol table */
987   char *raw_auxptr;             /* Pointer to first raw aux entry for sym */
988   sec_ptr  textsec;             /* Pointer to text section */
989   TracebackInfo *ptb;           /* Pointer to traceback table */
990
991   struct internal_syment symbol[1];
992   union internal_auxent main_aux[1];
993   struct coff_symbol cs[1];
994   CORE_ADDR file_start_addr = 0;
995   CORE_ADDR file_end_addr = 0;
996
997   int next_file_symnum = -1;
998   int just_started = 1;
999   int depth = 0;
1000   int toc_offset = 0;           /* toc offset value in data section. */
1001   int val;
1002   int fcn_last_line;
1003   int fcn_start_addr;
1004   long fcn_line_offset;
1005   size_t size;
1006
1007   struct coff_symbol fcn_stab_saved;
1008
1009   /* fcn_cs_saved is global because process_xcoff_symbol needs it. */
1010   union internal_auxent fcn_aux_saved;
1011   struct type *fcn_type_saved = NULL;
1012   struct context_stack *new;
1013
1014   char *filestring = " _start_ ";       /* Name of the current file. */
1015
1016   char *last_csect_name;                /* last seen csect's name and value */
1017   CORE_ADDR last_csect_val;
1018   int last_csect_sec;
1019   int  misc_func_recorded;              /* true if any misc. function */
1020
1021   current_objfile = objfile;
1022
1023   /* Get the appropriate COFF "constants" related to the file we're handling. */
1024   N_TMASK = coff_data (abfd)->local_n_tmask;
1025   N_BTSHFT = coff_data (abfd)->local_n_btshft;
1026   local_symesz = coff_data (abfd)->local_symesz;
1027
1028   last_source_file = NULL;
1029   last_csect_name = 0;
1030   last_csect_val = 0;
1031   misc_func_recorded = 0;
1032
1033   start_stabs ();
1034   start_symtab (filestring, (char *)NULL, file_start_addr);
1035   symnum = 0;
1036   first_object_file_end = 0;
1037
1038   /* Allocate space for the entire symbol table at once, and read it
1039      all in.  The bfd is already positioned at the beginning of
1040      the symbol table.  */
1041
1042   size = coff_data (abfd)->local_symesz * nsyms;
1043   symtbl = xmalloc (size);
1044   symtbl_num_syms = nsyms;
1045
1046   val = bfd_read (symtbl, size, 1, abfd);
1047   if (val != size)
1048     perror_with_name ("reading symbol table");
1049
1050   raw_symbol = symtbl;
1051
1052   textsec = bfd_get_section_by_name (abfd, ".text");
1053   if (!textsec) {
1054     printf ("Unable to locate text section!\n");
1055   }
1056
1057   while (symnum < nsyms) {
1058
1059     QUIT;                       /* make this command interruptable.  */
1060
1061     /* READ_ONE_SYMBOL (symbol, cs, symname_alloced); */
1062     /* read one symbol into `cs' structure. After processing the whole symbol
1063        table, only string table will be kept in memory, symbol table and debug
1064        section of xcoff will be freed. Thus we can mark symbols with names
1065        in string table as `alloced'. */
1066     {
1067       int ii;
1068
1069       /* Swap and align the symbol into a reasonable C structure.  */
1070       bfd_coff_swap_sym_in (abfd, raw_symbol, symbol);
1071
1072       cs->c_symnum = symnum;
1073       cs->c_nsyms = symbol->n_numaux;
1074       if (symbol->n_zeroes) {
1075         symname_alloced = 0;
1076         /* We must use the original, unswapped, name here so the name field
1077            pointed to by cs->c_name will persist throughout xcoffread.  If
1078            we use the new field, it gets overwritten for each symbol.  */
1079         cs->c_name = ((struct external_syment *)raw_symbol)->e.e_name;
1080         /* If it's exactly E_SYMNMLEN characters long it isn't
1081            '\0'-terminated.  */
1082         if (cs->c_name[E_SYMNMLEN - 1] != '\0')
1083           {
1084             char *p;
1085             p = obstack_alloc (&objfile->symbol_obstack, E_SYMNMLEN + 1);
1086             strncpy (p, cs->c_name, E_SYMNMLEN);
1087             p[E_SYMNMLEN] = '\0';
1088             cs->c_name = p;
1089             symname_alloced = 1;
1090           }
1091       } else if (symbol->n_sclass & 0x80) {
1092         cs->c_name = debugsec + symbol->n_offset;
1093         symname_alloced = 0;
1094       } else {  /* in string table */
1095         cs->c_name = strtbl + (int)symbol->n_offset;
1096         symname_alloced = 1;
1097       }
1098       cs->c_value = symbol->n_value;
1099       cs->c_sclass = symbol->n_sclass;
1100       cs->c_secnum = symbol->n_scnum;
1101       cs->c_type = (unsigned)symbol->n_type;
1102
1103       raw_symbol += coff_data (abfd)->local_symesz;
1104       ++symnum;
1105
1106       raw_auxptr = raw_symbol;          /* Save addr of first aux entry */
1107
1108       /* Skip all the auxents associated with this symbol.  */
1109       for (ii = symbol->n_numaux; ii; --ii ) {
1110         raw_symbol += coff_data (abfd)->local_auxesz;
1111         ++symnum;
1112       }
1113     }
1114
1115     /* if symbol name starts with ".$" or "$", ignore it. */
1116     if (cs->c_name[0] == '$' || (cs->c_name[1] == '$' && cs->c_name[0] == '.'))
1117       continue;
1118
1119     if (cs->c_symnum == next_file_symnum && cs->c_sclass != C_FILE) {
1120       if (last_source_file)
1121         {
1122           end_symtab (cur_src_end_addr, 1, 0, objfile, textsec->target_index);
1123           end_stabs ();
1124         }
1125
1126       start_stabs ();
1127       start_symtab ("_globals_", (char *)NULL, (CORE_ADDR)0);
1128       cur_src_end_addr = first_object_file_end;
1129       /* done with all files, everything from here on is globals */
1130     }
1131
1132     /* if explicitly specified as a function, treat is as one. */
1133     if (ISFCN(cs->c_type) && cs->c_sclass != C_TPDEF) {
1134       bfd_coff_swap_aux_in (abfd, raw_auxptr, cs->c_type, cs->c_sclass,
1135                             main_aux);
1136       goto function_entry_point;
1137     }
1138
1139     if ((cs->c_sclass == C_EXT || cs->c_sclass == C_HIDEXT) && cs->c_nsyms == 1)
1140     {
1141         /* dealing with a symbol with a csect entry. */
1142
1143 #   define      CSECT(PP)       ((PP)->x_csect)
1144 #   define      CSECT_LEN(PP)   (CSECT(PP).x_scnlen)
1145 #   define      CSECT_ALIGN(PP) (SMTYP_ALIGN(CSECT(PP).x_smtyp))
1146 #   define      CSECT_SMTYP(PP) (SMTYP_SMTYP(CSECT(PP).x_smtyp))
1147 #   define      CSECT_SCLAS(PP) (CSECT(PP).x_smclas)
1148
1149         /* Convert the auxent to something we can access.  */
1150         bfd_coff_swap_aux_in (abfd, raw_auxptr, cs->c_type, cs->c_sclass,
1151                               main_aux);
1152
1153         switch (CSECT_SMTYP (main_aux)) {
1154
1155         case XTY_ER :
1156           continue;                     /* ignore all external references. */
1157
1158         case XTY_SD :                   /* a section description. */
1159           {
1160             switch (CSECT_SCLAS (main_aux)) {
1161
1162             case XMC_PR :                       /* a `.text' csect.     */
1163               {
1164
1165                 /* A program csect is seen.  We have to allocate one
1166                    symbol table for each program csect.  Normally gdb
1167                    prefers one symtab for each source file.  In case
1168                    of AIX, one source file might include more than one
1169                    [PR] csect, and they don't have to be adjacent in
1170                    terms of the space they occupy in memory. Thus, one
1171                    single source file might get fragmented in the
1172                    memory and gdb's file start and end address
1173                    approach does not work!  GCC (and I think xlc) seem
1174                    to put all the code in the unnamed program csect.  */
1175
1176                 if (last_csect_name) {
1177
1178                   /* if no misc. function recorded in the last seen csect, enter
1179                      it as a function. This will take care of functions like
1180                      strcmp() compiled by xlc. */
1181
1182                   if (!misc_func_recorded) {
1183                      int alloced = 0;
1184                      RECORD_MINIMAL_SYMBOL (last_csect_name, last_csect_val,
1185                                             mst_text, alloced, last_csect_sec);
1186                   }
1187                     
1188
1189                   complete_symtab (filestring, file_start_addr);
1190                   cur_src_end_addr = file_end_addr;
1191                   end_symtab (file_end_addr, 1, 0, objfile,
1192                               textsec->target_index);
1193                   end_stabs ();
1194                   start_stabs ();
1195                   /* Give all csects for this source file the same
1196                      name.  */
1197                   start_symtab (filestring, (char *)NULL, (CORE_ADDR)0);
1198                 }
1199
1200                 /* If this is the very first csect seen, basically `__start'. */
1201                 if (just_started) {
1202                   first_object_file_end = cs->c_value + CSECT_LEN (main_aux);
1203                   just_started = 0;
1204                 }
1205
1206                 file_start_addr = cs->c_value;
1207                 file_end_addr = cs->c_value + CSECT_LEN (main_aux);
1208
1209                 if (cs->c_name && cs->c_name[0] == '.') {
1210                   last_csect_name = cs->c_name;
1211                   last_csect_val = cs->c_value;
1212                   last_csect_sec = cs->c_secnum;
1213                 }
1214               }
1215               misc_func_recorded = 0;
1216               continue;
1217
1218             case XMC_RW :
1219               break;
1220
1221               /* If the section is not a data description, ignore it. Note that
1222                  uninitialized data will show up as XTY_CM/XMC_RW pair. */
1223
1224             case XMC_TC0:
1225               if (toc_offset)
1226                 warning ("More than one xmc_tc0 symbol found.");
1227               toc_offset = cs->c_value;
1228               continue;
1229
1230             case XMC_TC :               /* ignore toc entries   */
1231             default     :               /* any other XMC_XXX    */
1232               continue;
1233             }
1234           }
1235           break;                        /* switch CSECT_SCLAS() */
1236
1237         case XTY_LD :
1238           
1239           /* a function entry point. */
1240           if (CSECT_SCLAS (main_aux) == XMC_PR) {
1241
1242 function_entry_point:
1243             RECORD_MINIMAL_SYMBOL (cs->c_name, cs->c_value, mst_text, 
1244                                    symname_alloced, cs->c_secnum);
1245
1246             fcn_line_offset = main_aux->x_sym.x_fcnary.x_fcn.x_lnnoptr;
1247             fcn_start_addr = cs->c_value;
1248
1249             /* save the function header info, which will be used
1250                when `.bf' is seen. */
1251             fcn_cs_saved = *cs;
1252             fcn_aux_saved = *main_aux;
1253
1254
1255             ptb = NULL;
1256
1257             /* If function has two auxent, then debugging information is
1258                already available for it. Process traceback table for
1259                functions with only one auxent. */
1260
1261             if (cs->c_nsyms == 1)
1262               ptb = retrieve_tracebackinfo (abfd, textsec, cs);
1263
1264             else if (cs->c_nsyms != 2)
1265               abort ();
1266
1267             /* If there is traceback info, create and add parameters for it. */
1268
1269             if (ptb && (ptb->fixedparms || ptb->floatparms)) {
1270
1271               int parmcnt = ptb->fixedparms + ptb->floatparms;
1272               char *parmcode = (char*) &ptb->parminfo;
1273               int parmvalue = ptb->framesize + 0x18;    /* sizeof(LINK AREA) == 0x18 */
1274               unsigned int ii, mask;
1275
1276               for (ii=0, mask = 0x80000000; ii <parmcnt; ++ii) {
1277                 struct symbol *parm;
1278
1279                 if (ptb->parminfo & mask) {             /* float or double */
1280                   mask = mask >> 1;
1281                   if (ptb->parminfo & mask) {           /* double parm */
1282                     ADD_PARM_TO_PENDING
1283                         (parm, parmvalue, builtin_type_double, local_symbols);
1284                     parmvalue += sizeof (double);
1285                   }
1286                   else {                                /* float parm */
1287                     ADD_PARM_TO_PENDING
1288                         (parm, parmvalue, builtin_type_float, local_symbols);
1289                     parmvalue += sizeof (float);
1290                   }
1291                 }
1292                 else {          /* fixed parm, use (int*) for hex rep. */
1293                   ADD_PARM_TO_PENDING (parm, parmvalue,
1294                                        lookup_pointer_type (builtin_type_int),
1295                                        local_symbols);
1296                   parmvalue += sizeof (int);
1297                 }
1298                 mask = mask >> 1;
1299               }
1300                 
1301               /* Fake this as a function. Needed in process_xcoff_symbol() */
1302               cs->c_type = 32;          
1303                                            
1304               finish_block(process_xcoff_symbol (cs, objfile), &local_symbols, 
1305                            pending_blocks, cs->c_value,
1306                            cs->c_value + ptb->fsize, objfile);
1307             }
1308             continue;
1309           }
1310           /* shared library function trampoline code entry point. */
1311           else if (CSECT_SCLAS (main_aux) == XMC_GL) {
1312
1313             /* record trampoline code entries as mst_unknown symbol. When we
1314                lookup mst symbols, we will choose mst_text over mst_unknown. */
1315
1316 #if 1
1317             /* After the implementation of incremental loading of shared
1318                libraries, we don't want to access trampoline entries. This
1319                approach has a consequence of the necessity to bring the whole 
1320                shared library at first, in order do anything with it (putting
1321                breakpoints, using malloc, etc). On the other side, this is
1322                consistient with gdb's behaviour on a SUN platform. */
1323
1324             /* Trying to prefer *real* function entry over its trampoline,
1325                by assigning `mst_unknown' type to trampoline entries fails.
1326                Gdb treats those entries as chars. FIXME. */
1327
1328             /* Recording this entry is necessary. Single stepping relies on
1329                this vector to get an idea about function address boundaries. */
1330
1331             prim_record_minimal_symbol_and_info
1332               ("<trampoline>", cs->c_value, mst_unknown,
1333                (char *)NULL, cs->c_secnum);
1334 #else
1335
1336             /* record trampoline code entries as mst_unknown symbol. When we
1337                lookup mst symbols, we will choose mst_text over mst_unknown. */
1338
1339             RECORD_MINIMAL_SYMBOL (cs->c_name, cs->c_value, mst_unknown,
1340                                    symname_alloced);
1341 #endif
1342             continue;
1343           }
1344           break;
1345
1346         default :               /* all other XTY_XXXs */
1347           break;
1348         }                       /* switch CSECT_SMTYP() */    }
1349
1350     switch (cs->c_sclass) {
1351
1352     case C_FILE:
1353
1354       /* see if the last csect needs to be recorded. */
1355
1356       if (last_csect_name && !misc_func_recorded) {
1357
1358           /* if no misc. function recorded in the last seen csect, enter
1359              it as a function. This will take care of functions like
1360              strcmp() compiled by xlc. */
1361
1362           int alloced = 0;
1363           RECORD_MINIMAL_SYMBOL (last_csect_name, last_csect_val,
1364                                 mst_text, alloced, last_csect_sec);
1365       }
1366
1367       /* c_value field contains symnum of next .file entry in table
1368          or symnum of first global after last .file. */
1369
1370       next_file_symnum = cs->c_value;
1371
1372       /* complete symbol table for last object file containing
1373          debugging information. */
1374
1375       /* Whether or not there was a csect in the previous file, we have to call
1376          `end_stabs' and `start_stabs' to reset type_vector, 
1377          line_vector, etc. structures. */
1378
1379       complete_symtab (filestring, file_start_addr);
1380       cur_src_end_addr = file_end_addr;
1381       end_symtab (file_end_addr, 1, 0, objfile, textsec->target_index);
1382       end_stabs ();
1383       start_stabs ();
1384       start_symtab (cs->c_name, (char *)NULL, (CORE_ADDR)0);
1385       last_csect_name = 0;
1386
1387       /* reset file start and end addresses. A compilation unit with no text
1388          (only data) should have zero file boundaries. */
1389       file_start_addr = file_end_addr = 0;
1390
1391       filestring = cs->c_name;
1392       break;
1393
1394
1395     case C_FUN:
1396       fcn_stab_saved = *cs;
1397       break;
1398     
1399
1400     case C_FCN:
1401       if (STREQ (cs->c_name, ".bf")) {
1402
1403         bfd_coff_swap_aux_in (abfd, raw_auxptr, cs->c_type, cs->c_sclass,
1404                               main_aux);
1405
1406         within_function = 1;
1407
1408         mark_first_line (fcn_line_offset, cs->c_symnum);
1409
1410         new = push_context (0, fcn_start_addr);
1411
1412         new->name = define_symbol 
1413                 (fcn_cs_saved.c_value, fcn_stab_saved.c_name, 0, 0, objfile);
1414         if (new->name != NULL)
1415           SYMBOL_SECTION (new->name) = cs->c_secnum;
1416       }
1417       else if (STREQ (cs->c_name, ".ef")) {
1418
1419         bfd_coff_swap_aux_in (abfd, raw_auxptr, cs->c_type, cs->c_sclass,
1420                               main_aux);
1421
1422         /* the value of .ef is the address of epilogue code;
1423            not useful for gdb */
1424         /* { main_aux.x_sym.x_misc.x_lnsz.x_lnno
1425            contains number of lines to '}' */
1426
1427         fcn_last_line = main_aux->x_sym.x_misc.x_lnsz.x_lnno;
1428         new = pop_context ();
1429         if (context_stack_depth != 0)
1430           error ("invalid symbol data; .bf/.ef/.bb/.eb symbol mismatch, at symbol %d.",
1431               symnum);
1432
1433         finish_block (new->name, &local_symbols, new->old_blocks,
1434             new->start_addr,
1435             fcn_cs_saved.c_value +
1436             fcn_aux_saved.x_sym.x_misc.x_fsize, objfile);
1437         within_function = 0;
1438       }
1439       break;
1440
1441     case C_BSTAT        :               /* begin static block   */
1442       {
1443         struct internal_syment symbol;
1444         
1445         read_symbol (&symbol, cs->c_value);
1446         static_block_base = symbol.n_value;
1447         static_block_section = symbol.n_scnum;
1448       }
1449       break;
1450
1451     case C_ESTAT        :               /* end of static block  */
1452       static_block_base = 0;
1453       static_block_section = -1;
1454       break;
1455
1456     case C_ARG          :               /* These are not implemented. */
1457     case C_REGPARM      :
1458     case C_TPDEF        :
1459     case C_STRTAG       :
1460     case C_UNTAG        :
1461     case C_ENTAG        :
1462       printf ("ERROR: Unimplemented storage class: %d.\n", cs->c_sclass);
1463       break;
1464
1465     case C_HIDEXT       :               /* ignore these.. */
1466     case C_LABEL        :
1467     case C_NULL         :
1468       break;
1469
1470     case C_BINCL        :               /* beginning of include file */
1471
1472         /* In xlc output, C_BINCL/C_EINCL pair doesn't show up in sorted
1473            order. Thus, when wee see them, we might not know enough info
1474            to process them. Thus, we'll be saving them into a table 
1475            (inclTable) and postpone their processing. */
1476
1477         record_include_begin (cs);
1478         break;
1479
1480     case C_EINCL        :               /* end of include file */
1481                         /* see the comment after case C_BINCL. */
1482         record_include_end (cs);
1483         break;
1484
1485     case C_BLOCK        :
1486       if (STREQ (cs->c_name, ".bb")) {
1487         depth++;
1488         new = push_context (depth, cs->c_value);
1489       }
1490       else if (STREQ (cs->c_name, ".eb")) {
1491         new = pop_context ();
1492         if (depth != new->depth)
1493           error ("Invalid symbol data: .bb/.eb symbol mismatch at symbol %d.",
1494                          symnum);
1495
1496         depth--;
1497         if (local_symbols && context_stack_depth > 0) {
1498           /* Make a block for the local symbols within.  */
1499           finish_block (new->name, &local_symbols, new->old_blocks,
1500                                   new->start_addr, cs->c_value, objfile);
1501         }
1502         local_symbols = new->locals;
1503       }
1504       break;
1505
1506     default             :
1507       process_xcoff_symbol (cs, objfile);
1508       break;
1509     }
1510
1511   } /* while */
1512
1513   if (last_source_file)
1514     {
1515       end_symtab (cur_src_end_addr, 1, 0, objfile, textsec->target_index);
1516       end_stabs ();
1517     }
1518
1519   free (symtbl);
1520   current_objfile = NULL;
1521
1522   /* Record the toc offset value of this symbol table into ldinfo structure.
1523      If no XMC_TC0 is found, toc_offset should be zero. Another place to obtain
1524      this information would be file auxiliary header. */
1525
1526 #ifndef FAKING_RS6000
1527   xcoff_add_toc_to_loadinfo (toc_offset);
1528 #endif
1529 }
1530
1531 #define SYMBOL_DUP(SYMBOL1, SYMBOL2)    \
1532   (SYMBOL2) = (struct symbol *)         \
1533         obstack_alloc (&objfile->symbol_obstack, sizeof (struct symbol)); \
1534   *(SYMBOL2) = *(SYMBOL1);
1535   
1536  
1537 #define SYMNAME_ALLOC(NAME, ALLOCED)    \
1538   (ALLOCED) ? (NAME) : obstack_copy0 (&objfile->symbol_obstack, (NAME), strlen (NAME));
1539
1540
1541 /* process one xcoff symbol. */
1542
1543 static struct symbol *
1544 process_xcoff_symbol (cs, objfile)
1545   register struct coff_symbol *cs;
1546   struct objfile *objfile;
1547 {
1548   struct symbol onesymbol;
1549   register struct symbol *sym = &onesymbol;
1550   struct symbol *sym2 = NULL;
1551   struct type *ttype;
1552   char *name, *pp, *qq;
1553   int struct_and_type_combined;
1554   int nameless;
1555
1556   name = cs->c_name;
1557   if (name[0] == '.')
1558     ++name;
1559
1560   memset (sym, '\0', sizeof (struct symbol));
1561
1562   /* default assumptions */
1563   SYMBOL_VALUE (sym) = cs->c_value;
1564   SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
1565   SYMBOL_SECTION (sym) = cs->c_secnum;
1566
1567   if (ISFCN (cs->c_type)) {
1568
1569     /* At this point, we don't know the type of the function and assume it 
1570        is int. This will be patched with the type from its stab entry later 
1571        on in patch_block_stabs () */
1572
1573     SYMBOL_NAME (sym) = SYMNAME_ALLOC (name, symname_alloced);
1574     SYMBOL_TYPE (sym) = lookup_function_type (lookup_fundamental_type (objfile, FT_INTEGER));
1575
1576     SYMBOL_CLASS (sym) = LOC_BLOCK;
1577     SYMBOL_DUP (sym, sym2);
1578
1579     if (cs->c_sclass == C_EXT)
1580       add_symbol_to_list (sym2, &global_symbols);
1581     else if (cs->c_sclass == C_HIDEXT || cs->c_sclass == C_STAT)
1582       add_symbol_to_list (sym2, &file_symbols);
1583   }
1584
1585   else {
1586
1587     /* in case we can't figure out the type, default is `int'. */
1588     SYMBOL_TYPE (sym) = lookup_fundamental_type (objfile, FT_INTEGER);
1589
1590     switch (cs->c_sclass)
1591     {
1592 #if 0
1593     case C_FUN:
1594       if (fcn_cs_saved.c_sclass == C_EXT)
1595         add_stab_to_list (name, &global_stabs);
1596       else
1597         add_stab_to_list (name, &file_stabs);
1598       break;
1599 #endif
1600
1601     case C_DECL:                        /* a type decleration?? */
1602
1603       sym = define_symbol (cs->c_value, cs->c_name, 0, 0, objfile);
1604       if (sym != NULL)
1605         SYMBOL_SECTION (sym) = cs->c_secnum;
1606       return sym;
1607
1608     case C_GSYM:
1609       add_stab_to_list (name, &global_stabs);
1610       break;
1611
1612     case C_PSYM:
1613     case C_RPSYM:
1614
1615       sym = define_symbol (cs->c_value, cs->c_name, 0, 0, objfile);
1616       if (sym != NULL)
1617         {
1618           SYMBOL_SECTION (sym) = cs->c_secnum;
1619         }
1620       return sym;
1621
1622     case C_STSYM:
1623
1624         /* If we are going to use Sun dbx's define_symbol(), we need to
1625            massage our stab string a little. Change 'V' type to 'S' to be
1626            comparible with Sun. */
1627         /* FIXME: I believe this is to avoid a Sun-specific hack somewhere.
1628            Needs more investigation.  */
1629
1630         if (*name == ':' || (pp = (char *) strchr(name, ':')) == NULL)
1631           return NULL;
1632
1633         ++pp;
1634         if (*pp == 'V') *pp = 'S';
1635         sym = define_symbol (cs->c_value, cs->c_name, 0, 0, objfile);
1636         if (sym != NULL)
1637           {
1638             SYMBOL_VALUE (sym) += static_block_base;
1639             SYMBOL_SECTION (sym) = static_block_section;
1640           }
1641         return sym;
1642
1643     case C_LSYM:
1644       sym = define_symbol (cs->c_value, cs->c_name, 0, N_LSYM, objfile);
1645       if (sym != NULL)
1646         {
1647           SYMBOL_SECTION (sym) = cs->c_secnum;
1648         }
1649       return sym;
1650
1651     case C_AUTO:
1652       SYMBOL_CLASS (sym) = LOC_LOCAL;
1653       SYMBOL_NAME (sym) = SYMNAME_ALLOC (name, symname_alloced);
1654       SYMBOL_SECTION (sym) = cs->c_secnum;
1655       SYMBOL_DUP (sym, sym2);
1656       add_symbol_to_list (sym2, &local_symbols);
1657       break;
1658
1659     case C_EXT:
1660       SYMBOL_CLASS (sym) = LOC_STATIC;
1661       SYMBOL_NAME (sym) = SYMNAME_ALLOC (name, symname_alloced);
1662       SYMBOL_SECTION (sym) = cs->c_secnum;
1663       SYMBOL_DUP (sym, sym2);
1664       add_symbol_to_list (sym2, &global_symbols);
1665       break;
1666
1667     case C_STAT:
1668       SYMBOL_CLASS (sym) = LOC_STATIC;
1669       SYMBOL_NAME (sym) = SYMNAME_ALLOC (name, symname_alloced);
1670       SYMBOL_SECTION (sym) = cs->c_secnum;
1671       SYMBOL_DUP (sym, sym2);
1672       add_symbol_to_list 
1673            (sym2, within_function ? &local_symbols : &file_symbols);
1674       break;
1675
1676     case C_REG:
1677       printf ("ERROR! C_REG is not fully implemented!\n");
1678       SYMBOL_CLASS (sym) = LOC_REGISTER;
1679       SYMBOL_NAME (sym) = SYMNAME_ALLOC (name, symname_alloced);
1680       SYMBOL_SECTION (sym) = cs->c_secnum;
1681       SYMBOL_DUP (sym, sym2);
1682       add_symbol_to_list (sym2, &local_symbols);
1683       break;
1684
1685     case C_RSYM:
1686         pp = (char*) strchr (name, ':');
1687         if (pp) {
1688           sym = define_symbol (cs->c_value, cs->c_name, 0, 0, objfile);
1689           if (sym != NULL)
1690             SYMBOL_SECTION (sym) = cs->c_secnum;
1691           return sym;
1692         }
1693         else {
1694           complain (&rsym_complaint, name);
1695           return NULL;
1696         }
1697
1698     default     :
1699       complain (&storclass_complaint, cs->c_sclass);
1700       return NULL;
1701     }
1702   }
1703   return sym2;
1704 }
1705
1706 /* Set *SYMBOL to symbol number symno in symtbl.  */
1707 static void
1708 read_symbol (symbol, symno)
1709      struct internal_syment *symbol;
1710      int symno;
1711 {
1712   if (symno < 0 || symno >= symtbl_num_syms)
1713     {
1714       static struct complaint msg =
1715         {"Invalid symbol offset", 0, 0};
1716       complain (&msg);
1717       symbol->n_value = 0;
1718       symbol->n_scnum = -1;
1719       return;
1720     }
1721   bfd_coff_swap_sym_in (symfile_bfd, symtbl + (symno*local_symesz), symbol);
1722 }
1723   
1724 /* Get value corresponding to symbol number symno in symtbl.  */
1725
1726 static int
1727 read_symbol_nvalue (symno)
1728      int symno;
1729 {
1730   struct internal_syment symbol[1];
1731
1732   read_symbol (symbol, symno);
1733   return symbol->n_value;  
1734 }
1735
1736
1737 /* Find the address of the function corresponding to symno, where
1738    symno is the symbol pointed to by the linetable.  */
1739
1740 static int
1741 read_symbol_lineno (symno)
1742   int symno;
1743 {
1744   struct internal_syment symbol[1];
1745   union internal_auxent main_aux[1];
1746
1747   /* Note that just searching for a short distance (e.g. 50 symbols)
1748      is not enough, at least in the following case.
1749
1750      .extern foo
1751      [many .stabx entries]
1752      [a few functions, referring to foo]
1753      .globl foo
1754      .bf
1755
1756      What happens here is that the assembler moves the .stabx entries
1757      to right before the ".bf" for foo, but the symbol for "foo" is before
1758      all the stabx entries.  See PR gdb/2222.  */
1759   while (symno < symtbl_num_syms) {
1760     bfd_coff_swap_sym_in (symfile_bfd,
1761                           symtbl + (symno*local_symesz), symbol);
1762     if (symbol->n_sclass == C_FCN && STREQ (symbol->n_name, ".bf"))
1763       goto gotit;
1764     symno += symbol->n_numaux+1;
1765   }
1766
1767   complain (&bf_notfound_complaint);
1768   return 0;
1769
1770 gotit:
1771   /* take aux entry and return its lineno */
1772   symno++;
1773   bfd_coff_swap_aux_in (symfile_bfd, symtbl+(symno*local_symesz),
1774                         symbol->n_type, symbol->n_sclass, main_aux);
1775
1776   return main_aux->x_sym.x_misc.x_lnsz.x_lnno;
1777 }
1778
1779 /* Support for line number handling */
1780
1781 /* This function is called for every section; it finds the outer limits
1782  * of the line table (minimum and maximum file offset) so that the
1783  * mainline code can read the whole thing for efficiency.
1784  */
1785 static void
1786 find_linenos(abfd, asect, vpinfo)
1787 bfd *abfd;
1788 sec_ptr asect;
1789 PTR vpinfo; 
1790 {
1791   struct coff_symfile_info *info;
1792   int size, count;
1793   file_ptr offset, maxoff;
1794
1795   count = asect->lineno_count;
1796
1797   if (!STREQ (asect->name, ".text") || count == 0)
1798     return;
1799
1800   size   = count * coff_data (symfile_bfd)->local_linesz;
1801   info   = (struct coff_symfile_info *)vpinfo;
1802   offset = asect->line_filepos;
1803   maxoff = offset + size;
1804
1805   if (offset < info->min_lineno_offset || info->min_lineno_offset == 0)
1806     info->min_lineno_offset = offset;
1807
1808   if (maxoff > info->max_lineno_offset)
1809     info->max_lineno_offset = maxoff;
1810 }
1811
1812
1813 /* Read in all the line numbers for fast lookups later.  Leave them in
1814    external (unswapped) format in memory; we'll swap them as we enter
1815    them into GDB's data structures.  */
1816
1817 static int
1818 init_lineno (abfd, offset, size)
1819      bfd *abfd;
1820      file_ptr offset;
1821      int size;
1822 {
1823   int val;
1824
1825   free_linetab ();
1826
1827   if (bfd_seek(abfd, offset, L_SET) < 0)
1828     return -1;
1829
1830   linetab = (char *) xmalloc(size);
1831
1832   val = bfd_read(linetab, 1, size, abfd);
1833   if (val != size)
1834     return -1;
1835
1836   linetab_offset = offset;
1837   linetab_size = size;
1838   return 0;
1839 }
1840
1841 static void
1842 free_linetab ()
1843 {
1844   if (linetab)
1845     free (linetab);
1846   linetab = NULL;
1847 }
1848 \f
1849 /* dbx allows the text of a symbol name to be continued into the
1850    next symbol name!  When such a continuation is encountered
1851    (a \ at the end of the text of a name)
1852    call this function to get the continuation.  */
1853 /* So far, I haven't seen this happenning xlc output. I doubt we'll need this
1854    for xcoff. */
1855
1856 #undef next_symbol_text
1857 #define next_symbol_text() \
1858   printf ("Gdb Error: symbol names on multiple lines not implemented.\n")
1859
1860
1861 static void
1862 xcoff_new_init (objfile)
1863      struct objfile *objfile;
1864 {
1865 }
1866
1867
1868 /* xcoff_symfile_init()
1869    is the xcoff-specific initialization routine for reading symbols.
1870    It is passed an objfile which contains, among other things,
1871    the BFD for the file whose symbols are being read, and a slot for
1872    a pointer to "private data" which we fill with cookies and other
1873    treats for xcoff_symfile_read().
1874  
1875    We will only be called if this is an XCOFF or XCOFF-like file.
1876    BFD handles figuring out the format of the file, and code in symfile.c
1877    uses BFD's determination to vector to us.
1878  
1879    The ultimate result is a new symtab (or, FIXME, eventually a psymtab).  */
1880
1881 static void
1882 xcoff_symfile_init (objfile)
1883   struct objfile *objfile;
1884 {
1885   bfd *abfd = objfile->obfd;
1886
1887   /* Allocate struct to keep track of the symfile */
1888   objfile -> sym_private = xmmalloc (objfile -> md,
1889                                      sizeof (struct coff_symfile_info));
1890   init_entry_point_info (objfile);
1891 }
1892
1893 /* Perform any local cleanups required when we are done with a particular
1894    objfile.  I.E, we are in the process of discarding all symbol information
1895    for an objfile, freeing up all memory held for it, and unlinking the
1896    objfile struct from the global list of known objfiles. */
1897
1898 static void
1899 xcoff_symfile_finish (objfile)
1900      struct objfile *objfile;
1901 {
1902   if (objfile -> sym_private != NULL)
1903     {
1904       mfree (objfile -> md, objfile -> sym_private);
1905     }
1906
1907   /* Start with a fresh include table for the next objfile. */
1908
1909   if (inclTable)
1910     {
1911       free (inclTable);
1912       inclTable = NULL;
1913     }
1914   inclIndx = inclLength = inclDepth = 0;
1915 }
1916
1917
1918 static int
1919 init_stringtab(abfd, offset, objfile)
1920      bfd *abfd;
1921      file_ptr offset;
1922      struct objfile *objfile;
1923 {
1924   long length;
1925   int val;
1926   unsigned char lengthbuf[4];
1927
1928   if (bfd_seek(abfd, offset, L_SET) < 0)
1929     return -1;
1930
1931   val    = bfd_read((char *)lengthbuf, 1, sizeof lengthbuf, abfd);
1932   length = bfd_h_get_32(abfd, lengthbuf);
1933
1934   /* If no string table is needed, then the file may end immediately
1935      after the symbols.  Just return with `strtbl' set to null. */
1936
1937   if (val != sizeof length || length < sizeof length)
1938     return 0;
1939
1940   /* Allocate string table from symbol_obstack. We will need this table
1941      as long as we have its symbol table around. */
1942
1943   strtbl = (char*) obstack_alloc (&objfile->symbol_obstack, length);
1944   if (strtbl == NULL)
1945     return -1;
1946
1947   memcpy(strtbl, &length, sizeof length);
1948   if (length == sizeof length)
1949     return 0;
1950
1951   val = bfd_read(strtbl + sizeof length, 1, length - sizeof length, abfd);
1952
1953   if (val != length - sizeof length || strtbl[length - 1] != '\0')
1954     return -1;
1955
1956   return 0;
1957 }
1958
1959 static int
1960 init_debugsection(abfd)
1961      bfd *abfd;
1962 {
1963   register sec_ptr secp;
1964   bfd_size_type length;
1965
1966   if (debugsec) {
1967     free(debugsec);
1968     debugsec = NULL;
1969   }
1970
1971   secp = bfd_get_section_by_name(abfd, ".debug");
1972   if (!secp)
1973     return 0;
1974
1975   if (!(length = bfd_section_size(abfd, secp)))
1976     return 0;
1977
1978   debugsec = (char *) xmalloc ((unsigned)length);
1979   if (debugsec == NULL)
1980     return -1;
1981
1982   if (!bfd_get_section_contents(abfd, secp, debugsec, (file_ptr) 0, length)) {
1983     printf ("Can't read .debug section from symbol file\n");
1984     return -1;
1985   }
1986   return 0;
1987 }
1988
1989 static void
1990 free_debugsection()
1991 {
1992   if (debugsec)
1993     free(debugsec);
1994   debugsec = NULL;
1995 }
1996
1997
1998 /* xcoff version of symbol file read. */
1999
2000 static void
2001 xcoff_symfile_read (objfile, section_offset, mainline)
2002   struct objfile *objfile;
2003   struct section_offset *section_offset;
2004   int mainline;
2005 {
2006   int num_symbols;                      /* # of symbols */
2007   file_ptr symtab_offset;               /* symbol table and */
2008   file_ptr stringtab_offset;            /* string table file offsets */
2009   int val;
2010   bfd *abfd;
2011   struct coff_symfile_info *info;
2012   char *name;
2013   struct cleanup *back_to = make_cleanup (null_cleanup, 0);
2014
2015   info = (struct coff_symfile_info *) objfile -> sym_private;
2016   symfile_bfd = abfd = objfile->obfd;
2017   name = objfile->name;
2018
2019   num_symbols = bfd_get_symcount (abfd);        /* # of symbols */
2020   symtab_offset = obj_sym_filepos (abfd);       /* symbol table file offset */
2021   stringtab_offset = symtab_offset +
2022     num_symbols * coff_data(abfd)->local_symesz;
2023
2024   info->min_lineno_offset = 0;
2025   info->max_lineno_offset = 0;
2026   bfd_map_over_sections (abfd, find_linenos, info);
2027
2028   /* FIXME!  This stuff should move into symfile_init */
2029   if (info->min_lineno_offset != 0
2030       && info->max_lineno_offset > info->min_lineno_offset) {
2031
2032     /* only read in the line # table if one exists */
2033     make_cleanup (free_linetab, 0);
2034     val = init_lineno(abfd, info->min_lineno_offset,
2035         (int) (info->max_lineno_offset - info->min_lineno_offset));
2036
2037     if (val < 0)
2038       error("\"%s\": error reading line numbers\n", name);
2039   }
2040
2041   if (num_symbols > 0)
2042     {
2043       val = init_stringtab(abfd, stringtab_offset, objfile);
2044       if (val < 0) {
2045         error ("\"%s\": can't get string table", name);
2046       }
2047
2048       if (init_debugsection(abfd) < 0) {
2049         error ("Error reading .debug section of `%s'\n", name);
2050       }
2051     }
2052
2053   /* Position to read the symbol table.  Do not read it all at once. */
2054   val = bfd_seek(abfd, symtab_offset, L_SET);
2055   if (val < 0)
2056     perror_with_name(name);
2057
2058   if (bfd_tell(abfd) != symtab_offset)
2059     fatal("bfd? BFD!");
2060
2061   init_minimal_symbol_collection ();
2062   make_cleanup (discard_minimal_symbols, 0);
2063
2064 #ifndef FAKING_RS6000
2065   /* Initialize load info structure. */
2066   if (mainline)
2067     xcoff_init_loadinfo ();
2068 #endif
2069
2070   /* Now that the executable file is positioned at symbol table,
2071      process it and define symbols accordingly. */
2072
2073   read_xcoff_symtab(objfile, num_symbols);
2074
2075   /* Free debug section. */
2076   free_debugsection ();
2077
2078   /* Sort symbols alphabetically within each block.  */
2079   sort_all_symtab_syms ();
2080
2081   /* Install any minimal symbols that have been collected as the current
2082      minimal symbols for this objfile. */
2083
2084   install_minimal_symbols (objfile);
2085
2086   do_cleanups (back_to);
2087 }
2088
2089 /* XCOFF-specific parsing routine for section offsets.  */
2090
2091 static int largest_section;
2092
2093 static void
2094 note_one_section (abfd, asect, ptr)
2095      bfd *abfd;
2096      asection *asect;
2097      PTR ptr;
2098 {
2099   if (asect->target_index > largest_section)
2100     largest_section = asect->target_index;
2101 }
2102
2103 static
2104 struct section_offsets *
2105 xcoff_symfile_offsets (objfile, addr)
2106      struct objfile *objfile;
2107      CORE_ADDR addr;
2108 {
2109   struct section_offsets *section_offsets;
2110   int i;
2111
2112   largest_section = 0;
2113   bfd_map_over_sections (objfile->obfd, note_one_section, NULL);
2114   objfile->num_sections = largest_section + 1;
2115   section_offsets = (struct section_offsets *)
2116     obstack_alloc
2117       (&objfile -> psymbol_obstack,
2118        sizeof (struct section_offsets)
2119        + sizeof (section_offsets->offsets) * (objfile->num_sections));
2120
2121   /* syms_from_objfile kindly subtracts from addr the bfd_section_vma
2122      of the .text section.  This strikes me as wrong--whether the
2123      offset to be applied to symbol reading is relative to the start
2124      address of the section depends on the symbol format.  In any
2125      event, this whole "addr" concept is pretty broken (it doesn't
2126      handle any section but .text sensibly), so just ignore the addr
2127      parameter and use 0.  That matches the fact that xcoff_symfile_read
2128      ignores the section_offsets).  */
2129   for (i = 0; i < objfile->num_sections; i++)
2130     ANOFFSET (section_offsets, i) = 0;
2131   
2132   return section_offsets;
2133 }
2134 /* Register our ability to parse symbols for xcoff BFD files. */
2135
2136 static struct sym_fns xcoff_sym_fns =
2137 {
2138   "aixcoff-rs6000",     /* sym_name: name or name prefix of BFD target type */
2139   15,                   /* sym_namelen: number of significant sym_name chars */
2140   xcoff_new_init,       /* sym_new_init: init anything gbl to entire symtab */
2141   xcoff_symfile_init,   /* sym_init: read initial info, setup for sym_read() */
2142   xcoff_symfile_read,   /* sym_read: read a symbol file into symtab */
2143   xcoff_symfile_finish, /* sym_finish: finished with file, cleanup */
2144   xcoff_symfile_offsets, /* sym_offsets: xlate offsets ext->int form */
2145   NULL                  /* next: pointer to next struct sym_fns */
2146 };
2147
2148 void
2149 _initialize_xcoffread ()
2150 {
2151   add_symtab_fns(&xcoff_sym_fns);
2152
2153   /* Initialize symbol template later used for arguments.  */
2154   SYMBOL_NAME (&parmsym) = "";
2155   SYMBOL_INIT_LANGUAGE_SPECIFIC (&parmsym, language_c);
2156   SYMBOL_NAMESPACE (&parmsym) = VAR_NAMESPACE;
2157   SYMBOL_CLASS (&parmsym) = LOC_ARG;
2158   /* Its other fields are zero, or are filled in later.  */
2159 }
This page took 0.147197 seconds and 4 git commands to generate.