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