2003-06-11 David Carlton <carlton@bactrian.org>
[external/binutils.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, *cleanup_minimal_symbols;
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   cleanup_minimal_symbols = 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   /* Install any minimal symbols that have been collected as the current
609      minimal symbols for this objfile.  */
610
611   install_minimal_symbols (objfile);
612
613   /* Free the installed minimal symbol data.  */
614   do_cleanups (cleanup_minimal_symbols);
615
616   bfd_map_over_sections (abfd, coff_locate_sections, (void *) info);
617
618   if (info->stabsects)
619     {
620       if (!info->stabstrsect)
621         {
622           error (("The debugging information in `%s' is corrupted.\n"
623                   "The file has a `.stabs' section, but no `.stabstr' "
624                   "section."),
625                  name);
626         }
627
628       /* FIXME: dubious.  Why can't we use something normal like
629          bfd_get_section_contents?  */
630       bfd_seek (abfd, abfd->where, 0);
631
632       stabstrsize = bfd_section_size (abfd, info->stabstrsect);
633
634       coffstab_build_psymtabs (objfile,
635                                mainline,
636                                info->textaddr, info->textsize,
637                                info->stabsects,
638                                info->stabstrsect->filepos, stabstrsize);
639     }
640   if (dwarf2_has_info (abfd))
641     {
642       /* DWARF2 sections.  */
643       dwarf2_build_psymtabs (objfile, mainline);
644     }
645
646   do_cleanups (back_to);
647 }
648
649 static void
650 coff_new_init (struct objfile *ignore)
651 {
652 }
653
654 /* Perform any local cleanups required when we are done with a particular
655    objfile.  I.E, we are in the process of discarding all symbol information
656    for an objfile, freeing up all memory held for it, and unlinking the
657    objfile struct from the global list of known objfiles. */
658
659 static void
660 coff_symfile_finish (struct objfile *objfile)
661 {
662   if (objfile->sym_private != NULL)
663     {
664       xmfree (objfile->md, objfile->sym_private);
665     }
666
667   /* Let stabs reader clean up */
668   stabsread_clear_cache ();
669 }
670 \f
671
672 /* Given pointers to a symbol table in coff style exec file,
673    analyze them and create struct symtab's describing the symbols.
674    NSYMS is the number of symbols in the symbol table.
675    We read them one at a time using read_one_sym ().  */
676
677 static void
678 coff_symtab_read (long symtab_offset, unsigned int nsyms,
679                   struct objfile *objfile)
680 {
681   register struct context_stack *new;
682   struct coff_symbol coff_symbol;
683   register struct coff_symbol *cs = &coff_symbol;
684   static struct internal_syment main_sym;
685   static union internal_auxent main_aux;
686   struct coff_symbol fcn_cs_saved;
687   static struct internal_syment fcn_sym_saved;
688   static union internal_auxent fcn_aux_saved;
689   struct symtab *s;
690   /* A .file is open.  */
691   int in_source_file = 0;
692   int next_file_symnum = -1;
693   /* Name of the current file.  */
694   char *filestring = "";
695   int depth = 0;
696   int fcn_first_line = 0;
697   CORE_ADDR fcn_first_line_addr = 0;
698   int fcn_last_line = 0;
699   int fcn_start_addr = 0;
700   long fcn_line_ptr = 0;
701   int val;
702   CORE_ADDR tmpaddr;
703
704   /* Work around a stdio bug in SunOS4.1.1 (this makes me nervous....
705      it's hard to know I've really worked around it.  The fix should be
706      harmless, anyway).  The symptom of the bug is that the first
707      fread (in read_one_sym), will (in my example) actually get data
708      from file offset 268, when the fseek was to 264 (and ftell shows
709      264).  This causes all hell to break loose.  I was unable to
710      reproduce this on a short test program which operated on the same
711      file, performing (I think) the same sequence of operations.
712
713      It stopped happening when I put in this (former) rewind().
714
715      FIXME: Find out if this has been reported to Sun, whether it has
716      been fixed in a later release, etc.  */
717
718   bfd_seek (objfile->obfd, 0, 0);
719
720   /* Position to read the symbol table. */
721   val = bfd_seek (objfile->obfd, (long) symtab_offset, 0);
722   if (val < 0)
723     perror_with_name (objfile->name);
724
725   current_objfile = objfile;
726   nlist_bfd_global = objfile->obfd;
727   nlist_nsyms_global = nsyms;
728   last_source_file = NULL;
729   memset (opaque_type_chain, 0, sizeof opaque_type_chain);
730
731   if (type_vector)              /* Get rid of previous one */
732     xfree (type_vector);
733   type_vector_length = 160;
734   type_vector = (struct type **)
735     xmalloc (type_vector_length * sizeof (struct type *));
736   memset (type_vector, 0, type_vector_length * sizeof (struct type *));
737
738   coff_start_symtab ("");
739
740   symnum = 0;
741   while (symnum < nsyms)
742     {
743       QUIT;                     /* Make this command interruptable.  */
744
745       read_one_sym (cs, &main_sym, &main_aux);
746
747       if (cs->c_symnum == next_file_symnum && cs->c_sclass != C_FILE)
748         {
749           if (last_source_file)
750             coff_end_symtab (objfile);
751
752           coff_start_symtab ("_globals_");
753           complete_symtab ("_globals_", 0, 0);
754           /* done with all files, everything from here on out is globals */
755         }
756
757       /* Special case for file with type declarations only, no text.  */
758       if (!last_source_file && SDB_TYPE (cs->c_type)
759           && cs->c_secnum == N_DEBUG)
760         complete_symtab (filestring, 0, 0);
761
762       /* Typedefs should not be treated as symbol definitions.  */
763       if (ISFCN (cs->c_type) && cs->c_sclass != C_TPDEF)
764         {
765           /* Record all functions -- external and static -- in minsyms. */
766           tmpaddr = cs->c_value + ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
767           record_minimal_symbol (cs->c_name, tmpaddr, mst_text, objfile);
768
769           fcn_line_ptr = main_aux.x_sym.x_fcnary.x_fcn.x_lnnoptr;
770           fcn_start_addr = tmpaddr;
771           fcn_cs_saved = *cs;
772           fcn_sym_saved = main_sym;
773           fcn_aux_saved = main_aux;
774           continue;
775         }
776
777       switch (cs->c_sclass)
778         {
779         case C_EFCN:
780         case C_EXTDEF:
781         case C_ULABEL:
782         case C_USTATIC:
783         case C_LINE:
784         case C_ALIAS:
785         case C_HIDDEN:
786           complaint (&symfile_complaints, "Bad n_sclass for symbol %s",
787                      cs->c_name);
788           break;
789
790         case C_FILE:
791           /* c_value field contains symnum of next .file entry in table
792              or symnum of first global after last .file.  */
793           next_file_symnum = cs->c_value;
794           if (cs->c_naux > 0)
795             filestring = coff_getfilename (&main_aux);
796           else
797             filestring = "";
798
799           /* Complete symbol table for last object file
800              containing debugging information.  */
801           if (last_source_file)
802             {
803               coff_end_symtab (objfile);
804               coff_start_symtab (filestring);
805             }
806           in_source_file = 1;
807           break;
808
809           /* C_LABEL is used for labels and static functions.  Including
810              it here allows gdb to see static functions when no debug
811              info is available.  */
812         case C_LABEL:
813           /* However, labels within a function can make weird backtraces,
814              so filter them out (from phdm@macqel.be). */
815           if (within_function)
816             break;
817         case C_STAT:
818         case C_THUMBLABEL:
819         case C_THUMBSTAT:
820         case C_THUMBSTATFUNC:
821           if (cs->c_name[0] == '.')
822             {
823               if (STREQ (cs->c_name, ".text"))
824                 {
825                   /* FIXME:  don't wire in ".text" as section name
826                      or symbol name! */
827                   /* Check for in_source_file deals with case of
828                      a file with debugging symbols
829                      followed by a later file with no symbols.  */
830                   if (in_source_file)
831                     complete_symtab (filestring,
832                     cs->c_value + ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)),
833                                      main_aux.x_scn.x_scnlen);
834                   in_source_file = 0;
835                 }
836               /* flush rest of '.' symbols */
837               break;
838             }
839           else if (!SDB_TYPE (cs->c_type)
840                    && cs->c_name[0] == 'L'
841                    && (strncmp (cs->c_name, "LI%", 3) == 0
842                        || strncmp (cs->c_name, "LF%", 3) == 0
843                        || strncmp (cs->c_name, "LC%", 3) == 0
844                        || strncmp (cs->c_name, "LP%", 3) == 0
845                        || strncmp (cs->c_name, "LPB%", 4) == 0
846                        || strncmp (cs->c_name, "LBB%", 4) == 0
847                        || strncmp (cs->c_name, "LBE%", 4) == 0
848                        || strncmp (cs->c_name, "LPBX%", 5) == 0))
849             /* At least on a 3b1, gcc generates swbeg and string labels
850                that look like this.  Ignore them.  */
851             break;
852           /* fall in for static symbols that don't start with '.' */
853         case C_THUMBEXT:
854         case C_THUMBEXTFUNC:
855         case C_EXT:
856           {
857             /* Record it in the minimal symbols regardless of
858                SDB_TYPE.  This parallels what we do for other debug
859                formats, and probably is needed to make
860                print_address_symbolic work right without the (now
861                gone) "set fast-symbolic-addr off" kludge.  */
862
863             enum minimal_symbol_type ms_type;
864             int sec;
865
866             if (cs->c_secnum == N_UNDEF)
867               {
868                 /* This is a common symbol.  See if the target
869                    environment knows where it has been relocated to.  */
870                 CORE_ADDR reladdr;
871                 if (target_lookup_symbol (cs->c_name, &reladdr))
872                   {
873                     /* Error in lookup; ignore symbol.  */
874                     break;
875                   }
876                 tmpaddr = reladdr;
877                 /* The address has already been relocated; make sure that
878                    objfile_relocate doesn't relocate it again.  */
879                 sec = -2;
880                 ms_type = cs->c_sclass == C_EXT
881                   || cs->c_sclass == C_THUMBEXT ?
882                   mst_bss : mst_file_bss;
883               }
884             else if (cs->c_secnum == N_ABS)
885               {
886                 /* Use the correct minimal symbol type (and don't
887                    relocate) for absolute values. */
888                 ms_type = mst_abs;
889                 sec = cs_to_section (cs, objfile);
890                 tmpaddr = cs->c_value;
891               }
892             else
893               {
894                 sec = cs_to_section (cs, objfile);
895                 tmpaddr = cs->c_value;
896                 /* Statics in a PE file also get relocated */
897                 if (cs->c_sclass == C_EXT
898                     || cs->c_sclass == C_THUMBEXTFUNC
899                     || cs->c_sclass == C_THUMBEXT
900                     || (pe_file && (cs->c_sclass == C_STAT)))
901                   tmpaddr += ANOFFSET (objfile->section_offsets, sec);
902
903                 if (sec == SECT_OFF_TEXT (objfile))
904                   {
905                     ms_type =
906                       cs->c_sclass == C_EXT || cs->c_sclass == C_THUMBEXTFUNC
907                       || cs->c_sclass == C_THUMBEXT ?
908                       mst_text : mst_file_text;
909                     tmpaddr = SMASH_TEXT_ADDRESS (tmpaddr);
910                   }
911                 else if (sec == SECT_OFF_DATA (objfile))
912                   {
913                     ms_type =
914                       cs->c_sclass == C_EXT || cs->c_sclass == C_THUMBEXT ?
915                       mst_data : mst_file_data;
916                   }
917                 else if (sec == SECT_OFF_BSS (objfile))
918                   {
919                     ms_type =
920                       cs->c_sclass == C_EXT || cs->c_sclass == C_THUMBEXT ?
921                       mst_data : mst_file_data;
922                   }
923                 else
924                   ms_type = mst_unknown;
925               }
926
927             if (cs->c_name[0] != '@' /* Skip tdesc symbols */ )
928               {
929                 struct minimal_symbol *msym;
930
931                 /* FIXME: cagney/2001-02-01: The nasty (int) -> (long)
932                    -> (void*) cast is to ensure that that the value of
933                    cs->c_sclass can be correctly stored in a void
934                    pointer in MSYMBOL_INFO.  Better solutions
935                    welcome. */
936                 gdb_assert (sizeof (void *) >= sizeof (cs->c_sclass));
937                 msym = prim_record_minimal_symbol_and_info
938                   (cs->c_name, tmpaddr, ms_type, (void *) (long) cs->c_sclass,
939                    sec, NULL, objfile);
940                 if (msym)
941                   COFF_MAKE_MSYMBOL_SPECIAL (cs->c_sclass, msym);
942               }
943             if (SDB_TYPE (cs->c_type))
944               {
945                 struct symbol *sym;
946                 sym = process_coff_symbol
947                   (cs, &main_aux, objfile);
948                 SYMBOL_VALUE (sym) = tmpaddr;
949                 SYMBOL_SECTION (sym) = sec;
950               }
951           }
952           break;
953
954         case C_FCN:
955           if (STREQ (cs->c_name, ".bf"))
956             {
957               within_function = 1;
958
959               /* value contains address of first non-init type code */
960               /* main_aux.x_sym.x_misc.x_lnsz.x_lnno
961                  contains line number of '{' } */
962               if (cs->c_naux != 1)
963                 complaint (&symfile_complaints,
964                            "`.bf' symbol %d has no aux entry", cs->c_symnum);
965               fcn_first_line = main_aux.x_sym.x_misc.x_lnsz.x_lnno;
966               fcn_first_line_addr = cs->c_value;
967
968               /* Might want to check that locals are 0 and
969                  context_stack_depth is zero, and complain if not.  */
970
971               depth = 0;
972               new = push_context (depth, fcn_start_addr);
973               fcn_cs_saved.c_name = getsymname (&fcn_sym_saved);
974               new->name =
975                 process_coff_symbol (&fcn_cs_saved, &fcn_aux_saved, objfile);
976             }
977           else if (STREQ (cs->c_name, ".ef"))
978             {
979               if (!within_function)
980                 error ("Bad coff function information\n");
981               /* the value of .ef is the address of epilogue code;
982                  not useful for gdb.  */
983               /* { main_aux.x_sym.x_misc.x_lnsz.x_lnno
984                  contains number of lines to '}' */
985
986               if (context_stack_depth <= 0)
987                 {               /* We attempted to pop an empty context stack */
988                   complaint (&symfile_complaints,
989                              "`.ef' symbol without matching `.bf' symbol ignored starting at symnum %d",
990                              cs->c_symnum);
991                   within_function = 0;
992                   break;
993                 }
994
995               new = pop_context ();
996               /* Stack must be empty now.  */
997               if (context_stack_depth > 0 || new == NULL)
998                 {
999                   complaint (&symfile_complaints,
1000                              "Unmatched .ef symbol(s) ignored starting at symnum %d",
1001                              cs->c_symnum);
1002                   within_function = 0;
1003                   break;
1004                 }
1005               if (cs->c_naux != 1)
1006                 {
1007                   complaint (&symfile_complaints,
1008                              "`.ef' symbol %d has no aux entry", cs->c_symnum);
1009                   fcn_last_line = 0x7FFFFFFF;
1010                 }
1011               else
1012                 {
1013                   fcn_last_line = main_aux.x_sym.x_misc.x_lnsz.x_lnno;
1014                 }
1015               /* fcn_first_line is the line number of the opening '{'.
1016                  Do not record it - because it would affect gdb's idea
1017                  of the line number of the first statement of the function -
1018                  except for one-line functions, for which it is also the line
1019                  number of all the statements and of the closing '}', and
1020                  for which we do not have any other statement-line-number. */
1021               if (fcn_last_line == 1)
1022                 record_line (current_subfile, fcn_first_line,
1023                              fcn_first_line_addr);
1024               else
1025                 enter_linenos (fcn_line_ptr, fcn_first_line, fcn_last_line,
1026                                objfile);
1027
1028               finish_block (new->name, &local_symbols, new->old_blocks,
1029                             new->start_addr,
1030 #if defined (FUNCTION_EPILOGUE_SIZE)
1031               /* This macro should be defined only on
1032                  machines where the
1033                  fcn_aux_saved.x_sym.x_misc.x_fsize
1034                  field is always zero.
1035                  So use the .bf record information that
1036                  points to the epilogue and add the size
1037                  of the epilogue.  */
1038                             cs->c_value
1039                             + FUNCTION_EPILOGUE_SIZE
1040                             + ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)),
1041 #else
1042                             fcn_cs_saved.c_value
1043                             + fcn_aux_saved.x_sym.x_misc.x_fsize
1044                             + ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)),
1045 #endif
1046                             objfile
1047                 );
1048               within_function = 0;
1049             }
1050           break;
1051
1052         case C_BLOCK:
1053           if (STREQ (cs->c_name, ".bb"))
1054             {
1055               tmpaddr = cs->c_value;
1056               tmpaddr += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
1057               push_context (++depth, tmpaddr);
1058             }
1059           else if (STREQ (cs->c_name, ".eb"))
1060             {
1061               if (context_stack_depth <= 0)
1062                 {               /* We attempted to pop an empty context stack */
1063                   complaint (&symfile_complaints,
1064                              "`.eb' symbol without matching `.bb' symbol ignored starting at symnum %d",
1065                              cs->c_symnum);
1066                   break;
1067                 }
1068
1069               new = pop_context ();
1070               if (depth-- != new->depth)
1071                 {
1072                   complaint (&symfile_complaints,
1073                              "Mismatched .eb symbol ignored starting at symnum %d",
1074                              symnum);
1075                   break;
1076                 }
1077               if (local_symbols && context_stack_depth > 0)
1078                 {
1079                   tmpaddr =
1080                     cs->c_value + ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
1081                   /* Make a block for the local symbols within.  */
1082                   finish_block (0, &local_symbols, new->old_blocks,
1083                                 new->start_addr, tmpaddr, objfile);
1084                 }
1085               /* Now pop locals of block just finished.  */
1086               local_symbols = new->locals;
1087             }
1088           break;
1089
1090         default:
1091           process_coff_symbol (cs, &main_aux, objfile);
1092           break;
1093         }
1094     }
1095
1096   if ((nsyms == 0) && (pe_file))
1097     {
1098       /* We've got no debugging symbols, but it's is a portable
1099          executable, so try to read the export table */
1100       read_pe_exported_syms (objfile);
1101     }
1102
1103   if (last_source_file)
1104     coff_end_symtab (objfile);
1105
1106   /* Patch up any opaque types (references to types that are not defined
1107      in the file where they are referenced, e.g. "struct foo *bar").  */
1108   ALL_OBJFILE_SYMTABS (objfile, s)
1109     patch_opaque_types (s);
1110
1111   current_objfile = NULL;
1112 }
1113 \f
1114 /* Routines for reading headers and symbols from executable.  */
1115
1116 /* Read the next symbol, swap it, and return it in both internal_syment
1117    form, and coff_symbol form.  Also return its first auxent, if any,
1118    in internal_auxent form, and skip any other auxents.  */
1119
1120 static void
1121 read_one_sym (register struct coff_symbol *cs,
1122               register struct internal_syment *sym,
1123               register union internal_auxent *aux)
1124 {
1125   int i;
1126
1127   cs->c_symnum = symnum;
1128   bfd_bread (temp_sym, local_symesz, nlist_bfd_global);
1129   bfd_coff_swap_sym_in (symfile_bfd, temp_sym, (char *) sym);
1130   cs->c_naux = sym->n_numaux & 0xff;
1131   if (cs->c_naux >= 1)
1132     {
1133       bfd_bread (temp_aux, local_auxesz, nlist_bfd_global);
1134       bfd_coff_swap_aux_in (symfile_bfd, temp_aux, sym->n_type, sym->n_sclass,
1135                             0, cs->c_naux, (char *) aux);
1136       /* If more than one aux entry, read past it (only the first aux
1137          is important). */
1138       for (i = 1; i < cs->c_naux; i++)
1139         bfd_bread (temp_aux, local_auxesz, nlist_bfd_global);
1140     }
1141   cs->c_name = getsymname (sym);
1142   cs->c_value = sym->n_value;
1143   cs->c_sclass = (sym->n_sclass & 0xff);
1144   cs->c_secnum = sym->n_scnum;
1145   cs->c_type = (unsigned) sym->n_type;
1146   if (!SDB_TYPE (cs->c_type))
1147     cs->c_type = 0;
1148
1149 #if 0
1150   if (cs->c_sclass & 128)
1151     printf ("thumb symbol %s, class 0x%x\n", cs->c_name, cs->c_sclass);
1152 #endif
1153
1154   symnum += 1 + cs->c_naux;
1155
1156   /* The PE file format stores symbol values as offsets within the
1157      section, rather than as absolute addresses.  We correct that
1158      here, if the symbol has an appropriate storage class.  FIXME: We
1159      should use BFD to read the symbols, rather than duplicating the
1160      work here.  */
1161   if (pe_file)
1162     {
1163       switch (cs->c_sclass)
1164         {
1165         case C_EXT:
1166         case C_THUMBEXT:
1167         case C_THUMBEXTFUNC:
1168         case C_SECTION:
1169         case C_NT_WEAK:
1170         case C_STAT:
1171         case C_THUMBSTAT:
1172         case C_THUMBSTATFUNC:
1173         case C_LABEL:
1174         case C_THUMBLABEL:
1175         case C_BLOCK:
1176         case C_FCN:
1177         case C_EFCN:
1178           if (cs->c_secnum != 0)
1179             cs->c_value += cs_section_address (cs, symfile_bfd);
1180           break;
1181         }
1182     }
1183 }
1184 \f
1185 /* Support for string table handling */
1186
1187 static char *stringtab = NULL;
1188
1189 static int
1190 init_stringtab (bfd *abfd, long offset)
1191 {
1192   long length;
1193   int val;
1194   unsigned char lengthbuf[4];
1195
1196   free_stringtab ();
1197
1198   /* If the file is stripped, the offset might be zero, indicating no
1199      string table.  Just return with `stringtab' set to null. */
1200   if (offset == 0)
1201     return 0;
1202
1203   if (bfd_seek (abfd, offset, 0) < 0)
1204     return -1;
1205
1206   val = bfd_bread ((char *) lengthbuf, sizeof lengthbuf, abfd);
1207   length = bfd_h_get_32 (symfile_bfd, lengthbuf);
1208
1209   /* If no string table is needed, then the file may end immediately
1210      after the symbols.  Just return with `stringtab' set to null. */
1211   if (val != sizeof lengthbuf || length < sizeof lengthbuf)
1212     return 0;
1213
1214   stringtab = (char *) xmalloc (length);
1215   /* This is in target format (probably not very useful, and not currently
1216      used), not host format.  */
1217   memcpy (stringtab, lengthbuf, sizeof lengthbuf);
1218   if (length == sizeof length)  /* Empty table -- just the count */
1219     return 0;
1220
1221   val = bfd_bread (stringtab + sizeof lengthbuf, length - sizeof lengthbuf,
1222                    abfd);
1223   if (val != length - sizeof lengthbuf || stringtab[length - 1] != '\0')
1224     return -1;
1225
1226   return 0;
1227 }
1228
1229 static void
1230 free_stringtab (void)
1231 {
1232   if (stringtab)
1233     xfree (stringtab);
1234   stringtab = NULL;
1235 }
1236
1237 static void
1238 free_stringtab_cleanup (void *ignore)
1239 {
1240   free_stringtab ();
1241 }
1242
1243 static char *
1244 getsymname (struct internal_syment *symbol_entry)
1245 {
1246   static char buffer[SYMNMLEN + 1];
1247   char *result;
1248
1249   if (symbol_entry->_n._n_n._n_zeroes == 0)
1250     {
1251       /* FIXME: Probably should be detecting corrupt symbol files by
1252          seeing whether offset points to within the stringtab.  */
1253       result = stringtab + symbol_entry->_n._n_n._n_offset;
1254     }
1255   else
1256     {
1257       strncpy (buffer, symbol_entry->_n._n_name, SYMNMLEN);
1258       buffer[SYMNMLEN] = '\0';
1259       result = buffer;
1260     }
1261   return result;
1262 }
1263
1264 /* Extract the file name from the aux entry of a C_FILE symbol.  Return
1265    only the last component of the name.  Result is in static storage and
1266    is only good for temporary use.  */
1267
1268 static char *
1269 coff_getfilename (union internal_auxent *aux_entry)
1270 {
1271   static char buffer[BUFSIZ];
1272   register char *temp;
1273   char *result;
1274
1275   if (aux_entry->x_file.x_n.x_zeroes == 0)
1276     strcpy (buffer, stringtab + aux_entry->x_file.x_n.x_offset);
1277   else
1278     {
1279       strncpy (buffer, aux_entry->x_file.x_fname, FILNMLEN);
1280       buffer[FILNMLEN] = '\0';
1281     }
1282   result = buffer;
1283
1284   /* FIXME: We should not be throwing away the information about what
1285      directory.  It should go into dirname of the symtab, or some such
1286      place.  */
1287   if ((temp = strrchr (result, '/')) != NULL)
1288     result = temp + 1;
1289   return (result);
1290 }
1291 \f
1292 /* Support for line number handling.  */
1293
1294 static char *linetab = NULL;
1295 static long linetab_offset;
1296 static unsigned long linetab_size;
1297
1298 /* Read in all the line numbers for fast lookups later.  Leave them in
1299    external (unswapped) format in memory; we'll swap them as we enter
1300    them into GDB's data structures.  */
1301
1302 static int
1303 init_lineno (bfd *abfd, long offset, int size)
1304 {
1305   int val;
1306
1307   linetab_offset = offset;
1308   linetab_size = size;
1309
1310   free_linetab ();
1311
1312   if (size == 0)
1313     return 0;
1314
1315   if (bfd_seek (abfd, offset, 0) < 0)
1316     return -1;
1317
1318   /* Allocate the desired table, plus a sentinel */
1319   linetab = (char *) xmalloc (size + local_linesz);
1320
1321   val = bfd_bread (linetab, size, abfd);
1322   if (val != size)
1323     return -1;
1324
1325   /* Terminate it with an all-zero sentinel record */
1326   memset (linetab + size, 0, local_linesz);
1327
1328   return 0;
1329 }
1330
1331 static void
1332 free_linetab (void)
1333 {
1334   if (linetab)
1335     xfree (linetab);
1336   linetab = NULL;
1337 }
1338
1339 static void
1340 free_linetab_cleanup (void *ignore)
1341 {
1342   free_linetab ();
1343 }
1344
1345 #if !defined (L_LNNO32)
1346 #define L_LNNO32(lp) ((lp)->l_lnno)
1347 #endif
1348
1349 static void
1350 enter_linenos (long file_offset, register int first_line,
1351                register int last_line, struct objfile *objfile)
1352 {
1353   register char *rawptr;
1354   struct internal_lineno lptr;
1355
1356   if (!linetab)
1357     return;
1358   if (file_offset < linetab_offset)
1359     {
1360       complaint (&symfile_complaints,
1361                  "Line number pointer %ld lower than start of line numbers",
1362                  file_offset);
1363       if (file_offset > linetab_size)   /* Too big to be an offset? */
1364         return;
1365       file_offset += linetab_offset;    /* Try reading at that linetab offset */
1366     }
1367
1368   rawptr = &linetab[file_offset - linetab_offset];
1369
1370   /* skip first line entry for each function */
1371   rawptr += local_linesz;
1372   /* line numbers start at one for the first line of the function */
1373   first_line--;
1374
1375   for (;;)
1376     {
1377       bfd_coff_swap_lineno_in (symfile_bfd, rawptr, &lptr);
1378       rawptr += local_linesz;
1379       /* The next function, or the sentinel, will have L_LNNO32 zero; we exit. */
1380       if (L_LNNO32 (&lptr) && L_LNNO32 (&lptr) <= last_line)
1381         record_line (current_subfile, first_line + L_LNNO32 (&lptr),
1382                      lptr.l_addr.l_paddr
1383                      + ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)));
1384       else
1385         break;
1386     }
1387 }
1388 \f
1389 static void
1390 patch_type (struct type *type, struct type *real_type)
1391 {
1392   register struct type *target = TYPE_TARGET_TYPE (type);
1393   register struct type *real_target = TYPE_TARGET_TYPE (real_type);
1394   int field_size = TYPE_NFIELDS (real_target) * sizeof (struct field);
1395
1396   TYPE_LENGTH (target) = TYPE_LENGTH (real_target);
1397   TYPE_NFIELDS (target) = TYPE_NFIELDS (real_target);
1398   TYPE_FIELDS (target) = (struct field *) TYPE_ALLOC (target, field_size);
1399
1400   memcpy (TYPE_FIELDS (target), TYPE_FIELDS (real_target), field_size);
1401
1402   if (TYPE_NAME (real_target))
1403     {
1404       if (TYPE_NAME (target))
1405         xfree (TYPE_NAME (target));
1406       TYPE_NAME (target) = concat (TYPE_NAME (real_target), NULL);
1407     }
1408 }
1409
1410 /* Patch up all appropriate typedef symbols in the opaque_type_chains
1411    so that they can be used to print out opaque data structures properly.  */
1412
1413 static void
1414 patch_opaque_types (struct symtab *s)
1415 {
1416   register struct block *b;
1417   register int i;
1418   register struct symbol *real_sym;
1419
1420   /* Go through the per-file symbols only */
1421   b = BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), STATIC_BLOCK);
1422   ALL_BLOCK_SYMBOLS (b, i, real_sym)
1423     {
1424       /* Find completed typedefs to use to fix opaque ones.
1425          Remove syms from the chain when their types are stored,
1426          but search the whole chain, as there may be several syms
1427          from different files with the same name.  */
1428       if (SYMBOL_CLASS (real_sym) == LOC_TYPEDEF &&
1429           SYMBOL_DOMAIN (real_sym) == VAR_DOMAIN &&
1430           TYPE_CODE (SYMBOL_TYPE (real_sym)) == TYPE_CODE_PTR &&
1431           TYPE_LENGTH (TYPE_TARGET_TYPE (SYMBOL_TYPE (real_sym))) != 0)
1432         {
1433           register char *name = DEPRECATED_SYMBOL_NAME (real_sym);
1434           register int hash = hashname (name);
1435           register struct symbol *sym, *prev;
1436
1437           prev = 0;
1438           for (sym = opaque_type_chain[hash]; sym;)
1439             {
1440               if (name[0] == DEPRECATED_SYMBOL_NAME (sym)[0] &&
1441                   STREQ (name + 1, DEPRECATED_SYMBOL_NAME (sym) + 1))
1442                 {
1443                   if (prev)
1444                     {
1445                       SYMBOL_VALUE_CHAIN (prev) = SYMBOL_VALUE_CHAIN (sym);
1446                     }
1447                   else
1448                     {
1449                       opaque_type_chain[hash] = SYMBOL_VALUE_CHAIN (sym);
1450                     }
1451
1452                   patch_type (SYMBOL_TYPE (sym), SYMBOL_TYPE (real_sym));
1453
1454                   if (prev)
1455                     {
1456                       sym = SYMBOL_VALUE_CHAIN (prev);
1457                     }
1458                   else
1459                     {
1460                       sym = opaque_type_chain[hash];
1461                     }
1462                 }
1463               else
1464                 {
1465                   prev = sym;
1466                   sym = SYMBOL_VALUE_CHAIN (sym);
1467                 }
1468             }
1469         }
1470     }
1471 }
1472 \f
1473 static struct symbol *
1474 process_coff_symbol (register struct coff_symbol *cs,
1475                      register union internal_auxent *aux,
1476                      struct objfile *objfile)
1477 {
1478   register struct symbol *sym
1479   = (struct symbol *) obstack_alloc (&objfile->symbol_obstack,
1480                                      sizeof (struct symbol));
1481   char *name;
1482
1483   memset (sym, 0, sizeof (struct symbol));
1484   name = cs->c_name;
1485   name = EXTERNAL_NAME (name, objfile->obfd);
1486   SYMBOL_LANGUAGE (sym) = language_auto;
1487   SYMBOL_SET_NAMES (sym, name, strlen (name), objfile);
1488
1489   /* default assumptions */
1490   SYMBOL_VALUE (sym) = cs->c_value;
1491   SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
1492   SYMBOL_SECTION (sym) = cs_to_section (cs, objfile);
1493
1494   if (ISFCN (cs->c_type))
1495     {
1496       SYMBOL_VALUE (sym) += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
1497       SYMBOL_TYPE (sym) =
1498         lookup_function_type (decode_function_type (cs, cs->c_type, aux));
1499
1500       SYMBOL_CLASS (sym) = LOC_BLOCK;
1501       if (cs->c_sclass == C_STAT || cs->c_sclass == C_THUMBSTAT
1502           || cs->c_sclass == C_THUMBSTATFUNC)
1503         add_symbol_to_list (sym, &file_symbols);
1504       else if (cs->c_sclass == C_EXT || cs->c_sclass == C_THUMBEXT
1505                || cs->c_sclass == C_THUMBEXTFUNC)
1506         add_symbol_to_list (sym, &global_symbols);
1507     }
1508   else
1509     {
1510       SYMBOL_TYPE (sym) = decode_type (cs, cs->c_type, aux);
1511       switch (cs->c_sclass)
1512         {
1513         case C_NULL:
1514           break;
1515
1516         case C_AUTO:
1517           SYMBOL_CLASS (sym) = LOC_LOCAL;
1518           add_symbol_to_list (sym, &local_symbols);
1519           break;
1520
1521         case C_THUMBEXT:
1522         case C_THUMBEXTFUNC:
1523         case C_EXT:
1524           SYMBOL_CLASS (sym) = LOC_STATIC;
1525           SYMBOL_VALUE_ADDRESS (sym) = (CORE_ADDR) cs->c_value;
1526           SYMBOL_VALUE_ADDRESS (sym) += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
1527           add_symbol_to_list (sym, &global_symbols);
1528           break;
1529
1530         case C_THUMBSTAT:
1531         case C_THUMBSTATFUNC:
1532         case C_STAT:
1533           SYMBOL_CLASS (sym) = LOC_STATIC;
1534           SYMBOL_VALUE_ADDRESS (sym) = (CORE_ADDR) cs->c_value;
1535           SYMBOL_VALUE_ADDRESS (sym) += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
1536           if (within_function)
1537             {
1538               /* Static symbol of local scope */
1539               add_symbol_to_list (sym, &local_symbols);
1540             }
1541           else
1542             {
1543               /* Static symbol at top level of file */
1544               add_symbol_to_list (sym, &file_symbols);
1545             }
1546           break;
1547
1548 #ifdef C_GLBLREG                /* AMD coff */
1549         case C_GLBLREG:
1550 #endif
1551         case C_REG:
1552           SYMBOL_CLASS (sym) = LOC_REGISTER;
1553           SYMBOL_VALUE (sym) = SDB_REG_TO_REGNUM (cs->c_value);
1554           add_symbol_to_list (sym, &local_symbols);
1555           break;
1556
1557         case C_THUMBLABEL:
1558         case C_LABEL:
1559           break;
1560
1561         case C_ARG:
1562           SYMBOL_CLASS (sym) = LOC_ARG;
1563           add_symbol_to_list (sym, &local_symbols);
1564 #if !defined (BELIEVE_PCC_PROMOTION)
1565           if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
1566             {
1567               /* If PCC says a parameter is a short or a char,
1568                  aligned on an int boundary, realign it to the
1569                  "little end" of the int.  */
1570               struct type *temptype;
1571               temptype = lookup_fundamental_type (current_objfile,
1572                                                   FT_INTEGER);
1573               if (TYPE_LENGTH (SYMBOL_TYPE (sym)) < TYPE_LENGTH (temptype)
1574                   && TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_INT
1575                   && 0 == SYMBOL_VALUE (sym) % TYPE_LENGTH (temptype))
1576                 {
1577                   SYMBOL_VALUE (sym) +=
1578                     TYPE_LENGTH (temptype)
1579                     - TYPE_LENGTH (SYMBOL_TYPE (sym));
1580                 }
1581             }
1582 #endif
1583           break;
1584
1585         case C_REGPARM:
1586           SYMBOL_CLASS (sym) = LOC_REGPARM;
1587           SYMBOL_VALUE (sym) = SDB_REG_TO_REGNUM (cs->c_value);
1588           add_symbol_to_list (sym, &local_symbols);
1589 #if !defined (BELIEVE_PCC_PROMOTION)
1590           /* FIXME:  This should retain the current type, since it's just
1591              a register value.  gnu@adobe, 26Feb93 */
1592           {
1593             /* If PCC says a parameter is a short or a char,
1594                it is really an int.  */
1595             struct type *temptype;
1596             temptype =
1597               lookup_fundamental_type (current_objfile, FT_INTEGER);
1598             if (TYPE_LENGTH (SYMBOL_TYPE (sym)) < TYPE_LENGTH (temptype)
1599                 && TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_INT)
1600               {
1601                 SYMBOL_TYPE (sym) =
1602                   (TYPE_UNSIGNED (SYMBOL_TYPE (sym))
1603                    ? lookup_fundamental_type (current_objfile,
1604                                               FT_UNSIGNED_INTEGER)
1605                    : temptype);
1606               }
1607           }
1608 #endif
1609           break;
1610
1611         case C_TPDEF:
1612           SYMBOL_CLASS (sym) = LOC_TYPEDEF;
1613           SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
1614
1615           /* If type has no name, give it one */
1616           if (TYPE_NAME (SYMBOL_TYPE (sym)) == 0)
1617             {
1618               if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_PTR
1619                   || TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_FUNC)
1620                 {
1621                   /* If we are giving a name to a type such as "pointer to
1622                      foo" or "function returning foo", we better not set
1623                      the TYPE_NAME.  If the program contains "typedef char
1624                      *caddr_t;", we don't want all variables of type char
1625                      * to print as caddr_t.  This is not just a
1626                      consequence of GDB's type management; CC and GCC (at
1627                      least through version 2.4) both output variables of
1628                      either type char * or caddr_t with the type
1629                      refering to the C_TPDEF symbol for caddr_t.  If a future
1630                      compiler cleans this up it GDB is not ready for it
1631                      yet, but if it becomes ready we somehow need to
1632                      disable this check (without breaking the PCC/GCC2.4
1633                      case).
1634
1635                      Sigh.
1636
1637                      Fortunately, this check seems not to be necessary
1638                      for anything except pointers or functions.  */
1639                   ;
1640                 }
1641               else
1642                 TYPE_NAME (SYMBOL_TYPE (sym)) =
1643                   concat (DEPRECATED_SYMBOL_NAME (sym), NULL);
1644             }
1645 #ifdef CXUX_TARGET
1646           /* Ignore vendor section for Harris CX/UX targets. */
1647           else if (cs->c_name[0] == '$')
1648             break;
1649 #endif /* CXUX_TARGET */
1650
1651           /* Keep track of any type which points to empty structured type,
1652              so it can be filled from a definition from another file.  A
1653              simple forward reference (TYPE_CODE_UNDEF) is not an
1654              empty structured type, though; the forward references
1655              work themselves out via the magic of coff_lookup_type.  */
1656           if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_PTR &&
1657               TYPE_LENGTH (TYPE_TARGET_TYPE (SYMBOL_TYPE (sym))) == 0 &&
1658               TYPE_CODE (TYPE_TARGET_TYPE (SYMBOL_TYPE (sym))) !=
1659               TYPE_CODE_UNDEF)
1660             {
1661               register int i = hashname (DEPRECATED_SYMBOL_NAME (sym));
1662
1663               SYMBOL_VALUE_CHAIN (sym) = opaque_type_chain[i];
1664               opaque_type_chain[i] = sym;
1665             }
1666           add_symbol_to_list (sym, &file_symbols);
1667           break;
1668
1669         case C_STRTAG:
1670         case C_UNTAG:
1671         case C_ENTAG:
1672           SYMBOL_CLASS (sym) = LOC_TYPEDEF;
1673           SYMBOL_DOMAIN (sym) = STRUCT_DOMAIN;
1674
1675           /* Some compilers try to be helpful by inventing "fake"
1676              names for anonymous enums, structures, and unions, like
1677              "~0fake" or ".0fake".  Thanks, but no thanks... */
1678           if (TYPE_TAG_NAME (SYMBOL_TYPE (sym)) == 0)
1679             if (DEPRECATED_SYMBOL_NAME (sym) != NULL
1680                 && *DEPRECATED_SYMBOL_NAME (sym) != '~'
1681                 && *DEPRECATED_SYMBOL_NAME (sym) != '.')
1682               TYPE_TAG_NAME (SYMBOL_TYPE (sym)) =
1683                 concat (DEPRECATED_SYMBOL_NAME (sym), NULL);
1684
1685           add_symbol_to_list (sym, &file_symbols);
1686           break;
1687
1688         default:
1689           break;
1690         }
1691     }
1692   return sym;
1693 }
1694 \f
1695 /* Decode a coff type specifier;  return the type that is meant.  */
1696
1697 static struct type *
1698 decode_type (register struct coff_symbol *cs, unsigned int c_type,
1699              register union internal_auxent *aux)
1700 {
1701   register struct type *type = 0;
1702   unsigned int new_c_type;
1703
1704   if (c_type & ~N_BTMASK)
1705     {
1706       new_c_type = DECREF (c_type);
1707       if (ISPTR (c_type))
1708         {
1709           type = decode_type (cs, new_c_type, aux);
1710           type = lookup_pointer_type (type);
1711         }
1712       else if (ISFCN (c_type))
1713         {
1714           type = decode_type (cs, new_c_type, aux);
1715           type = lookup_function_type (type);
1716         }
1717       else if (ISARY (c_type))
1718         {
1719           int i, n;
1720           register unsigned short *dim;
1721           struct type *base_type, *index_type, *range_type;
1722
1723           /* Define an array type.  */
1724           /* auxent refers to array, not base type */
1725           if (aux->x_sym.x_tagndx.l == 0)
1726             cs->c_naux = 0;
1727
1728           /* shift the indices down */
1729           dim = &aux->x_sym.x_fcnary.x_ary.x_dimen[0];
1730           i = 1;
1731           n = dim[0];
1732           for (i = 0; *dim && i < DIMNUM - 1; i++, dim++)
1733             *dim = *(dim + 1);
1734           *dim = 0;
1735
1736           base_type = decode_type (cs, new_c_type, aux);
1737           index_type = lookup_fundamental_type (current_objfile, FT_INTEGER);
1738           range_type =
1739             create_range_type ((struct type *) NULL, index_type, 0, n - 1);
1740           type =
1741             create_array_type ((struct type *) NULL, base_type, range_type);
1742         }
1743       return type;
1744     }
1745
1746   /* Reference to existing type.  This only occurs with the
1747      struct, union, and enum types.  EPI a29k coff
1748      fakes us out by producing aux entries with a nonzero
1749      x_tagndx for definitions of structs, unions, and enums, so we
1750      have to check the c_sclass field.  SCO 3.2v4 cc gets confused
1751      with pointers to pointers to defined structs, and generates
1752      negative x_tagndx fields.  */
1753   if (cs->c_naux > 0 && aux->x_sym.x_tagndx.l != 0)
1754     {
1755       if (cs->c_sclass != C_STRTAG
1756           && cs->c_sclass != C_UNTAG
1757           && cs->c_sclass != C_ENTAG
1758           && aux->x_sym.x_tagndx.l >= 0)
1759         {
1760           type = coff_alloc_type (aux->x_sym.x_tagndx.l);
1761           return type;
1762         }
1763       else
1764         {
1765           complaint (&symfile_complaints,
1766                      "Symbol table entry for %s has bad tagndx value",
1767                      cs->c_name);
1768           /* And fall through to decode_base_type... */
1769         }
1770     }
1771
1772   return decode_base_type (cs, BTYPE (c_type), aux);
1773 }
1774
1775 /* Decode a coff type specifier for function definition;
1776    return the type that the function returns.  */
1777
1778 static struct type *
1779 decode_function_type (register struct coff_symbol *cs, unsigned int c_type,
1780                       register union internal_auxent *aux)
1781 {
1782   if (aux->x_sym.x_tagndx.l == 0)
1783     cs->c_naux = 0;             /* auxent refers to function, not base type */
1784
1785   return decode_type (cs, DECREF (c_type), aux);
1786 }
1787 \f
1788 /* basic C types */
1789
1790 static struct type *
1791 decode_base_type (register struct coff_symbol *cs, unsigned int c_type,
1792                   register union internal_auxent *aux)
1793 {
1794   struct type *type;
1795
1796   switch (c_type)
1797     {
1798     case T_NULL:
1799       /* shows up with "void (*foo)();" structure members */
1800       return lookup_fundamental_type (current_objfile, FT_VOID);
1801
1802 #if 0
1803 /* DGUX actually defines both T_ARG and T_VOID to the same value.  */
1804 #ifdef T_ARG
1805     case T_ARG:
1806       /* Shows up in DGUX, I think.  Not sure where.  */
1807       return lookup_fundamental_type (current_objfile, FT_VOID);        /* shouldn't show up here */
1808 #endif
1809 #endif /* 0 */
1810
1811 #ifdef T_VOID
1812     case T_VOID:
1813       /* Intel 960 COFF has this symbol and meaning.  */
1814       return lookup_fundamental_type (current_objfile, FT_VOID);
1815 #endif
1816
1817     case T_CHAR:
1818       return lookup_fundamental_type (current_objfile, FT_CHAR);
1819
1820     case T_SHORT:
1821       return lookup_fundamental_type (current_objfile, FT_SHORT);
1822
1823     case T_INT:
1824       return lookup_fundamental_type (current_objfile, FT_INTEGER);
1825
1826     case T_LONG:
1827       if (cs->c_sclass == C_FIELD
1828           && aux->x_sym.x_misc.x_lnsz.x_size > TARGET_LONG_BIT)
1829         return lookup_fundamental_type (current_objfile, FT_LONG_LONG);
1830       else
1831         return lookup_fundamental_type (current_objfile, FT_LONG);
1832
1833     case T_FLOAT:
1834       return lookup_fundamental_type (current_objfile, FT_FLOAT);
1835
1836     case T_DOUBLE:
1837       return lookup_fundamental_type (current_objfile, FT_DBL_PREC_FLOAT);
1838
1839     case T_LNGDBL:
1840       return lookup_fundamental_type (current_objfile, FT_EXT_PREC_FLOAT);
1841
1842     case T_STRUCT:
1843       if (cs->c_naux != 1)
1844         {
1845           /* anonymous structure type */
1846           type = coff_alloc_type (cs->c_symnum);
1847           TYPE_CODE (type) = TYPE_CODE_STRUCT;
1848           TYPE_NAME (type) = NULL;
1849           /* This used to set the tag to "<opaque>".  But I think setting it
1850              to NULL is right, and the printing code can print it as
1851              "struct {...}".  */
1852           TYPE_TAG_NAME (type) = NULL;
1853           INIT_CPLUS_SPECIFIC (type);
1854           TYPE_LENGTH (type) = 0;
1855           TYPE_FIELDS (type) = 0;
1856           TYPE_NFIELDS (type) = 0;
1857         }
1858       else
1859         {
1860           type = coff_read_struct_type (cs->c_symnum,
1861                                         aux->x_sym.x_misc.x_lnsz.x_size,
1862                                       aux->x_sym.x_fcnary.x_fcn.x_endndx.l);
1863         }
1864       return type;
1865
1866     case T_UNION:
1867       if (cs->c_naux != 1)
1868         {
1869           /* anonymous union type */
1870           type = coff_alloc_type (cs->c_symnum);
1871           TYPE_NAME (type) = NULL;
1872           /* This used to set the tag to "<opaque>".  But I think setting it
1873              to NULL is right, and the printing code can print it as
1874              "union {...}".  */
1875           TYPE_TAG_NAME (type) = NULL;
1876           INIT_CPLUS_SPECIFIC (type);
1877           TYPE_LENGTH (type) = 0;
1878           TYPE_FIELDS (type) = 0;
1879           TYPE_NFIELDS (type) = 0;
1880         }
1881       else
1882         {
1883           type = coff_read_struct_type (cs->c_symnum,
1884                                         aux->x_sym.x_misc.x_lnsz.x_size,
1885                                       aux->x_sym.x_fcnary.x_fcn.x_endndx.l);
1886         }
1887       TYPE_CODE (type) = TYPE_CODE_UNION;
1888       return type;
1889
1890     case T_ENUM:
1891       if (cs->c_naux != 1)
1892         {
1893           /* anonymous enum type */
1894           type = coff_alloc_type (cs->c_symnum);
1895           TYPE_CODE (type) = TYPE_CODE_ENUM;
1896           TYPE_NAME (type) = NULL;
1897           /* This used to set the tag to "<opaque>".  But I think setting it
1898              to NULL is right, and the printing code can print it as
1899              "enum {...}".  */
1900           TYPE_TAG_NAME (type) = NULL;
1901           TYPE_LENGTH (type) = 0;
1902           TYPE_FIELDS (type) = 0;
1903           TYPE_NFIELDS (type) = 0;
1904         }
1905       else
1906         {
1907           type = coff_read_enum_type (cs->c_symnum,
1908                                       aux->x_sym.x_misc.x_lnsz.x_size,
1909                                       aux->x_sym.x_fcnary.x_fcn.x_endndx.l);
1910         }
1911       return type;
1912
1913     case T_MOE:
1914       /* shouldn't show up here */
1915       break;
1916
1917     case T_UCHAR:
1918       return lookup_fundamental_type (current_objfile, FT_UNSIGNED_CHAR);
1919
1920     case T_USHORT:
1921       return lookup_fundamental_type (current_objfile, FT_UNSIGNED_SHORT);
1922
1923     case T_UINT:
1924       return lookup_fundamental_type (current_objfile, FT_UNSIGNED_INTEGER);
1925
1926     case T_ULONG:
1927       if (cs->c_sclass == C_FIELD
1928           && aux->x_sym.x_misc.x_lnsz.x_size > TARGET_LONG_BIT)
1929         return lookup_fundamental_type (current_objfile, FT_UNSIGNED_LONG_LONG);
1930       else
1931         return lookup_fundamental_type (current_objfile, FT_UNSIGNED_LONG);
1932     }
1933   complaint (&symfile_complaints, "Unexpected type for symbol %s", cs->c_name);
1934   return lookup_fundamental_type (current_objfile, FT_VOID);
1935 }
1936 \f
1937 /* This page contains subroutines of read_type.  */
1938
1939 /* Read the description of a structure (or union type) and return an
1940    object describing the type.  */
1941
1942 static struct type *
1943 coff_read_struct_type (int index, int length, int lastsym)
1944 {
1945   struct nextfield
1946     {
1947       struct nextfield *next;
1948       struct field field;
1949     };
1950
1951   register struct type *type;
1952   register struct nextfield *list = 0;
1953   struct nextfield *new;
1954   int nfields = 0;
1955   register int n;
1956   char *name;
1957   struct coff_symbol member_sym;
1958   register struct coff_symbol *ms = &member_sym;
1959   struct internal_syment sub_sym;
1960   union internal_auxent sub_aux;
1961   int done = 0;
1962
1963   type = coff_alloc_type (index);
1964   TYPE_CODE (type) = TYPE_CODE_STRUCT;
1965   INIT_CPLUS_SPECIFIC (type);
1966   TYPE_LENGTH (type) = length;
1967
1968   while (!done && symnum < lastsym && symnum < nlist_nsyms_global)
1969     {
1970       read_one_sym (ms, &sub_sym, &sub_aux);
1971       name = ms->c_name;
1972       name = EXTERNAL_NAME (name, current_objfile->obfd);
1973
1974       switch (ms->c_sclass)
1975         {
1976         case C_MOS:
1977         case C_MOU:
1978
1979           /* Get space to record the next field's data.  */
1980           new = (struct nextfield *) alloca (sizeof (struct nextfield));
1981           new->next = list;
1982           list = new;
1983
1984           /* Save the data.  */
1985           list->field.name =
1986             obsavestring (name,
1987                           strlen (name),
1988                           &current_objfile->symbol_obstack);
1989           FIELD_TYPE (list->field) = decode_type (ms, ms->c_type, &sub_aux);
1990           FIELD_BITPOS (list->field) = 8 * ms->c_value;
1991           FIELD_BITSIZE (list->field) = 0;
1992           FIELD_STATIC_KIND (list->field) = 0;
1993           nfields++;
1994           break;
1995
1996         case C_FIELD:
1997
1998           /* Get space to record the next field's data.  */
1999           new = (struct nextfield *) alloca (sizeof (struct nextfield));
2000           new->next = list;
2001           list = new;
2002
2003           /* Save the data.  */
2004           list->field.name =
2005             obsavestring (name,
2006                           strlen (name),
2007                           &current_objfile->symbol_obstack);
2008           FIELD_TYPE (list->field) = decode_type (ms, ms->c_type, &sub_aux);
2009           FIELD_BITPOS (list->field) = ms->c_value;
2010           FIELD_BITSIZE (list->field) = sub_aux.x_sym.x_misc.x_lnsz.x_size;
2011           FIELD_STATIC_KIND (list->field) = 0;
2012           nfields++;
2013           break;
2014
2015         case C_EOS:
2016           done = 1;
2017           break;
2018         }
2019     }
2020   /* Now create the vector of fields, and record how big it is.  */
2021
2022   TYPE_NFIELDS (type) = nfields;
2023   TYPE_FIELDS (type) = (struct field *)
2024     TYPE_ALLOC (type, sizeof (struct field) * nfields);
2025
2026   /* Copy the saved-up fields into the field vector.  */
2027
2028   for (n = nfields; list; list = list->next)
2029     TYPE_FIELD (type, --n) = list->field;
2030
2031   return type;
2032 }
2033 \f
2034 /* Read a definition of an enumeration type,
2035    and create and return a suitable type object.
2036    Also defines the symbols that represent the values of the type.  */
2037
2038 /* ARGSUSED */
2039 static struct type *
2040 coff_read_enum_type (int index, int length, int lastsym)
2041 {
2042   register struct symbol *sym;
2043   register struct type *type;
2044   int nsyms = 0;
2045   int done = 0;
2046   struct pending **symlist;
2047   struct coff_symbol member_sym;
2048   register struct coff_symbol *ms = &member_sym;
2049   struct internal_syment sub_sym;
2050   union internal_auxent sub_aux;
2051   struct pending *osyms, *syms;
2052   int o_nsyms;
2053   register int n;
2054   char *name;
2055   int unsigned_enum = 1;
2056
2057   type = coff_alloc_type (index);
2058   if (within_function)
2059     symlist = &local_symbols;
2060   else
2061     symlist = &file_symbols;
2062   osyms = *symlist;
2063   o_nsyms = osyms ? osyms->nsyms : 0;
2064
2065   while (!done && symnum < lastsym && symnum < nlist_nsyms_global)
2066     {
2067       read_one_sym (ms, &sub_sym, &sub_aux);
2068       name = ms->c_name;
2069       name = EXTERNAL_NAME (name, current_objfile->obfd);
2070
2071       switch (ms->c_sclass)
2072         {
2073         case C_MOE:
2074           sym = (struct symbol *) obstack_alloc
2075             (&current_objfile->symbol_obstack,
2076              sizeof (struct symbol));
2077           memset (sym, 0, sizeof (struct symbol));
2078
2079           DEPRECATED_SYMBOL_NAME (sym) =
2080             obsavestring (name, strlen (name),
2081                           &current_objfile->symbol_obstack);
2082           SYMBOL_CLASS (sym) = LOC_CONST;
2083           SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
2084           SYMBOL_VALUE (sym) = ms->c_value;
2085           add_symbol_to_list (sym, symlist);
2086           nsyms++;
2087           break;
2088
2089         case C_EOS:
2090           /* Sometimes the linker (on 386/ix 2.0.2 at least) screws
2091              up the count of how many symbols to read.  So stop
2092              on .eos.  */
2093           done = 1;
2094           break;
2095         }
2096     }
2097
2098   /* Now fill in the fields of the type-structure.  */
2099
2100   if (length > 0)
2101     TYPE_LENGTH (type) = length;
2102   else
2103     TYPE_LENGTH (type) = TARGET_INT_BIT / TARGET_CHAR_BIT;      /* Assume ints */
2104   TYPE_CODE (type) = TYPE_CODE_ENUM;
2105   TYPE_NFIELDS (type) = nsyms;
2106   TYPE_FIELDS (type) = (struct field *)
2107     TYPE_ALLOC (type, sizeof (struct field) * nsyms);
2108
2109   /* Find the symbols for the values and put them into the type.
2110      The symbols can be found in the symlist that we put them on
2111      to cause them to be defined.  osyms contains the old value
2112      of that symlist; everything up to there was defined by us.  */
2113   /* Note that we preserve the order of the enum constants, so
2114      that in something like "enum {FOO, LAST_THING=FOO}" we print
2115      FOO, not LAST_THING.  */
2116
2117   for (syms = *symlist, n = 0; syms; syms = syms->next)
2118     {
2119       int j = 0;
2120
2121       if (syms == osyms)
2122         j = o_nsyms;
2123       for (; j < syms->nsyms; j++, n++)
2124         {
2125           struct symbol *xsym = syms->symbol[j];
2126           SYMBOL_TYPE (xsym) = type;
2127           TYPE_FIELD_NAME (type, n) = DEPRECATED_SYMBOL_NAME (xsym);
2128           TYPE_FIELD_BITPOS (type, n) = SYMBOL_VALUE (xsym);
2129           if (SYMBOL_VALUE (xsym) < 0)
2130             unsigned_enum = 0;
2131           TYPE_FIELD_BITSIZE (type, n) = 0;
2132           TYPE_FIELD_STATIC_KIND (type, n) = 0;
2133         }
2134       if (syms == osyms)
2135         break;
2136     }
2137
2138   if (unsigned_enum)
2139     TYPE_FLAGS (type) |= TYPE_FLAG_UNSIGNED;
2140
2141   return type;
2142 }
2143
2144 /* Register our ability to parse symbols for coff BFD files. */
2145
2146 static struct sym_fns coff_sym_fns =
2147 {
2148   bfd_target_coff_flavour,
2149   coff_new_init,                /* sym_new_init: init anything gbl to entire symtab */
2150   coff_symfile_init,            /* sym_init: read initial info, setup for sym_read() */
2151   coff_symfile_read,            /* sym_read: read a symbol file into symtab */
2152   coff_symfile_finish,          /* sym_finish: finished with file, cleanup */
2153   default_symfile_offsets,      /* sym_offsets:  xlate external to internal form */
2154   NULL                          /* next: pointer to next struct sym_fns */
2155 };
2156
2157 void
2158 _initialize_coffread (void)
2159 {
2160   add_symtab_fns (&coff_sym_fns);
2161 }