diff options
Diffstat (limited to 'gdb/coffread.c')
-rw-r--r-- | gdb/coffread.c | 633 |
1 files changed, 342 insertions, 291 deletions
diff --git a/gdb/coffread.c b/gdb/coffread.c index 13c3f2d..49a8000 100644 --- a/gdb/coffread.c +++ b/gdb/coffread.c @@ -18,40 +18,20 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include <stdio.h> #include "defs.h" #include "symtab.h" +#include "gdbtypes.h" #include "breakpoint.h" #include "bfd.h" #include "symfile.h" - +#include "buildsym.h" #include <obstack.h> + #include <string.h> #include "coff/internal.h" /* Internal format of COFF symbols in BFD */ #include "libcoff.h" /* FIXME secret internal data from BFD */ -static void add_symbol_to_list (); -static void read_coff_symtab (); -static void patch_opaque_types (); -static struct type *decode_function_type (); -static struct type *decode_type (); -static struct type *decode_base_type (); -static struct type *read_enum_type (); -static struct type *read_struct_type (); -static void finish_block (); -static struct blockvector *make_blockvector (); -static struct symbol *process_coff_symbol (); -static int init_stringtab (); -static void free_stringtab (); -static char *getfilename (); -static char *getsymname (); -static int init_lineno (); -static void enter_linenos (); -static void read_one_sym (); - -extern int fclose (); - /* To be an sdb debug type, type must have at least a basic or primary derived type. Using this rather than checking against T_NULL is said to prevent core dumps if we try to operate on Michael Bloom @@ -68,11 +48,6 @@ extern int fclose (); # define SDB_REG_TO_REGNUM(value) (value) #endif -/* Name of source file whose symbol data we are now processing. - This comes from a symbol named ".file". */ - -static char *last_source_file; - /* Core address of start and end of text of current source file. This comes from a ".text" symbol where x_nlinno > 0. */ @@ -88,18 +63,6 @@ static CORE_ADDR first_object_file_end; static FILE *nlist_stream_global; static int nlist_nsyms_global; -/* The index in the symbol table of the last coff symbol that was processed. */ - -static int symnum; - -/* Vector of types defined so far, indexed by their coff symnum. */ - -static struct type **type_vector; - -/* Number of elements allocated for type_vector currently. */ - -static int type_vector_length; - /* Vector of line number information. */ static struct linetable *line_vector; @@ -150,41 +113,40 @@ static unsigned local_auxesz; /* Chain of typedefs of pointers to empty struct/union types. They are chained thru the SYMBOL_VALUE_CHAIN. */ -#define HASHSIZE 127 static struct symbol *opaque_type_chain[HASHSIZE]; /* Record the symbols defined for each context in a list. We don't create a struct block for the context until we know how long to make it. */ -struct pending +struct coff_pending { - struct pending *next; + struct coff_pending *next; struct symbol *symbol; }; /* Here are the three lists that symbols are put on. */ -struct pending *file_symbols; /* static at top level, and types */ +struct coff_pending *coff_file_symbols; /* static at top level, and types */ -struct pending *global_symbols; /* global functions and variables */ +struct coff_pending *coff_global_symbols; /* global functions and variables */ -struct pending *local_symbols; /* everything local to lexical context */ +struct coff_pending *coff_local_symbols; /* everything local to lexical context */ /* List of unclosed lexical contexts (that will become blocks, eventually). */ -struct context_stack +struct coff_context_stack { - struct context_stack *next; - struct pending *locals; + struct coff_context_stack *next; + struct coff_pending *locals; struct pending_block *old_blocks; struct symbol *name; CORE_ADDR start_addr; int depth; }; -struct context_stack *context_stack; +struct coff_context_stack *coff_context_stack; /* Nonzero if within a function (so symbols should be local, if nothing says specifically). */ @@ -198,15 +160,6 @@ int within_function; struct type *in_function_type; #endif -/* List of blocks already made (lexical contexts already closed). - This is used at the end to make the blockvector. */ - -struct pending_block -{ - struct pending_block *next; - struct block *block; -}; - struct pending_block *pending_blocks; extern CORE_ADDR startup_file_start; /* From blockframe.c */ @@ -231,6 +184,116 @@ struct complaint unexpected_type_complaint = struct complaint bad_sclass_complaint = {"Bad n_sclass for symbol %s", 0, 0}; + +/* Simplified internal version of coff symbol table information */ + +struct coff_symbol { + char *c_name; + int c_symnum; /* symbol number of this entry */ + int c_naux; /* 0 if syment only, 1 if syment + auxent, etc */ + long c_value; + int c_sclass; + int c_secnum; + unsigned int c_type; +}; + +static struct type * +coff_read_struct_type PARAMS ((int, int, int)); + +static struct type * +decode_base_type PARAMS ((struct coff_symbol *, unsigned int, + union internal_auxent *)); + +static struct type * +decode_type PARAMS ((struct coff_symbol *, unsigned int, + union internal_auxent *)); + +static struct type * +decode_function_type PARAMS ((struct coff_symbol *, unsigned int, + union internal_auxent *)); + +static struct type * +coff_read_enum_type PARAMS ((int, int, int)); + +static struct blockvector * +make_blockvector PARAMS ((struct objfile *)); + +static struct symbol * +process_coff_symbol PARAMS ((struct coff_symbol *, union internal_auxent *, + struct objfile *)); + +static PTR +patch_opaque_types PARAMS ((struct objfile *, struct symtab *, PTR, PTR, PTR)); + +static void +patch_type PARAMS ((struct type *, struct type *)); + +static void +enter_linenos PARAMS ((long, int, int)); + +static int +init_lineno PARAMS ((int, long, int)); + +static char * +getfilename PARAMS ((union internal_auxent *)); + +static char * +getsymname PARAMS ((struct internal_syment *)); + +static void +free_stringtab PARAMS ((void)); + +static int +init_stringtab PARAMS ((int, long)); + +static void +read_one_sym PARAMS ((struct coff_symbol *, struct internal_syment *, + union internal_auxent *)); + +static void +read_coff_symtab PARAMS ((int, int, struct objfile *)); + +static void +coff_new_init PARAMS ((void)); + +static void +coff_symfile_read PARAMS ((struct sym_fns *, CORE_ADDR, int)); + +static void +find_linenos PARAMS ((bfd *, sec_ptr, PTR)); + +static void +coff_symfile_init PARAMS ((struct sym_fns *)); + +static void +record_minimal_symbol PARAMS ((char *, CORE_ADDR)); + +static void +coff_end_symtab PARAMS ((struct objfile *)); + +static void +complete_symtab PARAMS ((char *, CORE_ADDR, unsigned int)); + +static void +coff_start_symtab PARAMS ((void)); + +static void +coff_record_line PARAMS ((int, CORE_ADDR)); + +static void +coff_finish_block PARAMS ((struct symbol *, struct coff_pending **, + struct pending_block *, CORE_ADDR, CORE_ADDR, + struct objfile *)); + +static void +coff_add_symbol_to_list PARAMS ((struct symbol *, struct coff_pending **)); + +static struct type * +coff_alloc_type PARAMS ((int)); + +static struct type ** +coff_lookup_type PARAMS ((int)); + /* Look up a coff type-number index. Return the address of the slot where the type for that index is stored. @@ -252,7 +315,8 @@ coff_lookup_type (index) type_vector_length = index * 2; } type_vector = (struct type **) - xrealloc (type_vector, type_vector_length * sizeof (struct type *)); + xrealloc ((char *) type_vector, + type_vector_length * sizeof (struct type *)); bzero (&type_vector[old_vector_length], (type_vector_length - old_vector_length) * sizeof(struct type *)); } @@ -273,12 +337,9 @@ coff_alloc_type (index) /* If we are referring to a type not known at all yet, allocate an empty type for it. We will fill it in later if we find out how. */ - if (type == 0) + if (type == NULL) { - type = (struct type *) obstack_alloc (symbol_obstack, - sizeof (struct type)); - bzero (type, sizeof (struct type)); - TYPE_VPTR_FIELDNO (type) = -1; + type = alloc_type (current_objfile); *type_addr = type; } return type; @@ -288,12 +349,12 @@ coff_alloc_type (index) /* Add a symbol to one of the lists of symbols. */ static void -add_symbol_to_list (symbol, listhead) +coff_add_symbol_to_list (symbol, listhead) struct symbol *symbol; - struct pending **listhead; + struct coff_pending **listhead; { - register struct pending *link - = (struct pending *) xmalloc (sizeof (struct pending)); + register struct coff_pending *link + = (struct coff_pending *) xmalloc (sizeof (struct coff_pending)); link->next = *listhead; link->symbol = symbol; @@ -304,13 +365,14 @@ add_symbol_to_list (symbol, listhead) Put the block on the list of pending blocks. */ static void -finish_block (symbol, listhead, old_blocks, start, end) +coff_finish_block (symbol, listhead, old_blocks, start, end, objfile) struct symbol *symbol; - struct pending **listhead; + struct coff_pending **listhead; struct pending_block *old_blocks; CORE_ADDR start, end; + struct objfile *objfile; { - register struct pending *next, *next1; + register struct coff_pending *next, *next1; register struct block *block; register struct pending_block *pblock; struct pending_block *opblock; @@ -321,7 +383,7 @@ finish_block (symbol, listhead, old_blocks, start, end) for (next = *listhead, i = 0; next; next = next->next, i++); block = (struct block *) - obstack_alloc (symbol_obstack, sizeof (struct block) + (i - 1) * sizeof (struct symbol *)); + obstack_alloc (&objfile->symbol_obstack, sizeof (struct block) + (i - 1) * sizeof (struct symbol *)); /* Copy the symbols into the block. */ @@ -383,7 +445,8 @@ finish_block (symbol, listhead, old_blocks, start, end) } static struct blockvector * -make_blockvector () +make_blockvector (objfile) + struct objfile *objfile; { register struct pending_block *next, *next1; register struct blockvector *blockvector; @@ -394,12 +457,12 @@ make_blockvector () for (next = pending_blocks, i = 0; next; next = next->next, i++); blockvector = (struct blockvector *) - obstack_alloc (symbol_obstack, sizeof (struct blockvector) + (i - 1) * sizeof (struct block *)); + obstack_alloc (&objfile->symbol_obstack, sizeof (struct blockvector) + (i - 1) * sizeof (struct block *)); /* Copy the blocks into the blockvector. This is done in reverse order, which happens to put the blocks into the proper order (ascending starting address). - finish_block has hair to insert each block into the list + coff_finish_block has hair to insert each block into the list after its subblocks in order to make sure this is true. */ BLOCKVECTOR_NBLOCKS (blockvector) = i; @@ -421,7 +484,7 @@ make_blockvector () /* Manage the vector of line numbers. */ static void -record_line (line, pc) +coff_record_line (line, pc) int line; CORE_ADDR pc; { @@ -432,7 +495,7 @@ record_line (line, pc) { line_vector_length *= 2; line_vector = (struct linetable *) - xrealloc (line_vector, sizeof (struct linetable) + xrealloc ((char *) line_vector, sizeof (struct linetable) + (line_vector_length * sizeof (struct linetable_entry))); } @@ -446,11 +509,11 @@ record_line (line, pc) it indicates the start of data for one original source file. */ static void -start_symtab () +coff_start_symtab () { - file_symbols = 0; - global_symbols = 0; - context_stack = 0; + coff_file_symbols = 0; + coff_global_symbols = 0; + coff_context_stack = 0; within_function = 0; last_source_file = 0; @@ -495,28 +558,28 @@ complete_symtab (name, start_addr, size) struct symtab for that file and put it in the list of all such. */ static void -end_symtab (objfile) +coff_end_symtab (objfile) struct objfile *objfile; { register struct symtab *symtab; - register struct context_stack *cstk; + register struct coff_context_stack *cstk; register struct blockvector *blockvector; register struct linetable *lv; /* Finish the lexical context of the last function in the file. */ - if (context_stack) + if (coff_context_stack) { - cstk = context_stack; - context_stack = 0; + cstk = coff_context_stack; + coff_context_stack = 0; /* Make a block for the local symbols within. */ - finish_block (cstk->name, &local_symbols, cstk->old_blocks, - cstk->start_addr, cur_src_end_addr); + coff_finish_block (cstk->name, &coff_local_symbols, cstk->old_blocks, + cstk->start_addr, cur_src_end_addr, objfile); free (cstk); } /* Ignore a file that has no functions with real debugging info. */ - if (pending_blocks == 0 && file_symbols == 0 && global_symbols == 0) + if (pending_blocks == 0 && coff_file_symbols == 0 && coff_global_symbols == 0) { free (line_vector); line_vector = 0; @@ -527,11 +590,11 @@ end_symtab (objfile) /* Create the two top-level blocks for this file (STATIC_BLOCK and GLOBAL_BLOCK). */ - finish_block (0, &file_symbols, 0, cur_src_start_addr, cur_src_end_addr); - finish_block (0, &global_symbols, 0, cur_src_start_addr, cur_src_end_addr); + coff_finish_block (0, &coff_file_symbols, 0, cur_src_start_addr, cur_src_end_addr, objfile); + coff_finish_block (0, &coff_global_symbols, 0, cur_src_start_addr, cur_src_end_addr, objfile); /* Create the blockvector that points to all the file's blocks. */ - blockvector = make_blockvector (); + blockvector = make_blockvector (objfile); /* Now create the symtab object for this source file. */ symtab = allocate_symtab (last_source_file, objfile); @@ -545,15 +608,11 @@ end_symtab (objfile) lv = line_vector; lv->nitems = line_vector_index; symtab->linetable = (struct linetable *) - xrealloc (lv, (sizeof (struct linetable) + xrealloc ((char *) lv, (sizeof (struct linetable) + lv->nitems * sizeof (struct linetable_entry))); free_named_symtabs (symtab->filename); - /* Link the new symtab into the list of such. */ - symtab->next = symtab_list; - symtab_list = symtab; - /* Reinitialize for beginning of new file. */ line_vector = 0; line_vector_length = -1; @@ -561,18 +620,18 @@ end_symtab (objfile) } static void -record_misc_function (name, address) +record_minimal_symbol (name, address) char *name; CORE_ADDR address; { - /* We don't want TDESC entry points on the misc_function_vector */ + /* We don't want TDESC entry points in the minimal symbol table */ if (name[0] == '@') return; - /* mf_text isn't true, but apparently COFF doesn't tell us what it really - is, so this guess is more useful than mf_unknown. */ - prim_record_misc_function (savestring (name, strlen (name)), + /* mst_text isn't true, but apparently COFF doesn't tell us what it really + is, so this guess is more useful than mst_unknown. */ + prim_record_minimal_symbol (savestring (name, strlen (name)), address, - (int)mf_text); + (int)mst_text); } /* coff_symfile_init () @@ -639,7 +698,7 @@ static void find_linenos (abfd, asect, vpinfo) bfd *abfd; sec_ptr asect; - void *vpinfo; + PTR vpinfo; { struct coff_symfile_info *info; int size, count; @@ -743,23 +802,25 @@ coff_symfile_read (sf, addr, mainline) if (val < 0) perror_with_name (name); - init_misc_bunches (); - make_cleanup (discard_misc_bunches, 0); + init_minimal_symbol_collection (); + make_cleanup (discard_minimal_symbols, 0); /* Now that the executable file is positioned at symbol table, process it and define symbols accordingly. */ read_coff_symtab (desc, num_symbols, sf->objfile); - patch_opaque_types (); + iterate_over_symtabs (patch_opaque_types, (PTR) NULL, (PTR) NULL, + (PTR) NULL); /* Sort symbols alphabetically within each block. */ sort_all_symtab_syms (); - /* Go over the misc symbol bunches and install them in vector. */ + /* Install any minimal symbols that have been collected as the current + minimal symbols for this objfile. */ - condense_misc_bunches (!mainline); + install_minimal_symbols (sf -> objfile); } static void @@ -768,18 +829,6 @@ coff_new_init () /* Nothin' to do */ } -/* Simplified internal version of coff symbol table information */ - -struct coff_symbol { - char *c_name; - int c_symnum; /* symbol number of this entry */ - int c_naux; /* 0 if syment only, 1 if syment + auxent, etc */ - long c_value; - int c_sclass; - int c_secnum; - unsigned int c_type; -}; - /* Given pointers to a symbol table in coff style exec file, analyze them and create struct symtab's describing the symbols. NSYMS is the number of symbols in the symbol table. @@ -793,7 +842,7 @@ read_coff_symtab (desc, nsyms, objfile) { int newfd; /* Avoid multiple closes on same desc */ FILE *stream; - register struct context_stack *new; + register struct coff_context_stack *new; struct coff_symbol coff_symbol; register struct coff_symbol *cs = &coff_symbol; static struct internal_syment main_sym; @@ -826,6 +875,7 @@ read_coff_symtab (desc, nsyms, objfile) old_chain = make_cleanup (free_objfile, objfile); make_cleanup (fclose, stream); + current_objfile = objfile; nlist_stream_global = stream; nlist_nsyms_global = nsyms; last_source_file = 0; @@ -838,7 +888,7 @@ read_coff_symtab (desc, nsyms, objfile) xmalloc (type_vector_length * sizeof (struct type *)); bzero (type_vector, type_vector_length * sizeof (struct type *)); - start_symtab (); + coff_start_symtab (); symnum = 0; while (symnum < nsyms) @@ -856,9 +906,9 @@ read_coff_symtab (desc, nsyms, objfile) if (cs->c_symnum == next_file_symnum && cs->c_sclass != C_FILE) { if (last_source_file) - end_symtab (objfile); + coff_end_symtab (objfile); - start_symtab (); + coff_start_symtab (); complete_symtab ("_globals_", 0, first_object_file_end); /* done with all files, everything from here on out is globals */ } @@ -871,10 +921,10 @@ read_coff_symtab (desc, nsyms, objfile) /* Typedefs should not be treated as symbol definitions. */ if (ISFCN (cs->c_type) && cs->c_sclass != C_TPDEF) { - /* record as misc function. if we get '.bf' next, + /* record as a minimal symbol. if we get '.bf' next, * then we undo this step */ - record_misc_function (cs->c_name, cs->c_value); + record_minimal_symbol (cs->c_name, cs->c_value); fcn_line_ptr = main_aux.x_sym.x_fcnary.x_fcn.x_lnnoptr; fcn_start_addr = cs->c_value; @@ -909,8 +959,8 @@ read_coff_symtab (desc, nsyms, objfile) */ if (last_source_file) { - end_symtab (objfile); - start_symtab (); + coff_end_symtab (objfile); + coff_start_symtab (); } in_source_file = 1; break; @@ -956,16 +1006,16 @@ read_coff_symtab (desc, nsyms, objfile) Coff should provide the SEC_CODE flag for executable sections, then if we could look up sections by section number we could see if the flags indicate SEC_CODE. If so, then - record this symbol as a miscellaneous function. But why - are absolute syms recorded as functions, anyway? */ + record this symbol as a function in the minimal symbol table. + But why are absolute syms recorded as functions, anyway? */ if (cs->c_secnum <= text_bfd_scnum+1) {/* text or abs */ - record_misc_function (cs->c_name, cs->c_value); + record_minimal_symbol (cs->c_name, cs->c_value); break; } else { cs->c_type = T_INT; } } - (void) process_coff_symbol (cs, &main_aux); + (void) process_coff_symbol (cs, &main_aux, objfile); break; case C_FCN: @@ -977,20 +1027,20 @@ read_coff_symtab (desc, nsyms, objfile) /* main_aux.x_sym.x_misc.x_lnsz.x_lnno contains line number of '{' } */ if (cs->c_naux != 1) - complain (&bf_no_aux_complaint, cs->c_symnum); + complain (&bf_no_aux_complaint, (char *) cs->c_symnum); fcn_first_line = main_aux.x_sym.x_misc.x_lnsz.x_lnno; - new = (struct context_stack *) - xmalloc (sizeof (struct context_stack)); + new = (struct coff_context_stack *) + xmalloc (sizeof (struct coff_context_stack)); new->depth = depth = 0; new->next = 0; - context_stack = new; + coff_context_stack = new; new->locals = 0; new->old_blocks = pending_blocks; new->start_addr = fcn_start_addr; fcn_cs_saved.c_name = getsymname (&fcn_sym_saved); new->name = process_coff_symbol (&fcn_cs_saved, - &fcn_aux_saved); + &fcn_aux_saved, objfile); } else if (strcmp (cs->c_name, ".ef") == 0) { @@ -999,22 +1049,22 @@ read_coff_symtab (desc, nsyms, objfile) */ /* { main_aux.x_sym.x_misc.x_lnsz.x_lnno contains number of lines to '}' */ - new = context_stack; + new = coff_context_stack; if (new == 0) { - complain (&ef_complaint, cs->c_symnum); + complain (&ef_complaint, (char *) cs->c_symnum); within_function = 0; break; } if (cs->c_naux != 1) { - complain (&ef_no_aux_complaint, cs->c_symnum); + complain (&ef_no_aux_complaint, (char *) cs->c_symnum); fcn_last_line = 0x7FFFFFFF; } else { fcn_last_line = main_aux.x_sym.x_misc.x_lnsz.x_lnno; } enter_linenos (fcn_line_ptr, fcn_first_line, fcn_last_line); - finish_block (new->name, &local_symbols, new->old_blocks, + coff_finish_block (new->name, &coff_local_symbols, new->old_blocks, new->start_addr, #if defined (FUNCTION_EPILOGUE_SIZE) /* This macro should be defined only on @@ -1024,13 +1074,14 @@ read_coff_symtab (desc, nsyms, objfile) So use the .bf record information that points to the epilogue and add the size of the epilogue. */ - cs->c_value + FUNCTION_EPILOGUE_SIZE + cs->c_value + FUNCTION_EPILOGUE_SIZE, #else fcn_cs_saved.c_value + - fcn_aux_saved.x_sym.x_misc.x_fsize + fcn_aux_saved.x_sym.x_misc.x_fsize, #endif + objfile ); - context_stack = 0; + coff_context_stack = 0; within_function = 0; free (new); } @@ -1039,47 +1090,48 @@ read_coff_symtab (desc, nsyms, objfile) case C_BLOCK: if (strcmp (cs->c_name, ".bb") == 0) { - new = (struct context_stack *) - xmalloc (sizeof (struct context_stack)); + new = (struct coff_context_stack *) + xmalloc (sizeof (struct coff_context_stack)); depth++; new->depth = depth; - new->next = context_stack; - context_stack = new; - new->locals = local_symbols; + new->next = coff_context_stack; + coff_context_stack = new; + new->locals = coff_local_symbols; new->old_blocks = pending_blocks; new->start_addr = cs->c_value; new->name = 0; - local_symbols = 0; + coff_local_symbols = 0; } else if (strcmp (cs->c_name, ".eb") == 0) { - new = context_stack; + new = coff_context_stack; if (new == 0 || depth != new->depth) error ("Invalid symbol data: .bb/.eb symbol mismatch at symbol %d.", symnum); - if (local_symbols && context_stack->next) + if (coff_local_symbols && coff_context_stack->next) { /* Make a block for the local symbols within. */ - finish_block (0, &local_symbols, new->old_blocks, - new->start_addr, cs->c_value); + coff_finish_block (0, &coff_local_symbols, new->old_blocks, + new->start_addr, cs->c_value, objfile); } depth--; - local_symbols = new->locals; - context_stack = new->next; + coff_local_symbols = new->locals; + coff_context_stack = new->next; free (new); } break; default: - (void) process_coff_symbol (cs, &main_aux); + (void) process_coff_symbol (cs, &main_aux, objfile); break; } } if (last_source_file) - end_symtab (objfile); + coff_end_symtab (objfile); fclose (stream); discard_cleanups (old_chain); + current_objfile = NULL; } /* Routines for reading headers and symbols from executable. */ @@ -1264,7 +1316,6 @@ getfilename (aux_entry) static char buffer[BUFSIZ]; register char *temp; char *result; - extern char *rindex (); #ifndef COFF_NO_LONG_FILE_NAMES #if defined (x_zeroes) @@ -1287,7 +1338,7 @@ getfilename (aux_entry) buffer[FILNMLEN] = '\0'; } result = buffer; - if ((temp = rindex (result, '/')) != NULL) + if ((temp = strrchr (result, '/')) != NULL) result = temp + 1; return (result); } @@ -1347,7 +1398,7 @@ enter_linenos (file_offset, first_line, last_line) if (file_offset < linetab_offset) { - complain (&lineno_complaint, file_offset); + complain (&lineno_complaint, (char *) file_offset); if (file_offset > linetab_size) /* Too big to be an offset? */ return; file_offset += linetab_offset; /* Try reading at that linetab offset */ @@ -1365,33 +1416,12 @@ enter_linenos (file_offset, first_line, last_line) rawptr += local_linesz; /* The next function, or the sentinel, will have L_LNNO32 zero; we exit. */ if (L_LNNO32 (&lptr) && L_LNNO32 (&lptr) <= last_line) - record_line (first_line + L_LNNO32 (&lptr), lptr.l_addr.l_paddr); + coff_record_line (first_line + L_LNNO32 (&lptr), lptr.l_addr.l_paddr); else break; } } -static int -hashname (name) - char *name; -{ - register char *p = name; - register int total = p[0]; - register int c; - - c = p[1]; - total += c << 2; - if (c) - { - c = p[2]; - total += c << 4; - if (c) - total += p[3] << 6; - } - - return total % HASHSIZE; -} - static void patch_type (type, real_type) struct type *type; @@ -1404,7 +1434,7 @@ patch_type (type, real_type) TYPE_LENGTH (target) = TYPE_LENGTH (real_target); TYPE_NFIELDS (target) = TYPE_NFIELDS (real_target); TYPE_FIELDS (target) = (struct field *) - obstack_alloc (symbol_obstack, field_size); + obstack_alloc (¤t_objfile -> type_obstack, field_size); bcopy (TYPE_FIELDS (real_target), TYPE_FIELDS (target), field_size); @@ -1417,86 +1447,100 @@ patch_type (type, real_type) } /* Patch up all appropriate typedef symbols in the opaque_type_chains - so that they can be used to print out opaque data structures properly */ + so that they can be used to print out opaque data structures properly. -static void -patch_opaque_types () -{ - struct symtab *s; + This is called via iterate_over_symtabs, and thus simply returns NULL + for each time it is called, to indicate that the iteration should + continue. */ - /* Look at each symbol in the per-file block of each symtab. */ - for (s = symtab_list; s; s = s->next) +/* ARGSUSED */ +static PTR +patch_opaque_types (objfile, s, arg1, arg2, arg3) + struct objfile *objfile; + struct symtab *s; + PTR arg1; + PTR arg2; + PTR arg3; +{ + register struct block *b; + register int i; + register struct symbol *real_sym; + + /* Go through the per-file symbols only */ + b = BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), STATIC_BLOCK); + for (i = BLOCK_NSYMS (b) - 1; i >= 0; i--) { - register struct block *b; - register int i; - - /* Go through the per-file symbols only */ - b = BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), STATIC_BLOCK); - for (i = BLOCK_NSYMS (b) - 1; i >= 0; i--) + /* Find completed typedefs to use to fix opaque ones. + Remove syms from the chain when their types are stored, + but search the whole chain, as there may be several syms + from different files with the same name. */ + real_sym = BLOCK_SYM (b, i); + if (SYMBOL_CLASS (real_sym) == LOC_TYPEDEF && + SYMBOL_NAMESPACE (real_sym) == VAR_NAMESPACE && + TYPE_CODE (SYMBOL_TYPE (real_sym)) == TYPE_CODE_PTR && + TYPE_LENGTH (TYPE_TARGET_TYPE (SYMBOL_TYPE (real_sym))) != 0) { - register struct symbol *real_sym; - - /* Find completed typedefs to use to fix opaque ones. - Remove syms from the chain when their types are stored, - but search the whole chain, as there may be several syms - from different files with the same name. */ - real_sym = BLOCK_SYM (b, i); - if (SYMBOL_CLASS (real_sym) == LOC_TYPEDEF && - SYMBOL_NAMESPACE (real_sym) == VAR_NAMESPACE && - TYPE_CODE (SYMBOL_TYPE (real_sym)) == TYPE_CODE_PTR && - TYPE_LENGTH (TYPE_TARGET_TYPE (SYMBOL_TYPE (real_sym))) != 0) + register char *name = SYMBOL_NAME (real_sym); + register int hash = hashname (name); + register struct symbol *sym, *prev; + + prev = 0; + for (sym = opaque_type_chain[hash]; sym;) { - register char *name = SYMBOL_NAME (real_sym); - register int hash = hashname (name); - register struct symbol *sym, *prev; - - prev = 0; - for (sym = opaque_type_chain[hash]; sym;) + if (name[0] == SYMBOL_NAME (sym)[0] && + !strcmp (name + 1, SYMBOL_NAME (sym) + 1)) { - if (name[0] == SYMBOL_NAME (sym)[0] && - !strcmp (name + 1, SYMBOL_NAME (sym) + 1)) + if (prev) { - if (prev) - SYMBOL_VALUE_CHAIN (prev) = SYMBOL_VALUE_CHAIN (sym); - else - opaque_type_chain[hash] = SYMBOL_VALUE_CHAIN (sym); - - patch_type (SYMBOL_TYPE (sym), SYMBOL_TYPE (real_sym)); - - if (prev) - sym = SYMBOL_VALUE_CHAIN (prev); - else - sym = opaque_type_chain[hash]; + SYMBOL_VALUE_CHAIN (prev) = SYMBOL_VALUE_CHAIN (sym); } else { - prev = sym; - sym = SYMBOL_VALUE_CHAIN (sym); + opaque_type_chain[hash] = SYMBOL_VALUE_CHAIN (sym); } + + patch_type (SYMBOL_TYPE (sym), SYMBOL_TYPE (real_sym)); + + if (prev) + { + sym = SYMBOL_VALUE_CHAIN (prev); + } + else + { + sym = opaque_type_chain[hash]; + } + } + else + { + prev = sym; + sym = SYMBOL_VALUE_CHAIN (sym); } } } } + return (NULL); } static struct symbol * -process_coff_symbol (cs, aux) +process_coff_symbol (cs, aux, objfile) register struct coff_symbol *cs; register union internal_auxent *aux; + struct objfile *objfile; { register struct symbol *sym - = (struct symbol *) obstack_alloc (symbol_obstack, sizeof (struct symbol)); + = (struct symbol *) obstack_alloc (&objfile->symbol_obstack, sizeof (struct symbol)); char *name; #ifdef NAMES_HAVE_UNDERSCORE int offset = 1; #else int offset = 0; #endif + struct type *temptype; bzero (sym, sizeof (struct symbol)); name = cs->c_name; name = (name[0] == '_' ? name + offset : name); - SYMBOL_NAME (sym) = obstack_copy0 (symbol_obstack, name, strlen (name)); + SYMBOL_NAME (sym) = obstack_copy0 (&objfile->symbol_obstack, name, strlen (name)); /* default assumptions */ SYMBOL_VALUE (sym) = cs->c_value; @@ -1510,7 +1554,7 @@ process_coff_symbol (cs, aux) types of the arguments will be added as we read the symbol table. */ struct type *new = (struct type *) - obstack_alloc (symbol_obstack, sizeof (struct type)); + obstack_alloc (&objfile->symbol_obstack, sizeof (struct type)); bcopy(lookup_function_type (decode_function_type (cs, cs->c_type, aux)), new, sizeof(struct type)); @@ -1523,9 +1567,9 @@ process_coff_symbol (cs, aux) SYMBOL_CLASS (sym) = LOC_BLOCK; if (cs->c_sclass == C_STAT) - add_symbol_to_list (sym, &file_symbols); + coff_add_symbol_to_list (sym, &coff_file_symbols); else if (cs->c_sclass == C_EXT) - add_symbol_to_list (sym, &global_symbols); + coff_add_symbol_to_list (sym, &coff_global_symbols); } else { @@ -1537,13 +1581,13 @@ process_coff_symbol (cs, aux) case C_AUTO: SYMBOL_CLASS (sym) = LOC_LOCAL; - add_symbol_to_list (sym, &local_symbols); + coff_add_symbol_to_list (sym, &coff_local_symbols); break; case C_EXT: SYMBOL_CLASS (sym) = LOC_STATIC; SYMBOL_VALUE_ADDRESS (sym) = (CORE_ADDR) cs->c_value; - add_symbol_to_list (sym, &global_symbols); + coff_add_symbol_to_list (sym, &coff_global_symbols); break; case C_STAT: @@ -1551,11 +1595,11 @@ process_coff_symbol (cs, aux) SYMBOL_VALUE_ADDRESS (sym) = (CORE_ADDR) cs->c_value; if (within_function) { /* Static symbol of local scope */ - add_symbol_to_list (sym, &local_symbols); + coff_add_symbol_to_list (sym, &coff_local_symbols); } else { /* Static symbol at top level of file */ - add_symbol_to_list (sym, &file_symbols); + coff_add_symbol_to_list (sym, &coff_file_symbols); } break; @@ -1565,7 +1609,7 @@ process_coff_symbol (cs, aux) case C_REG: SYMBOL_CLASS (sym) = LOC_REGISTER; SYMBOL_VALUE (sym) = SDB_REG_TO_REGNUM(cs->c_value); - add_symbol_to_list (sym, &local_symbols); + coff_add_symbol_to_list (sym, &coff_local_symbols); break; case C_LABEL: @@ -1578,32 +1622,38 @@ process_coff_symbol (cs, aux) /* Add parameter to function. */ add_param_to_type(&in_function_type,sym); #endif - add_symbol_to_list (sym, &local_symbols); + coff_add_symbol_to_list (sym, &coff_local_symbols); #if !defined (BELIEVE_PCC_PROMOTION) /* If PCC says a parameter is a short or a char, it is really an int. */ - if (TYPE_LENGTH (SYMBOL_TYPE (sym)) < TYPE_LENGTH (builtin_type_int) - && TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_INT) { - SYMBOL_TYPE (sym) = TYPE_UNSIGNED (SYMBOL_TYPE (sym))? - builtin_type_unsigned_int: - builtin_type_int; - } + temptype = lookup_fundamental_type (current_objfile, FT_INTEGER); + if (TYPE_LENGTH (SYMBOL_TYPE (sym)) < TYPE_LENGTH (temptype) + && TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_INT) + { + SYMBOL_TYPE (sym) = TYPE_UNSIGNED (SYMBOL_TYPE (sym)) + ? lookup_fundamental_type (current_objfile, + FT_UNSIGNED_INTEGER) + : temptype; + } #endif break; case C_REGPARM: SYMBOL_CLASS (sym) = LOC_REGPARM; SYMBOL_VALUE (sym) = SDB_REG_TO_REGNUM(cs->c_value); - add_symbol_to_list (sym, &local_symbols); + coff_add_symbol_to_list (sym, &coff_local_symbols); #if !defined (BELIEVE_PCC_PROMOTION) /* If PCC says a parameter is a short or a char, it is really an int. */ - if (TYPE_LENGTH (SYMBOL_TYPE (sym)) < TYPE_LENGTH (builtin_type_int) - && TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_INT) { - SYMBOL_TYPE (sym) = TYPE_UNSIGNED (SYMBOL_TYPE (sym))? - builtin_type_unsigned_int: - builtin_type_int; - } + temptype = lookup_fundamental_type (current_objfile, FT_INTEGER); + if (TYPE_LENGTH (SYMBOL_TYPE (sym)) < TYPE_LENGTH (temptype) + && TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_INT) + { + SYMBOL_TYPE (sym) = TYPE_UNSIGNED (SYMBOL_TYPE (sym)) + ? lookup_fundamental_type (current_objfile, + FT_UNSIGNED_INTEGER) + : temptype; + } #endif break; @@ -1612,10 +1662,8 @@ process_coff_symbol (cs, aux) SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE; /* If type has no name, give it one */ - if (TYPE_NAME (SYMBOL_TYPE (sym)) == 0 - && (TYPE_FLAGS (SYMBOL_TYPE (sym)) & TYPE_FLAG_PERM) == 0) - TYPE_NAME (SYMBOL_TYPE (sym)) - = concat (SYMBOL_NAME (sym), NULL); + if (TYPE_NAME (SYMBOL_TYPE (sym)) == 0) + TYPE_NAME (SYMBOL_TYPE (sym)) = concat (SYMBOL_NAME (sym), NULL); /* Keep track of any type which points to empty structured type, so it can be filled from a definition from another file */ @@ -1627,7 +1675,7 @@ process_coff_symbol (cs, aux) SYMBOL_VALUE_CHAIN (sym) = opaque_type_chain[i]; opaque_type_chain[i] = sym; } - add_symbol_to_list (sym, &file_symbols); + coff_add_symbol_to_list (sym, &coff_file_symbols); break; case C_STRTAG: @@ -1635,8 +1683,7 @@ process_coff_symbol (cs, aux) case C_ENTAG: SYMBOL_CLASS (sym) = LOC_TYPEDEF; SYMBOL_NAMESPACE (sym) = STRUCT_NAMESPACE; - if (TYPE_NAME (SYMBOL_TYPE (sym)) == 0 - && (TYPE_FLAGS (SYMBOL_TYPE (sym)) & TYPE_FLAG_PERM) == 0) + if (TYPE_NAME (SYMBOL_TYPE (sym)) == 0) TYPE_NAME (SYMBOL_TYPE (sym)) = concat ("", (cs->c_sclass == C_ENTAG @@ -1644,7 +1691,7 @@ process_coff_symbol (cs, aux) : (cs->c_sclass == C_STRTAG ? "struct " : "union ")), SYMBOL_NAME (sym), NULL); - add_symbol_to_list (sym, &file_symbols); + coff_add_symbol_to_list (sym, &coff_file_symbols); break; default: @@ -1700,8 +1747,10 @@ decode_type (cs, c_type, aux) *dim = 0; type = (struct type *) - obstack_alloc (symbol_obstack, sizeof (struct type)); + obstack_alloc (¤t_objfile -> type_obstack, + sizeof (struct type)); bzero (type, sizeof (struct type)); + TYPE_OBJFILE (type) = current_objfile; base_type = decode_type (cs, new_c_type, aux); @@ -1753,40 +1802,40 @@ decode_base_type (cs, c_type, aux) { case T_NULL: /* shows up with "void (*foo)();" structure members */ - return builtin_type_void; + return lookup_fundamental_type (current_objfile, FT_VOID); #if 0 /* DGUX actually defines both T_ARG and T_VOID to the same value. */ #ifdef T_ARG case T_ARG: /* Shows up in DGUX, I think. Not sure where. */ - return builtin_type_void; /* shouldn't show up here */ + return lookup_fundamental_type (current_objfile, FT_VOID); /* shouldn't show up here */ #endif #endif /* 0 */ #ifdef T_VOID case T_VOID: /* Intel 960 COFF has this symbol and meaning. */ - return builtin_type_void; + return lookup_fundamental_type (current_objfile, FT_VOID); #endif case T_CHAR: - return builtin_type_char; + return lookup_fundamental_type (current_objfile, FT_CHAR); case T_SHORT: - return builtin_type_short; + return lookup_fundamental_type (current_objfile, FT_SHORT); case T_INT: - return builtin_type_int; + return lookup_fundamental_type (current_objfile, FT_INTEGER); case T_LONG: - return builtin_type_long; + return lookup_fundamental_type (current_objfile, FT_LONG); case T_FLOAT: - return builtin_type_float; + return lookup_fundamental_type (current_objfile, FT_FLOAT); case T_DOUBLE: - return builtin_type_double; + return lookup_fundamental_type (current_objfile, FT_DBL_PREC_FLOAT); case T_STRUCT: if (cs->c_naux != 1) @@ -1802,7 +1851,7 @@ decode_base_type (cs, c_type, aux) } else { - type = read_struct_type (cs->c_symnum, + type = coff_read_struct_type (cs->c_symnum, aux->x_sym.x_misc.x_lnsz.x_size, aux->x_sym.x_fcnary.x_fcn.x_endndx.l); } @@ -1822,7 +1871,7 @@ decode_base_type (cs, c_type, aux) } else { - type = read_struct_type (cs->c_symnum, + type = coff_read_struct_type (cs->c_symnum, aux->x_sym.x_misc.x_lnsz.x_size, aux->x_sym.x_fcnary.x_fcn.x_endndx.l); } @@ -1830,7 +1879,7 @@ decode_base_type (cs, c_type, aux) return type; case T_ENUM: - return read_enum_type (cs->c_symnum, + return coff_read_enum_type (cs->c_symnum, aux->x_sym.x_misc.x_lnsz.x_size, aux->x_sym.x_fcnary.x_fcn.x_endndx.l); @@ -1839,19 +1888,19 @@ decode_base_type (cs, c_type, aux) break; case T_UCHAR: - return builtin_type_unsigned_char; + return lookup_fundamental_type (current_objfile, FT_UNSIGNED_CHAR); case T_USHORT: - return builtin_type_unsigned_short; + return lookup_fundamental_type (current_objfile, FT_UNSIGNED_SHORT); case T_UINT: - return builtin_type_unsigned_int; + return lookup_fundamental_type (current_objfile, FT_UNSIGNED_INTEGER); case T_ULONG: - return builtin_type_unsigned_long; + return lookup_fundamental_type (current_objfile, FT_UNSIGNED_LONG); } complain (&unexpected_type_complaint, cs->c_name); - return builtin_type_void; + return lookup_fundamental_type (current_objfile, FT_VOID); } /* This page contains subroutines of read_type. */ @@ -1860,7 +1909,7 @@ decode_base_type (cs, c_type, aux) and return an object describing the type. */ static struct type * -read_struct_type (index, length, lastsym) +coff_read_struct_type (index, length, lastsym) int index; int length; int lastsym; @@ -1941,7 +1990,8 @@ read_struct_type (index, length, lastsym) TYPE_NFIELDS (type) = nfields; TYPE_FIELDS (type) = (struct field *) - obstack_alloc (symbol_obstack, sizeof (struct field) * nfields); + obstack_alloc (¤t_objfile -> type_obstack, + sizeof (struct field) * nfields); /* Copy the saved-up fields into the field vector. */ @@ -1958,7 +2008,7 @@ read_struct_type (index, length, lastsym) /* ARGSUSED */ static struct type * -read_enum_type (index, length, lastsym) +coff_read_enum_type (index, length, lastsym) int index; int length; int lastsym; @@ -1967,12 +2017,12 @@ read_enum_type (index, length, lastsym) register struct type *type; int nsyms = 0; int done = 0; - struct pending **symlist; + struct coff_pending **symlist; struct coff_symbol member_sym; register struct coff_symbol *ms = &member_sym; struct internal_syment sub_sym; union internal_auxent sub_aux; - struct pending *osyms, *syms; + struct coff_pending *osyms, *syms; register int n; char *name; #ifdef NAMES_HAVE_UNDERSCORE @@ -1983,9 +2033,9 @@ read_enum_type (index, length, lastsym) type = coff_alloc_type (index); if (within_function) - symlist = &local_symbols; + symlist = &coff_local_symbols; else - symlist = &file_symbols; + symlist = &coff_file_symbols; osyms = *symlist; while (!done && symnum < lastsym && symnum < nlist_nsyms_global) @@ -2004,7 +2054,7 @@ read_enum_type (index, length, lastsym) SYMBOL_CLASS (sym) = LOC_CONST; SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE; SYMBOL_VALUE (sym) = ms->c_value; - add_symbol_to_list (sym, symlist); + coff_add_symbol_to_list (sym, symlist); nsyms++; break; @@ -2023,7 +2073,8 @@ read_enum_type (index, length, lastsym) TYPE_CODE (type) = TYPE_CODE_ENUM; TYPE_NFIELDS (type) = nsyms; TYPE_FIELDS (type) = (struct field *) - obstack_alloc (symbol_obstack, sizeof (struct field) * nsyms); + obstack_alloc (¤t_objfile -> type_obstack, + sizeof (struct field) * nsyms); /* Find the symbols for the values and put them into the type. The symbols can be found in the symlist that we put them on |