1 /* Read coff symbol tables and convert to internal format, for GDB.
3 Copyright (C) 1987-1991 Free Software Foundation, Inc.
5 This file is part of GDB.
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.
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.
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. */
24 #include "breakpoint.h"
31 #include "coff/internal.h" /* Internal format of COFF symbols in BFD */
32 #include "libcoff.h" /* FIXME secret internal data from BFD */
34 static void add_symbol_to_list ();
35 static void read_coff_symtab ();
36 static void patch_opaque_types ();
37 static struct type *decode_function_type ();
38 static struct type *decode_type ();
39 static struct type *decode_base_type ();
40 static struct type *read_enum_type ();
41 static struct type *read_struct_type ();
42 static void finish_block ();
43 static struct blockvector *make_blockvector ();
44 static struct symbol *process_coff_symbol ();
45 static int init_stringtab ();
46 static void free_stringtab ();
47 static char *getfilename ();
48 static char *getsymname ();
49 static int init_lineno ();
50 static void enter_linenos ();
51 static void read_one_sym ();
55 /* To be an sdb debug type, type must have at least a basic or primary
56 derived type. Using this rather than checking against T_NULL is
57 said to prevent core dumps if we try to operate on Michael Bloom
60 #define SDB_TYPE(type) (BTYPE(type) | (type & N_TMASK))
63 * Convert from an sdb register number to an internal gdb register number.
64 * This should be defined in tm.h, if REGISTER_NAMES is not set up
65 * to map one to one onto the sdb register numbers.
67 #ifndef SDB_REG_TO_REGNUM
68 # define SDB_REG_TO_REGNUM(value) (value)
71 /* Name of source file whose symbol data we are now processing.
72 This comes from a symbol named ".file". */
74 static char *last_source_file;
76 /* Core address of start and end of text of current source file.
77 This comes from a ".text" symbol where x_nlinno > 0. */
79 static CORE_ADDR cur_src_start_addr;
80 static CORE_ADDR cur_src_end_addr;
82 /* Core address of the end of the first object file. */
83 static CORE_ADDR first_object_file_end;
85 /* The addresses of the symbol table stream and number of symbols
86 of the object file we are reading (as copied into core). */
88 static FILE *nlist_stream_global;
89 static int nlist_nsyms_global;
91 /* The index in the symbol table of the last coff symbol that was processed. */
95 /* Vector of types defined so far, indexed by their coff symnum. */
97 static struct type **type_vector;
99 /* Number of elements allocated for type_vector currently. */
101 static int type_vector_length;
103 /* Vector of line number information. */
105 static struct linetable *line_vector;
107 /* Index of next entry to go in line_vector_index. */
109 static int line_vector_index;
111 /* Last line number recorded in the line vector. */
113 static int prev_line_number;
115 /* Number of elements allocated for line_vector currently. */
117 static int line_vector_length;
119 /* Pointers to scratch storage, used for reading raw symbols and auxents. */
121 static char *temp_sym;
122 static char *temp_aux;
124 /* Local variables that hold the shift and mask values for the
125 COFF file that we are currently reading. These come back to us
126 from BFD, and are referenced by their macro names, as well as
127 internally to the BTYPE, ISPTR, ISFCN, ISARY, ISTAG, and DECREF
128 macros from ../internalcoff.h . */
130 static unsigned local_n_btmask;
131 static unsigned local_n_btshft;
132 static unsigned local_n_tmask;
133 static unsigned local_n_tshift;
135 #define N_BTMASK local_n_btmask
136 #define N_BTSHFT local_n_btshft
137 #define N_TMASK local_n_tmask
138 #define N_TSHIFT local_n_tshift
140 /* Local variables that hold the sizes in the file of various COFF structures.
141 (We only need to know this to read them from the file -- BFD will then
142 translate the data in them, into `internal_xxx' structs in the right
143 byte order, alignment, etc.) */
145 static unsigned local_linesz;
146 static unsigned local_symesz;
147 static unsigned local_auxesz;
150 /* Chain of typedefs of pointers to empty struct/union types.
151 They are chained thru the SYMBOL_VALUE_CHAIN. */
154 static struct symbol *opaque_type_chain[HASHSIZE];
156 /* Record the symbols defined for each context in a list.
157 We don't create a struct block for the context until we
158 know how long to make it. */
162 struct pending *next;
163 struct symbol *symbol;
166 /* Here are the three lists that symbols are put on. */
168 struct pending *file_symbols; /* static at top level, and types */
170 struct pending *global_symbols; /* global functions and variables */
172 struct pending *local_symbols; /* everything local to lexical context */
174 /* List of unclosed lexical contexts
175 (that will become blocks, eventually). */
179 struct context_stack *next;
180 struct pending *locals;
181 struct pending_block *old_blocks;
183 CORE_ADDR start_addr;
187 struct context_stack *context_stack;
189 /* Nonzero if within a function (so symbols should be local,
190 if nothing says specifically). */
195 /* The type of the function we are currently reading in. This is
196 used by define_symbol to record the type of arguments to a function. */
198 struct type *in_function_type;
201 /* List of blocks already made (lexical contexts already closed).
202 This is used at the end to make the blockvector. */
206 struct pending_block *next;
210 struct pending_block *pending_blocks;
212 extern CORE_ADDR startup_file_start; /* From blockframe.c */
213 extern CORE_ADDR startup_file_end; /* From blockframe.c */
215 /* Complaints about various problems in the file being read */
217 struct complaint ef_complaint =
218 {"Unmatched .ef symbol(s) ignored starting at symnum %d", 0, 0};
220 struct complaint no_aux_complaint =
221 {"symbol %d without one aux entry", 0, 0};
223 struct complaint lineno_complaint =
224 {"Line number pointer %d lower than start of line numbers", 0, 0};
227 /* Look up a coff type-number index. Return the address of the slot
228 where the type for that index is stored.
229 The type-number is in INDEX.
231 This can be used for finding the type associated with that index
232 or for associating a new type with the index. */
234 static struct type **
235 coff_lookup_type (index)
238 if (index >= type_vector_length)
240 int old_vector_length = type_vector_length;
242 type_vector_length *= 2;
243 if (type_vector_length < index) {
244 type_vector_length = index * 2;
246 type_vector = (struct type **)
247 xrealloc (type_vector, type_vector_length * sizeof (struct type *));
248 bzero (&type_vector[old_vector_length],
249 (type_vector_length - old_vector_length) * sizeof(struct type *));
251 return &type_vector[index];
254 /* Make sure there is a type allocated for type number index
255 and return the type object.
256 This can create an empty (zeroed) type object. */
259 coff_alloc_type (index)
262 register struct type **type_addr = coff_lookup_type (index);
263 register struct type *type = *type_addr;
265 /* If we are referring to a type not known at all yet,
266 allocate an empty type for it.
267 We will fill it in later if we find out how. */
270 type = (struct type *) obstack_alloc (symbol_obstack,
271 sizeof (struct type));
272 bzero (type, sizeof (struct type));
273 TYPE_VPTR_FIELDNO (type) = -1;
279 /* maintain the lists of symbols and blocks */
281 /* Add a symbol to one of the lists of symbols. */
283 add_symbol_to_list (symbol, listhead)
284 struct symbol *symbol;
285 struct pending **listhead;
287 register struct pending *link
288 = (struct pending *) xmalloc (sizeof (struct pending));
290 link->next = *listhead;
291 link->symbol = symbol;
295 /* Take one of the lists of symbols and make a block from it.
296 Put the block on the list of pending blocks. */
299 finish_block (symbol, listhead, old_blocks, start, end)
300 struct symbol *symbol;
301 struct pending **listhead;
302 struct pending_block *old_blocks;
303 CORE_ADDR start, end;
305 register struct pending *next, *next1;
306 register struct block *block;
307 register struct pending_block *pblock;
308 struct pending_block *opblock;
311 /* Count the length of the list of symbols. */
313 for (next = *listhead, i = 0; next; next = next->next, i++);
315 block = (struct block *)
316 obstack_alloc (symbol_obstack, sizeof (struct block) + (i - 1) * sizeof (struct symbol *));
318 /* Copy the symbols into the block. */
320 BLOCK_NSYMS (block) = i;
321 for (next = *listhead; next; next = next->next)
322 BLOCK_SYM (block, --i) = next->symbol;
324 BLOCK_START (block) = start;
325 BLOCK_END (block) = end;
326 BLOCK_SUPERBLOCK (block) = 0; /* Filled in when containing block is made */
328 /* Put the block in as the value of the symbol that names it. */
332 SYMBOL_BLOCK_VALUE (symbol) = block;
333 BLOCK_FUNCTION (block) = symbol;
336 BLOCK_FUNCTION (block) = 0;
338 /* Now free the links of the list, and empty the list. */
340 for (next = *listhead; next; next = next1)
347 /* Install this block as the superblock
348 of all blocks made since the start of this scope
349 that don't have superblocks yet. */
352 for (pblock = pending_blocks; pblock != old_blocks; pblock = pblock->next)
354 if (BLOCK_SUPERBLOCK (pblock->block) == 0)
355 BLOCK_SUPERBLOCK (pblock->block) = block;
359 /* Record this block on the list of all blocks in the file.
360 Put it after opblock, or at the beginning if opblock is 0.
361 This puts the block in the list after all its subblocks. */
363 pblock = (struct pending_block *) xmalloc (sizeof (struct pending_block));
364 pblock->block = block;
367 pblock->next = opblock->next;
368 opblock->next = pblock;
372 pblock->next = pending_blocks;
373 pending_blocks = pblock;
377 static struct blockvector *
380 register struct pending_block *next, *next1;
381 register struct blockvector *blockvector;
384 /* Count the length of the list of blocks. */
386 for (next = pending_blocks, i = 0; next; next = next->next, i++);
388 blockvector = (struct blockvector *)
389 obstack_alloc (symbol_obstack, sizeof (struct blockvector) + (i - 1) * sizeof (struct block *));
391 /* Copy the blocks into the blockvector.
392 This is done in reverse order, which happens to put
393 the blocks into the proper order (ascending starting address).
394 finish_block has hair to insert each block into the list
395 after its subblocks in order to make sure this is true. */
397 BLOCKVECTOR_NBLOCKS (blockvector) = i;
398 for (next = pending_blocks; next; next = next->next)
399 BLOCKVECTOR_BLOCK (blockvector, --i) = next->block;
401 /* Now free the links of the list, and empty the list. */
403 for (next = pending_blocks; next; next = next1)
413 /* Manage the vector of line numbers. */
416 record_line (line, pc)
420 struct linetable_entry *e;
421 /* Make sure line vector is big enough. */
423 if (line_vector_index + 2 >= line_vector_length)
425 line_vector_length *= 2;
426 line_vector = (struct linetable *)
427 xrealloc (line_vector, sizeof (struct linetable)
428 + (line_vector_length
429 * sizeof (struct linetable_entry)));
432 e = line_vector->item + line_vector_index++;
433 e->line = line; e->pc = pc;
436 /* Start a new symtab for a new source file.
437 This is called when a COFF ".file" symbol is seen;
438 it indicates the start of data for one original source file. */
447 last_source_file = 0;
449 /* Initialize the source file line number information for this file. */
451 if (line_vector) /* Unlikely, but maybe possible? */
453 line_vector_index = 0;
454 line_vector_length = 1000;
455 prev_line_number = -2; /* Force first line number to be explicit */
456 line_vector = (struct linetable *)
457 xmalloc (sizeof (struct linetable)
458 + line_vector_length * sizeof (struct linetable_entry));
461 /* Save the vital information from when starting to read a file,
462 for use when closing off the current file.
463 NAME is the file name the symbols came from, START_ADDR is the first
464 text address for the file, and SIZE is the number of bytes of text. */
467 complete_symtab (name, start_addr, size)
469 CORE_ADDR start_addr;
472 last_source_file = savestring (name, strlen (name));
473 cur_src_start_addr = start_addr;
474 cur_src_end_addr = start_addr + size;
476 if (entry_point < cur_src_end_addr
477 && entry_point >= cur_src_start_addr)
479 startup_file_start = cur_src_start_addr;
480 startup_file_end = cur_src_end_addr;
484 /* Finish the symbol definitions for one main source file,
485 close off all the lexical contexts for that file
486 (creating struct block's for them), then make the
487 struct symtab for that file and put it in the list of all such. */
491 struct objfile *objfile;
493 register struct symtab *symtab;
494 register struct context_stack *cstk;
495 register struct blockvector *blockvector;
496 register struct linetable *lv;
498 /* Finish the lexical context of the last function in the file. */
502 cstk = context_stack;
504 /* Make a block for the local symbols within. */
505 finish_block (cstk->name, &local_symbols, cstk->old_blocks,
506 cstk->start_addr, cur_src_end_addr);
510 /* Ignore a file that has no functions with real debugging info. */
511 if (pending_blocks == 0 && file_symbols == 0 && global_symbols == 0)
515 line_vector_length = -1;
516 last_source_file = 0;
520 /* Create the two top-level blocks for this file (STATIC_BLOCK and
522 finish_block (0, &file_symbols, 0, cur_src_start_addr, cur_src_end_addr);
523 finish_block (0, &global_symbols, 0, cur_src_start_addr, cur_src_end_addr);
525 /* Create the blockvector that points to all the file's blocks. */
526 blockvector = make_blockvector ();
528 /* Now create the symtab object for this source file. */
529 symtab = allocate_symtab (last_source_file, objfile);
531 /* Fill in its components. */
532 symtab->blockvector = blockvector;
533 symtab->free_code = free_linetable;
534 symtab->free_ptr = 0;
535 symtab->filename = last_source_file;
536 symtab->dirname = NULL;
538 lv->nitems = line_vector_index;
539 symtab->linetable = (struct linetable *)
540 xrealloc (lv, (sizeof (struct linetable)
541 + lv->nitems * sizeof (struct linetable_entry)));
543 free_named_symtabs (symtab->filename);
545 /* Link the new symtab into the list of such. */
546 symtab->next = symtab_list;
547 symtab_list = symtab;
549 /* Reinitialize for beginning of new file. */
551 line_vector_length = -1;
552 last_source_file = 0;
556 record_misc_function (name, address)
560 /* We don't want TDESC entry points on the misc_function_vector */
561 if (name[0] == '@') return;
563 /* mf_text isn't true, but apparently COFF doesn't tell us what it really
564 is, so this guess is more useful than mf_unknown. */
565 prim_record_misc_function (savestring (name, strlen (name)),
570 /* coff_symfile_init ()
571 is the coff-specific initialization routine for reading symbols.
572 It is passed a struct sym_fns which contains, among other things,
573 the BFD for the file whose symbols are being read, and a slot for
574 a pointer to "private data" which we fill with cookies and other
575 treats for coff_symfile_read ().
577 We will only be called if this is a COFF or COFF-like file.
578 BFD handles figuring out the format of the file, and code in symtab.c
579 uses BFD's determination to vector to us.
581 The ultimate result is a new symtab (or, FIXME, eventually a psymtab). */
583 struct coff_symfile_info {
584 file_ptr min_lineno_offset; /* Where in file lowest line#s are */
585 file_ptr max_lineno_offset; /* 1+last byte of line#s in file */
588 static int text_bfd_scnum;
591 coff_symfile_init (sf)
595 bfd *abfd = sf->sym_bfd;
597 /* Allocate struct to keep track of the symfile */
598 /* FIXME memory leak */
599 sf->sym_private = xmalloc (sizeof (struct coff_symfile_info));
601 /* Save startup file's range of PC addresses to help blockframe.c
602 decide where the bottom of the stack is. */
603 if (bfd_get_file_flags (abfd) & EXEC_P)
605 /* Executable file -- record its entry point so we'll recognize
606 the startup file because it contains the entry point. */
607 entry_point = bfd_get_start_address (abfd);
611 /* Examination of non-executable.o files. Short-circuit this stuff. */
612 /* ~0 will not be in any file, we hope. */
614 /* set the startup file to be an empty range. */
615 startup_file_start = 0;
616 startup_file_end = 0;
618 /* Save the section number for the text section */
619 if (section = bfd_get_section_by_name(abfd,".text"))
620 text_bfd_scnum = section->index;
625 /* This function is called for every section; it finds the outer limits
626 of the line table (minimum and maximum file offset) so that the
627 mainline code can read the whole thing for efficiency. */
631 find_linenos (abfd, asect, vpinfo)
636 struct coff_symfile_info *info;
638 file_ptr offset, maxoff;
640 /* WARNING WILL ROBINSON! ACCESSING BFD-PRIVATE DATA HERE! FIXME! */
641 count = asect->lineno_count;
646 size = count * local_linesz;
648 info = (struct coff_symfile_info *)vpinfo;
649 /* WARNING WILL ROBINSON! ACCESSING BFD-PRIVATE DATA HERE! FIXME! */
650 offset = asect->line_filepos;
653 if (offset < info->min_lineno_offset || info->min_lineno_offset == 0)
654 info->min_lineno_offset = offset;
656 maxoff = offset + size;
657 if (maxoff > info->max_lineno_offset)
658 info->max_lineno_offset = maxoff;
662 /* The BFD for this file -- only good while we're actively reading
663 symbols into a psymtab or a symtab. */
665 static bfd *symfile_bfd;
667 /* Read a symbol file, after initialization by coff_symfile_init. */
668 /* FIXME! Addr and Mainline are not used yet -- this will not work for
669 shared libraries or add_file! */
673 coff_symfile_read (sf, addr, mainline)
678 struct coff_symfile_info *info = (struct coff_symfile_info *)sf->sym_private;
679 bfd *abfd = sf->objfile->obfd;
680 coff_data_type *cdata = coff_data (abfd);
681 char *name = bfd_get_filename (abfd);
686 int stringtab_offset;
688 symfile_bfd = abfd; /* Kludge for swap routines */
690 /* WARNING WILL ROBINSON! ACCESSING BFD-PRIVATE DATA HERE! FIXME! */
691 desc = fileno ((FILE *)(abfd->iostream)); /* File descriptor */
692 num_symbols = bfd_get_symcount (abfd); /* How many syms */
693 symtab_offset = cdata->sym_filepos; /* Symbol table file offset */
694 stringtab_offset = symtab_offset + /* String table file offset */
695 num_symbols * cdata->local_symesz;
697 /* Set a few file-statics that give us specific information about
698 the particular COFF file format we're reading. */
699 local_linesz = cdata->local_linesz;
700 local_n_btmask = cdata->local_n_btmask;
701 local_n_btshft = cdata->local_n_btshft;
702 local_n_tmask = cdata->local_n_tmask;
703 local_n_tshift = cdata->local_n_tshift;
704 local_linesz = cdata->local_linesz;
705 local_symesz = cdata->local_symesz;
706 local_auxesz = cdata->local_auxesz;
708 /* Allocate space for raw symbol and aux entries, based on their
709 space requirements as reported by BFD. */
710 temp_sym = (char *) xmalloc
711 (cdata->local_symesz + cdata->local_auxesz);
712 temp_aux = temp_sym + cdata->local_symesz;
713 make_cleanup (free_current_contents, &temp_sym);
716 /* Read the line number table, all at once. */
717 info->min_lineno_offset = 0;
718 info->max_lineno_offset = 0;
719 bfd_map_over_sections (abfd, find_linenos, info);
721 val = init_lineno (desc, info->min_lineno_offset,
722 info->max_lineno_offset - info->min_lineno_offset);
724 error ("\"%s\": error reading line numbers\n", name);
726 /* Now read the string table, all at once. */
728 val = init_stringtab (desc, stringtab_offset);
730 error ("\"%s\": can't get string table", name);
731 make_cleanup (free_stringtab, 0);
733 /* Position to read the symbol table. Do not read it all at once. */
734 val = lseek (desc, (long)symtab_offset, 0);
736 perror_with_name (name);
738 init_misc_bunches ();
739 make_cleanup (discard_misc_bunches, 0);
741 /* Now that the executable file is positioned at symbol table,
742 process it and define symbols accordingly. */
744 read_coff_symtab (desc, num_symbols, sf->objfile);
746 patch_opaque_types ();
748 /* Sort symbols alphabetically within each block. */
750 sort_all_symtab_syms ();
752 /* Go over the misc symbol bunches and install them in vector. */
754 condense_misc_bunches (!mainline);
763 /* Simplified internal version of coff symbol table information */
767 int c_symnum; /* symbol number of this entry */
768 int c_naux; /* 0 if syment only, 1 if syment + auxent, etc */
775 /* Given pointers to a symbol table in coff style exec file,
776 analyze them and create struct symtab's describing the symbols.
777 NSYMS is the number of symbols in the symbol table.
778 We read them one at a time using read_one_sym (). */
781 read_coff_symtab (desc, nsyms, objfile)
784 struct objfile *objfile;
786 int newfd; /* Avoid multiple closes on same desc */
788 register struct context_stack *new;
789 struct coff_symbol coff_symbol;
790 register struct coff_symbol *cs = &coff_symbol;
791 static struct internal_syment main_sym;
792 static union internal_auxent main_aux;
793 struct coff_symbol fcn_cs_saved;
794 static struct internal_syment fcn_sym_saved;
795 static union internal_auxent fcn_aux_saved;
797 /* A .file is open. */
798 int in_source_file = 0;
799 int num_object_files = 0;
800 int next_file_symnum = -1;
802 /* Name of the current file. */
803 char *filestring = "";
809 struct cleanup *old_chain;
814 fatal ("Too many open files");
815 stream = fdopen (newfd, "r");
817 /* These cleanups will be discarded below if we succeed. */
818 old_chain = make_cleanup (free_objfile, objfile);
819 make_cleanup (fclose, stream);
821 nlist_stream_global = stream;
822 nlist_nsyms_global = nsyms;
823 last_source_file = 0;
824 bzero (opaque_type_chain, sizeof opaque_type_chain);
826 if (type_vector) /* Get rid of previous one */
828 type_vector_length = 160;
829 type_vector = (struct type **)
830 xmalloc (type_vector_length * sizeof (struct type *));
831 bzero (type_vector, type_vector_length * sizeof (struct type *));
836 while (symnum < nsyms)
838 QUIT; /* Make this command interruptable. */
839 read_one_sym (cs, &main_sym, &main_aux);
842 temp_sem_val = cs->c_name[0] << 24 | cs->c_name[1] << 16 |
843 cs->c_name[2] << 8 | cs->c_name[3];
844 if (int_sem_val == temp_sem_val)
845 last_coffsem = (int) strtol (cs->c_name+4, (char **) NULL, 10);
848 if (cs->c_symnum == next_file_symnum && cs->c_sclass != C_FILE)
850 if (last_source_file)
851 end_symtab (objfile);
854 complete_symtab ("_globals_", 0, first_object_file_end);
855 /* done with all files, everything from here on out is globals */
858 /* Special case for file with type declarations only, no text. */
859 if (!last_source_file && SDB_TYPE (cs->c_type)
860 && cs->c_secnum == N_DEBUG)
861 complete_symtab (filestring, 0, 0);
863 /* Typedefs should not be treated as symbol definitions. */
864 if (ISFCN (cs->c_type) && cs->c_sclass != C_TPDEF)
866 /* record as misc function. if we get '.bf' next,
867 * then we undo this step
869 record_misc_function (cs->c_name, cs->c_value);
871 fcn_line_ptr = main_aux.x_sym.x_fcnary.x_fcn.x_lnnoptr;
872 fcn_start_addr = cs->c_value;
874 fcn_sym_saved = main_sym;
875 fcn_aux_saved = main_aux;
879 switch (cs->c_sclass)
888 printf ("Bad n_sclass = %d\n", cs->c_sclass);
893 * c_value field contains symnum of next .file entry in table
894 * or symnum of first global after last .file.
896 next_file_symnum = cs->c_value;
897 filestring = getfilename (&main_aux);
899 * Complete symbol table for last object file
900 * containing debugging information.
902 if (last_source_file)
904 end_symtab (objfile);
911 if (cs->c_name[0] == '.') {
912 if (strcmp (cs->c_name, ".text") == 0) {
913 /* FIXME: don't wire in ".text" as section name
915 if (++num_object_files == 1) {
916 /* last address of startup file */
917 first_object_file_end = cs->c_value +
918 main_aux.x_scn.x_scnlen;
920 /* Check for in_source_file deals with case of
921 a file with debugging symbols
922 followed by a later file with no symbols. */
924 complete_symtab (filestring, cs->c_value,
925 main_aux.x_scn.x_scnlen);
928 /* flush rest of '.' symbols */
931 else if (!SDB_TYPE (cs->c_type)
932 && cs->c_name[0] == 'L'
933 && (strncmp (cs->c_name, "LI%", 3) == 0
934 || strncmp (cs->c_name, "LF%", 3) == 0
935 || strncmp (cs->c_name,"LC%",3) == 0
936 || strncmp (cs->c_name,"LP%",3) == 0
937 || strncmp (cs->c_name,"LPB%",4) == 0
938 || strncmp (cs->c_name,"LBB%",4) == 0
939 || strncmp (cs->c_name,"LBE%",4) == 0
940 || strncmp (cs->c_name,"LPBX%",5) == 0))
941 /* At least on a 3b1, gcc generates swbeg and string labels
942 that look like this. Ignore them. */
944 /* fall in for static symbols that don't start with '.' */
946 if (!SDB_TYPE (cs->c_type)) {
947 /* FIXME: This is BOGUS Will Robinson!
948 Coff should provide the SEC_CODE flag for executable sections,
949 then if we could look up sections by section number we
950 could see if the flags indicate SEC_CODE. If so, then
951 record this symbol as a miscellaneous function. But why
952 are absolute syms recorded as functions, anyway? */
953 if (cs->c_secnum <= text_bfd_scnum+1) {/* text or abs */
954 record_misc_function (cs->c_name, cs->c_value);
960 (void) process_coff_symbol (cs, &main_aux);
964 if (strcmp (cs->c_name, ".bf") == 0)
968 /* value contains address of first non-init type code */
969 /* main_aux.x_sym.x_misc.x_lnsz.x_lnno
970 contains line number of '{' } */
972 complain (no_aux_complaint, cs->c_symnum);
973 fcn_first_line = main_aux.x_sym.x_misc.x_lnsz.x_lnno;
975 new = (struct context_stack *)
976 xmalloc (sizeof (struct context_stack));
977 new->depth = depth = 0;
981 new->old_blocks = pending_blocks;
982 new->start_addr = fcn_start_addr;
983 fcn_cs_saved.c_name = getsymname (&fcn_sym_saved);
984 new->name = process_coff_symbol (&fcn_cs_saved,
987 else if (strcmp (cs->c_name, ".ef") == 0)
989 /* the value of .ef is the address of epilogue code;
992 /* { main_aux.x_sym.x_misc.x_lnsz.x_lnno
993 contains number of lines to '}' */
997 complain (&ef_complaint, cs->c_symnum);
1001 if (cs->c_naux != 1) {
1002 complain (no_aux_complaint, cs->c_symnum);
1003 fcn_last_line = 0x7FFFFFFF;
1005 fcn_last_line = main_aux.x_sym.x_misc.x_lnsz.x_lnno;
1007 enter_linenos (fcn_line_ptr, fcn_first_line, fcn_last_line);
1009 finish_block (new->name, &local_symbols, new->old_blocks,
1011 #if defined (FUNCTION_EPILOGUE_SIZE)
1012 /* This macro should be defined only on
1014 fcn_aux_saved.x_sym.x_misc.x_fsize
1015 field is always zero.
1016 So use the .bf record information that
1017 points to the epilogue and add the size
1019 cs->c_value + FUNCTION_EPILOGUE_SIZE
1021 fcn_cs_saved.c_value +
1022 fcn_aux_saved.x_sym.x_misc.x_fsize
1026 within_function = 0;
1032 if (strcmp (cs->c_name, ".bb") == 0)
1034 new = (struct context_stack *)
1035 xmalloc (sizeof (struct context_stack));
1038 new->next = context_stack;
1039 context_stack = new;
1040 new->locals = local_symbols;
1041 new->old_blocks = pending_blocks;
1042 new->start_addr = cs->c_value;
1046 else if (strcmp (cs->c_name, ".eb") == 0)
1048 new = context_stack;
1049 if (new == 0 || depth != new->depth)
1050 error ("Invalid symbol data: .bb/.eb symbol mismatch at symbol %d.",
1052 if (local_symbols && context_stack->next)
1054 /* Make a block for the local symbols within. */
1055 finish_block (0, &local_symbols, new->old_blocks,
1056 new->start_addr, cs->c_value);
1059 local_symbols = new->locals;
1060 context_stack = new->next;
1066 (void) process_coff_symbol (cs, &main_aux);
1071 if (last_source_file)
1072 end_symtab (objfile);
1074 discard_cleanups (old_chain);
1077 /* Routines for reading headers and symbols from executable. */
1080 /* Move these XXXMAGIC symbol defns into BFD! */
1082 /* Read COFF file header, check magic number,
1083 and return number of symbols. */
1084 read_file_hdr (chan, file_hdr)
1088 lseek (chan, 0L, 0);
1089 if (myread (chan, (char *)file_hdr, FILHSZ) < 0)
1092 switch (file_hdr->f_magic)
1107 #if defined (MC68KWRMAGIC) \
1108 && (!defined (MC68MAGIC) || MC68KWRMAGIC != MC68MAGIC)
1122 case I960ROMAGIC: /* Intel 960 */
1125 case I960RWMAGIC: /* Intel 960 */
1127 return file_hdr->f_nsyms;
1131 if (BADMAG(file_hdr))
1134 return file_hdr->f_nsyms;
1142 /* Read the next symbol, swap it, and return it in both internal_syment
1143 form, and coff_symbol form. Also return its first auxent, if any,
1144 in internal_auxent form, and skip any other auxents. */
1147 read_one_sym (cs, sym, aux)
1148 register struct coff_symbol *cs;
1149 register struct internal_syment *sym;
1150 register union internal_auxent *aux;
1154 cs->c_symnum = symnum;
1155 fread (temp_sym, local_symesz, 1, nlist_stream_global);
1156 bfd_coff_swap_sym_in (symfile_bfd, temp_sym, (char *)sym);
1157 cs->c_naux = sym->n_numaux & 0xff;
1158 if (cs->c_naux >= 1)
1160 fread (temp_aux, local_auxesz, 1, nlist_stream_global);
1161 bfd_coff_swap_aux_in (symfile_bfd, temp_aux, sym->n_type, sym->n_sclass,
1163 /* If more than one aux entry, read past it (only the first aux
1165 for (i = 1; i < cs->c_naux; i++)
1166 fread (temp_aux, local_auxesz, 1, nlist_stream_global);
1168 cs->c_name = getsymname (sym);
1169 cs->c_value = sym->n_value;
1170 cs->c_sclass = (sym->n_sclass & 0xff);
1171 cs->c_secnum = sym->n_scnum;
1172 cs->c_type = (unsigned) sym->n_type;
1173 if (!SDB_TYPE (cs->c_type))
1176 symnum += 1 + cs->c_naux;
1179 /* Support for string table handling */
1181 static char *stringtab = NULL;
1184 init_stringtab (chan, offset)
1190 unsigned char lengthbuf[4];
1198 if (lseek (chan, offset, 0) < 0)
1201 val = myread (chan, (char *)lengthbuf, sizeof lengthbuf);
1202 length = bfd_h_get_32 (symfile_bfd, lengthbuf);
1204 /* If no string table is needed, then the file may end immediately
1205 after the symbols. Just return with `stringtab' set to null. */
1206 if (val != sizeof length || length < sizeof length)
1209 stringtab = (char *) xmalloc (length);
1210 if (stringtab == NULL)
1213 bcopy (&length, stringtab, sizeof length);
1214 if (length == sizeof length) /* Empty table -- just the count */
1217 val = myread (chan, stringtab + sizeof length, length - sizeof length);
1218 if (val != length - sizeof length || stringtab[length - 1] != '\0')
1233 getsymname (symbol_entry)
1234 struct internal_syment *symbol_entry;
1236 static char buffer[SYMNMLEN+1];
1239 if (symbol_entry->_n._n_n._n_zeroes == 0)
1241 result = stringtab + symbol_entry->_n._n_n._n_offset;
1245 strncpy (buffer, symbol_entry->_n._n_name, SYMNMLEN);
1246 buffer[SYMNMLEN] = '\0';
1253 getfilename (aux_entry)
1254 union internal_auxent *aux_entry;
1256 static char buffer[BUFSIZ];
1257 register char *temp;
1259 extern char *rindex ();
1261 #ifndef COFF_NO_LONG_FILE_NAMES
1262 #if defined (x_zeroes)
1264 if (aux_entry->x_zeroes == 0)
1265 strcpy (buffer, stringtab + aux_entry->x_offset);
1266 #else /* no x_zeroes */
1267 if (aux_entry->x_file.x_n.x_zeroes == 0)
1268 strcpy (buffer, stringtab + aux_entry->x_file.x_n.x_offset);
1269 #endif /* no x_zeroes */
1271 #endif /* COFF_NO_LONG_FILE_NAMES */
1273 #if defined (x_name)
1275 strncpy (buffer, aux_entry->x_name, FILNMLEN);
1277 strncpy (buffer, aux_entry->x_file.x_fname, FILNMLEN);
1279 buffer[FILNMLEN] = '\0';
1282 if ((temp = rindex (result, '/')) != NULL)
1287 /* Support for line number handling */
1288 static char *linetab = NULL;
1289 static long linetab_offset;
1290 static unsigned long linetab_size;
1292 /* Read in all the line numbers for fast lookups later. Leave them in
1293 external (unswapped) format in memory; we'll swap them as we enter
1294 them into GDB's data structures. */
1297 init_lineno (chan, offset, size)
1304 linetab_offset = offset;
1305 linetab_size = size;
1310 if (lseek (chan, offset, 0) < 0)
1313 /* Allocate the desired table, plus a sentinel */
1314 linetab = (char *) xmalloc (size + local_linesz);
1316 val = myread (chan, linetab, size);
1320 /* Terminate it with an all-zero sentinel record */
1321 bzero (linetab + size, local_linesz);
1323 make_cleanup (free, linetab); /* Be sure it gets de-allocated. */
1327 #if !defined (L_LNNO32)
1328 #define L_LNNO32(lp) ((lp)->l_lnno)
1332 enter_linenos (file_offset, first_line, last_line)
1334 register int first_line;
1335 register int last_line;
1337 register char *rawptr;
1338 struct internal_lineno lptr;
1340 if (file_offset < linetab_offset)
1342 complain (&lineno_complaint, file_offset);
1343 if (file_offset > linetab_size) /* Too big to be an offset? */
1345 file_offset += linetab_offset; /* Try reading at that linetab offset */
1348 rawptr = &linetab[file_offset - linetab_offset];
1350 /* skip first line entry for each function */
1351 rawptr += local_linesz;
1352 /* line numbers start at one for the first line of the function */
1356 bfd_coff_swap_lineno_in (symfile_bfd, rawptr, &lptr);
1357 rawptr += local_linesz;
1358 /* The next function, or the sentinel, will have L_LNNO32 zero; we exit. */
1359 if (L_LNNO32 (&lptr) && L_LNNO32 (&lptr) <= last_line)
1360 record_line (first_line + L_LNNO32 (&lptr), lptr.l_addr.l_paddr);
1370 register char *p = name;
1371 register int total = p[0];
1384 return total % HASHSIZE;
1388 patch_type (type, real_type)
1390 struct type *real_type;
1392 register struct type *target = TYPE_TARGET_TYPE (type);
1393 register struct type *real_target = TYPE_TARGET_TYPE (real_type);
1394 int field_size = TYPE_NFIELDS (real_target) * sizeof (struct field);
1396 TYPE_LENGTH (target) = TYPE_LENGTH (real_target);
1397 TYPE_NFIELDS (target) = TYPE_NFIELDS (real_target);
1398 TYPE_FIELDS (target) = (struct field *)
1399 obstack_alloc (symbol_obstack, field_size);
1401 bcopy (TYPE_FIELDS (real_target), TYPE_FIELDS (target), field_size);
1403 if (TYPE_NAME (real_target))
1405 if (TYPE_NAME (target))
1406 free (TYPE_NAME (target));
1407 TYPE_NAME (target) = concat (TYPE_NAME (real_target), NULL);
1411 /* Patch up all appropriate typdef symbols in the opaque_type_chains
1412 so that they can be used to print out opaque data structures properly */
1415 patch_opaque_types ()
1419 /* Look at each symbol in the per-file block of each symtab. */
1420 for (s = symtab_list; s; s = s->next)
1422 register struct block *b;
1425 /* Go through the per-file symbols only */
1426 b = BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), STATIC_BLOCK);
1427 for (i = BLOCK_NSYMS (b) - 1; i >= 0; i--)
1429 register struct symbol *real_sym;
1431 /* Find completed typedefs to use to fix opaque ones.
1432 Remove syms from the chain when their types are stored,
1433 but search the whole chain, as there may be several syms
1434 from different files with the same name. */
1435 real_sym = BLOCK_SYM (b, i);
1436 if (SYMBOL_CLASS (real_sym) == LOC_TYPEDEF &&
1437 SYMBOL_NAMESPACE (real_sym) == VAR_NAMESPACE &&
1438 TYPE_CODE (SYMBOL_TYPE (real_sym)) == TYPE_CODE_PTR &&
1439 TYPE_LENGTH (TYPE_TARGET_TYPE (SYMBOL_TYPE (real_sym))) != 0)
1441 register char *name = SYMBOL_NAME (real_sym);
1442 register int hash = hashname (name);
1443 register struct symbol *sym, *prev;
1446 for (sym = opaque_type_chain[hash]; sym;)
1448 if (name[0] == SYMBOL_NAME (sym)[0] &&
1449 !strcmp (name + 1, SYMBOL_NAME (sym) + 1))
1452 SYMBOL_VALUE_CHAIN (prev) = SYMBOL_VALUE_CHAIN (sym);
1454 opaque_type_chain[hash] = SYMBOL_VALUE_CHAIN (sym);
1456 patch_type (SYMBOL_TYPE (sym), SYMBOL_TYPE (real_sym));
1459 sym = SYMBOL_VALUE_CHAIN (prev);
1461 sym = opaque_type_chain[hash];
1466 sym = SYMBOL_VALUE_CHAIN (sym);
1474 #if defined (clipper)
1475 #define BELIEVE_PCC_PROMOTION 1
1478 static struct symbol *
1479 process_coff_symbol (cs, aux)
1480 register struct coff_symbol *cs;
1481 register union internal_auxent *aux;
1483 register struct symbol *sym
1484 = (struct symbol *) obstack_alloc (symbol_obstack, sizeof (struct symbol));
1486 #ifdef NAMES_HAVE_UNDERSCORE
1492 bzero (sym, sizeof (struct symbol));
1494 name = (name[0] == '_' ? name + offset : name);
1495 SYMBOL_NAME (sym) = obstack_copy0 (symbol_obstack, name, strlen (name));
1497 /* default assumptions */
1498 SYMBOL_VALUE (sym) = cs->c_value;
1499 SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
1501 if (ISFCN (cs->c_type))
1504 /* FIXME: This has NOT been tested. The DBX version has.. */
1505 /* Generate a template for the type of this function. The
1506 types of the arguments will be added as we read the symbol
1508 struct type *new = (struct type *)
1509 obstack_alloc (symbol_obstack, sizeof (struct type));
1511 bcopy(lookup_function_type (decode_function_type (cs, cs->c_type, aux)),
1512 new, sizeof(struct type));
1513 SYMBOL_TYPE (sym) = new;
1514 in_function_type = SYMBOL_TYPE(sym);
1517 lookup_function_type (decode_function_type (cs, cs->c_type, aux));
1520 SYMBOL_CLASS (sym) = LOC_BLOCK;
1521 if (cs->c_sclass == C_STAT)
1522 add_symbol_to_list (sym, &file_symbols);
1523 else if (cs->c_sclass == C_EXT)
1524 add_symbol_to_list (sym, &global_symbols);
1528 SYMBOL_TYPE (sym) = decode_type (cs, cs->c_type, aux);
1529 switch (cs->c_sclass)
1535 SYMBOL_CLASS (sym) = LOC_LOCAL;
1536 add_symbol_to_list (sym, &local_symbols);
1540 SYMBOL_CLASS (sym) = LOC_STATIC;
1541 SYMBOL_VALUE_ADDRESS (sym) = (CORE_ADDR) cs->c_value;
1542 add_symbol_to_list (sym, &global_symbols);
1546 SYMBOL_CLASS (sym) = LOC_STATIC;
1547 SYMBOL_VALUE_ADDRESS (sym) = (CORE_ADDR) cs->c_value;
1548 if (within_function) {
1549 /* Static symbol of local scope */
1550 add_symbol_to_list (sym, &local_symbols);
1553 /* Static symbol at top level of file */
1554 add_symbol_to_list (sym, &file_symbols);
1558 #ifdef C_GLBLREG /* AMD coff */
1562 SYMBOL_CLASS (sym) = LOC_REGISTER;
1563 SYMBOL_VALUE (sym) = SDB_REG_TO_REGNUM(cs->c_value);
1564 add_symbol_to_list (sym, &local_symbols);
1571 SYMBOL_CLASS (sym) = LOC_ARG;
1573 /* FIXME: This has not bee tested. */
1574 /* Add parameter to function. */
1575 add_param_to_type(&in_function_type,sym);
1577 add_symbol_to_list (sym, &local_symbols);
1578 #if !defined (BELIEVE_PCC_PROMOTION)
1579 /* If PCC says a parameter is a short or a char,
1580 it is really an int. */
1581 if (SYMBOL_TYPE (sym) == builtin_type_char
1582 || SYMBOL_TYPE (sym) == builtin_type_short)
1583 SYMBOL_TYPE (sym) = builtin_type_int;
1584 else if (SYMBOL_TYPE (sym) == builtin_type_unsigned_char
1585 || SYMBOL_TYPE (sym) == builtin_type_unsigned_short)
1586 SYMBOL_TYPE (sym) = builtin_type_unsigned_int;
1591 SYMBOL_CLASS (sym) = LOC_REGPARM;
1592 SYMBOL_VALUE (sym) = SDB_REG_TO_REGNUM(cs->c_value);
1593 add_symbol_to_list (sym, &local_symbols);
1594 #if !defined (BELIEVE_PCC_PROMOTION)
1595 /* If PCC says a parameter is a short or a char,
1596 it is really an int. */
1597 if (SYMBOL_TYPE (sym) == builtin_type_char
1598 || SYMBOL_TYPE (sym) == builtin_type_short)
1599 SYMBOL_TYPE (sym) = builtin_type_int;
1600 else if (SYMBOL_TYPE (sym) == builtin_type_unsigned_char
1601 || SYMBOL_TYPE (sym) == builtin_type_unsigned_short)
1602 SYMBOL_TYPE (sym) = builtin_type_unsigned_int;
1607 SYMBOL_CLASS (sym) = LOC_TYPEDEF;
1608 SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
1610 /* If type has no name, give it one */
1611 if (TYPE_NAME (SYMBOL_TYPE (sym)) == 0
1612 && (TYPE_FLAGS (SYMBOL_TYPE (sym)) & TYPE_FLAG_PERM) == 0)
1613 TYPE_NAME (SYMBOL_TYPE (sym))
1614 = concat (SYMBOL_NAME (sym), NULL);
1616 /* Keep track of any type which points to empty structured type,
1617 so it can be filled from a definition from another file */
1618 if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_PTR &&
1619 TYPE_LENGTH (TYPE_TARGET_TYPE (SYMBOL_TYPE (sym))) == 0)
1621 register int i = hashname (SYMBOL_NAME (sym));
1623 SYMBOL_VALUE_CHAIN (sym) = opaque_type_chain[i];
1624 opaque_type_chain[i] = sym;
1626 add_symbol_to_list (sym, &file_symbols);
1632 SYMBOL_CLASS (sym) = LOC_TYPEDEF;
1633 SYMBOL_NAMESPACE (sym) = STRUCT_NAMESPACE;
1634 if (TYPE_NAME (SYMBOL_TYPE (sym)) == 0
1635 && (TYPE_FLAGS (SYMBOL_TYPE (sym)) & TYPE_FLAG_PERM) == 0)
1636 TYPE_NAME (SYMBOL_TYPE (sym))
1638 (cs->c_sclass == C_ENTAG
1640 : (cs->c_sclass == C_STRTAG
1641 ? "struct " : "union ")),
1642 SYMBOL_NAME (sym), NULL);
1643 add_symbol_to_list (sym, &file_symbols);
1653 /* Decode a coff type specifier;
1654 return the type that is meant. */
1658 decode_type (cs, c_type, aux)
1659 register struct coff_symbol *cs;
1660 unsigned int c_type;
1661 register union internal_auxent *aux;
1663 register struct type *type = 0;
1664 unsigned int new_c_type;
1666 if (c_type & ~N_BTMASK)
1668 new_c_type = DECREF (c_type);
1671 type = decode_type (cs, new_c_type, aux);
1672 type = lookup_pointer_type (type);
1674 else if (ISFCN (c_type))
1676 type = decode_type (cs, new_c_type, aux);
1677 type = lookup_function_type (type);
1679 else if (ISARY (c_type))
1682 register unsigned short *dim;
1683 struct type *base_type;
1685 /* Define an array type. */
1686 /* auxent refers to array, not base type */
1687 if (aux->x_sym.x_tagndx.l == 0)
1690 /* shift the indices down */
1691 dim = &aux->x_sym.x_fcnary.x_ary.x_dimen[0];
1694 for (i = 0; *dim && i < DIMNUM - 1; i++, dim++)
1698 type = (struct type *)
1699 obstack_alloc (symbol_obstack, sizeof (struct type));
1700 bzero (type, sizeof (struct type));
1702 base_type = decode_type (cs, new_c_type, aux);
1704 TYPE_CODE (type) = TYPE_CODE_ARRAY;
1705 TYPE_TARGET_TYPE (type) = base_type;
1706 TYPE_LENGTH (type) = n * TYPE_LENGTH (base_type);
1711 /* Reference to existing type */
1712 if (cs->c_naux > 0 && aux->x_sym.x_tagndx.l != 0)
1714 type = coff_alloc_type (aux->x_sym.x_tagndx.l);
1718 return decode_base_type (cs, BTYPE (c_type), aux);
1721 /* Decode a coff type specifier for function definition;
1722 return the type that the function returns. */
1726 decode_function_type (cs, c_type, aux)
1727 register struct coff_symbol *cs;
1728 unsigned int c_type;
1729 register union internal_auxent *aux;
1731 if (aux->x_sym.x_tagndx.l == 0)
1732 cs->c_naux = 0; /* auxent refers to function, not base type */
1734 return decode_type (cs, DECREF (c_type), aux);
1741 decode_base_type (cs, c_type, aux)
1742 register struct coff_symbol *cs;
1743 unsigned int c_type;
1744 register union internal_auxent *aux;
1751 /* shows up with "void (*foo)();" structure members */
1752 return builtin_type_void;
1755 /* DGUX actually defines both T_ARG and T_VOID to the same value. */
1758 /* Shows up in DGUX, I think. Not sure where. */
1759 return builtin_type_void; /* shouldn't show up here */
1765 /* Intel 960 COFF has this symbol and meaning. */
1766 return builtin_type_void;
1770 return builtin_type_char;
1773 return builtin_type_short;
1776 return builtin_type_int;
1779 return builtin_type_long;
1782 return builtin_type_float;
1785 return builtin_type_double;
1788 if (cs->c_naux != 1)
1790 /* anonymous structure type */
1791 type = coff_alloc_type (cs->c_symnum);
1792 TYPE_CODE (type) = TYPE_CODE_STRUCT;
1793 TYPE_NAME (type) = concat ("struct ", "<opaque>", NULL);
1794 TYPE_CPLUS_SPECIFIC (type)
1795 = (struct cplus_struct_type *) obstack_alloc (symbol_obstack, sizeof (struct cplus_struct_type));
1796 bzero (TYPE_CPLUS_SPECIFIC (type), sizeof (struct cplus_struct_type));
1797 TYPE_LENGTH (type) = 0;
1798 TYPE_FIELDS (type) = 0;
1799 TYPE_NFIELDS (type) = 0;
1803 type = read_struct_type (cs->c_symnum,
1804 aux->x_sym.x_misc.x_lnsz.x_size,
1805 aux->x_sym.x_fcnary.x_fcn.x_endndx);
1810 if (cs->c_naux != 1)
1812 /* anonymous union type */
1813 type = coff_alloc_type (cs->c_symnum);
1814 TYPE_NAME (type) = concat ("union ", "<opaque>", NULL);
1815 TYPE_CPLUS_SPECIFIC (type) = (struct cplus_struct_type *)
1816 obstack_alloc (symbol_obstack, sizeof (struct cplus_struct_type));
1817 bzero (TYPE_CPLUS_SPECIFIC (type), sizeof (struct cplus_struct_type));
1818 TYPE_LENGTH (type) = 0;
1819 TYPE_LENGTH (type) = 0;
1820 TYPE_FIELDS (type) = 0;
1821 TYPE_NFIELDS (type) = 0;
1825 type = read_struct_type (cs->c_symnum,
1826 aux->x_sym.x_misc.x_lnsz.x_size,
1827 aux->x_sym.x_fcnary.x_fcn.x_endndx);
1829 TYPE_CODE (type) = TYPE_CODE_UNION;
1833 return read_enum_type (cs->c_symnum,
1834 aux->x_sym.x_misc.x_lnsz.x_size,
1835 aux->x_sym.x_fcnary.x_fcn.x_endndx);
1838 /* shouldn't show up here */
1842 return builtin_type_unsigned_char;
1845 return builtin_type_unsigned_short;
1848 return builtin_type_unsigned_int;
1851 return builtin_type_unsigned_long;
1853 printf ("unexpected type %d at symnum %d\n", c_type, cs->c_symnum);
1854 return builtin_type_void;
1857 /* This page contains subroutines of read_type. */
1859 /* Read the description of a structure (or union type)
1860 and return an object describing the type. */
1862 static struct type *
1863 read_struct_type (index, length, lastsym)
1870 struct nextfield *next;
1874 register struct type *type;
1875 register struct nextfield *list = 0;
1876 struct nextfield *new;
1880 #ifdef NAMES_HAVE_UNDERSCORE
1885 struct coff_symbol member_sym;
1886 register struct coff_symbol *ms = &member_sym;
1887 struct internal_syment sub_sym;
1888 union internal_auxent sub_aux;
1891 type = coff_alloc_type (index);
1892 TYPE_CODE (type) = TYPE_CODE_STRUCT;
1893 TYPE_CPLUS_SPECIFIC (type)
1894 = (struct cplus_struct_type *) obstack_alloc (symbol_obstack, sizeof (struct cplus_struct_type));
1895 bzero (TYPE_CPLUS_SPECIFIC (type), sizeof (struct cplus_struct_type));
1896 TYPE_LENGTH (type) = length;
1898 while (!done && symnum < lastsym && symnum < nlist_nsyms_global)
1900 read_one_sym (ms, &sub_sym, &sub_aux);
1902 name = (name[0] == '_' ? name + offset : name);
1904 switch (ms->c_sclass)
1909 /* Get space to record the next field's data. */
1910 new = (struct nextfield *) alloca (sizeof (struct nextfield));
1914 /* Save the data. */
1915 list->field.name = savestring (name, strlen (name));
1916 list->field.type = decode_type (ms, ms->c_type, &sub_aux);
1917 list->field.bitpos = 8 * ms->c_value;
1918 list->field.bitsize = 0;
1924 /* Get space to record the next field's data. */
1925 new = (struct nextfield *) alloca (sizeof (struct nextfield));
1929 /* Save the data. */
1930 list->field.name = savestring (name, strlen (name));
1931 list->field.type = decode_type (ms, ms->c_type, &sub_aux);
1932 list->field.bitpos = ms->c_value;
1933 list->field.bitsize = sub_aux.x_sym.x_misc.x_lnsz.x_size;
1942 /* Now create the vector of fields, and record how big it is. */
1944 TYPE_NFIELDS (type) = nfields;
1945 TYPE_FIELDS (type) = (struct field *)
1946 obstack_alloc (symbol_obstack, sizeof (struct field) * nfields);
1948 /* Copy the saved-up fields into the field vector. */
1950 for (n = nfields; list; list = list->next)
1951 TYPE_FIELD (type, --n) = list->field;
1956 /* Read a definition of an enumeration type,
1957 and create and return a suitable type object.
1958 Also defines the symbols that represent the values of the type. */
1959 /* Currently assumes it's sizeof (int) and doesn't use length. */
1962 static struct type *
1963 read_enum_type (index, length, lastsym)
1968 register struct symbol *sym;
1969 register struct type *type;
1972 struct pending **symlist;
1973 struct coff_symbol member_sym;
1974 register struct coff_symbol *ms = &member_sym;
1975 struct internal_syment sub_sym;
1976 union internal_auxent sub_aux;
1977 struct pending *osyms, *syms;
1980 #ifdef NAMES_HAVE_UNDERSCORE
1986 type = coff_alloc_type (index);
1987 if (within_function)
1988 symlist = &local_symbols;
1990 symlist = &file_symbols;
1993 while (!done && symnum < lastsym && symnum < nlist_nsyms_global)
1995 read_one_sym (ms, &sub_sym, &sub_aux);
1997 name = (name[0] == '_' ? name + offset : name);
1999 switch (ms->c_sclass)
2002 sym = (struct symbol *) xmalloc (sizeof (struct symbol));
2003 bzero (sym, sizeof (struct symbol));
2005 SYMBOL_NAME (sym) = savestring (name, strlen (name));
2006 SYMBOL_CLASS (sym) = LOC_CONST;
2007 SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
2008 SYMBOL_VALUE (sym) = ms->c_value;
2009 add_symbol_to_list (sym, symlist);
2014 /* Sometimes the linker (on 386/ix 2.0.2 at least) screws
2015 up the count of how many symbols to read. So stop
2022 /* Now fill in the fields of the type-structure. */
2024 /* FIXME: Should be sizeof (int) on target, not host. */
2025 TYPE_LENGTH (type) = sizeof (int);
2026 TYPE_CODE (type) = TYPE_CODE_ENUM;
2027 TYPE_NFIELDS (type) = nsyms;
2028 TYPE_FIELDS (type) = (struct field *)
2029 obstack_alloc (symbol_obstack, sizeof (struct field) * nsyms);
2031 /* Find the symbols for the values and put them into the type.
2032 The symbols can be found in the symlist that we put them on
2033 to cause them to be defined. osyms contains the old value
2034 of that symlist; everything up to there was defined by us. */
2036 for (syms = *symlist, n = nsyms; syms != osyms; syms = syms->next)
2038 SYMBOL_TYPE (syms->symbol) = type;
2039 TYPE_FIELD_NAME (type, --n) = SYMBOL_NAME (syms->symbol);
2040 TYPE_FIELD_VALUE (type, n) = 0;
2041 TYPE_FIELD_BITPOS (type, n) = SYMBOL_VALUE (syms->symbol);
2042 TYPE_FIELD_BITSIZE (type, n) = 0;
2044 /* Is this Modula-2's BOOLEAN type? Flag it as such if so. */
2045 if(TYPE_NFIELDS(type) == 2 &&
2046 ((!strcmp(TYPE_FIELD_NAME(type,0),"TRUE") &&
2047 !strcmp(TYPE_FIELD_NAME(type,1),"FALSE")) ||
2048 (!strcmp(TYPE_FIELD_NAME(type,1),"TRUE") &&
2049 !strcmp(TYPE_FIELD_NAME(type,0),"FALSE"))))
2050 TYPE_CODE(type) = TYPE_CODE_BOOL;
2054 /* Register our ability to parse symbols for coff BFD files */
2056 static struct sym_fns coff_sym_fns =
2059 coff_new_init, coff_symfile_init, coff_symfile_read,
2063 _initialize_coffread ()
2065 add_symtab_fns(&coff_sym_fns);