Eliminate uses of NAMES_HAVE_UNDERSCORE, using
[platform/upstream/binutils.git] / gdb / coffread.c
1 /* Read coff symbol tables and convert to internal format, for GDB.
2    Contributed by David D. Johnson, Brown University (ddj@cs.brown.edu).
3    Copyright 1987, 1988, 1989, 1990, 1991, 1992 Free Software Foundation, Inc.
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
20 \f
21 #include "defs.h"
22 #include "symtab.h"
23 #include "gdbtypes.h"
24 #include "breakpoint.h"
25 #include "bfd.h"
26 #include "symfile.h"
27 #include "objfiles.h"
28 #include "buildsym.h"
29 #include "complaints.h"
30 #include <obstack.h>
31
32 #include <string.h>
33
34 #include "libbfd.h"             /* FIXME secret internal data from BFD */
35 #include "coff/internal.h"      /* Internal format of COFF symbols in BFD */
36 #include "libcoff.h"            /* FIXME secret internal data from BFD */
37
38 /* Translate an external name string into a user-visible name.  */
39 #define EXTERNAL_NAME(string, abfd) \
40         (string[0] == bfd_get_symbol_leading_char(abfd)? string+1: string)
41
42 /* To be an sdb debug type, type must have at least a basic or primary
43    derived type.  Using this rather than checking against T_NULL is
44    said to prevent core dumps if we try to operate on Michael Bloom
45    dbx-in-coff file.  */
46
47 #define SDB_TYPE(type) (BTYPE(type) | (type & N_TMASK))
48
49 /*
50  * Convert from an sdb register number to an internal gdb register number.
51  * This should be defined in tm.h, if REGISTER_NAMES is not set up
52  * to map one to one onto the sdb register numbers.
53  */
54 #ifndef SDB_REG_TO_REGNUM
55 # define SDB_REG_TO_REGNUM(value)     (value)
56 #endif
57
58 /* Core address of start and end of text of current source file.
59    This comes from a ".text" symbol where x_nlinno > 0.  */
60
61 static CORE_ADDR cur_src_start_addr;
62 static CORE_ADDR cur_src_end_addr;
63
64 /* Core address of the end of the first object file.  */
65 static CORE_ADDR first_object_file_end;
66
67 /* The addresses of the symbol table stream and number of symbols
68    of the object file we are reading (as copied into core).  */
69
70 static FILE *nlist_stream_global;
71 static int nlist_nsyms_global;
72
73 /* Vector of line number information.  */
74
75 static struct linetable *line_vector;
76
77 /* Index of next entry to go in line_vector_index.  */
78
79 static int line_vector_index;
80
81 /* Last line number recorded in the line vector.  */
82
83 static int prev_line_number;
84
85 /* Number of elements allocated for line_vector currently.  */
86
87 static int line_vector_length;
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 ../internalcoff.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
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 /* Record the symbols defined for each context in a list.
126    We don't create a struct block for the context until we
127    know how long to make it.  */
128
129 struct coff_pending
130 {
131   struct coff_pending *next;
132   struct symbol *symbol;
133 };
134
135 /* Here are the three lists that symbols are put on.  */
136
137 struct coff_pending *coff_file_symbols; /* static at top level, and types */
138
139 struct coff_pending *coff_global_symbols;  /* global functions and variables */
140
141 struct coff_pending *coff_local_symbols;  /* everything local to lexical context */
142
143 /* List of unclosed lexical contexts
144    (that will become blocks, eventually).  */
145
146 struct coff_context_stack
147 {
148   struct coff_context_stack *next;
149   struct coff_pending *locals;
150   struct pending_block *old_blocks;
151   struct symbol *name;
152   CORE_ADDR start_addr;
153   int depth;
154 };
155
156 struct coff_context_stack *coff_context_stack;
157
158 /* Nonzero if within a function (so symbols should be local,
159    if nothing says specifically).  */
160
161 int within_function;
162
163 #if 0
164 /* The type of the function we are currently reading in.  This is
165    used by define_symbol to record the type of arguments to a function. */
166
167 struct type *in_function_type;
168 #endif
169
170 struct pending_block *pending_blocks;
171
172 /* Complaints about various problems in the file being read  */
173
174 struct complaint ef_complaint = 
175   {"Unmatched .ef symbol(s) ignored starting at symnum %d", 0, 0};
176
177 struct complaint bf_no_aux_complaint =
178   {"`.bf' symbol %d has no aux entry", 0, 0};
179
180 struct complaint ef_no_aux_complaint =
181   {"`.ef' symbol %d has no aux entry", 0, 0};
182
183 struct complaint lineno_complaint =
184   {"Line number pointer %d lower than start of line numbers", 0, 0};
185
186 struct complaint unexpected_type_complaint =
187   {"Unexpected type for symbol %s", 0, 0};
188
189 struct complaint bad_sclass_complaint =
190   {"Bad n_sclass for symbol %s", 0, 0};
191
192 struct complaint misordered_blocks_complaint =
193   {"Blocks out of order at address %x", 0, 0};
194
195 struct complaint tagndx_bad_complaint =
196   {"Symbol table entry for %s has bad tagndx value", 0, 0};
197
198 struct complaint eb_complaint = 
199   {"Mismatched .eb symbol ignored starting at symnum %d", 0, 0};
200
201 /* Simplified internal version of coff symbol table information */
202
203 struct coff_symbol {
204   char *c_name;
205   int c_symnum;         /* symbol number of this entry */
206   int c_naux;           /* 0 if syment only, 1 if syment + auxent, etc */
207   long c_value;
208   int c_sclass;
209   int c_secnum;
210   unsigned int c_type;
211 };
212
213 static struct type *
214 coff_read_struct_type PARAMS ((int, int, int));
215
216 static struct type *
217 decode_base_type PARAMS ((struct coff_symbol *, unsigned int,
218                           union internal_auxent *));
219
220 static struct type *
221 decode_type PARAMS ((struct coff_symbol *, unsigned int,
222                      union internal_auxent *));
223
224 static struct type *
225 decode_function_type PARAMS ((struct coff_symbol *, unsigned int,
226                               union internal_auxent *));
227
228 static struct type *
229 coff_read_enum_type PARAMS ((int, int, int));
230
231 static struct blockvector *
232 make_blockvector PARAMS ((struct objfile *));
233
234 static struct symbol *
235 process_coff_symbol PARAMS ((struct coff_symbol *, union internal_auxent *,
236                              struct objfile *));
237
238 static void
239 patch_opaque_types PARAMS ((struct symtab *));
240
241 static void
242 patch_type PARAMS ((struct type *, struct type *));
243
244 static void
245 enter_linenos PARAMS ((long, int, int));
246
247 static int
248 init_lineno PARAMS ((int, long, int));
249
250 static char *
251 getfilename PARAMS ((union internal_auxent *));
252
253 static char *
254 getsymname PARAMS ((struct internal_syment *));
255
256 static void
257 free_stringtab PARAMS ((void));
258
259 static int
260 init_stringtab PARAMS ((int, long));
261
262 static void
263 read_one_sym PARAMS ((struct coff_symbol *, struct internal_syment *,
264                       union internal_auxent *));
265
266 static void
267 read_coff_symtab PARAMS ((long, int, struct objfile *));
268
269 static void
270 find_linenos PARAMS ((bfd *, sec_ptr, PTR));
271
272 static void
273 coff_symfile_init PARAMS ((struct objfile *));
274
275 static void
276 coff_new_init PARAMS ((struct objfile *));
277
278 static void
279 coff_symfile_read PARAMS ((struct objfile *, struct section_offsets *, int));
280
281 static void
282 coff_symfile_finish PARAMS ((struct objfile *));
283
284 static void
285 record_minimal_symbol PARAMS ((char *, CORE_ADDR, enum minimal_symbol_type));
286
287 static void
288 coff_end_symtab PARAMS ((struct objfile *));
289
290 static void
291 complete_symtab PARAMS ((char *, CORE_ADDR, unsigned int));
292
293 static void
294 coff_start_symtab PARAMS ((void));
295
296 static void
297 coff_record_line PARAMS ((int, CORE_ADDR));
298
299 static void
300 coff_finish_block PARAMS ((struct symbol *, struct coff_pending **,
301                            struct pending_block *, CORE_ADDR, CORE_ADDR,
302                            struct objfile *));
303
304 static void
305 coff_add_symbol_to_list PARAMS ((struct symbol *, struct coff_pending **));
306
307 static struct type *
308 coff_alloc_type PARAMS ((int));
309
310 static struct type **
311 coff_lookup_type PARAMS ((int));
312
313 \f
314 /* Look up a coff type-number index.  Return the address of the slot
315    where the type for that index is stored.
316    The type-number is in INDEX. 
317
318    This can be used for finding the type associated with that index
319    or for associating a new type with the index.  */
320
321 static struct type **
322 coff_lookup_type (index)
323      register int index;
324 {
325   if (index >= type_vector_length)
326     {
327       int old_vector_length = type_vector_length;
328
329       type_vector_length *= 2;
330       if (type_vector_length < index) {
331         type_vector_length = index * 2;
332       }
333       type_vector = (struct type **)
334         xrealloc ((char *) type_vector,
335                   type_vector_length * sizeof (struct type *));
336       memset (&type_vector[old_vector_length], 0,
337              (type_vector_length - old_vector_length) * sizeof(struct type *));
338     }
339   return &type_vector[index];
340 }
341
342 /* Make sure there is a type allocated for type number index
343    and return the type object.
344    This can create an empty (zeroed) type object.  */
345
346 static struct type *
347 coff_alloc_type (index)
348      int index;
349 {
350   register struct type **type_addr = coff_lookup_type (index);
351   register struct type *type = *type_addr;
352
353   /* If we are referring to a type not known at all yet,
354      allocate an empty type for it.
355      We will fill it in later if we find out how.  */
356   if (type == NULL)
357     {
358       type = alloc_type (current_objfile);
359       *type_addr = type;
360     }
361   return type;
362 }
363 \f
364 /* maintain the lists of symbols and blocks */
365
366 /* Add a symbol to one of the lists of symbols.  */
367 static void
368 coff_add_symbol_to_list (symbol, listhead)
369      struct symbol *symbol;
370      struct coff_pending **listhead;
371 {
372   register struct coff_pending *link
373     = (struct coff_pending *) xmalloc (sizeof (struct coff_pending));
374
375   link->next = *listhead;
376   link->symbol = symbol;
377   *listhead = link;
378 }
379
380 /* Take one of the lists of symbols and make a block from it.
381    Put the block on the list of pending blocks.  */
382
383 static void
384 coff_finish_block (symbol, listhead, old_blocks, start, end, objfile)
385      struct symbol *symbol;
386      struct coff_pending **listhead;
387      struct pending_block *old_blocks;
388      CORE_ADDR start, end;
389      struct objfile *objfile;
390 {
391   register struct coff_pending *next, *next1;
392   register struct block *block;
393   register struct pending_block *pblock;
394   struct pending_block *opblock;
395   register int i;
396
397   /* Count the length of the list of symbols.  */
398
399   for (next = *listhead, i = 0; next; next = next->next, i++);
400
401   block = (struct block *)
402             obstack_alloc (&objfile->symbol_obstack, sizeof (struct block) + (i - 1) * sizeof (struct symbol *));
403
404   /* Copy the symbols into the block.  */
405
406   BLOCK_NSYMS (block) = i;
407   for (next = *listhead; next; next = next->next)
408     BLOCK_SYM (block, --i) = next->symbol;
409
410   BLOCK_START (block) = start;
411   BLOCK_END (block) = end;
412   BLOCK_SUPERBLOCK (block) = 0; /* Filled in when containing block is made */
413
414   /* Put the block in as the value of the symbol that names it.  */
415
416   if (symbol)
417     {
418       SYMBOL_BLOCK_VALUE (symbol) = block;
419       BLOCK_FUNCTION (block) = symbol;
420     }
421   else
422     BLOCK_FUNCTION (block) = 0;
423
424   /* Now free the links of the list, and empty the list.  */
425
426   for (next = *listhead; next; next = next1)
427     {
428       next1 = next->next;
429       free ((PTR)next);
430     }
431   *listhead = 0;
432
433   /* Install this block as the superblock
434      of all blocks made since the start of this scope
435      that don't have superblocks yet.  */
436
437   opblock = 0;
438   for (pblock = pending_blocks; pblock != old_blocks; pblock = pblock->next)
439     {
440       if (BLOCK_SUPERBLOCK (pblock->block) == 0)
441         BLOCK_SUPERBLOCK (pblock->block) = block;
442       opblock = pblock;
443     }
444
445   /* Record this block on the list of all blocks in the file.
446      Put it after opblock, or at the beginning if opblock is 0.
447      This puts the block in the list after all its subblocks.  */
448
449   pblock = (struct pending_block *) xmalloc (sizeof (struct pending_block));
450   pblock->block = block;
451   if (opblock)
452     {
453       pblock->next = opblock->next;
454       opblock->next = pblock;
455     }
456   else
457     {
458       pblock->next = pending_blocks;
459       pending_blocks = pblock;
460     }
461 }
462
463 static struct blockvector *
464 make_blockvector (objfile)
465      struct objfile *objfile;
466 {
467   register struct pending_block *next, *next1;
468   register struct blockvector *blockvector;
469   register int i;
470
471   /* Count the length of the list of blocks.  */
472
473   for (next = pending_blocks, i = 0; next; next = next->next, i++);
474
475   blockvector = (struct blockvector *)
476                   obstack_alloc (&objfile->symbol_obstack, sizeof (struct blockvector) + (i - 1) * sizeof (struct block *));
477
478   /* Copy the blocks into the blockvector.
479      This is done in reverse order, which happens to put
480      the blocks into the proper order (ascending starting address).
481      coff_finish_block has hair to insert each block into the list
482      after its subblocks in order to make sure this is true.  */
483
484   BLOCKVECTOR_NBLOCKS (blockvector) = i;
485   for (next = pending_blocks; next; next = next->next)
486     BLOCKVECTOR_BLOCK (blockvector, --i) = next->block;
487
488   /* Now free the links of the list, and empty the list.  */
489
490   for (next = pending_blocks; next; next = next1)
491     {
492       next1 = next->next;
493       free ((PTR)next);
494     }
495   pending_blocks = 0;
496
497   return blockvector;
498 }
499
500 /* Manage the vector of line numbers.  */
501
502 static void
503 coff_record_line (line, pc)
504      int line;
505      CORE_ADDR pc;
506 {
507   struct linetable_entry *e;
508   /* Make sure line vector is big enough.  */
509
510   if (line_vector_index + 2 >= line_vector_length)
511     {
512       line_vector_length *= 2;
513       line_vector = (struct linetable *)
514         xrealloc ((char *) line_vector, sizeof (struct linetable)
515                   + (line_vector_length
516                      * sizeof (struct linetable_entry)));
517     }
518
519   e = line_vector->item + line_vector_index++;
520   e->line = line; e->pc = pc;
521 }
522 \f
523 /* Start a new symtab for a new source file.
524    This is called when a COFF ".file" symbol is seen;
525    it indicates the start of data for one original source file.  */
526
527 static void
528 coff_start_symtab ()
529 {
530   coff_file_symbols = 0;
531   coff_global_symbols = 0;
532   coff_context_stack = 0;
533   within_function = 0;
534   last_source_file = NULL;
535
536   /* Initialize the source file line number information for this file.  */
537
538   if (line_vector)              /* Unlikely, but maybe possible? */
539     free ((PTR)line_vector);
540   line_vector_index = 0;
541   line_vector_length = 1000;
542   prev_line_number = -2;        /* Force first line number to be explicit */
543   line_vector = (struct linetable *)
544     xmalloc (sizeof (struct linetable)
545              + line_vector_length * sizeof (struct linetable_entry));
546 }
547
548 /* Save the vital information from when starting to read a file,
549    for use when closing off the current file.
550    NAME is the file name the symbols came from, START_ADDR is the first
551    text address for the file, and SIZE is the number of bytes of text.  */
552
553 static void
554 complete_symtab (name, start_addr, size)
555     char *name;
556     CORE_ADDR start_addr;
557     unsigned int size;
558 {
559   last_source_file = savestring (name, strlen (name));
560   cur_src_start_addr = start_addr;
561   cur_src_end_addr = start_addr + size;
562
563   if (current_objfile -> ei.entry_point >= cur_src_start_addr &&
564       current_objfile -> ei.entry_point <  cur_src_end_addr)
565     {
566       current_objfile -> ei.entry_file_lowpc = cur_src_start_addr;
567       current_objfile -> ei.entry_file_highpc = cur_src_end_addr;
568     }
569 }
570
571 /* Finish the symbol definitions for one main source file,
572    close off all the lexical contexts for that file
573    (creating struct block's for them), then make the
574    struct symtab for that file and put it in the list of all such. */
575
576 static void
577 coff_end_symtab (objfile)
578      struct objfile *objfile;
579 {
580   register struct symtab *symtab;
581   register struct coff_context_stack *cstk;
582   register struct blockvector *blockvector;
583   register struct linetable *lv;
584
585   /* Finish the lexical context of the last function in the file.  */
586
587   if (coff_context_stack)
588     {
589       cstk = coff_context_stack;
590       coff_context_stack = 0;
591       /* Make a block for the local symbols within.  */
592       coff_finish_block (cstk->name, &coff_local_symbols, cstk->old_blocks,
593                     cstk->start_addr, cur_src_end_addr, objfile);
594       free ((PTR)cstk);
595     }
596
597   /* Ignore a file that has no functions with real debugging info.  */
598   if (pending_blocks == 0 && coff_file_symbols == 0 && coff_global_symbols == 0)
599     {
600       free ((PTR)line_vector);
601       line_vector = 0;
602       line_vector_length = -1;
603       last_source_file = NULL;
604       return;
605     }
606
607   /* It is unfortunate that in amdcoff, pending blocks might not be ordered
608      in this stage. Especially, blocks for static functions will show up at
609      the end.  We need to sort them, so tools like `find_pc_function' and
610      `find_pc_block' can work reliably. */
611   if (pending_blocks) {
612     /* FIXME!  Remove this horrid bubble sort and use qsort!!! */
613     int swapped;
614     do {
615       struct pending_block *pb, *pbnext;
616
617       pb = pending_blocks, pbnext = pb->next;
618       swapped = 0;
619
620       while ( pbnext ) {
621
622           /* swap blocks if unordered! */
623
624           if (BLOCK_START(pb->block) < BLOCK_START(pbnext->block)) {
625             struct block *tmp = pb->block;
626             complain (&misordered_blocks_complaint, BLOCK_START (pb->block));
627             pb->block = pbnext->block;
628             pbnext->block = tmp;
629             swapped = 1;
630           }
631           pb = pbnext;
632           pbnext = pbnext->next;
633       }
634     } while (swapped);
635   }
636
637   /* Create the two top-level blocks for this file (STATIC_BLOCK and
638      GLOBAL_BLOCK).  */
639   coff_finish_block (0, &coff_file_symbols, 0, cur_src_start_addr, cur_src_end_addr, objfile);
640   coff_finish_block (0, &coff_global_symbols, 0, cur_src_start_addr, cur_src_end_addr, objfile);
641
642   /* Create the blockvector that points to all the file's blocks.  */
643   blockvector = make_blockvector (objfile);
644
645   /* Now create the symtab object for this source file.  */
646   symtab = allocate_symtab (last_source_file, objfile);
647
648   /* Fill in its components.  */
649   symtab->blockvector = blockvector;
650   symtab->free_code = free_linetable;
651   symtab->free_ptr = 0;
652   symtab->filename = last_source_file;
653   symtab->dirname = NULL;
654   lv = line_vector;
655   lv->nitems = line_vector_index;
656   symtab->linetable = (struct linetable *)
657     xrealloc ((char *) lv, (sizeof (struct linetable)
658                    + lv->nitems * sizeof (struct linetable_entry)));
659
660   free_named_symtabs (symtab->filename);
661
662   /* Reinitialize for beginning of new file. */
663   line_vector = 0;
664   line_vector_length = -1;
665   last_source_file = NULL;
666 }
667 \f
668 static void
669 record_minimal_symbol (name, address, type)
670      char *name;
671      CORE_ADDR address;
672      enum minimal_symbol_type type;
673 {
674   /* We don't want TDESC entry points in the minimal symbol table */
675   if (name[0] == '@') return;
676
677   /* mst_text isn't true, but apparently COFF doesn't tell us what it really
678      is, so this guess is more useful than mst_unknown.  */
679   prim_record_minimal_symbol (savestring (name, strlen (name)),
680                              address,
681                              type);
682 }
683 \f
684 /* coff_symfile_init ()
685    is the coff-specific initialization routine for reading symbols.
686    It is passed a struct objfile which contains, among other things,
687    the BFD for the file whose symbols are being read, and a slot for
688    a pointer to "private data" which we fill with cookies and other
689    treats for coff_symfile_read ().
690
691    We will only be called if this is a COFF or COFF-like file.
692    BFD handles figuring out the format of the file, and code in symtab.c
693    uses BFD's determination to vector to us.
694
695    The ultimate result is a new symtab (or, FIXME, eventually a psymtab).  */
696
697 struct coff_symfile_info {
698   file_ptr min_lineno_offset;           /* Where in file lowest line#s are */
699   file_ptr max_lineno_offset;           /* 1+last byte of line#s in file */
700 };
701
702 static int text_bfd_scnum;
703
704 static void
705 coff_symfile_init (objfile)
706      struct objfile *objfile;
707 {
708   asection      *section;
709   bfd *abfd = objfile->obfd;
710
711   /* Allocate struct to keep track of the symfile */
712   objfile -> sym_private = xmmalloc (objfile -> md,
713                                      sizeof (struct coff_symfile_info));
714
715   init_entry_point_info (objfile);
716
717   /* Save the section number for the text section */
718   section = bfd_get_section_by_name(abfd,".text");
719   if (section)
720     text_bfd_scnum = section->index;
721   else
722     text_bfd_scnum = -1; 
723 }
724
725 /* This function is called for every section; it finds the outer limits
726    of the line table (minimum and maximum file offset) so that the
727    mainline code can read the whole thing for efficiency.  */
728
729 /* ARGSUSED */
730 static void
731 find_linenos (abfd, asect, vpinfo)
732      bfd *abfd;
733      sec_ptr asect;
734      PTR vpinfo;
735 {
736   struct coff_symfile_info *info;
737   int size, count;
738   file_ptr offset, maxoff;
739
740 /* WARNING WILL ROBINSON!  ACCESSING BFD-PRIVATE DATA HERE!  FIXME!  */
741   count = asect->lineno_count;
742 /* End of warning */
743
744   if (count == 0)
745     return;
746   size = count * local_linesz;
747
748   info = (struct coff_symfile_info *)vpinfo;
749 /* WARNING WILL ROBINSON!  ACCESSING BFD-PRIVATE DATA HERE!  FIXME!  */
750   offset = asect->line_filepos;
751 /* End of warning */
752
753   if (offset < info->min_lineno_offset || info->min_lineno_offset == 0)
754     info->min_lineno_offset = offset;
755
756   maxoff = offset + size;
757   if (maxoff > info->max_lineno_offset)
758     info->max_lineno_offset = maxoff;
759 }
760
761
762 /* The BFD for this file -- only good while we're actively reading
763    symbols into a psymtab or a symtab.  */
764
765 static bfd *symfile_bfd;
766
767 /* Read a symbol file, after initialization by coff_symfile_init.  */
768 /* FIXME!  Addr and Mainline are not used yet -- this will not work for
769    shared libraries or add_file!  */
770
771 /* ARGSUSED */
772 static void
773 coff_symfile_read (objfile, section_offsets, mainline)
774      struct objfile *objfile;
775      struct section_offsets *section_offsets;
776      int mainline;
777 {
778   struct coff_symfile_info *info;
779   bfd *abfd = objfile->obfd;
780   coff_data_type *cdata = coff_data (abfd);
781   char *name = bfd_get_filename (abfd);
782   int desc;
783   register int val;
784   int num_symbols;
785   int symtab_offset;
786   int stringtab_offset;
787
788   info = (struct coff_symfile_info *) objfile -> sym_private;
789   symfile_bfd = abfd;                   /* Kludge for swap routines */
790
791 /* WARNING WILL ROBINSON!  ACCESSING BFD-PRIVATE DATA HERE!  FIXME!  */
792    desc = fileno ((FILE *)(abfd->iostream));    /* File descriptor */
793    num_symbols = bfd_get_symcount (abfd);       /* How many syms */
794    symtab_offset = cdata->sym_filepos;          /* Symbol table file offset */
795    stringtab_offset = symtab_offset +           /* String table file offset */
796                       num_symbols * cdata->local_symesz;
797
798   /* Set a few file-statics that give us specific information about
799      the particular COFF file format we're reading.  */
800   local_linesz   = cdata->local_linesz;
801   local_n_btmask = cdata->local_n_btmask;
802   local_n_btshft = cdata->local_n_btshft;
803   local_n_tmask  = cdata->local_n_tmask;
804   local_n_tshift = cdata->local_n_tshift;
805   local_linesz   = cdata->local_linesz;
806   local_symesz   = cdata->local_symesz;
807   local_auxesz   = cdata->local_auxesz;
808
809   /* Allocate space for raw symbol and aux entries, based on their
810      space requirements as reported by BFD.  */
811   temp_sym = (char *) xmalloc
812          (cdata->local_symesz + cdata->local_auxesz);
813   temp_aux = temp_sym + cdata->local_symesz;
814   make_cleanup (free_current_contents, &temp_sym);
815 /* End of warning */
816
817   /* Read the line number table, all at once.  */
818   info->min_lineno_offset = 0;
819   info->max_lineno_offset = 0;
820   bfd_map_over_sections (abfd, find_linenos, (PTR)info);
821
822   val = init_lineno (desc, info->min_lineno_offset, 
823                      info->max_lineno_offset - info->min_lineno_offset);
824   if (val < 0)
825     error ("\"%s\": error reading line numbers\n", name);
826
827   /* Now read the string table, all at once.  */
828
829   val = init_stringtab (desc, stringtab_offset);
830   if (val < 0)
831     error ("\"%s\": can't get string table", name);
832   make_cleanup (free_stringtab, 0);
833
834   init_minimal_symbol_collection ();
835   make_cleanup (discard_minimal_symbols, 0);
836
837   /* Now that the executable file is positioned at symbol table,
838      process it and define symbols accordingly.  */
839
840   read_coff_symtab ((long)symtab_offset, num_symbols, objfile);
841
842   /* Sort symbols alphabetically within each block.  */
843
844   sort_all_symtab_syms ();
845
846   /* Install any minimal symbols that have been collected as the current
847      minimal symbols for this objfile. */
848
849   install_minimal_symbols (objfile);
850 }
851
852 static void
853 coff_new_init (ignore)
854      struct objfile *ignore;
855 {
856         /* Nothin' to do */
857 }
858
859 /* Perform any local cleanups required when we are done with a particular
860    objfile.  I.E, we are in the process of discarding all symbol information
861    for an objfile, freeing up all memory held for it, and unlinking the
862    objfile struct from the global list of known objfiles. */
863
864 static void
865 coff_symfile_finish (objfile)
866      struct objfile *objfile;
867 {
868   if (objfile -> sym_private != NULL)
869     {
870       mfree (objfile -> md, objfile -> sym_private);
871     }
872 }
873
874 \f
875 /* Given pointers to a symbol table in coff style exec file,
876    analyze them and create struct symtab's describing the symbols.
877    NSYMS is the number of symbols in the symbol table.
878    We read them one at a time using read_one_sym ().  */
879
880 static void
881 read_coff_symtab (symtab_offset, nsyms, objfile)
882      long symtab_offset;
883      int nsyms;
884      struct objfile *objfile;
885 {
886   FILE *stream; 
887   register struct coff_context_stack *new;
888   struct coff_symbol coff_symbol;
889   register struct coff_symbol *cs = &coff_symbol;
890   static struct internal_syment main_sym;
891   static union internal_auxent main_aux;
892   struct coff_symbol fcn_cs_saved;
893   static struct internal_syment fcn_sym_saved;
894   static union internal_auxent fcn_aux_saved;
895   struct symtab *s;
896   
897   /* A .file is open.  */
898   int in_source_file = 0;
899   int num_object_files = 0;
900   int next_file_symnum = -1;
901
902   /* Name of the current file.  */
903   char *filestring = "";
904   int depth = 0;
905   int fcn_first_line = 0;
906   int fcn_last_line = 0;
907   int fcn_start_addr = 0;
908   long fcn_line_ptr = 0;
909   struct cleanup *old_chain;
910   int val;
911
912   stream = bfd_cache_lookup(objfile->obfd);
913   if (!stream)
914    perror_with_name(objfile->name);
915
916   /* Position to read the symbol table. */
917   val = fseek (stream, (long)symtab_offset, 0);
918   if (val < 0)
919     perror_with_name (objfile->name);
920
921   /* This cleanup will be discarded below if we succeed.  */
922   old_chain = make_cleanup (free_objfile, objfile);
923
924   current_objfile = objfile;
925   nlist_stream_global = stream;
926   nlist_nsyms_global = nsyms;
927   last_source_file = NULL;
928   memset (opaque_type_chain, 0, sizeof opaque_type_chain);
929
930   if (type_vector)                      /* Get rid of previous one */
931     free ((PTR)type_vector);
932   type_vector_length = 160;
933   type_vector = (struct type **)
934                 xmalloc (type_vector_length * sizeof (struct type *));
935   memset (type_vector, 0, type_vector_length * sizeof (struct type *));
936
937   coff_start_symtab ();
938
939   symnum = 0;
940   while (symnum < nsyms)
941     {
942       QUIT;                     /* Make this command interruptable.  */
943       read_one_sym (cs, &main_sym, &main_aux);
944
945 #ifdef SEM
946       temp_sem_val = cs->c_name[0] << 24 | cs->c_name[1] << 16 |
947                      cs->c_name[2] << 8 | cs->c_name[3];
948       if (int_sem_val == temp_sem_val)
949         last_coffsem = (int) strtol (cs->c_name+4, (char **) NULL, 10);
950 #endif
951
952       if (cs->c_symnum == next_file_symnum && cs->c_sclass != C_FILE)
953         {
954           if (last_source_file)
955             coff_end_symtab (objfile);
956
957           coff_start_symtab ();
958           complete_symtab ("_globals_", 0, first_object_file_end);
959           /* done with all files, everything from here on out is globals */
960         }
961
962       /* Special case for file with type declarations only, no text.  */
963       if (!last_source_file && SDB_TYPE (cs->c_type)
964           && cs->c_secnum == N_DEBUG)
965         complete_symtab (filestring, 0, 0);
966
967       /* Typedefs should not be treated as symbol definitions.  */
968       if (ISFCN (cs->c_type) && cs->c_sclass != C_TPDEF)
969         {
970           /* record as a minimal symbol.  if we get '.bf' next,
971            * then we undo this step
972            */
973           record_minimal_symbol (cs->c_name, cs->c_value, mst_text);
974
975           fcn_line_ptr = main_aux.x_sym.x_fcnary.x_fcn.x_lnnoptr;
976           fcn_start_addr = cs->c_value;
977           fcn_cs_saved = *cs;
978           fcn_sym_saved = main_sym;
979           fcn_aux_saved = main_aux;
980           continue;
981         }
982
983       switch (cs->c_sclass)
984         {
985           case C_EFCN:
986           case C_EXTDEF:
987           case C_ULABEL:
988           case C_USTATIC:
989           case C_LINE:
990           case C_ALIAS:
991           case C_HIDDEN:
992             complain (&bad_sclass_complaint, cs->c_name);
993             break;
994
995           case C_FILE:
996             /*
997              * c_value field contains symnum of next .file entry in table
998              * or symnum of first global after last .file.
999              */
1000             next_file_symnum = cs->c_value;
1001             filestring = getfilename (&main_aux);
1002             /*
1003              * Complete symbol table for last object file
1004              * containing debugging information.
1005              */
1006             if (last_source_file)
1007               {
1008                 coff_end_symtab (objfile);
1009                 coff_start_symtab ();
1010               }
1011             in_source_file = 1;
1012             break;
1013
1014           case C_STAT:
1015             if (cs->c_name[0] == '.') {
1016                     if (strcmp (cs->c_name, ".text") == 0) {
1017                             /* FIXME:  don't wire in ".text" as section name
1018                                        or symbol name! */
1019                             if (++num_object_files == 1) {
1020                                     /* last address of startup file */
1021                                     first_object_file_end = cs->c_value +
1022                                             main_aux.x_scn.x_scnlen;
1023                             }
1024                             /* Check for in_source_file deals with case of
1025                                a file with debugging symbols
1026                                followed by a later file with no symbols.  */
1027                             if (in_source_file)
1028                               complete_symtab (filestring, cs->c_value,
1029                                                main_aux.x_scn.x_scnlen);
1030                             in_source_file = 0;
1031                     }
1032                     /* flush rest of '.' symbols */
1033                     break;
1034             }
1035             else if (!SDB_TYPE (cs->c_type)
1036                      && cs->c_name[0] == 'L'
1037                      && (strncmp (cs->c_name, "LI%", 3) == 0
1038                          || strncmp (cs->c_name, "LF%", 3) == 0
1039                          || strncmp (cs->c_name,"LC%",3) == 0
1040                          || strncmp (cs->c_name,"LP%",3) == 0
1041                          || strncmp (cs->c_name,"LPB%",4) == 0
1042                          || strncmp (cs->c_name,"LBB%",4) == 0
1043                          || strncmp (cs->c_name,"LBE%",4) == 0
1044                          || strncmp (cs->c_name,"LPBX%",5) == 0))
1045               /* At least on a 3b1, gcc generates swbeg and string labels
1046                  that look like this.  Ignore them.  */
1047               break;
1048             /* fall in for static symbols that don't start with '.' */
1049           case C_EXT:
1050             if (!SDB_TYPE (cs->c_type)) {
1051                 /* FIXME: This is BOGUS Will Robinson! 
1052                 Coff should provide the SEC_CODE flag for executable sections,
1053                 then if we could look up sections by section number we
1054                 could see if the flags indicate SEC_CODE.  If so, then
1055                 record this symbol as a function in the minimal symbol table.
1056                 But why are absolute syms recorded as functions, anyway?  */
1057                     if (cs->c_secnum <= text_bfd_scnum+1) {/* text or abs */
1058                             record_minimal_symbol (cs->c_name, cs->c_value,
1059                                                    mst_text);
1060                             break;
1061                     } else {
1062                             record_minimal_symbol (cs->c_name, cs->c_value,
1063                                                    mst_data);
1064                             break;
1065                     }
1066             }
1067             process_coff_symbol (cs, &main_aux, objfile);
1068             break;
1069
1070           case C_FCN:
1071             if (strcmp (cs->c_name, ".bf") == 0)
1072               {
1073                 within_function = 1;
1074
1075                 /* value contains address of first non-init type code */
1076                 /* main_aux.x_sym.x_misc.x_lnsz.x_lnno
1077                             contains line number of '{' } */
1078                 if (cs->c_naux != 1)
1079                   complain (&bf_no_aux_complaint, cs->c_symnum);
1080                 fcn_first_line = main_aux.x_sym.x_misc.x_lnsz.x_lnno;
1081
1082                 new = (struct coff_context_stack *)
1083                   xmalloc (sizeof (struct coff_context_stack));
1084                 new->depth = depth = 0;
1085                 new->next = 0;
1086                 coff_context_stack = new;
1087                 new->locals = 0;
1088                 new->old_blocks = pending_blocks;
1089                 new->start_addr = fcn_start_addr;
1090                 fcn_cs_saved.c_name = getsymname (&fcn_sym_saved);
1091                 new->name = process_coff_symbol (&fcn_cs_saved,
1092                                                  &fcn_aux_saved, objfile);
1093               }
1094             else if (strcmp (cs->c_name, ".ef") == 0)
1095               {
1096                       /* the value of .ef is the address of epilogue code;
1097                        * not useful for gdb
1098                        */
1099                 /* { main_aux.x_sym.x_misc.x_lnsz.x_lnno
1100                             contains number of lines to '}' */
1101                 new = coff_context_stack;
1102                 if (new == 0)
1103                   {
1104                     complain (&ef_complaint, cs->c_symnum);
1105                     within_function = 0;
1106                     break;
1107                   }
1108                 if (cs->c_naux != 1) {
1109                   complain (&ef_no_aux_complaint, cs->c_symnum);
1110                   fcn_last_line = 0x7FFFFFFF;
1111                 } else {
1112                   fcn_last_line = main_aux.x_sym.x_misc.x_lnsz.x_lnno;
1113                 }
1114                 enter_linenos (fcn_line_ptr, fcn_first_line, fcn_last_line);
1115
1116                 coff_finish_block (new->name, &coff_local_symbols, new->old_blocks,
1117                               new->start_addr,
1118 #if defined (FUNCTION_EPILOGUE_SIZE)
1119                               /* This macro should be defined only on
1120                                  machines where the
1121                                  fcn_aux_saved.x_sym.x_misc.x_fsize
1122                                  field is always zero.
1123                                  So use the .bf record information that
1124                                  points to the epilogue and add the size
1125                                  of the epilogue.  */
1126                               cs->c_value + FUNCTION_EPILOGUE_SIZE,
1127 #else
1128                               fcn_cs_saved.c_value +
1129                                   fcn_aux_saved.x_sym.x_misc.x_fsize,
1130 #endif
1131                               objfile
1132                               );
1133                 coff_context_stack = 0;
1134                 within_function = 0;
1135                 free ((PTR)new);
1136               }
1137             break;
1138
1139           case C_BLOCK:
1140             if (strcmp (cs->c_name, ".bb") == 0)
1141               {
1142                 new = (struct coff_context_stack *)
1143                             xmalloc (sizeof (struct coff_context_stack));
1144                 depth++;
1145                 new->depth = depth;
1146                 new->next = coff_context_stack;
1147                 coff_context_stack = new;
1148                 new->locals = coff_local_symbols;
1149                 new->old_blocks = pending_blocks;
1150                 new->start_addr = cs->c_value;
1151                 new->name = 0;
1152                 coff_local_symbols = 0;
1153               }
1154             else if (strcmp (cs->c_name, ".eb") == 0)
1155               {
1156                 new = coff_context_stack;
1157                 if (new == 0 || depth != new->depth)
1158                   {
1159                     complain (&eb_complaint, (char *)symnum);
1160                     break;
1161                   }
1162                 if (coff_local_symbols && coff_context_stack->next)
1163                   {
1164                     /* Make a block for the local symbols within.  */
1165                     coff_finish_block (0, &coff_local_symbols, new->old_blocks,
1166                                   new->start_addr, cs->c_value, objfile);
1167                   }
1168                 depth--;
1169                 coff_local_symbols = new->locals;
1170                 coff_context_stack = new->next;
1171                 free ((PTR)new);
1172               }
1173             break;
1174
1175           default:
1176             process_coff_symbol (cs, &main_aux, objfile);
1177             break;
1178         }
1179     }
1180
1181   if (last_source_file)
1182     coff_end_symtab (objfile);
1183   fclose (stream);
1184
1185   /* Patch up any opaque types (references to types that are not defined
1186      in the file where they are referenced, e.g. "struct foo *bar").  */
1187   ALL_OBJFILE_SYMTABS (objfile, s)
1188     patch_opaque_types (s);
1189
1190   discard_cleanups (old_chain);
1191   current_objfile = NULL;
1192 }
1193 \f
1194 /* Routines for reading headers and symbols from executable.  */
1195
1196 #ifdef FIXME
1197 /* Move these XXXMAGIC symbol defns into BFD!  */
1198
1199 /* Read COFF file header, check magic number,
1200    and return number of symbols. */
1201 read_file_hdr (chan, file_hdr)
1202     int chan;
1203     FILHDR *file_hdr;
1204 {
1205   lseek (chan, 0L, 0);
1206   if (myread (chan, (char *)file_hdr, FILHSZ) < 0)
1207     return -1;
1208
1209   switch (file_hdr->f_magic)
1210     {
1211 #ifdef MC68MAGIC
1212     case MC68MAGIC:
1213 #endif
1214 #ifdef NS32GMAGIC
1215       case NS32GMAGIC:
1216       case NS32SMAGIC:
1217 #endif
1218 #ifdef I386MAGIC
1219     case I386MAGIC:
1220 #endif
1221 #ifdef CLIPPERMAGIC
1222     case CLIPPERMAGIC:
1223 #endif
1224 #if defined (MC68KWRMAGIC) \
1225   && (!defined (MC68MAGIC) || MC68KWRMAGIC != MC68MAGIC)
1226     case MC68KWRMAGIC:
1227 #endif
1228 #ifdef MC68KROMAGIC
1229     case MC68KROMAGIC:
1230     case MC68KPGMAGIC:
1231 #endif
1232 #ifdef MC88DGMAGIC
1233     case MC88DGMAGIC:
1234 #endif      
1235 #ifdef MC88MAGIC
1236     case MC88MAGIC:
1237 #endif      
1238 #ifdef I960ROMAGIC
1239     case I960ROMAGIC:           /* Intel 960 */
1240 #endif
1241 #ifdef I960RWMAGIC
1242     case I960RWMAGIC:           /* Intel 960 */
1243 #endif
1244         return file_hdr->f_nsyms;
1245
1246       default:
1247 #ifdef BADMAG
1248         if (BADMAG(file_hdr))
1249           return -1;
1250         else
1251           return file_hdr->f_nsyms;
1252 #else
1253         return -1;
1254 #endif
1255     }
1256 }
1257 #endif
1258
1259 /* Read the next symbol, swap it, and return it in both internal_syment
1260    form, and coff_symbol form.  Also return its first auxent, if any,
1261    in internal_auxent form, and skip any other auxents.  */
1262
1263 static void
1264 read_one_sym (cs, sym, aux)
1265     register struct coff_symbol *cs;
1266     register struct internal_syment *sym;
1267     register union internal_auxent *aux;
1268 {
1269   int i;
1270
1271   cs->c_symnum = symnum;
1272   fread (temp_sym, local_symesz, 1, nlist_stream_global);
1273   bfd_coff_swap_sym_in (symfile_bfd, temp_sym, (char *)sym);
1274   cs->c_naux = sym->n_numaux & 0xff;
1275   if (cs->c_naux >= 1)
1276     {
1277     fread (temp_aux, local_auxesz, 1, nlist_stream_global);
1278     bfd_coff_swap_aux_in (symfile_bfd, temp_aux, sym->n_type, sym->n_sclass,
1279                           (char *)aux);
1280     /* If more than one aux entry, read past it (only the first aux
1281        is important). */
1282     for (i = 1; i < cs->c_naux; i++)
1283       fread (temp_aux, local_auxesz, 1, nlist_stream_global);
1284     }
1285   cs->c_name = getsymname (sym);
1286   cs->c_value = sym->n_value;
1287   cs->c_sclass = (sym->n_sclass & 0xff);
1288   cs->c_secnum = sym->n_scnum;
1289   cs->c_type = (unsigned) sym->n_type;
1290   if (!SDB_TYPE (cs->c_type))
1291     cs->c_type = 0;
1292
1293   symnum += 1 + cs->c_naux;
1294 }
1295 \f
1296 /* Support for string table handling */
1297
1298 static char *stringtab = NULL;
1299
1300 static int
1301 init_stringtab (chan, offset)
1302     int chan;
1303     long offset;
1304 {
1305   long length;
1306   int val;
1307   unsigned char lengthbuf[4];
1308
1309   if (stringtab)
1310     {
1311       free (stringtab);
1312       stringtab = NULL;
1313     }
1314
1315   if (lseek (chan, offset, 0) < 0)
1316     return -1;
1317
1318   val = myread (chan, (char *)lengthbuf, sizeof lengthbuf);
1319   length = bfd_h_get_32 (symfile_bfd, lengthbuf);
1320
1321   /* If no string table is needed, then the file may end immediately
1322      after the symbols.  Just return with `stringtab' set to null. */
1323   if (val != sizeof length || length < sizeof length)
1324     return 0;
1325
1326   stringtab = (char *) xmalloc (length);
1327   if (stringtab == NULL)
1328     return -1;
1329
1330   memcpy (stringtab, &length, sizeof length);
1331   if (length == sizeof length)          /* Empty table -- just the count */
1332     return 0;
1333
1334   val = myread (chan, stringtab + sizeof length, length - sizeof length);
1335   if (val != length - sizeof length || stringtab[length - 1] != '\0')
1336     return -1;
1337
1338   return 0;
1339 }
1340
1341 static void
1342 free_stringtab ()
1343 {
1344   if (stringtab)
1345     free (stringtab);
1346   stringtab = NULL;
1347 }
1348
1349 static char *
1350 getsymname (symbol_entry)
1351     struct internal_syment *symbol_entry;
1352 {
1353   static char buffer[SYMNMLEN+1];
1354   char *result;
1355
1356   if (symbol_entry->_n._n_n._n_zeroes == 0)
1357     {
1358       result = stringtab + symbol_entry->_n._n_n._n_offset;
1359     }
1360   else
1361     {
1362       strncpy (buffer, symbol_entry->_n._n_name, SYMNMLEN);
1363       buffer[SYMNMLEN] = '\0';
1364       result = buffer;
1365     }
1366   return result;
1367 }
1368
1369 static char *
1370 getfilename (aux_entry)
1371     union internal_auxent *aux_entry;
1372 {
1373   static char buffer[BUFSIZ];
1374   register char *temp;
1375   char *result;
1376
1377 #ifndef COFF_NO_LONG_FILE_NAMES
1378 #if defined (x_zeroes)
1379   /* Data General.  */
1380   if (aux_entry->x_zeroes == 0)
1381     strcpy (buffer, stringtab + aux_entry->x_offset);
1382 #else /* no x_zeroes */
1383   if (aux_entry->x_file.x_n.x_zeroes == 0)
1384     strcpy (buffer, stringtab + aux_entry->x_file.x_n.x_offset);
1385 #endif /* no x_zeroes */
1386   else
1387 #endif /* COFF_NO_LONG_FILE_NAMES */
1388     {
1389 #if defined (x_name)
1390       /* Data General.  */
1391       strncpy (buffer, aux_entry->x_name, FILNMLEN);
1392 #else
1393       strncpy (buffer, aux_entry->x_file.x_fname, FILNMLEN);
1394 #endif
1395       buffer[FILNMLEN] = '\0';
1396     }
1397   result = buffer;
1398   if ((temp = strrchr (result, '/')) != NULL)
1399     result = temp + 1;
1400   return (result);
1401 }
1402 \f
1403 /* Support for line number handling */
1404 static char *linetab = NULL;
1405 static long linetab_offset;
1406 static unsigned long linetab_size;
1407
1408 /* Read in all the line numbers for fast lookups later.  Leave them in
1409    external (unswapped) format in memory; we'll swap them as we enter
1410    them into GDB's data structures.  */
1411  
1412 static int
1413 init_lineno (chan, offset, size)
1414     int chan;
1415     long offset;
1416     int size;
1417 {
1418   int val;
1419
1420   linetab_offset = offset;
1421   linetab_size = size;
1422
1423   if (size == 0)
1424     return 0;
1425
1426   if (lseek (chan, offset, 0) < 0)
1427     return -1;
1428   
1429   /* Allocate the desired table, plus a sentinel */
1430   linetab = (char *) xmalloc (size + local_linesz);
1431
1432   val = myread (chan, linetab, size);
1433   if (val != size)
1434     return -1;
1435
1436   /* Terminate it with an all-zero sentinel record */
1437   memset (linetab + size, 0, local_linesz);
1438
1439   make_cleanup (free, linetab);         /* Be sure it gets de-allocated. */
1440   return 0;
1441 }
1442
1443 #if !defined (L_LNNO32)
1444 #define L_LNNO32(lp) ((lp)->l_lnno)
1445 #endif
1446
1447 static void
1448 enter_linenos (file_offset, first_line, last_line)
1449     long file_offset;
1450     register int first_line;
1451     register int last_line;
1452 {
1453   register char *rawptr;
1454   struct internal_lineno lptr;
1455
1456   if (file_offset < linetab_offset)
1457     {
1458       complain (&lineno_complaint, file_offset);
1459       if (file_offset > linetab_size)   /* Too big to be an offset? */
1460         return;
1461       file_offset += linetab_offset;  /* Try reading at that linetab offset */
1462     }
1463   
1464   rawptr = &linetab[file_offset - linetab_offset];
1465
1466   /* skip first line entry for each function */
1467   rawptr += local_linesz;
1468   /* line numbers start at one for the first line of the function */
1469   first_line--;
1470
1471   for (;;) {
1472     bfd_coff_swap_lineno_in (symfile_bfd, rawptr, &lptr);
1473     rawptr += local_linesz;
1474     /* The next function, or the sentinel, will have L_LNNO32 zero; we exit. */
1475     if (L_LNNO32 (&lptr) && L_LNNO32 (&lptr) <= last_line)
1476       coff_record_line (first_line + L_LNNO32 (&lptr), lptr.l_addr.l_paddr);
1477     else
1478       break;
1479   } 
1480 }
1481 \f
1482 static void
1483 patch_type (type, real_type)
1484     struct type *type;
1485     struct type *real_type;
1486 {
1487   register struct type *target = TYPE_TARGET_TYPE (type);
1488   register struct type *real_target = TYPE_TARGET_TYPE (real_type);
1489   int field_size = TYPE_NFIELDS (real_target) * sizeof (struct field);
1490
1491   TYPE_LENGTH (target) = TYPE_LENGTH (real_target);
1492   TYPE_NFIELDS (target) = TYPE_NFIELDS (real_target);
1493   TYPE_FIELDS (target) = (struct field *) TYPE_ALLOC (target, field_size);
1494
1495   memcpy (TYPE_FIELDS (target), TYPE_FIELDS (real_target), field_size);
1496
1497   if (TYPE_NAME (real_target))
1498     {
1499       if (TYPE_NAME (target))
1500         free (TYPE_NAME (target));
1501       TYPE_NAME (target) = concat (TYPE_NAME (real_target), NULL);
1502     }
1503 }
1504
1505 /* Patch up all appropriate typedef symbols in the opaque_type_chains
1506    so that they can be used to print out opaque data structures properly.  */
1507
1508 static void
1509 patch_opaque_types (s)
1510      struct symtab *s;
1511 {
1512   register struct block *b;
1513   register int i;
1514   register struct symbol *real_sym;
1515   
1516   /* Go through the per-file symbols only */
1517   b = BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), STATIC_BLOCK);
1518   for (i = BLOCK_NSYMS (b) - 1; i >= 0; i--)
1519     {
1520       /* Find completed typedefs to use to fix opaque ones.
1521          Remove syms from the chain when their types are stored,
1522          but search the whole chain, as there may be several syms
1523          from different files with the same name.  */
1524       real_sym = BLOCK_SYM (b, i);
1525       if (SYMBOL_CLASS (real_sym) == LOC_TYPEDEF &&
1526           SYMBOL_NAMESPACE (real_sym) == VAR_NAMESPACE &&
1527           TYPE_CODE (SYMBOL_TYPE (real_sym)) == TYPE_CODE_PTR &&
1528           TYPE_LENGTH (TYPE_TARGET_TYPE (SYMBOL_TYPE (real_sym))) != 0)
1529         {
1530           register char *name = SYMBOL_NAME (real_sym);
1531           register int hash = hashname (name);
1532           register struct symbol *sym, *prev;
1533           
1534           prev = 0;
1535           for (sym = opaque_type_chain[hash]; sym;)
1536             {
1537               if (name[0] == SYMBOL_NAME (sym)[0] &&
1538                   !strcmp (name + 1, SYMBOL_NAME (sym) + 1))
1539                 {
1540                   if (prev)
1541                     {
1542                       SYMBOL_VALUE_CHAIN (prev) = SYMBOL_VALUE_CHAIN (sym);
1543                     }
1544                   else
1545                     {
1546                       opaque_type_chain[hash] = SYMBOL_VALUE_CHAIN (sym);
1547                     }
1548                   
1549                   patch_type (SYMBOL_TYPE (sym), SYMBOL_TYPE (real_sym));
1550                   
1551                   if (prev)
1552                     {
1553                       sym = SYMBOL_VALUE_CHAIN (prev);
1554                     }
1555                   else
1556                     {
1557                       sym = opaque_type_chain[hash];
1558                     }
1559                 }
1560               else
1561                 {
1562                   prev = sym;
1563                   sym = SYMBOL_VALUE_CHAIN (sym);
1564                 }
1565             }
1566         }
1567     }
1568 }
1569 \f
1570 static struct symbol *
1571 process_coff_symbol (cs, aux, objfile)
1572      register struct coff_symbol *cs;
1573      register union internal_auxent *aux;
1574      struct objfile *objfile;
1575 {
1576   register struct symbol *sym
1577     = (struct symbol *) obstack_alloc (&objfile->symbol_obstack, sizeof (struct symbol));
1578   char *name;
1579   struct type *temptype;
1580
1581   memset (sym, 0, sizeof (struct symbol));
1582   name = cs->c_name;
1583   name = EXTERNAL_NAME (name, objfile->obfd);
1584   SYMBOL_NAME (sym) = obstack_copy0 (&objfile->symbol_obstack, name, strlen (name));
1585
1586   /* default assumptions */
1587   SYMBOL_VALUE (sym) = cs->c_value;
1588   SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
1589
1590   if (ISFCN (cs->c_type))
1591     {
1592 #if 0
1593        /* FIXME:  This has NOT been tested.  The DBX version has.. */
1594        /* Generate a template for the type of this function.  The 
1595           types of the arguments will be added as we read the symbol 
1596           table. */
1597        struct type *new = (struct type *)
1598                     obstack_alloc (&objfile->symbol_obstack, sizeof (struct type));
1599        
1600        memcpy (new, lookup_function_type (decode_function_type (cs, cs->c_type, aux)),
1601                       sizeof(struct type));
1602        SYMBOL_TYPE (sym) = new;
1603        in_function_type = SYMBOL_TYPE(sym);
1604 #else
1605        SYMBOL_TYPE(sym) = 
1606          lookup_function_type (decode_function_type (cs, cs->c_type, aux));
1607 #endif
1608
1609       SYMBOL_CLASS (sym) = LOC_BLOCK;
1610       if (cs->c_sclass == C_STAT)
1611         coff_add_symbol_to_list (sym, &coff_file_symbols);
1612       else if (cs->c_sclass == C_EXT)
1613         coff_add_symbol_to_list (sym, &coff_global_symbols);
1614     }
1615   else
1616     {
1617       SYMBOL_TYPE (sym) = decode_type (cs, cs->c_type, aux);
1618       switch (cs->c_sclass)
1619         {
1620           case C_NULL:
1621             break;
1622
1623           case C_AUTO:
1624             SYMBOL_CLASS (sym) = LOC_LOCAL;
1625             coff_add_symbol_to_list (sym, &coff_local_symbols);
1626             break;
1627
1628           case C_EXT:
1629             SYMBOL_CLASS (sym) = LOC_STATIC;
1630             SYMBOL_VALUE_ADDRESS (sym) = (CORE_ADDR) cs->c_value;
1631             coff_add_symbol_to_list (sym, &coff_global_symbols);
1632             break;
1633
1634           case C_STAT:
1635             SYMBOL_CLASS (sym) = LOC_STATIC;
1636             SYMBOL_VALUE_ADDRESS (sym) = (CORE_ADDR) cs->c_value;
1637             if (within_function) {
1638               /* Static symbol of local scope */
1639               coff_add_symbol_to_list (sym, &coff_local_symbols);
1640             }
1641             else {
1642               /* Static symbol at top level of file */
1643               coff_add_symbol_to_list (sym, &coff_file_symbols);
1644             }
1645             break;
1646
1647 #ifdef C_GLBLREG                /* AMD coff */
1648           case C_GLBLREG:
1649 #endif
1650           case C_REG:
1651             SYMBOL_CLASS (sym) = LOC_REGISTER;
1652             SYMBOL_VALUE (sym) = SDB_REG_TO_REGNUM(cs->c_value);
1653             coff_add_symbol_to_list (sym, &coff_local_symbols);
1654             break;
1655
1656           case C_LABEL:
1657             break;
1658
1659           case C_ARG:
1660             SYMBOL_CLASS (sym) = LOC_ARG;
1661 #if 0
1662             /* FIXME:  This has not been tested. */
1663             /* Add parameter to function.  */
1664             add_param_to_type(&in_function_type,sym);
1665 #endif
1666             coff_add_symbol_to_list (sym, &coff_local_symbols);
1667 #if !defined (BELIEVE_PCC_PROMOTION)
1668             /* If PCC says a parameter is a short or a char,
1669                it is really an int.  */
1670             temptype = lookup_fundamental_type (current_objfile, FT_INTEGER);
1671             if (TYPE_LENGTH (SYMBOL_TYPE (sym)) < TYPE_LENGTH (temptype)
1672                 && TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_INT)
1673                 {
1674                     SYMBOL_TYPE (sym) = TYPE_UNSIGNED (SYMBOL_TYPE (sym))
1675                         ? lookup_fundamental_type (current_objfile,
1676                                                    FT_UNSIGNED_INTEGER)
1677                             : temptype;
1678                 }
1679 #endif
1680             break;
1681
1682           case C_REGPARM:
1683             SYMBOL_CLASS (sym) = LOC_REGPARM;
1684             SYMBOL_VALUE (sym) = SDB_REG_TO_REGNUM(cs->c_value);
1685             coff_add_symbol_to_list (sym, &coff_local_symbols);
1686 #if !defined (BELIEVE_PCC_PROMOTION)
1687             /* If PCC says a parameter is a short or a char,
1688                it is really an int.  */
1689             temptype = lookup_fundamental_type (current_objfile, FT_INTEGER);
1690             if (TYPE_LENGTH (SYMBOL_TYPE (sym)) < TYPE_LENGTH (temptype)
1691                 && TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_INT)
1692                 {
1693                     SYMBOL_TYPE (sym) = TYPE_UNSIGNED (SYMBOL_TYPE (sym))
1694                         ? lookup_fundamental_type (current_objfile,
1695                                                    FT_UNSIGNED_INTEGER)
1696                             : temptype;
1697                 }
1698 #endif
1699             break;
1700             
1701           case C_TPDEF:
1702             SYMBOL_CLASS (sym) = LOC_TYPEDEF;
1703             SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
1704
1705             /* If type has no name, give it one */
1706             if (TYPE_NAME (SYMBOL_TYPE (sym)) == 0)
1707               TYPE_NAME (SYMBOL_TYPE (sym)) = concat (SYMBOL_NAME (sym), NULL);
1708
1709             /* Keep track of any type which points to empty structured type,
1710                 so it can be filled from a definition from another file.  A
1711                 simple forward reference (TYPE_CODE_UNDEF) is not an
1712                 empty structured type, though; the forward references
1713                 work themselves out via the magic of coff_lookup_type.  */
1714             if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_PTR &&
1715                 TYPE_LENGTH (TYPE_TARGET_TYPE (SYMBOL_TYPE (sym))) == 0 &&
1716                 TYPE_CODE   (TYPE_TARGET_TYPE (SYMBOL_TYPE (sym))) !=
1717                                                 TYPE_CODE_UNDEF)
1718               {
1719                 register int i = hashname (SYMBOL_NAME (sym));
1720
1721                 SYMBOL_VALUE_CHAIN (sym) = opaque_type_chain[i];
1722                 opaque_type_chain[i] = sym;
1723               }
1724             coff_add_symbol_to_list (sym, &coff_file_symbols);
1725             break;
1726
1727           case C_STRTAG:
1728           case C_UNTAG:
1729           case C_ENTAG:
1730             SYMBOL_CLASS (sym) = LOC_TYPEDEF;
1731             SYMBOL_NAMESPACE (sym) = STRUCT_NAMESPACE;
1732             if (TYPE_NAME (SYMBOL_TYPE (sym)) == 0)
1733               TYPE_NAME (SYMBOL_TYPE (sym))
1734                 = concat ("",
1735                           (cs->c_sclass == C_ENTAG
1736                            ? "enum "
1737                            : (cs->c_sclass == C_STRTAG
1738                               ? "struct " : "union ")),
1739                           SYMBOL_NAME (sym), NULL);
1740             coff_add_symbol_to_list (sym, &coff_file_symbols);
1741             break;
1742
1743           default:
1744             break;
1745         }
1746     }
1747   return sym;
1748 }
1749 \f
1750 /* Decode a coff type specifier;
1751    return the type that is meant.  */
1752
1753 static
1754 struct type *
1755 decode_type (cs, c_type, aux)
1756      register struct coff_symbol *cs;
1757      unsigned int c_type;
1758      register union internal_auxent *aux;
1759 {
1760   register struct type *type = 0;
1761   unsigned int new_c_type;
1762
1763   if (c_type & ~N_BTMASK)
1764     {
1765       new_c_type = DECREF (c_type);
1766       if (ISPTR (c_type))
1767         {
1768           type = decode_type (cs, new_c_type, aux);
1769           type = lookup_pointer_type (type);
1770         }
1771       else if (ISFCN (c_type))
1772         {
1773           type = decode_type (cs, new_c_type, aux);
1774           type = lookup_function_type (type);
1775         }
1776       else if (ISARY (c_type))
1777         {
1778           int i, n;
1779           register unsigned short *dim;
1780           struct type *base_type, *index_type;
1781
1782           /* Define an array type.  */
1783           /* auxent refers to array, not base type */
1784           if (aux->x_sym.x_tagndx.l == 0)
1785             cs->c_naux = 0;
1786
1787           /* shift the indices down */
1788           dim = &aux->x_sym.x_fcnary.x_ary.x_dimen[0];
1789           i = 1;
1790           n = dim[0];
1791           for (i = 0; *dim && i < DIMNUM - 1; i++, dim++)
1792             *dim = *(dim + 1);
1793           *dim = 0;
1794
1795           base_type = decode_type (cs, new_c_type, aux);
1796           index_type = lookup_fundamental_type (current_objfile, FT_INTEGER);
1797           type = create_array_type ((struct type *) NULL, base_type,
1798                                     index_type, 0, n - 1);
1799         }
1800       return type;
1801     }
1802
1803   /* Reference to existing type.  This only occurs with the
1804      struct, union, and enum types.  EPI a29k coff
1805      fakes us out by producing aux entries with a nonzero
1806      x_tagndx for definitions of structs, unions, and enums, so we
1807      have to check the c_sclass field.  SCO 3.2v4 cc gets confused
1808      with pointers to pointers to defined structs, and generates
1809      negative x_tagndx fields.  */
1810   if (cs->c_naux > 0 && aux->x_sym.x_tagndx.l != 0)
1811     {
1812       if (cs->c_sclass != C_STRTAG
1813           && cs->c_sclass != C_UNTAG
1814           && cs->c_sclass != C_ENTAG
1815           && aux->x_sym.x_tagndx.l >= 0)
1816         {
1817           type = coff_alloc_type (aux->x_sym.x_tagndx.l);
1818           return type;
1819         } else {
1820           complain (&tagndx_bad_complaint, cs->c_name);
1821           /* And fall through to decode_base_type... */
1822         }
1823     }
1824
1825   return decode_base_type (cs, BTYPE (c_type), aux);
1826 }
1827
1828 /* Decode a coff type specifier for function definition;
1829    return the type that the function returns.  */
1830
1831 static
1832 struct type *
1833 decode_function_type (cs, c_type, aux)
1834      register struct coff_symbol *cs;
1835      unsigned int c_type;
1836      register union internal_auxent *aux;
1837 {
1838   if (aux->x_sym.x_tagndx.l == 0)
1839     cs->c_naux = 0;     /* auxent refers to function, not base type */
1840
1841   return decode_type (cs, DECREF (c_type), aux);
1842 }
1843 \f
1844 /* basic C types */
1845
1846 static
1847 struct type *
1848 decode_base_type (cs, c_type, aux)
1849      register struct coff_symbol *cs;
1850      unsigned int c_type;
1851      register union internal_auxent *aux;
1852 {
1853   struct type *type;
1854
1855   switch (c_type)
1856     {
1857       case T_NULL:
1858         /* shows up with "void (*foo)();" structure members */
1859         return lookup_fundamental_type (current_objfile, FT_VOID);
1860
1861 #if 0
1862 /* DGUX actually defines both T_ARG and T_VOID to the same value.  */
1863 #ifdef T_ARG
1864       case T_ARG:
1865         /* Shows up in DGUX, I think.  Not sure where.  */
1866         return lookup_fundamental_type (current_objfile, FT_VOID);      /* shouldn't show up here */
1867 #endif
1868 #endif /* 0 */
1869
1870 #ifdef T_VOID
1871       case T_VOID:
1872         /* Intel 960 COFF has this symbol and meaning.  */
1873         return lookup_fundamental_type (current_objfile, FT_VOID);
1874 #endif
1875
1876       case T_CHAR:
1877         return lookup_fundamental_type (current_objfile, FT_CHAR);
1878
1879       case T_SHORT:
1880         return lookup_fundamental_type (current_objfile, FT_SHORT);
1881
1882       case T_INT:
1883         return lookup_fundamental_type (current_objfile, FT_INTEGER);
1884
1885       case T_LONG:
1886         return lookup_fundamental_type (current_objfile, FT_LONG);
1887
1888       case T_FLOAT:
1889         return lookup_fundamental_type (current_objfile, FT_FLOAT);
1890
1891       case T_DOUBLE:
1892         return lookup_fundamental_type (current_objfile, FT_DBL_PREC_FLOAT);
1893
1894       case T_STRUCT:
1895         if (cs->c_naux != 1)
1896           {
1897             /* anonymous structure type */
1898             type = coff_alloc_type (cs->c_symnum);
1899             TYPE_CODE (type) = TYPE_CODE_STRUCT;
1900             TYPE_NAME (type) = concat ("struct ", "<opaque>", NULL);
1901             INIT_CPLUS_SPECIFIC(type);
1902             TYPE_LENGTH (type) = 0;
1903             TYPE_FIELDS (type) = 0;
1904             TYPE_NFIELDS (type) = 0;
1905           }
1906         else
1907           {
1908             type = coff_read_struct_type (cs->c_symnum,
1909                                     aux->x_sym.x_misc.x_lnsz.x_size,
1910                                     aux->x_sym.x_fcnary.x_fcn.x_endndx.l);
1911           }
1912         return type;
1913
1914       case T_UNION:
1915         if (cs->c_naux != 1)
1916           {
1917             /* anonymous union type */
1918             type = coff_alloc_type (cs->c_symnum);
1919             TYPE_NAME (type) = concat ("union ", "<opaque>", NULL);
1920             INIT_CPLUS_SPECIFIC(type);
1921             TYPE_LENGTH (type) = 0;
1922             TYPE_LENGTH (type) = 0;
1923             TYPE_FIELDS (type) = 0;
1924             TYPE_NFIELDS (type) = 0;
1925           }
1926         else
1927           {
1928             type = coff_read_struct_type (cs->c_symnum,
1929                                     aux->x_sym.x_misc.x_lnsz.x_size,
1930                                     aux->x_sym.x_fcnary.x_fcn.x_endndx.l);
1931           }
1932         TYPE_CODE (type) = TYPE_CODE_UNION;
1933         return type;
1934
1935       case T_ENUM:
1936         return coff_read_enum_type (cs->c_symnum,
1937                                     aux->x_sym.x_misc.x_lnsz.x_size,
1938                                     aux->x_sym.x_fcnary.x_fcn.x_endndx.l);
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         return lookup_fundamental_type (current_objfile, FT_UNSIGNED_LONG);
1955     }
1956   complain (&unexpected_type_complaint, cs->c_name);
1957   return lookup_fundamental_type (current_objfile, FT_VOID);
1958 }
1959 \f
1960 /* This page contains subroutines of read_type.  */
1961
1962 /* Read the description of a structure (or union type)
1963    and return an object describing the type.  */
1964
1965 static struct type *
1966 coff_read_struct_type (index, length, lastsym)
1967      int index;
1968      int length;
1969      int lastsym;
1970 {
1971   struct nextfield
1972     {
1973       struct nextfield *next;
1974       struct field field;
1975     };
1976
1977   register struct type *type;
1978   register struct nextfield *list = 0;
1979   struct nextfield *new;
1980   int nfields = 0;
1981   register int n;
1982   char *name;
1983   struct coff_symbol member_sym;
1984   register struct coff_symbol *ms = &member_sym;
1985   struct internal_syment sub_sym;
1986   union internal_auxent sub_aux;
1987   int done = 0;
1988
1989   type = coff_alloc_type (index);
1990   TYPE_CODE (type) = TYPE_CODE_STRUCT;
1991   INIT_CPLUS_SPECIFIC(type);
1992   TYPE_LENGTH (type) = length;
1993
1994   while (!done && symnum < lastsym && symnum < nlist_nsyms_global)
1995     {
1996       read_one_sym (ms, &sub_sym, &sub_aux);
1997       name = ms->c_name;
1998       name = EXTERNAL_NAME (name, current_objfile->obfd);
1999
2000       switch (ms->c_sclass)
2001         {
2002           case C_MOS:
2003           case C_MOU:
2004
2005             /* Get space to record the next field's data.  */
2006             new = (struct nextfield *) alloca (sizeof (struct nextfield));
2007             new->next = list;
2008             list = new;
2009
2010             /* Save the data.  */
2011             list->field.name = savestring (name, strlen (name));
2012             list->field.type = decode_type (ms, ms->c_type, &sub_aux);
2013             list->field.bitpos = 8 * ms->c_value;
2014             list->field.bitsize = 0;
2015             nfields++;
2016             break;
2017
2018           case C_FIELD:
2019
2020             /* Get space to record the next field's data.  */
2021             new = (struct nextfield *) alloca (sizeof (struct nextfield));
2022             new->next = list;
2023             list = new;
2024
2025             /* Save the data.  */
2026             list->field.name = savestring (name, strlen (name));
2027             list->field.type = decode_type (ms, ms->c_type, &sub_aux);
2028             list->field.bitpos = ms->c_value;
2029             list->field.bitsize = sub_aux.x_sym.x_misc.x_lnsz.x_size;
2030             nfields++;
2031             break;
2032
2033           case C_EOS:
2034             done = 1;
2035             break;
2036         }
2037     }
2038   /* Now create the vector of fields, and record how big it is.  */
2039
2040   TYPE_NFIELDS (type) = nfields;
2041   TYPE_FIELDS (type) = (struct field *)
2042     TYPE_ALLOC (type, sizeof (struct field) * nfields);
2043
2044   /* Copy the saved-up fields into the field vector.  */
2045
2046   for (n = nfields; list; list = list->next)
2047     TYPE_FIELD (type, --n) = list->field;
2048
2049   return type;
2050 }
2051 \f
2052 /* Read a definition of an enumeration type,
2053    and create and return a suitable type object.
2054    Also defines the symbols that represent the values of the type.  */
2055 /* Currently assumes it's sizeof (int) and doesn't use length.  */
2056
2057 /* ARGSUSED */
2058 static struct type *
2059 coff_read_enum_type (index, length, lastsym)
2060      int index;
2061      int length;
2062      int lastsym;
2063 {
2064   register struct symbol *sym;
2065   register struct type *type;
2066   int nsyms = 0;
2067   int done = 0;
2068   struct coff_pending **symlist;
2069   struct coff_symbol member_sym;
2070   register struct coff_symbol *ms = &member_sym;
2071   struct internal_syment sub_sym;
2072   union internal_auxent sub_aux;
2073   struct coff_pending *osyms, *syms;
2074   register int n;
2075   char *name;
2076
2077   type = coff_alloc_type (index);
2078   if (within_function)
2079     symlist = &coff_local_symbols;
2080   else
2081     symlist = &coff_file_symbols;
2082   osyms = *symlist;
2083
2084   while (!done && symnum < lastsym && symnum < nlist_nsyms_global)
2085     {
2086       read_one_sym (ms, &sub_sym, &sub_aux);
2087       name = ms->c_name;
2088       name = EXTERNAL_NAME (name, current_objfile->obfd);
2089
2090       switch (ms->c_sclass)
2091         {
2092           case C_MOE:
2093             sym = (struct symbol *) xmalloc (sizeof (struct symbol));
2094             memset (sym, 0, sizeof (struct symbol));
2095
2096             SYMBOL_NAME (sym) = savestring (name, strlen (name));
2097             SYMBOL_CLASS (sym) = LOC_CONST;
2098             SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
2099             SYMBOL_VALUE (sym) = ms->c_value;
2100             coff_add_symbol_to_list (sym, symlist);
2101             nsyms++;
2102             break;
2103
2104           case C_EOS:
2105             /* Sometimes the linker (on 386/ix 2.0.2 at least) screws
2106                up the count of how many symbols to read.  So stop
2107                on .eos.  */
2108             done = 1;
2109             break;
2110         }
2111     }
2112
2113   /* Now fill in the fields of the type-structure.  */
2114
2115   TYPE_LENGTH (type) =  TARGET_INT_BIT / TARGET_CHAR_BIT;
2116   TYPE_CODE (type) = TYPE_CODE_ENUM;
2117   TYPE_NFIELDS (type) = nsyms;
2118   TYPE_FIELDS (type) = (struct field *)
2119     TYPE_ALLOC (type, sizeof (struct field) * nsyms);
2120
2121   /* Find the symbols for the values and put them into the type.
2122      The symbols can be found in the symlist that we put them on
2123      to cause them to be defined.  osyms contains the old value
2124      of that symlist; everything up to there was defined by us.  */
2125
2126   for (syms = *symlist, n = nsyms; syms != osyms; syms = syms->next)
2127     {
2128       SYMBOL_TYPE (syms->symbol) = type;
2129       TYPE_FIELD_NAME (type, --n) = SYMBOL_NAME (syms->symbol);
2130       TYPE_FIELD_VALUE (type, n) = 0;
2131       TYPE_FIELD_BITPOS (type, n) = SYMBOL_VALUE (syms->symbol);
2132       TYPE_FIELD_BITSIZE (type, n) = 0;
2133     }
2134   /* Is this Modula-2's BOOLEAN type?  Flag it as such if so. */
2135   if(TYPE_NFIELDS(type) == 2 &&
2136      ((!strcmp(TYPE_FIELD_NAME(type,0),"TRUE") &&
2137        !strcmp(TYPE_FIELD_NAME(type,1),"FALSE")) ||
2138       (!strcmp(TYPE_FIELD_NAME(type,1),"TRUE") &&
2139        !strcmp(TYPE_FIELD_NAME(type,0),"FALSE"))))
2140      TYPE_CODE(type) = TYPE_CODE_BOOL;
2141   return type;
2142 }
2143
2144 /* Fake up support for relocating symbol addresses.  FIXME.  */
2145
2146 struct section_offsets coff_symfile_faker = {0};
2147
2148 struct section_offsets *
2149 coff_symfile_offsets (objfile, addr)
2150      struct objfile *objfile;
2151      CORE_ADDR addr;
2152 {
2153   return &coff_symfile_faker;
2154 }
2155
2156 /* Register our ability to parse symbols for coff BFD files */
2157
2158 static struct sym_fns coff_sym_fns =
2159 {
2160   "coff",               /* sym_name: name or name prefix of BFD target type */
2161   4,                    /* sym_namelen: number of significant sym_name chars */
2162   coff_new_init,        /* sym_new_init: init anything gbl to entire symtab */
2163   coff_symfile_init,    /* sym_init: read initial info, setup for sym_read() */
2164   coff_symfile_read,    /* sym_read: read a symbol file into symtab */
2165   coff_symfile_finish,  /* sym_finish: finished with file, cleanup */
2166   coff_symfile_offsets, /* sym_offsets:  xlate external to internal form */
2167   NULL                  /* next: pointer to next struct sym_fns */
2168 };
2169
2170 void
2171 _initialize_coffread ()
2172 {
2173   add_symtab_fns(&coff_sym_fns);
2174 }