OSDN Git Service

* coff-pe-read.c: New file - support reading of minimal symbols from a portable
[pf3gnuchains/pf3gnuchains3x.git] / gdb / coffread.c
1 /* Read coff symbol tables and convert to internal format, for GDB.
2    Copyright 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
3    1997, 1998, 1999, 2000, 2001, 2002, 2003
4    Free Software Foundation, Inc.
5    Contributed by David D. Johnson, Brown University (ddj@cs.brown.edu).
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., 59 Temple Place - Suite 330,
22    Boston, MA 02111-1307, USA.  */
23
24 #include "defs.h"
25 #include "symtab.h"
26 #include "gdbtypes.h"
27 #include "demangle.h"
28 #include "breakpoint.h"
29
30 #include "bfd.h"
31 #include "gdb_obstack.h"
32
33 #include "gdb_string.h"
34 #include <ctype.h>
35
36 #include "coff/internal.h"      /* Internal format of COFF symbols in BFD */
37 #include "libcoff.h"            /* FIXME secret internal data from BFD */
38
39 #include "symfile.h"
40 #include "objfiles.h"
41 #include "buildsym.h"
42 #include "gdb-stabs.h"
43 #include "stabsread.h"
44 #include "complaints.h"
45 #include "target.h"
46 #include "gdb_assert.h"
47 #include "block.h"
48
49 #include "coff-pe-read.h"
50
51 extern void _initialize_coffread (void);
52
53 struct coff_symfile_info
54   {
55     file_ptr min_lineno_offset; /* Where in file lowest line#s are */
56     file_ptr max_lineno_offset; /* 1+last byte of line#s in file */
57
58     CORE_ADDR textaddr;         /* Addr of .text section. */
59     unsigned int textsize;      /* Size of .text section. */
60     struct stab_section_list *stabsects;        /* .stab sections.  */
61     asection *stabstrsect;      /* Section pointer for .stab section */
62     char *stabstrdata;
63   };
64
65 /* Translate an external name string into a user-visible name.  */
66 #define EXTERNAL_NAME(string, abfd) \
67         (string[0] == bfd_get_symbol_leading_char(abfd)? string+1: string)
68
69 /* To be an sdb debug type, type must have at least a basic or primary
70    derived type.  Using this rather than checking against T_NULL is
71    said to prevent core dumps if we try to operate on Michael Bloom
72    dbx-in-coff file.  */
73
74 #define SDB_TYPE(type) (BTYPE(type) | (type & N_TMASK))
75
76 /* Core address of start and end of text of current source file.
77    This comes from a ".text" symbol where x_nlinno > 0.  */
78
79 static CORE_ADDR current_source_start_addr;
80 static CORE_ADDR current_source_end_addr;
81
82 /* The addresses of the symbol table stream and number of symbols
83    of the object file we are reading (as copied into core).  */
84
85 static bfd *nlist_bfd_global;
86 static int nlist_nsyms_global;
87
88
89 /* Pointers to scratch storage, used for reading raw symbols and auxents.  */
90
91 static char *temp_sym;
92 static char *temp_aux;
93
94 /* Local variables that hold the shift and mask values for the
95    COFF file that we are currently reading.  These come back to us
96    from BFD, and are referenced by their macro names, as well as
97    internally to the BTYPE, ISPTR, ISFCN, ISARY, ISTAG, and DECREF
98    macros from include/coff/internal.h .  */
99
100 static unsigned local_n_btmask;
101 static unsigned local_n_btshft;
102 static unsigned local_n_tmask;
103 static unsigned local_n_tshift;
104
105 #define N_BTMASK        local_n_btmask
106 #define N_BTSHFT        local_n_btshft
107 #define N_TMASK         local_n_tmask
108 #define N_TSHIFT        local_n_tshift
109
110 /* Local variables that hold the sizes in the file of various COFF structures.
111    (We only need to know this to read them from the file -- BFD will then
112    translate the data in them, into `internal_xxx' structs in the right
113    byte order, alignment, etc.)  */
114
115 static unsigned local_linesz;
116 static unsigned local_symesz;
117 static unsigned local_auxesz;
118
119 /* This is set if this is a PE format file.  */
120
121 static int pe_file;
122
123 /* Chain of typedefs of pointers to empty struct/union types.
124    They are chained thru the SYMBOL_VALUE_CHAIN.  */
125
126 static struct symbol *opaque_type_chain[HASHSIZE];
127
128 /* Simplified internal version of coff symbol table information */
129
130 struct coff_symbol
131   {
132     char *c_name;
133     int c_symnum;               /* symbol number of this entry */
134     int c_naux;                 /* 0 if syment only, 1 if syment + auxent, etc */
135     long c_value;
136     int c_sclass;
137     int c_secnum;
138     unsigned int c_type;
139   };
140
141 extern void stabsread_clear_cache (void);
142
143 static struct type *coff_read_struct_type (int, int, int);
144
145 static struct type *decode_base_type (struct coff_symbol *,
146                                       unsigned int, union internal_auxent *);
147
148 static struct type *decode_type (struct coff_symbol *, unsigned int,
149                                  union internal_auxent *);
150
151 static struct type *decode_function_type (struct coff_symbol *,
152                                           unsigned int,
153                                           union internal_auxent *);
154
155 static struct type *coff_read_enum_type (int, int, int);
156
157 static struct symbol *process_coff_symbol (struct coff_symbol *,
158                                            union internal_auxent *,
159                                            struct objfile *);
160
161 static void patch_opaque_types (struct symtab *);
162
163 static void enter_linenos (long, int, int, struct objfile *);
164
165 static void free_linetab (void);
166
167 static void free_linetab_cleanup (void *ignore);
168
169 static int init_lineno (bfd *, long, int);
170
171 static char *getsymname (struct internal_syment *);
172
173 static char *coff_getfilename (union internal_auxent *);
174
175 static void free_stringtab (void);
176
177 static void free_stringtab_cleanup (void *ignore);
178
179 static int init_stringtab (bfd *, long);
180
181 static void read_one_sym (struct coff_symbol *,
182                           struct internal_syment *, union internal_auxent *);
183
184 static void coff_symtab_read (long, unsigned int, struct objfile *);
185 \f
186 /* We are called once per section from coff_symfile_read.  We
187    need to examine each section we are passed, check to see
188    if it is something we are interested in processing, and
189    if so, stash away some access information for the section.
190
191    FIXME: The section names should not be hardwired strings (what
192    should they be?  I don't think most object file formats have enough
193    section flags to specify what kind of debug section it is
194    -kingdon).  */
195
196 static void
197 coff_locate_sections (bfd *abfd, asection *sectp, void *csip)
198 {
199   register struct coff_symfile_info *csi;
200   const char *name;
201
202   csi = (struct coff_symfile_info *) csip;
203   name = bfd_get_section_name (abfd, sectp);
204   if (STREQ (name, ".text"))
205     {
206       csi->textaddr = bfd_section_vma (abfd, sectp);
207       csi->textsize += bfd_section_size (abfd, sectp);
208     }
209   else if (strncmp (name, ".text", sizeof ".text" - 1) == 0)
210     {
211       csi->textsize += bfd_section_size (abfd, sectp);
212     }
213   else if (STREQ (name, ".stabstr"))
214     {
215       csi->stabstrsect = sectp;
216     }
217   else if (strncmp (name, ".stab", sizeof ".stab" - 1) == 0)
218     {
219       const char *s;
220
221       /* We can have multiple .stab sections if linked with
222          --split-by-reloc.  */
223       for (s = name + sizeof ".stab" - 1; *s != '\0'; s++)
224         if (!isdigit (*s))
225           break;
226       if (*s == '\0')
227         {
228           struct stab_section_list *n, **pn;
229
230           n = ((struct stab_section_list *)
231                xmalloc (sizeof (struct stab_section_list)));
232           n->section = sectp;
233           n->next = NULL;
234           for (pn = &csi->stabsects; *pn != NULL; pn = &(*pn)->next)
235             ;
236           *pn = n;
237
238           /* This will be run after coffstab_build_psymtabs is called
239              in coff_symfile_read, at which point we no longer need
240              the information.  */
241           make_cleanup (xfree, n);
242         }
243     }
244 }
245
246 /* Return the section_offsets* that CS points to.  */
247 static int cs_to_section (struct coff_symbol *, struct objfile *);
248
249 struct find_targ_sec_arg
250   {
251     int targ_index;
252     asection **resultp;
253   };
254
255 static void
256 find_targ_sec (bfd *abfd, asection *sect, void *obj)
257 {
258   struct find_targ_sec_arg *args = (struct find_targ_sec_arg *) obj;
259   if (sect->target_index == args->targ_index)
260     *args->resultp = sect;
261 }
262
263 /* Return the section number (SECT_OFF_*) that CS points to.  */
264 static int
265 cs_to_section (struct coff_symbol *cs, struct objfile *objfile)
266 {
267   asection *sect = NULL;
268   struct find_targ_sec_arg args;
269   int off = SECT_OFF_TEXT (objfile);
270
271   args.targ_index = cs->c_secnum;
272   args.resultp = &sect;
273   bfd_map_over_sections (objfile->obfd, find_targ_sec, &args);
274   if (sect != NULL)
275     {
276       /* This is the section.  Figure out what SECT_OFF_* code it is.  */
277       if (bfd_get_section_flags (abfd, sect) & SEC_CODE)
278         off = SECT_OFF_TEXT (objfile);
279       else if (bfd_get_section_flags (abfd, sect) & SEC_LOAD)
280         off = SECT_OFF_DATA (objfile);
281       else
282         /* Just return the bfd section index. */
283         off = sect->index;
284     }
285   return off;
286 }
287
288 /* Return the address of the section of a COFF symbol.  */
289
290 static CORE_ADDR cs_section_address (struct coff_symbol *, bfd *);
291
292 static CORE_ADDR
293 cs_section_address (struct coff_symbol *cs, bfd *abfd)
294 {
295   asection *sect = NULL;
296   struct find_targ_sec_arg args;
297   CORE_ADDR addr = 0;
298
299   args.targ_index = cs->c_secnum;
300   args.resultp = &sect;
301   bfd_map_over_sections (abfd, find_targ_sec, &args);
302   if (sect != NULL)
303     addr = bfd_get_section_vma (objfile->obfd, sect);
304   return addr;
305 }
306
307 /* Look up a coff type-number index.  Return the address of the slot
308    where the type for that index is stored.
309    The type-number is in INDEX. 
310
311    This can be used for finding the type associated with that index
312    or for associating a new type with the index.  */
313
314 static struct type **
315 coff_lookup_type (register int index)
316 {
317   if (index >= type_vector_length)
318     {
319       int old_vector_length = type_vector_length;
320
321       type_vector_length *= 2;
322       if (index /* is still */  >= type_vector_length)
323         type_vector_length = index * 2;
324
325       type_vector = (struct type **)
326         xrealloc ((char *) type_vector,
327                   type_vector_length * sizeof (struct type *));
328       memset (&type_vector[old_vector_length], 0,
329          (type_vector_length - old_vector_length) * sizeof (struct type *));
330     }
331   return &type_vector[index];
332 }
333
334 /* Make sure there is a type allocated for type number index
335    and return the type object.
336    This can create an empty (zeroed) type object.  */
337
338 static struct type *
339 coff_alloc_type (int index)
340 {
341   register struct type **type_addr = coff_lookup_type (index);
342   register struct type *type = *type_addr;
343
344   /* If we are referring to a type not known at all yet,
345      allocate an empty type for it.
346      We will fill it in later if we find out how.  */
347   if (type == NULL)
348     {
349       type = alloc_type (current_objfile);
350       *type_addr = type;
351     }
352   return type;
353 }
354 \f
355 /* Start a new symtab for a new source file.
356    This is called when a COFF ".file" symbol is seen;
357    it indicates the start of data for one original source file.  */
358
359 static void
360 coff_start_symtab (char *name)
361 {
362   start_symtab (
363   /* We fill in the filename later.  start_symtab puts
364      this pointer into last_source_file and we put it in
365      subfiles->name, which end_symtab frees; that's why
366      it must be malloc'd.  */
367                  savestring (name, strlen (name)),
368   /* We never know the directory name for COFF.  */
369                  NULL,
370   /* The start address is irrelevant, since we set
371      last_source_start_addr in coff_end_symtab.  */
372                  0);
373   record_debugformat ("COFF");
374 }
375
376 /* Save the vital information from when starting to read a file,
377    for use when closing off the current file.
378    NAME is the file name the symbols came from, START_ADDR is the first
379    text address for the file, and SIZE is the number of bytes of text.  */
380
381 static void
382 complete_symtab (char *name, CORE_ADDR start_addr, unsigned int size)
383 {
384   if (last_source_file != NULL)
385     xfree (last_source_file);
386   last_source_file = savestring (name, strlen (name));
387   current_source_start_addr = start_addr;
388   current_source_end_addr = start_addr + size;
389
390   if (current_objfile->ei.entry_point >= current_source_start_addr &&
391       current_objfile->ei.entry_point < current_source_end_addr)
392     {
393       current_objfile->ei.entry_file_lowpc = current_source_start_addr;
394       current_objfile->ei.entry_file_highpc = current_source_end_addr;
395     }
396 }
397
398 /* Finish the symbol definitions for one main source file,
399    close off all the lexical contexts for that file
400    (creating struct block's for them), then make the
401    struct symtab for that file and put it in the list of all such. */
402
403 static void
404 coff_end_symtab (struct objfile *objfile)
405 {
406   struct symtab *symtab;
407
408   last_source_start_addr = current_source_start_addr;
409
410   symtab = end_symtab (current_source_end_addr, objfile, SECT_OFF_TEXT (objfile));
411
412   if (symtab != NULL)
413     free_named_symtabs (symtab->filename);
414
415   /* Reinitialize for beginning of new file. */
416   last_source_file = NULL;
417 }
418 \f
419 static void
420 record_minimal_symbol (char *name, CORE_ADDR address,
421                        enum minimal_symbol_type type, struct objfile *objfile)
422 {
423   /* We don't want TDESC entry points in the minimal symbol table */
424   if (name[0] == '@')
425     return;
426
427   prim_record_minimal_symbol (name, address, type, objfile);
428 }
429 \f
430 /* coff_symfile_init ()
431    is the coff-specific initialization routine for reading symbols.
432    It is passed a struct objfile which contains, among other things,
433    the BFD for the file whose symbols are being read, and a slot for
434    a pointer to "private data" which we fill with cookies and other
435    treats for coff_symfile_read ().
436
437    We will only be called if this is a COFF or COFF-like file.
438    BFD handles figuring out the format of the file, and code in symtab.c
439    uses BFD's determination to vector to us.
440
441    The ultimate result is a new symtab (or, FIXME, eventually a psymtab).  */
442
443 static void
444 coff_symfile_init (struct objfile *objfile)
445 {
446   /* Allocate struct to keep track of stab reading. */
447   objfile->sym_stab_info = (struct dbx_symfile_info *)
448     xmmalloc (objfile->md, sizeof (struct dbx_symfile_info));
449
450   memset (objfile->sym_stab_info, 0,
451           sizeof (struct dbx_symfile_info));
452
453   /* Allocate struct to keep track of the symfile */
454   objfile->sym_private = xmmalloc (objfile->md,
455                                    sizeof (struct coff_symfile_info));
456
457   memset (objfile->sym_private, 0, sizeof (struct coff_symfile_info));
458
459   /* COFF objects may be reordered, so set OBJF_REORDERED.  If we
460      find this causes a significant slowdown in gdb then we could
461      set it in the debug symbol readers only when necessary.  */
462   objfile->flags |= OBJF_REORDERED;
463
464   init_entry_point_info (objfile);
465 }
466
467 /* This function is called for every section; it finds the outer limits
468    of the line table (minimum and maximum file offset) so that the
469    mainline code can read the whole thing for efficiency.  */
470
471 /* ARGSUSED */
472 static void
473 find_linenos (bfd *abfd, sec_ptr asect, void *vpinfo)
474 {
475   struct coff_symfile_info *info;
476   int size, count;
477   file_ptr offset, maxoff;
478
479 /* WARNING WILL ROBINSON!  ACCESSING BFD-PRIVATE DATA HERE!  FIXME!  */
480   count = asect->lineno_count;
481 /* End of warning */
482
483   if (count == 0)
484     return;
485   size = count * local_linesz;
486
487   info = (struct coff_symfile_info *) vpinfo;
488 /* WARNING WILL ROBINSON!  ACCESSING BFD-PRIVATE DATA HERE!  FIXME!  */
489   offset = asect->line_filepos;
490 /* End of warning */
491
492   if (offset < info->min_lineno_offset || info->min_lineno_offset == 0)
493     info->min_lineno_offset = offset;
494
495   maxoff = offset + size;
496   if (maxoff > info->max_lineno_offset)
497     info->max_lineno_offset = maxoff;
498 }
499
500
501 /* The BFD for this file -- only good while we're actively reading
502    symbols into a psymtab or a symtab.  */
503
504 static bfd *symfile_bfd;
505
506 /* Read a symbol file, after initialization by coff_symfile_init.  */
507
508 /* ARGSUSED */
509 static void
510 coff_symfile_read (struct objfile *objfile, int mainline)
511 {
512   struct coff_symfile_info *info;
513   struct dbx_symfile_info *dbxinfo;
514   bfd *abfd = objfile->obfd;
515   coff_data_type *cdata = coff_data (abfd);
516   char *name = bfd_get_filename (abfd);
517   register int val;
518   unsigned int num_symbols;
519   int symtab_offset;
520   int stringtab_offset;
521   struct cleanup *back_to;
522   int stabstrsize;
523   int len;
524   char * target;
525   
526   info = (struct coff_symfile_info *) objfile->sym_private;
527   dbxinfo = objfile->sym_stab_info;
528   symfile_bfd = abfd;           /* Kludge for swap routines */
529
530 /* WARNING WILL ROBINSON!  ACCESSING BFD-PRIVATE DATA HERE!  FIXME!  */
531   num_symbols = bfd_get_symcount (abfd);        /* How many syms */
532   symtab_offset = cdata->sym_filepos;   /* Symbol table file offset */
533   stringtab_offset = symtab_offset +    /* String table file offset */
534     num_symbols * cdata->local_symesz;
535
536   /* Set a few file-statics that give us specific information about
537      the particular COFF file format we're reading.  */
538   local_n_btmask = cdata->local_n_btmask;
539   local_n_btshft = cdata->local_n_btshft;
540   local_n_tmask = cdata->local_n_tmask;
541   local_n_tshift = cdata->local_n_tshift;
542   local_linesz = cdata->local_linesz;
543   local_symesz = cdata->local_symesz;
544   local_auxesz = cdata->local_auxesz;
545
546   /* Allocate space for raw symbol and aux entries, based on their
547      space requirements as reported by BFD.  */
548   temp_sym = (char *) xmalloc
549     (cdata->local_symesz + cdata->local_auxesz);
550   temp_aux = temp_sym + cdata->local_symesz;
551   back_to = make_cleanup (free_current_contents, &temp_sym);
552
553   /* We need to know whether this is a PE file, because in PE files,
554      unlike standard COFF files, symbol values are stored as offsets
555      from the section address, rather than as absolute addresses.
556      FIXME: We should use BFD to read the symbol table, and thus avoid
557      this problem.  */
558   pe_file =
559     strncmp (bfd_get_target (objfile->obfd), "pe", 2) == 0
560     || strncmp (bfd_get_target (objfile->obfd), "epoc-pe", 7) == 0;
561
562 /* End of warning */
563
564   info->min_lineno_offset = 0;
565   info->max_lineno_offset = 0;
566
567   /* Only read line number information if we have symbols.
568
569      On Windows NT, some of the system's DLL's have sections with
570      PointerToLinenumbers fields that are non-zero, but point at
571      random places within the image file.  (In the case I found,
572      KERNEL32.DLL's .text section has a line number info pointer that
573      points into the middle of the string `lib\\i386\kernel32.dll'.)
574
575      However, these DLL's also have no symbols.  The line number
576      tables are meaningless without symbols.  And in fact, GDB never
577      uses the line number information unless there are symbols.  So we
578      can avoid spurious error messages (and maybe run a little
579      faster!) by not even reading the line number table unless we have
580      symbols.  */
581   if (num_symbols > 0)
582     {
583       /* Read the line number table, all at once.  */
584       bfd_map_over_sections (abfd, find_linenos, (void *) info);
585
586       make_cleanup (free_linetab_cleanup, 0 /*ignore*/);
587       val = init_lineno (abfd, info->min_lineno_offset,
588                          info->max_lineno_offset - info->min_lineno_offset);
589       if (val < 0)
590         error ("\"%s\": error reading line numbers\n", name);
591     }
592
593   /* Now read the string table, all at once.  */
594
595   make_cleanup (free_stringtab_cleanup, 0 /*ignore*/);
596   val = init_stringtab (abfd, stringtab_offset);
597   if (val < 0)
598     error ("\"%s\": can't get string table", name);
599
600   init_minimal_symbol_collection ();
601   make_cleanup_discard_minimal_symbols ();
602
603   /* Now that the executable file is positioned at symbol table,
604      process it and define symbols accordingly.  */
605
606   coff_symtab_read ((long) symtab_offset, num_symbols, objfile);
607
608   /* Sort symbols alphabetically within each block.  */
609
610   {
611     struct symtab *s;
612
613     for (s = objfile->symtabs; s != NULL; s = s->next)
614       sort_symtab_syms (s);
615   }
616
617   /* Install any minimal symbols that have been collected as the current
618      minimal symbols for this objfile.  */
619
620   install_minimal_symbols (objfile);
621
622   bfd_map_over_sections (abfd, coff_locate_sections, (void *) info);
623
624   if (info->stabsects)
625     {
626       if (!info->stabstrsect)
627         {
628           error (("The debugging information in `%s' is corrupted.\n"
629                   "The file has a `.stabs' section, but no `.stabstr' "
630                   "section."),
631                  name);
632         }
633
634       /* FIXME: dubious.  Why can't we use something normal like
635          bfd_get_section_contents?  */
636       bfd_seek (abfd, abfd->where, 0);
637
638       stabstrsize = bfd_section_size (abfd, info->stabstrsect);
639
640       coffstab_build_psymtabs (objfile,
641                                mainline,
642                                info->textaddr, info->textsize,
643                                info->stabsects,
644                                info->stabstrsect->filepos, stabstrsize);
645     }
646   if (dwarf2_has_info (abfd))
647     {
648       /* DWARF2 sections.  */
649       dwarf2_build_psymtabs (objfile, mainline);
650     }
651
652   do_cleanups (back_to);
653 }
654
655 static void
656 coff_new_init (struct objfile *ignore)
657 {
658 }
659
660 /* Perform any local cleanups required when we are done with a particular
661    objfile.  I.E, we are in the process of discarding all symbol information
662    for an objfile, freeing up all memory held for it, and unlinking the
663    objfile struct from the global list of known objfiles. */
664
665 static void
666 coff_symfile_finish (struct objfile *objfile)
667 {
668   if (objfile->sym_private != NULL)
669     {
670       xmfree (objfile->md, objfile->sym_private);
671     }
672
673   /* Let stabs reader clean up */
674   stabsread_clear_cache ();
675 }
676 \f
677
678 /* Given pointers to a symbol table in coff style exec file,
679    analyze them and create struct symtab's describing the symbols.
680    NSYMS is the number of symbols in the symbol table.
681    We read them one at a time using read_one_sym ().  */
682
683 static void
684 coff_symtab_read (long symtab_offset, unsigned int nsyms,
685                   struct objfile *objfile)
686 {
687   register struct context_stack *new;
688   struct coff_symbol coff_symbol;
689   register struct coff_symbol *cs = &coff_symbol;
690   static struct internal_syment main_sym;
691   static union internal_auxent main_aux;
692   struct coff_symbol fcn_cs_saved;
693   static struct internal_syment fcn_sym_saved;
694   static union internal_auxent fcn_aux_saved;
695   struct symtab *s;
696   /* A .file is open.  */
697   int in_source_file = 0;
698   int next_file_symnum = -1;
699   /* Name of the current file.  */
700   char *filestring = "";
701   int depth = 0;
702   int fcn_first_line = 0;
703   CORE_ADDR fcn_first_line_addr = 0;
704   int fcn_last_line = 0;
705   int fcn_start_addr = 0;
706   long fcn_line_ptr = 0;
707   int val;
708   CORE_ADDR tmpaddr;
709
710   /* Work around a stdio bug in SunOS4.1.1 (this makes me nervous....
711      it's hard to know I've really worked around it.  The fix should be
712      harmless, anyway).  The symptom of the bug is that the first
713      fread (in read_one_sym), will (in my example) actually get data
714      from file offset 268, when the fseek was to 264 (and ftell shows
715      264).  This causes all hell to break loose.  I was unable to
716      reproduce this on a short test program which operated on the same
717      file, performing (I think) the same sequence of operations.
718
719      It stopped happening when I put in this (former) rewind().
720
721      FIXME: Find out if this has been reported to Sun, whether it has
722      been fixed in a later release, etc.  */
723
724   bfd_seek (objfile->obfd, 0, 0);
725
726   /* Position to read the symbol table. */
727   val = bfd_seek (objfile->obfd, (long) symtab_offset, 0);
728   if (val < 0)
729     perror_with_name (objfile->name);
730
731   current_objfile = objfile;
732   nlist_bfd_global = objfile->obfd;
733   nlist_nsyms_global = nsyms;
734   last_source_file = NULL;
735   memset (opaque_type_chain, 0, sizeof opaque_type_chain);
736
737   if (type_vector)              /* Get rid of previous one */
738     xfree (type_vector);
739   type_vector_length = 160;
740   type_vector = (struct type **)
741     xmalloc (type_vector_length * sizeof (struct type *));
742   memset (type_vector, 0, type_vector_length * sizeof (struct type *));
743
744   coff_start_symtab ("");
745
746   symnum = 0;
747   while (symnum < nsyms)
748     {
749       QUIT;                     /* Make this command interruptable.  */
750
751       read_one_sym (cs, &main_sym, &main_aux);
752
753       if (cs->c_symnum == next_file_symnum && cs->c_sclass != C_FILE)
754         {
755           if (last_source_file)
756             coff_end_symtab (objfile);
757
758           coff_start_symtab ("_globals_");
759           complete_symtab ("_globals_", 0, 0);
760           /* done with all files, everything from here on out is globals */
761         }
762
763       /* Special case for file with type declarations only, no text.  */
764       if (!last_source_file && SDB_TYPE (cs->c_type)
765           && cs->c_secnum == N_DEBUG)
766         complete_symtab (filestring, 0, 0);
767
768       /* Typedefs should not be treated as symbol definitions.  */
769       if (ISFCN (cs->c_type) && cs->c_sclass != C_TPDEF)
770         {
771           /* Record all functions -- external and static -- in minsyms. */
772           tmpaddr = cs->c_value + ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
773           record_minimal_symbol (cs->c_name, tmpaddr, mst_text, objfile);
774
775           fcn_line_ptr = main_aux.x_sym.x_fcnary.x_fcn.x_lnnoptr;
776           fcn_start_addr = tmpaddr;
777           fcn_cs_saved = *cs;
778           fcn_sym_saved = main_sym;
779           fcn_aux_saved = main_aux;
780           continue;
781         }
782
783       switch (cs->c_sclass)
784         {
785         case C_EFCN:
786         case C_EXTDEF:
787         case C_ULABEL:
788         case C_USTATIC:
789         case C_LINE:
790         case C_ALIAS:
791         case C_HIDDEN:
792           complaint (&symfile_complaints, "Bad n_sclass for symbol %s",
793                      cs->c_name);
794           break;
795
796         case C_FILE:
797           /* c_value field contains symnum of next .file entry in table
798              or symnum of first global after last .file.  */
799           next_file_symnum = cs->c_value;
800           if (cs->c_naux > 0)
801             filestring = coff_getfilename (&main_aux);
802           else
803             filestring = "";
804
805           /* Complete symbol table for last object file
806              containing debugging information.  */
807           if (last_source_file)
808             {
809               coff_end_symtab (objfile);
810               coff_start_symtab (filestring);
811             }
812           in_source_file = 1;
813           break;
814
815           /* C_LABEL is used for labels and static functions.  Including
816              it here allows gdb to see static functions when no debug
817              info is available.  */
818         case C_LABEL:
819           /* However, labels within a function can make weird backtraces,
820              so filter them out (from phdm@macqel.be). */
821           if (within_function)
822             break;
823         case C_STAT:
824         case C_THUMBLABEL:
825         case C_THUMBSTAT:
826         case C_THUMBSTATFUNC:
827           if (cs->c_name[0] == '.')
828             {
829               if (STREQ (cs->c_name, ".text"))
830                 {
831                   /* FIXME:  don't wire in ".text" as section name
832                      or symbol name! */
833                   /* Check for in_source_file deals with case of
834                      a file with debugging symbols
835                      followed by a later file with no symbols.  */
836                   if (in_source_file)
837                     complete_symtab (filestring,
838                     cs->c_value + ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)),
839                                      main_aux.x_scn.x_scnlen);
840                   in_source_file = 0;
841                 }
842               /* flush rest of '.' symbols */
843               break;
844             }
845           else if (!SDB_TYPE (cs->c_type)
846                    && cs->c_name[0] == 'L'
847                    && (strncmp (cs->c_name, "LI%", 3) == 0
848                        || strncmp (cs->c_name, "LF%", 3) == 0
849                        || strncmp (cs->c_name, "LC%", 3) == 0
850                        || strncmp (cs->c_name, "LP%", 3) == 0
851                        || strncmp (cs->c_name, "LPB%", 4) == 0
852                        || strncmp (cs->c_name, "LBB%", 4) == 0
853                        || strncmp (cs->c_name, "LBE%", 4) == 0
854                        || strncmp (cs->c_name, "LPBX%", 5) == 0))
855             /* At least on a 3b1, gcc generates swbeg and string labels
856                that look like this.  Ignore them.  */
857             break;
858           /* fall in for static symbols that don't start with '.' */
859         case C_THUMBEXT:
860         case C_THUMBEXTFUNC:
861         case C_EXT:
862           {
863             /* Record it in the minimal symbols regardless of
864                SDB_TYPE.  This parallels what we do for other debug
865                formats, and probably is needed to make
866                print_address_symbolic work right without the (now
867                gone) "set fast-symbolic-addr off" kludge.  */
868
869             /* FIXME: should use mst_abs, and not relocate, if absolute.  */
870             enum minimal_symbol_type ms_type;
871             int sec;
872
873             if (cs->c_secnum == N_UNDEF)
874               {
875                 /* This is a common symbol.  See if the target
876                    environment knows where it has been relocated to.  */
877                 CORE_ADDR reladdr;
878                 if (target_lookup_symbol (cs->c_name, &reladdr))
879                   {
880                     /* Error in lookup; ignore symbol.  */
881                     break;
882                   }
883                 tmpaddr = reladdr;
884                 /* The address has already been relocated; make sure that
885                    objfile_relocate doesn't relocate it again.  */
886                 sec = -2;
887                 ms_type = cs->c_sclass == C_EXT
888                   || cs->c_sclass == C_THUMBEXT ?
889                   mst_bss : mst_file_bss;
890               }
891             else
892               {
893                 sec = cs_to_section (cs, objfile);
894                 tmpaddr = cs->c_value;
895                 if (cs->c_sclass == C_EXT || cs->c_sclass == C_THUMBEXTFUNC
896                     || cs->c_sclass == C_THUMBEXT)
897                   tmpaddr += ANOFFSET (objfile->section_offsets, sec);
898
899                 if (sec == SECT_OFF_TEXT (objfile))
900                   {
901                     ms_type =
902                       cs->c_sclass == C_EXT || cs->c_sclass == C_THUMBEXTFUNC
903                       || cs->c_sclass == C_THUMBEXT ?
904                       mst_text : mst_file_text;
905                     tmpaddr = SMASH_TEXT_ADDRESS (tmpaddr);
906                   }
907                 else if (sec == SECT_OFF_DATA (objfile))
908                   {
909                     ms_type =
910                       cs->c_sclass == C_EXT || cs->c_sclass == C_THUMBEXT ?
911                       mst_data : mst_file_data;
912                   }
913                 else if (sec == SECT_OFF_BSS (objfile))
914                   {
915                     ms_type =
916                       cs->c_sclass == C_EXT || cs->c_sclass == C_THUMBEXT ?
917                       mst_data : mst_file_data;
918                   }
919                 else
920                   ms_type = mst_unknown;
921               }
922
923             if (cs->c_name[0] != '@' /* Skip tdesc symbols */ )
924               {
925                 struct minimal_symbol *msym;
926
927                 /* FIXME: cagney/2001-02-01: The nasty (int) -> (long)
928                    -> (void*) cast is to ensure that that the value of
929                    cs->c_sclass can be correctly stored in a void
930                    pointer in MSYMBOL_INFO.  Better solutions
931                    welcome. */
932                 gdb_assert (sizeof (void *) >= sizeof (cs->c_sclass));
933                 msym = prim_record_minimal_symbol_and_info
934                   (cs->c_name, tmpaddr, ms_type, (void *) (long) cs->c_sclass,
935                    sec, NULL, objfile);
936                 if (msym)
937                   COFF_MAKE_MSYMBOL_SPECIAL (cs->c_sclass, msym);
938               }
939             if (SDB_TYPE (cs->c_type))
940               {
941                 struct symbol *sym;
942                 sym = process_coff_symbol
943                   (cs, &main_aux, objfile);
944                 SYMBOL_VALUE (sym) = tmpaddr;
945                 SYMBOL_SECTION (sym) = sec;
946               }
947           }
948           break;
949
950         case C_FCN:
951           if (STREQ (cs->c_name, ".bf"))
952             {
953               within_function = 1;
954
955               /* value contains address of first non-init type code */
956               /* main_aux.x_sym.x_misc.x_lnsz.x_lnno
957                  contains line number of '{' } */
958               if (cs->c_naux != 1)
959                 complaint (&symfile_complaints,
960                            "`.bf' symbol %d has no aux entry", cs->c_symnum);
961               fcn_first_line = main_aux.x_sym.x_misc.x_lnsz.x_lnno;
962               fcn_first_line_addr = cs->c_value;
963
964               /* Might want to check that locals are 0 and
965                  context_stack_depth is zero, and complain if not.  */
966
967               depth = 0;
968               new = push_context (depth, fcn_start_addr);
969               fcn_cs_saved.c_name = getsymname (&fcn_sym_saved);
970               new->name =
971                 process_coff_symbol (&fcn_cs_saved, &fcn_aux_saved, objfile);
972             }
973           else if (STREQ (cs->c_name, ".ef"))
974             {
975               if (!within_function)
976                 error ("Bad coff function information\n");
977               /* the value of .ef is the address of epilogue code;
978                  not useful for gdb.  */
979               /* { main_aux.x_sym.x_misc.x_lnsz.x_lnno
980                  contains number of lines to '}' */
981
982               if (context_stack_depth <= 0)
983                 {               /* We attempted to pop an empty context stack */
984                   complaint (&symfile_complaints,
985                              "`.ef' symbol without matching `.bf' symbol ignored starting at symnum %d",
986                              cs->c_symnum);
987                   within_function = 0;
988                   break;
989                 }
990
991               new = pop_context ();
992               /* Stack must be empty now.  */
993               if (context_stack_depth > 0 || new == NULL)
994                 {
995                   complaint (&symfile_complaints,
996                              "Unmatched .ef symbol(s) ignored starting at symnum %d",
997                              cs->c_symnum);
998                   within_function = 0;
999                   break;
1000                 }
1001               if (cs->c_naux != 1)
1002                 {
1003                   complaint (&symfile_complaints,
1004                              "`.ef' symbol %d has no aux entry", cs->c_symnum);
1005                   fcn_last_line = 0x7FFFFFFF;
1006                 }
1007               else
1008                 {
1009                   fcn_last_line = main_aux.x_sym.x_misc.x_lnsz.x_lnno;
1010                 }
1011               /* fcn_first_line is the line number of the opening '{'.
1012                  Do not record it - because it would affect gdb's idea
1013                  of the line number of the first statement of the function -
1014                  except for one-line functions, for which it is also the line
1015                  number of all the statements and of the closing '}', and
1016                  for which we do not have any other statement-line-number. */
1017               if (fcn_last_line == 1)
1018                 record_line (current_subfile, fcn_first_line,
1019                              fcn_first_line_addr);
1020               else
1021                 enter_linenos (fcn_line_ptr, fcn_first_line, fcn_last_line,
1022                                objfile);
1023
1024               finish_block (new->name, &local_symbols, new->old_blocks,
1025                             new->start_addr,
1026 #if defined (FUNCTION_EPILOGUE_SIZE)
1027               /* This macro should be defined only on
1028                  machines where the
1029                  fcn_aux_saved.x_sym.x_misc.x_fsize
1030                  field is always zero.
1031                  So use the .bf record information that
1032                  points to the epilogue and add the size
1033                  of the epilogue.  */
1034                             cs->c_value
1035                             + FUNCTION_EPILOGUE_SIZE
1036                             + ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)),
1037 #else
1038                             fcn_cs_saved.c_value
1039                             + fcn_aux_saved.x_sym.x_misc.x_fsize
1040                             + ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)),
1041 #endif
1042                             objfile
1043                 );
1044               within_function = 0;
1045             }
1046           break;
1047
1048         case C_BLOCK:
1049           if (STREQ (cs->c_name, ".bb"))
1050             {
1051               tmpaddr = cs->c_value;
1052               tmpaddr += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
1053               push_context (++depth, tmpaddr);
1054             }
1055           else if (STREQ (cs->c_name, ".eb"))
1056             {
1057               if (context_stack_depth <= 0)
1058                 {               /* We attempted to pop an empty context stack */
1059                   complaint (&symfile_complaints,
1060                              "`.eb' symbol without matching `.bb' symbol ignored starting at symnum %d",
1061                              cs->c_symnum);
1062                   break;
1063                 }
1064
1065               new = pop_context ();
1066               if (depth-- != new->depth)
1067                 {
1068                   complaint (&symfile_complaints,
1069                              "Mismatched .eb symbol ignored starting at symnum %d",
1070                              symnum);
1071                   break;
1072                 }
1073               if (local_symbols && context_stack_depth > 0)
1074                 {
1075                   tmpaddr =
1076                     cs->c_value + ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
1077                   /* Make a block for the local symbols within.  */
1078                   finish_block (0, &local_symbols, new->old_blocks,
1079                                 new->start_addr, tmpaddr, objfile);
1080                 }
1081               /* Now pop locals of block just finished.  */
1082               local_symbols = new->locals;
1083             }
1084           break;
1085
1086         default:
1087           process_coff_symbol (cs, &main_aux, objfile);
1088           break;
1089         }
1090     }
1091
1092   if ((nsyms == 0) && (pe_file))
1093     {
1094       /* We've got no debugging symbols, but it's is a portable
1095          executable, so try to read the export table */
1096       read_pe_exported_syms (objfile);
1097     }
1098
1099   if (last_source_file)
1100     coff_end_symtab (objfile);
1101
1102   /* Patch up any opaque types (references to types that are not defined
1103      in the file where they are referenced, e.g. "struct foo *bar").  */
1104   ALL_OBJFILE_SYMTABS (objfile, s)
1105     patch_opaque_types (s);
1106
1107   current_objfile = NULL;
1108 }
1109 \f
1110 /* Routines for reading headers and symbols from executable.  */
1111
1112 /* Read the next symbol, swap it, and return it in both internal_syment
1113    form, and coff_symbol form.  Also return its first auxent, if any,
1114    in internal_auxent form, and skip any other auxents.  */
1115
1116 static void
1117 read_one_sym (register struct coff_symbol *cs,
1118               register struct internal_syment *sym,
1119               register union internal_auxent *aux)
1120 {
1121   int i;
1122
1123   cs->c_symnum = symnum;
1124   bfd_bread (temp_sym, local_symesz, nlist_bfd_global);
1125   bfd_coff_swap_sym_in (symfile_bfd, temp_sym, (char *) sym);
1126   cs->c_naux = sym->n_numaux & 0xff;
1127   if (cs->c_naux >= 1)
1128     {
1129       bfd_bread (temp_aux, local_auxesz, nlist_bfd_global);
1130       bfd_coff_swap_aux_in (symfile_bfd, temp_aux, sym->n_type, sym->n_sclass,
1131                             0, cs->c_naux, (char *) aux);
1132       /* If more than one aux entry, read past it (only the first aux
1133          is important). */
1134       for (i = 1; i < cs->c_naux; i++)
1135         bfd_bread (temp_aux, local_auxesz, nlist_bfd_global);
1136     }
1137   cs->c_name = getsymname (sym);
1138   cs->c_value = sym->n_value;
1139   cs->c_sclass = (sym->n_sclass & 0xff);
1140   cs->c_secnum = sym->n_scnum;
1141   cs->c_type = (unsigned) sym->n_type;
1142   if (!SDB_TYPE (cs->c_type))
1143     cs->c_type = 0;
1144
1145 #if 0
1146   if (cs->c_sclass & 128)
1147     printf ("thumb symbol %s, class 0x%x\n", cs->c_name, cs->c_sclass);
1148 #endif
1149
1150   symnum += 1 + cs->c_naux;
1151
1152   /* The PE file format stores symbol values as offsets within the
1153      section, rather than as absolute addresses.  We correct that
1154      here, if the symbol has an appropriate storage class.  FIXME: We
1155      should use BFD to read the symbols, rather than duplicating the
1156      work here.  */
1157   if (pe_file)
1158     {
1159       switch (cs->c_sclass)
1160         {
1161         case C_EXT:
1162         case C_THUMBEXT:
1163         case C_THUMBEXTFUNC:
1164         case C_SECTION:
1165         case C_NT_WEAK:
1166         case C_STAT:
1167         case C_THUMBSTAT:
1168         case C_THUMBSTATFUNC:
1169         case C_LABEL:
1170         case C_THUMBLABEL:
1171         case C_BLOCK:
1172         case C_FCN:
1173         case C_EFCN:
1174           if (cs->c_secnum != 0)
1175             cs->c_value += cs_section_address (cs, symfile_bfd);
1176           break;
1177         }
1178     }
1179 }
1180 \f
1181 /* Support for string table handling */
1182
1183 static char *stringtab = NULL;
1184
1185 static int
1186 init_stringtab (bfd *abfd, long offset)
1187 {
1188   long length;
1189   int val;
1190   unsigned char lengthbuf[4];
1191
1192   free_stringtab ();
1193
1194   /* If the file is stripped, the offset might be zero, indicating no
1195      string table.  Just return with `stringtab' set to null. */
1196   if (offset == 0)
1197     return 0;
1198
1199   if (bfd_seek (abfd, offset, 0) < 0)
1200     return -1;
1201
1202   val = bfd_bread ((char *) lengthbuf, sizeof lengthbuf, abfd);
1203   length = bfd_h_get_32 (symfile_bfd, lengthbuf);
1204
1205   /* If no string table is needed, then the file may end immediately
1206      after the symbols.  Just return with `stringtab' set to null. */
1207   if (val != sizeof lengthbuf || length < sizeof lengthbuf)
1208     return 0;
1209
1210   stringtab = (char *) xmalloc (length);
1211   /* This is in target format (probably not very useful, and not currently
1212      used), not host format.  */
1213   memcpy (stringtab, lengthbuf, sizeof lengthbuf);
1214   if (length == sizeof length)  /* Empty table -- just the count */
1215     return 0;
1216
1217   val = bfd_bread (stringtab + sizeof lengthbuf, length - sizeof lengthbuf,
1218                    abfd);
1219   if (val != length - sizeof lengthbuf || stringtab[length - 1] != '\0')
1220     return -1;
1221
1222   return 0;
1223 }
1224
1225 static void
1226 free_stringtab (void)
1227 {
1228   if (stringtab)
1229     xfree (stringtab);
1230   stringtab = NULL;
1231 }
1232
1233 static void
1234 free_stringtab_cleanup (void *ignore)
1235 {
1236   free_stringtab ();
1237 }
1238
1239 static char *
1240 getsymname (struct internal_syment *symbol_entry)
1241 {
1242   static char buffer[SYMNMLEN + 1];
1243   char *result;
1244
1245   if (symbol_entry->_n._n_n._n_zeroes == 0)
1246     {
1247       /* FIXME: Probably should be detecting corrupt symbol files by
1248          seeing whether offset points to within the stringtab.  */
1249       result = stringtab + symbol_entry->_n._n_n._n_offset;
1250     }
1251   else
1252     {
1253       strncpy (buffer, symbol_entry->_n._n_name, SYMNMLEN);
1254       buffer[SYMNMLEN] = '\0';
1255       result = buffer;
1256     }
1257   return result;
1258 }
1259
1260 /* Extract the file name from the aux entry of a C_FILE symbol.  Return
1261    only the last component of the name.  Result is in static storage and
1262    is only good for temporary use.  */
1263
1264 static char *
1265 coff_getfilename (union internal_auxent *aux_entry)
1266 {
1267   static char buffer[BUFSIZ];
1268   register char *temp;
1269   char *result;
1270
1271   if (aux_entry->x_file.x_n.x_zeroes == 0)
1272     strcpy (buffer, stringtab + aux_entry->x_file.x_n.x_offset);
1273   else
1274     {
1275       strncpy (buffer, aux_entry->x_file.x_fname, FILNMLEN);
1276       buffer[FILNMLEN] = '\0';
1277     }
1278   result = buffer;
1279
1280   /* FIXME: We should not be throwing away the information about what
1281      directory.  It should go into dirname of the symtab, or some such
1282      place.  */
1283   if ((temp = strrchr (result, '/')) != NULL)
1284     result = temp + 1;
1285   return (result);
1286 }
1287 \f
1288 /* Support for line number handling.  */
1289
1290 static char *linetab = NULL;
1291 static long linetab_offset;
1292 static unsigned long linetab_size;
1293
1294 /* Read in all the line numbers for fast lookups later.  Leave them in
1295    external (unswapped) format in memory; we'll swap them as we enter
1296    them into GDB's data structures.  */
1297
1298 static int
1299 init_lineno (bfd *abfd, long offset, int size)
1300 {
1301   int val;
1302
1303   linetab_offset = offset;
1304   linetab_size = size;
1305
1306   free_linetab ();
1307
1308   if (size == 0)
1309     return 0;
1310
1311   if (bfd_seek (abfd, offset, 0) < 0)
1312     return -1;
1313
1314   /* Allocate the desired table, plus a sentinel */
1315   linetab = (char *) xmalloc (size + local_linesz);
1316
1317   val = bfd_bread (linetab, size, abfd);
1318   if (val != size)
1319     return -1;
1320
1321   /* Terminate it with an all-zero sentinel record */
1322   memset (linetab + size, 0, local_linesz);
1323
1324   return 0;
1325 }
1326
1327 static void
1328 free_linetab (void)
1329 {
1330   if (linetab)
1331     xfree (linetab);
1332   linetab = NULL;
1333 }
1334
1335 static void
1336 free_linetab_cleanup (void *ignore)
1337 {
1338   free_linetab ();
1339 }
1340
1341 #if !defined (L_LNNO32)
1342 #define L_LNNO32(lp) ((lp)->l_lnno)
1343 #endif
1344
1345 static void
1346 enter_linenos (long file_offset, register int first_line,
1347                register int last_line, struct objfile *objfile)
1348 {
1349   register char *rawptr;
1350   struct internal_lineno lptr;
1351
1352   if (!linetab)
1353     return;
1354   if (file_offset < linetab_offset)
1355     {
1356       complaint (&symfile_complaints,
1357                  "Line number pointer %ld lower than start of line numbers",
1358                  file_offset);
1359       if (file_offset > linetab_size)   /* Too big to be an offset? */
1360         return;
1361       file_offset += linetab_offset;    /* Try reading at that linetab offset */
1362     }
1363
1364   rawptr = &linetab[file_offset - linetab_offset];
1365
1366   /* skip first line entry for each function */
1367   rawptr += local_linesz;
1368   /* line numbers start at one for the first line of the function */
1369   first_line--;
1370
1371   for (;;)
1372     {
1373       bfd_coff_swap_lineno_in (symfile_bfd, rawptr, &lptr);
1374       rawptr += local_linesz;
1375       /* The next function, or the sentinel, will have L_LNNO32 zero; we exit. */
1376       if (L_LNNO32 (&lptr) && L_LNNO32 (&lptr) <= last_line)
1377         record_line (current_subfile, first_line + L_LNNO32 (&lptr),
1378                      lptr.l_addr.l_paddr
1379                      + ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)));
1380       else
1381         break;
1382     }
1383 }
1384 \f
1385 static void
1386 patch_type (struct type *type, struct type *real_type)
1387 {
1388   register struct type *target = TYPE_TARGET_TYPE (type);
1389   register struct type *real_target = TYPE_TARGET_TYPE (real_type);
1390   int field_size = TYPE_NFIELDS (real_target) * sizeof (struct field);
1391
1392   TYPE_LENGTH (target) = TYPE_LENGTH (real_target);
1393   TYPE_NFIELDS (target) = TYPE_NFIELDS (real_target);
1394   TYPE_FIELDS (target) = (struct field *) TYPE_ALLOC (target, field_size);
1395
1396   memcpy (TYPE_FIELDS (target), TYPE_FIELDS (real_target), field_size);
1397
1398   if (TYPE_NAME (real_target))
1399     {
1400       if (TYPE_NAME (target))
1401         xfree (TYPE_NAME (target));
1402       TYPE_NAME (target) = concat (TYPE_NAME (real_target), NULL);
1403     }
1404 }
1405
1406 /* Patch up all appropriate typedef symbols in the opaque_type_chains
1407    so that they can be used to print out opaque data structures properly.  */
1408
1409 static void
1410 patch_opaque_types (struct symtab *s)
1411 {
1412   register struct block *b;
1413   register int i;
1414   register struct symbol *real_sym;
1415
1416   /* Go through the per-file symbols only */
1417   b = BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), STATIC_BLOCK);
1418   ALL_BLOCK_SYMBOLS (b, i, real_sym)
1419     {
1420       /* Find completed typedefs to use to fix opaque ones.
1421          Remove syms from the chain when their types are stored,
1422          but search the whole chain, as there may be several syms
1423          from different files with the same name.  */
1424       if (SYMBOL_CLASS (real_sym) == LOC_TYPEDEF &&
1425           SYMBOL_NAMESPACE (real_sym) == VAR_NAMESPACE &&
1426           TYPE_CODE (SYMBOL_TYPE (real_sym)) == TYPE_CODE_PTR &&
1427           TYPE_LENGTH (TYPE_TARGET_TYPE (SYMBOL_TYPE (real_sym))) != 0)
1428         {
1429           register char *name = SYMBOL_NAME (real_sym);
1430           register int hash = hashname (name);
1431           register struct symbol *sym, *prev;
1432
1433           prev = 0;
1434           for (sym = opaque_type_chain[hash]; sym;)
1435             {
1436               if (name[0] == SYMBOL_NAME (sym)[0] &&
1437                   STREQ (name + 1, SYMBOL_NAME (sym) + 1))
1438                 {
1439                   if (prev)
1440                     {
1441                       SYMBOL_VALUE_CHAIN (prev) = SYMBOL_VALUE_CHAIN (sym);
1442                     }
1443                   else
1444                     {
1445                       opaque_type_chain[hash] = SYMBOL_VALUE_CHAIN (sym);
1446                     }
1447
1448                   patch_type (SYMBOL_TYPE (sym), SYMBOL_TYPE (real_sym));
1449
1450                   if (prev)
1451                     {
1452                       sym = SYMBOL_VALUE_CHAIN (prev);
1453                     }
1454                   else
1455                     {
1456                       sym = opaque_type_chain[hash];
1457                     }
1458                 }
1459               else
1460                 {
1461                   prev = sym;
1462                   sym = SYMBOL_VALUE_CHAIN (sym);
1463                 }
1464             }
1465         }
1466     }
1467 }
1468 \f
1469 static struct symbol *
1470 process_coff_symbol (register struct coff_symbol *cs,
1471                      register union internal_auxent *aux,
1472                      struct objfile *objfile)
1473 {
1474   register struct symbol *sym
1475   = (struct symbol *) obstack_alloc (&objfile->symbol_obstack,
1476                                      sizeof (struct symbol));
1477   char *name;
1478
1479   memset (sym, 0, sizeof (struct symbol));
1480   name = cs->c_name;
1481   name = EXTERNAL_NAME (name, objfile->obfd);
1482   SYMBOL_LANGUAGE (sym) = language_auto;
1483   SYMBOL_SET_NAMES (sym, name, strlen (name), objfile);
1484
1485   /* default assumptions */
1486   SYMBOL_VALUE (sym) = cs->c_value;
1487   SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
1488   SYMBOL_SECTION (sym) = cs_to_section (cs, objfile);
1489
1490   if (ISFCN (cs->c_type))
1491     {
1492       SYMBOL_VALUE (sym) += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
1493       SYMBOL_TYPE (sym) =
1494         lookup_function_type (decode_function_type (cs, cs->c_type, aux));
1495
1496       SYMBOL_CLASS (sym) = LOC_BLOCK;
1497       if (cs->c_sclass == C_STAT || cs->c_sclass == C_THUMBSTAT
1498           || cs->c_sclass == C_THUMBSTATFUNC)
1499         add_symbol_to_list (sym, &file_symbols);
1500       else if (cs->c_sclass == C_EXT || cs->c_sclass == C_THUMBEXT
1501                || cs->c_sclass == C_THUMBEXTFUNC)
1502         add_symbol_to_list (sym, &global_symbols);
1503     }
1504   else
1505     {
1506       SYMBOL_TYPE (sym) = decode_type (cs, cs->c_type, aux);
1507       switch (cs->c_sclass)
1508         {
1509         case C_NULL:
1510           break;
1511
1512         case C_AUTO:
1513           SYMBOL_CLASS (sym) = LOC_LOCAL;
1514           add_symbol_to_list (sym, &local_symbols);
1515           break;
1516
1517         case C_THUMBEXT:
1518         case C_THUMBEXTFUNC:
1519         case C_EXT:
1520           SYMBOL_CLASS (sym) = LOC_STATIC;
1521           SYMBOL_VALUE_ADDRESS (sym) = (CORE_ADDR) cs->c_value;
1522           SYMBOL_VALUE_ADDRESS (sym) += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
1523           add_symbol_to_list (sym, &global_symbols);
1524           break;
1525
1526         case C_THUMBSTAT:
1527         case C_THUMBSTATFUNC:
1528         case C_STAT:
1529           SYMBOL_CLASS (sym) = LOC_STATIC;
1530           SYMBOL_VALUE_ADDRESS (sym) = (CORE_ADDR) cs->c_value;
1531           SYMBOL_VALUE_ADDRESS (sym) += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
1532           if (within_function)
1533             {
1534               /* Static symbol of local scope */
1535               add_symbol_to_list (sym, &local_symbols);
1536             }
1537           else
1538             {
1539               /* Static symbol at top level of file */
1540               add_symbol_to_list (sym, &file_symbols);
1541             }
1542           break;
1543
1544 #ifdef C_GLBLREG                /* AMD coff */
1545         case C_GLBLREG:
1546 #endif
1547         case C_REG:
1548           SYMBOL_CLASS (sym) = LOC_REGISTER;
1549           SYMBOL_VALUE (sym) = SDB_REG_TO_REGNUM (cs->c_value);
1550           add_symbol_to_list (sym, &local_symbols);
1551           break;
1552
1553         case C_THUMBLABEL:
1554         case C_LABEL:
1555           break;
1556
1557         case C_ARG:
1558           SYMBOL_CLASS (sym) = LOC_ARG;
1559           add_symbol_to_list (sym, &local_symbols);
1560 #if !defined (BELIEVE_PCC_PROMOTION)
1561           if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
1562             {
1563               /* If PCC says a parameter is a short or a char,
1564                  aligned on an int boundary, realign it to the
1565                  "little end" of the int.  */
1566               struct type *temptype;
1567               temptype = lookup_fundamental_type (current_objfile,
1568                                                   FT_INTEGER);
1569               if (TYPE_LENGTH (SYMBOL_TYPE (sym)) < TYPE_LENGTH (temptype)
1570                   && TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_INT
1571                   && 0 == SYMBOL_VALUE (sym) % TYPE_LENGTH (temptype))
1572                 {
1573                   SYMBOL_VALUE (sym) +=
1574                     TYPE_LENGTH (temptype)
1575                     - TYPE_LENGTH (SYMBOL_TYPE (sym));
1576                 }
1577             }
1578 #endif
1579           break;
1580
1581         case C_REGPARM:
1582           SYMBOL_CLASS (sym) = LOC_REGPARM;
1583           SYMBOL_VALUE (sym) = SDB_REG_TO_REGNUM (cs->c_value);
1584           add_symbol_to_list (sym, &local_symbols);
1585 #if !defined (BELIEVE_PCC_PROMOTION)
1586           /* FIXME:  This should retain the current type, since it's just
1587              a register value.  gnu@adobe, 26Feb93 */
1588           {
1589             /* If PCC says a parameter is a short or a char,
1590                it is really an int.  */
1591             struct type *temptype;
1592             temptype =
1593               lookup_fundamental_type (current_objfile, FT_INTEGER);
1594             if (TYPE_LENGTH (SYMBOL_TYPE (sym)) < TYPE_LENGTH (temptype)
1595                 && TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_INT)
1596               {
1597                 SYMBOL_TYPE (sym) =
1598                   (TYPE_UNSIGNED (SYMBOL_TYPE (sym))
1599                    ? lookup_fundamental_type (current_objfile,
1600                                               FT_UNSIGNED_INTEGER)
1601                    : temptype);
1602               }
1603           }
1604 #endif
1605           break;
1606
1607         case C_TPDEF:
1608           SYMBOL_CLASS (sym) = LOC_TYPEDEF;
1609           SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
1610
1611           /* If type has no name, give it one */
1612           if (TYPE_NAME (SYMBOL_TYPE (sym)) == 0)
1613             {
1614               if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_PTR
1615                   || TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_FUNC)
1616                 {
1617                   /* If we are giving a name to a type such as "pointer to
1618                      foo" or "function returning foo", we better not set
1619                      the TYPE_NAME.  If the program contains "typedef char
1620                      *caddr_t;", we don't want all variables of type char
1621                      * to print as caddr_t.  This is not just a
1622                      consequence of GDB's type management; CC and GCC (at
1623                      least through version 2.4) both output variables of
1624                      either type char * or caddr_t with the type
1625                      refering to the C_TPDEF symbol for caddr_t.  If a future
1626                      compiler cleans this up it GDB is not ready for it
1627                      yet, but if it becomes ready we somehow need to
1628                      disable this check (without breaking the PCC/GCC2.4
1629                      case).
1630
1631                      Sigh.
1632
1633                      Fortunately, this check seems not to be necessary
1634                      for anything except pointers or functions.  */
1635                   ;
1636                 }
1637               else
1638                 TYPE_NAME (SYMBOL_TYPE (sym)) =
1639                   concat (SYMBOL_NAME (sym), NULL);
1640             }
1641 #ifdef CXUX_TARGET
1642           /* Ignore vendor section for Harris CX/UX targets. */
1643           else if (cs->c_name[0] == '$')
1644             break;
1645 #endif /* CXUX_TARGET */
1646
1647           /* Keep track of any type which points to empty structured type,
1648              so it can be filled from a definition from another file.  A
1649              simple forward reference (TYPE_CODE_UNDEF) is not an
1650              empty structured type, though; the forward references
1651              work themselves out via the magic of coff_lookup_type.  */
1652           if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_PTR &&
1653               TYPE_LENGTH (TYPE_TARGET_TYPE (SYMBOL_TYPE (sym))) == 0 &&
1654               TYPE_CODE (TYPE_TARGET_TYPE (SYMBOL_TYPE (sym))) !=
1655               TYPE_CODE_UNDEF)
1656             {
1657               register int i = hashname (SYMBOL_NAME (sym));
1658
1659               SYMBOL_VALUE_CHAIN (sym) = opaque_type_chain[i];
1660               opaque_type_chain[i] = sym;
1661             }
1662           add_symbol_to_list (sym, &file_symbols);
1663           break;
1664
1665         case C_STRTAG:
1666         case C_UNTAG:
1667         case C_ENTAG:
1668           SYMBOL_CLASS (sym) = LOC_TYPEDEF;
1669           SYMBOL_NAMESPACE (sym) = STRUCT_NAMESPACE;
1670
1671           /* Some compilers try to be helpful by inventing "fake"
1672              names for anonymous enums, structures, and unions, like
1673              "~0fake" or ".0fake".  Thanks, but no thanks... */
1674           if (TYPE_TAG_NAME (SYMBOL_TYPE (sym)) == 0)
1675             if (SYMBOL_NAME (sym) != NULL
1676                 && *SYMBOL_NAME (sym) != '~'
1677                 && *SYMBOL_NAME (sym) != '.')
1678               TYPE_TAG_NAME (SYMBOL_TYPE (sym)) =
1679                 concat (SYMBOL_NAME (sym), NULL);
1680
1681           add_symbol_to_list (sym, &file_symbols);
1682           break;
1683
1684         default:
1685           break;
1686         }
1687     }
1688   return sym;
1689 }
1690 \f
1691 /* Decode a coff type specifier;  return the type that is meant.  */
1692
1693 static struct type *
1694 decode_type (register struct coff_symbol *cs, unsigned int c_type,
1695              register union internal_auxent *aux)
1696 {
1697   register struct type *type = 0;
1698   unsigned int new_c_type;
1699
1700   if (c_type & ~N_BTMASK)
1701     {
1702       new_c_type = DECREF (c_type);
1703       if (ISPTR (c_type))
1704         {
1705           type = decode_type (cs, new_c_type, aux);
1706           type = lookup_pointer_type (type);
1707         }
1708       else if (ISFCN (c_type))
1709         {
1710           type = decode_type (cs, new_c_type, aux);
1711           type = lookup_function_type (type);
1712         }
1713       else if (ISARY (c_type))
1714         {
1715           int i, n;
1716           register unsigned short *dim;
1717           struct type *base_type, *index_type, *range_type;
1718
1719           /* Define an array type.  */
1720           /* auxent refers to array, not base type */
1721           if (aux->x_sym.x_tagndx.l == 0)
1722             cs->c_naux = 0;
1723
1724           /* shift the indices down */
1725           dim = &aux->x_sym.x_fcnary.x_ary.x_dimen[0];
1726           i = 1;
1727           n = dim[0];
1728           for (i = 0; *dim && i < DIMNUM - 1; i++, dim++)
1729             *dim = *(dim + 1);
1730           *dim = 0;
1731
1732           base_type = decode_type (cs, new_c_type, aux);
1733           index_type = lookup_fundamental_type (current_objfile, FT_INTEGER);
1734           range_type =
1735             create_range_type ((struct type *) NULL, index_type, 0, n - 1);
1736           type =
1737             create_array_type ((struct type *) NULL, base_type, range_type);
1738         }
1739       return type;
1740     }
1741
1742   /* Reference to existing type.  This only occurs with the
1743      struct, union, and enum types.  EPI a29k coff
1744      fakes us out by producing aux entries with a nonzero
1745      x_tagndx for definitions of structs, unions, and enums, so we
1746      have to check the c_sclass field.  SCO 3.2v4 cc gets confused
1747      with pointers to pointers to defined structs, and generates
1748      negative x_tagndx fields.  */
1749   if (cs->c_naux > 0 && aux->x_sym.x_tagndx.l != 0)
1750     {
1751       if (cs->c_sclass != C_STRTAG
1752           && cs->c_sclass != C_UNTAG
1753           && cs->c_sclass != C_ENTAG
1754           && aux->x_sym.x_tagndx.l >= 0)
1755         {
1756           type = coff_alloc_type (aux->x_sym.x_tagndx.l);
1757           return type;
1758         }
1759       else
1760         {
1761           complaint (&symfile_complaints,
1762                      "Symbol table entry for %s has bad tagndx value",
1763                      cs->c_name);
1764           /* And fall through to decode_base_type... */
1765         }
1766     }
1767
1768   return decode_base_type (cs, BTYPE (c_type), aux);
1769 }
1770
1771 /* Decode a coff type specifier for function definition;
1772    return the type that the function returns.  */
1773
1774 static struct type *
1775 decode_function_type (register struct coff_symbol *cs, unsigned int c_type,
1776                       register union internal_auxent *aux)
1777 {
1778   if (aux->x_sym.x_tagndx.l == 0)
1779     cs->c_naux = 0;             /* auxent refers to function, not base type */
1780
1781   return decode_type (cs, DECREF (c_type), aux);
1782 }
1783 \f
1784 /* basic C types */
1785
1786 static struct type *
1787 decode_base_type (register struct coff_symbol *cs, unsigned int c_type,
1788                   register union internal_auxent *aux)
1789 {
1790   struct type *type;
1791
1792   switch (c_type)
1793     {
1794     case T_NULL:
1795       /* shows up with "void (*foo)();" structure members */
1796       return lookup_fundamental_type (current_objfile, FT_VOID);
1797
1798 #if 0
1799 /* DGUX actually defines both T_ARG and T_VOID to the same value.  */
1800 #ifdef T_ARG
1801     case T_ARG:
1802       /* Shows up in DGUX, I think.  Not sure where.  */
1803       return lookup_fundamental_type (current_objfile, FT_VOID);        /* shouldn't show up here */
1804 #endif
1805 #endif /* 0 */
1806
1807 #ifdef T_VOID
1808     case T_VOID:
1809       /* Intel 960 COFF has this symbol and meaning.  */
1810       return lookup_fundamental_type (current_objfile, FT_VOID);
1811 #endif
1812
1813     case T_CHAR:
1814       return lookup_fundamental_type (current_objfile, FT_CHAR);
1815
1816     case T_SHORT:
1817       return lookup_fundamental_type (current_objfile, FT_SHORT);
1818
1819     case T_INT:
1820       return lookup_fundamental_type (current_objfile, FT_INTEGER);
1821
1822     case T_LONG:
1823       if (cs->c_sclass == C_FIELD
1824           && aux->x_sym.x_misc.x_lnsz.x_size > TARGET_LONG_BIT)
1825         return lookup_fundamental_type (current_objfile, FT_LONG_LONG);
1826       else
1827         return lookup_fundamental_type (current_objfile, FT_LONG);
1828
1829     case T_FLOAT:
1830       return lookup_fundamental_type (current_objfile, FT_FLOAT);
1831
1832     case T_DOUBLE:
1833       return lookup_fundamental_type (current_objfile, FT_DBL_PREC_FLOAT);
1834
1835     case T_LNGDBL:
1836       return lookup_fundamental_type (current_objfile, FT_EXT_PREC_FLOAT);
1837
1838     case T_STRUCT:
1839       if (cs->c_naux != 1)
1840         {
1841           /* anonymous structure type */
1842           type = coff_alloc_type (cs->c_symnum);
1843           TYPE_CODE (type) = TYPE_CODE_STRUCT;
1844           TYPE_NAME (type) = NULL;
1845           /* This used to set the tag to "<opaque>".  But I think setting it
1846              to NULL is right, and the printing code can print it as
1847              "struct {...}".  */
1848           TYPE_TAG_NAME (type) = NULL;
1849           INIT_CPLUS_SPECIFIC (type);
1850           TYPE_LENGTH (type) = 0;
1851           TYPE_FIELDS (type) = 0;
1852           TYPE_NFIELDS (type) = 0;
1853         }
1854       else
1855         {
1856           type = coff_read_struct_type (cs->c_symnum,
1857                                         aux->x_sym.x_misc.x_lnsz.x_size,
1858                                       aux->x_sym.x_fcnary.x_fcn.x_endndx.l);
1859         }
1860       return type;
1861
1862     case T_UNION:
1863       if (cs->c_naux != 1)
1864         {
1865           /* anonymous union type */
1866           type = coff_alloc_type (cs->c_symnum);
1867           TYPE_NAME (type) = NULL;
1868           /* This used to set the tag to "<opaque>".  But I think setting it
1869              to NULL is right, and the printing code can print it as
1870              "union {...}".  */
1871           TYPE_TAG_NAME (type) = NULL;
1872           INIT_CPLUS_SPECIFIC (type);
1873           TYPE_LENGTH (type) = 0;
1874           TYPE_FIELDS (type) = 0;
1875           TYPE_NFIELDS (type) = 0;
1876         }
1877       else
1878         {
1879           type = coff_read_struct_type (cs->c_symnum,
1880                                         aux->x_sym.x_misc.x_lnsz.x_size,
1881                                       aux->x_sym.x_fcnary.x_fcn.x_endndx.l);
1882         }
1883       TYPE_CODE (type) = TYPE_CODE_UNION;
1884       return type;
1885
1886     case T_ENUM:
1887       if (cs->c_naux != 1)
1888         {
1889           /* anonymous enum type */
1890           type = coff_alloc_type (cs->c_symnum);
1891           TYPE_CODE (type) = TYPE_CODE_ENUM;
1892           TYPE_NAME (type) = NULL;
1893           /* This used to set the tag to "<opaque>".  But I think setting it
1894              to NULL is right, and the printing code can print it as
1895              "enum {...}".  */
1896           TYPE_TAG_NAME (type) = NULL;
1897           TYPE_LENGTH (type) = 0;
1898           TYPE_FIELDS (type) = 0;
1899           TYPE_NFIELDS (type) = 0;
1900         }
1901       else
1902         {
1903           type = coff_read_enum_type (cs->c_symnum,
1904                                       aux->x_sym.x_misc.x_lnsz.x_size,
1905                                       aux->x_sym.x_fcnary.x_fcn.x_endndx.l);
1906         }
1907       return type;
1908
1909     case T_MOE:
1910       /* shouldn't show up here */
1911       break;
1912
1913     case T_UCHAR:
1914       return lookup_fundamental_type (current_objfile, FT_UNSIGNED_CHAR);
1915
1916     case T_USHORT:
1917       return lookup_fundamental_type (current_objfile, FT_UNSIGNED_SHORT);
1918
1919     case T_UINT:
1920       return lookup_fundamental_type (current_objfile, FT_UNSIGNED_INTEGER);
1921
1922     case T_ULONG:
1923       if (cs->c_sclass == C_FIELD
1924           && aux->x_sym.x_misc.x_lnsz.x_size > TARGET_LONG_BIT)
1925         return lookup_fundamental_type (current_objfile, FT_UNSIGNED_LONG_LONG);
1926       else
1927         return lookup_fundamental_type (current_objfile, FT_UNSIGNED_LONG);
1928     }
1929   complaint (&symfile_complaints, "Unexpected type for symbol %s", cs->c_name);
1930   return lookup_fundamental_type (current_objfile, FT_VOID);
1931 }
1932 \f
1933 /* This page contains subroutines of read_type.  */
1934
1935 /* Read the description of a structure (or union type) and return an
1936    object describing the type.  */
1937
1938 static struct type *
1939 coff_read_struct_type (int index, int length, int lastsym)
1940 {
1941   struct nextfield
1942     {
1943       struct nextfield *next;
1944       struct field field;
1945     };
1946
1947   register struct type *type;
1948   register struct nextfield *list = 0;
1949   struct nextfield *new;
1950   int nfields = 0;
1951   register int n;
1952   char *name;
1953   struct coff_symbol member_sym;
1954   register struct coff_symbol *ms = &member_sym;
1955   struct internal_syment sub_sym;
1956   union internal_auxent sub_aux;
1957   int done = 0;
1958
1959   type = coff_alloc_type (index);
1960   TYPE_CODE (type) = TYPE_CODE_STRUCT;
1961   INIT_CPLUS_SPECIFIC (type);
1962   TYPE_LENGTH (type) = length;
1963
1964   while (!done && symnum < lastsym && symnum < nlist_nsyms_global)
1965     {
1966       read_one_sym (ms, &sub_sym, &sub_aux);
1967       name = ms->c_name;
1968       name = EXTERNAL_NAME (name, current_objfile->obfd);
1969
1970       switch (ms->c_sclass)
1971         {
1972         case C_MOS:
1973         case C_MOU:
1974
1975           /* Get space to record the next field's data.  */
1976           new = (struct nextfield *) alloca (sizeof (struct nextfield));
1977           new->next = list;
1978           list = new;
1979
1980           /* Save the data.  */
1981           list->field.name =
1982             obsavestring (name,
1983                           strlen (name),
1984                           &current_objfile->symbol_obstack);
1985           FIELD_TYPE (list->field) = decode_type (ms, ms->c_type, &sub_aux);
1986           FIELD_BITPOS (list->field) = 8 * ms->c_value;
1987           FIELD_BITSIZE (list->field) = 0;
1988           FIELD_STATIC_KIND (list->field) = 0;
1989           nfields++;
1990           break;
1991
1992         case C_FIELD:
1993
1994           /* Get space to record the next field's data.  */
1995           new = (struct nextfield *) alloca (sizeof (struct nextfield));
1996           new->next = list;
1997           list = new;
1998
1999           /* Save the data.  */
2000           list->field.name =
2001             obsavestring (name,
2002                           strlen (name),
2003                           &current_objfile->symbol_obstack);
2004           FIELD_TYPE (list->field) = decode_type (ms, ms->c_type, &sub_aux);
2005           FIELD_BITPOS (list->field) = ms->c_value;
2006           FIELD_BITSIZE (list->field) = sub_aux.x_sym.x_misc.x_lnsz.x_size;
2007           FIELD_STATIC_KIND (list->field) = 0;
2008           nfields++;
2009           break;
2010
2011         case C_EOS:
2012           done = 1;
2013           break;
2014         }
2015     }
2016   /* Now create the vector of fields, and record how big it is.  */
2017
2018   TYPE_NFIELDS (type) = nfields;
2019   TYPE_FIELDS (type) = (struct field *)
2020     TYPE_ALLOC (type, sizeof (struct field) * nfields);
2021
2022   /* Copy the saved-up fields into the field vector.  */
2023
2024   for (n = nfields; list; list = list->next)
2025     TYPE_FIELD (type, --n) = list->field;
2026
2027   return type;
2028 }
2029 \f
2030 /* Read a definition of an enumeration type,
2031    and create and return a suitable type object.
2032    Also defines the symbols that represent the values of the type.  */
2033
2034 /* ARGSUSED */
2035 static struct type *
2036 coff_read_enum_type (int index, int length, int lastsym)
2037 {
2038   register struct symbol *sym;
2039   register struct type *type;
2040   int nsyms = 0;
2041   int done = 0;
2042   struct pending **symlist;
2043   struct coff_symbol member_sym;
2044   register struct coff_symbol *ms = &member_sym;
2045   struct internal_syment sub_sym;
2046   union internal_auxent sub_aux;
2047   struct pending *osyms, *syms;
2048   int o_nsyms;
2049   register int n;
2050   char *name;
2051   int unsigned_enum = 1;
2052
2053   type = coff_alloc_type (index);
2054   if (within_function)
2055     symlist = &local_symbols;
2056   else
2057     symlist = &file_symbols;
2058   osyms = *symlist;
2059   o_nsyms = osyms ? osyms->nsyms : 0;
2060
2061   while (!done && symnum < lastsym && symnum < nlist_nsyms_global)
2062     {
2063       read_one_sym (ms, &sub_sym, &sub_aux);
2064       name = ms->c_name;
2065       name = EXTERNAL_NAME (name, current_objfile->obfd);
2066
2067       switch (ms->c_sclass)
2068         {
2069         case C_MOE:
2070           sym = (struct symbol *) obstack_alloc
2071             (&current_objfile->symbol_obstack,
2072              sizeof (struct symbol));
2073           memset (sym, 0, sizeof (struct symbol));
2074
2075           SYMBOL_NAME (sym) =
2076             obsavestring (name, strlen (name),
2077                           &current_objfile->symbol_obstack);
2078           SYMBOL_CLASS (sym) = LOC_CONST;
2079           SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
2080           SYMBOL_VALUE (sym) = ms->c_value;
2081           add_symbol_to_list (sym, symlist);
2082           nsyms++;
2083           break;
2084
2085         case C_EOS:
2086           /* Sometimes the linker (on 386/ix 2.0.2 at least) screws
2087              up the count of how many symbols to read.  So stop
2088              on .eos.  */
2089           done = 1;
2090           break;
2091         }
2092     }
2093
2094   /* Now fill in the fields of the type-structure.  */
2095
2096   if (length > 0)
2097     TYPE_LENGTH (type) = length;
2098   else
2099     TYPE_LENGTH (type) = TARGET_INT_BIT / TARGET_CHAR_BIT;      /* Assume ints */
2100   TYPE_CODE (type) = TYPE_CODE_ENUM;
2101   TYPE_NFIELDS (type) = nsyms;
2102   TYPE_FIELDS (type) = (struct field *)
2103     TYPE_ALLOC (type, sizeof (struct field) * nsyms);
2104
2105   /* Find the symbols for the values and put them into the type.
2106      The symbols can be found in the symlist that we put them on
2107      to cause them to be defined.  osyms contains the old value
2108      of that symlist; everything up to there was defined by us.  */
2109   /* Note that we preserve the order of the enum constants, so
2110      that in something like "enum {FOO, LAST_THING=FOO}" we print
2111      FOO, not LAST_THING.  */
2112
2113   for (syms = *symlist, n = 0; syms; syms = syms->next)
2114     {
2115       int j = 0;
2116
2117       if (syms == osyms)
2118         j = o_nsyms;
2119       for (; j < syms->nsyms; j++, n++)
2120         {
2121           struct symbol *xsym = syms->symbol[j];
2122           SYMBOL_TYPE (xsym) = type;
2123           TYPE_FIELD_NAME (type, n) = SYMBOL_NAME (xsym);
2124           TYPE_FIELD_BITPOS (type, n) = SYMBOL_VALUE (xsym);
2125           if (SYMBOL_VALUE (xsym) < 0)
2126             unsigned_enum = 0;
2127           TYPE_FIELD_BITSIZE (type, n) = 0;
2128           TYPE_FIELD_STATIC_KIND (type, n) = 0;
2129         }
2130       if (syms == osyms)
2131         break;
2132     }
2133
2134   if (unsigned_enum)
2135     TYPE_FLAGS (type) |= TYPE_FLAG_UNSIGNED;
2136
2137   return type;
2138 }
2139
2140 /* Register our ability to parse symbols for coff BFD files. */
2141
2142 static struct sym_fns coff_sym_fns =
2143 {
2144   bfd_target_coff_flavour,
2145   coff_new_init,                /* sym_new_init: init anything gbl to entire symtab */
2146   coff_symfile_init,            /* sym_init: read initial info, setup for sym_read() */
2147   coff_symfile_read,            /* sym_read: read a symbol file into symtab */
2148   coff_symfile_finish,          /* sym_finish: finished with file, cleanup */
2149   default_symfile_offsets,      /* sym_offsets:  xlate external to internal form */
2150   NULL                          /* next: pointer to next struct sym_fns */
2151 };
2152
2153 void
2154 _initialize_coffread (void)
2155 {
2156   add_symtab_fns (&coff_sym_fns);
2157 }