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