diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 0bd8350f13..759a6b50a0 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,24 @@ +Mon Jan 8 10:20:14 1996 Jeffrey A Law (law@cygnus.com) + + * buildsym.c (end_symtab): Remove sort_pending and sort_linevec + arguments. Sorting is now dependent on OBJF_REORDERED. All + callers/references changed. + * dbxread.c (read_ofile_symtab): Correctly determine value for + last_source_start_addr for reordered executables. + (process_one_symbol): Handle N_FUN with no name as an end of + function marker. + * partial-stab.h (case N_FN, N_TEXT): Don't assume CUR_SYMBOL_VALUE + is the high text address for a psymtab. + (case N_SO): Likewise. + (case N_FUN): Handle N_FUN with no name as an end of function + marker. + * minsyms.c (lookup_minimal_symbol_by_pc): Examine all symbols + at the same address rather than a random subset of them. + * coffread.c (coff_symfile_init): Set OBJF_REORDERED. + * elfread.c (elf_symfile_init): Similarly. + * somread.c (som_symfile_init): Similarly. + * xcoffread.c (xcoff_symfile_init): Similarly. + Fri Jan 5 17:46:01 1996 Stu Grossman (grossman@cygnus.com) * stack.c (print_stack_frame print_frame_info) symmisc.c diff --git a/gdb/buildsym.c b/gdb/buildsym.c index c9c30b0199..5a5847a823 100644 --- a/gdb/buildsym.c +++ b/gdb/buildsym.c @@ -1,5 +1,5 @@ /* Support routines for building symbol tables in GDB's internal format. - Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1995 + Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1995, 1996 Free Software Foundation, Inc. This file is part of GDB. @@ -737,10 +737,8 @@ start_symtab (name, dirname, start_addr) because then gdb will never know about this empty file (FIXME). */ struct symtab * -end_symtab (end_addr, sort_pending, sort_linevec, objfile, section) +end_symtab (end_addr, objfile, section) CORE_ADDR end_addr; - int sort_pending; - int sort_linevec; struct objfile *objfile; int section; { @@ -774,14 +772,12 @@ end_symtab (end_addr, sort_pending, sort_linevec, objfile, section) } } - /* It is unfortunate that in xcoff, pending blocks might not be ordered - in this stage. Especially, blocks for static functions will show up at - the end. We need to sort them, so tools like `find_pc_function' and - `find_pc_block' can work reliably. */ - - if (sort_pending && pending_blocks) + /* Reordered executables may have out of order pending blocks; if + OBJF_REORDERED is true, then sort the pending blocks. */ + if ((objfile->flags & OBJF_REORDERED) && pending_blocks) { - /* FIXME! Remove this horrid bubble sort and use qsort!!! */ + /* FIXME! Remove this horrid bubble sort and use qsort!!! + It'd be a whole lot easier if they weren't in a linked list!!! */ int swapped; do { @@ -865,12 +861,11 @@ end_symtab (end_addr, sort_pending, sort_linevec, objfile, section) subfile->line_vector = (struct linetable *) xrealloc ((char *) subfile->line_vector, linetablesize); #endif - /* If sort_linevec is false, we might want just check to make - sure they are sorted and complain() if not, as a way of - tracking down compilers/symbol readers which don't get - them sorted right. */ - if (sort_linevec) + /* Like the pending blocks, the line table may be scrambled + in reordered executables. Sort it if OBJF_REORDERED is + true. */ + if (objfile->flags & OBJF_REORDERED) qsort (subfile->line_vector->item, subfile->line_vector->nitems, sizeof (struct linetable_entry), compare_line_numbers); diff --git a/gdb/buildsym.h b/gdb/buildsym.h index 36732f047a..58529c709b 100644 --- a/gdb/buildsym.h +++ b/gdb/buildsym.h @@ -1,5 +1,5 @@ /* Build symbol tables in GDB's internal format. - Copyright (C) 1986-1995 Free Software Foundation, Inc. + Copyright (C) 1986-1996 Free Software Foundation, Inc. This file is part of GDB. @@ -231,7 +231,7 @@ extern char * pop_subfile PARAMS ((void)); extern struct symtab * -end_symtab PARAMS ((CORE_ADDR, int, int, struct objfile *, int)); +end_symtab PARAMS ((CORE_ADDR, struct objfile *, int)); extern void scan_file_globals PARAMS ((struct objfile *)); diff --git a/gdb/dwarfread.c b/gdb/dwarfread.c index 41f2a6cce5..fa7c9a2080 100644 --- a/gdb/dwarfread.c +++ b/gdb/dwarfread.c @@ -1,5 +1,6 @@ /* DWARF debugging format support for GDB. - Copyright (C) 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc. + Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996 + Free Software Foundation, Inc. Written by Fred Fish at Cygnus Support. Portions based on dbxread.c, mipsread.c, coffread.c, and dwarfread.c from a Data General SVR4 gdb port. @@ -1926,7 +1927,7 @@ read_file_scope (dip, thisdie, enddie, objfile) decode_line_numbers (lnbase); process_dies (thisdie + dip -> die_length, enddie, objfile); - symtab = end_symtab (dip -> at_high_pc, 0, 0, objfile, 0); + symtab = end_symtab (dip -> at_high_pc, objfile, 0); if (symtab != NULL) { symtab -> language = cu_language; diff --git a/gdb/elfread.c b/gdb/elfread.c index 0372abb77d..9a7a0fe3e1 100644 --- a/gdb/elfread.c +++ b/gdb/elfread.c @@ -1,5 +1,5 @@ /* Read ELF (Executable and Linking Format) object files for GDB. - Copyright 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc. + Copyright 1991, 1992, 1993, 1994, 1995, 1996 Free Software Foundation, Inc. Written by Fred Fish at Cygnus Support. This file is part of GDB. @@ -705,9 +705,13 @@ elf_symfile_finish (objfile) just a stub. */ static void -elf_symfile_init (ignore) - struct objfile *ignore; +elf_symfile_init (objfile) + struct objfile *objfile; { + /* ELF objects may be reordered, so set OBJF_REORDERED. If we + find this causes a significant slowdown in gdb then we could + set it in the debug symbol readers only when necessary. */ + objfile->flags |= OBJF_REORDERED; } /* ELF specific parsing routine for section offsets. diff --git a/gdb/hpread.c b/gdb/hpread.c index 79d5ee4cae..bfd7330aa1 100644 --- a/gdb/hpread.c +++ b/gdb/hpread.c @@ -1,5 +1,5 @@ /* Read hp debug symbols and convert to internal format, for GDB. - Copyright 1993 Free Software Foundation, Inc. + Copyright 1993, 1996 Free Software Foundation, Inc. This file is part of GDB. @@ -1116,7 +1116,7 @@ hpread_expand_symtab (objfile, sym_offset, sym_size, text_offset, text_size, current_objfile = NULL; - return end_symtab (text_offset + text_size, 0, 0, objfile, 0); + return end_symtab (text_offset + text_size, objfile, 0); } @@ -1896,7 +1896,7 @@ hpread_process_one_debug_symbol (dn_bufp, name, section_offsets, objfile, case DNTT_TYPE_MODULE: /* Ending a module ends the symbol table for that module. */ valu = text_offset + text_size + offset; - (void) end_symtab (valu, 0, 0, objfile, 0); + (void) end_symtab (valu, objfile, 0); break; case DNTT_TYPE_FUNCTION: diff --git a/gdb/mdebugread.c b/gdb/mdebugread.c index 1c88f5110f..07dca2b3b0 100644 --- a/gdb/mdebugread.c +++ b/gdb/mdebugread.c @@ -1,5 +1,5 @@ /* Read a symbol table in ECOFF format (Third-Eye). - Copyright 1986, 1987, 1989, 1990, 1991, 1992, 1993, 1994, 1995 + Copyright 1986, 1987, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996 Free Software Foundation, Inc. Original version contributed by Alessandro Forin (af@cs.cmu.edu) at CMU. Major work by Per Bothner, John Gilmore and Ian Lance Taylor @@ -3271,7 +3271,7 @@ psymtab_to_symtab_1 (pst, filename) else complain (&stab_unknown_complaint, name); } - st = end_symtab (pst->texthigh, 0, 0, pst->objfile, SECT_OFF_TEXT); + st = end_symtab (pst->texthigh, pst->objfile, SECT_OFF_TEXT); end_stabs (); /* Sort the symbol table now, we are done adding symbols to it. diff --git a/gdb/minsyms.c b/gdb/minsyms.c index c020062615..e36302ea8e 100644 --- a/gdb/minsyms.c +++ b/gdb/minsyms.c @@ -1,5 +1,5 @@ /* GDB routines for manipulating the minimal symbol tables. - Copyright 1992, 1993, 1994, 1995 Free Software Foundation, Inc. + Copyright 1992, 1993, 1994, 1995, 1996 Free Software Foundation, Inc. Contributed by Cygnus Support, using pieces from other GDB modules. This file is part of GDB. @@ -253,7 +253,6 @@ lookup_minimal_symbol_text (name, sfile, objf) return NULL; } - /* Search through the minimal symbol table for each objfile and find the symbol whose address is the largest address that is still less than or equal to PC. Returns a pointer to the minimal symbol if such a symbol @@ -325,6 +324,15 @@ lookup_minimal_symbol_by_pc (pc) lo = new; } } + + /* If we have multiple symbols at the same address, we want + hi to point to the last one. That way we can find the + right symbol if it has an index greater than hi. */ + while (hi < objfile -> minimal_symbol_count - 1 + && (SYMBOL_VALUE_ADDRESS (&msymbol[hi]) + == SYMBOL_VALUE_ADDRESS (&msymbol[hi+1]))) + hi++; + /* The minimal symbol indexed by hi now is the best one in this objfile's minimal symbol table. See if it is the best one overall. */ diff --git a/gdb/os9kread.c b/gdb/os9kread.c index 110d4cffba..bcdf30834d 100644 --- a/gdb/os9kread.c +++ b/gdb/os9kread.c @@ -1,5 +1,5 @@ /* Read os9/os9k symbol tables and convert to internal format, for GDB. - Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994 + Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1996 Free Software Foundation, Inc. This file is part of GDB. @@ -1409,8 +1409,7 @@ os9k_read_ofile_symtab (pst) which comes from pst->textlow is correct. */ if (last_source_start_addr == 0) last_source_start_addr = text_offset; - pst->symtab = end_symtab (text_offset + text_size, 0, 0, objfile, - SECT_OFF_TEXT); + pst->symtab = end_symtab (text_offset + text_size, objfile, SECT_OFF_TEXT); end_stabs (); } @@ -1566,7 +1565,7 @@ os9k_process_one_symbol (type, desc, valu, name, section_offsets, objfile) *p = '\0'; if (symfile_depth++ == 0) { if (last_source_file) { - end_symtab (valu, 0, 0, objfile, SECT_OFF_TEXT); + end_symtab (valu, objfile, SECT_OFF_TEXT); end_stabs (); } start_stabs (); diff --git a/gdb/partial-stab.h b/gdb/partial-stab.h index 1ea1eb0421..b01eb1e44c 100644 --- a/gdb/partial-stab.h +++ b/gdb/partial-stab.h @@ -1,5 +1,5 @@ /* Shared code to pre-read a stab (dbx-style), when building a psymtab. - Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995 + Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996 Free Software Foundation, Inc. This file is part of GDB. @@ -103,7 +103,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ && CUR_SYMBOL_VALUE >= pst->textlow) { END_PSYMTAB (pst, psymtab_include_list, includes_used, - symnum * symbol_size, CUR_SYMBOL_VALUE, + symnum * symbol_size, + CUR_SYMBOL_VALUE > pst->texthigh + ? CUR_SYMBOL_VALUE : pst->texthigh, dependency_list, dependencies_used); pst = (struct partial_symtab *) 0; includes_used = 0; @@ -214,7 +216,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ if (pst) { END_PSYMTAB (pst, psymtab_include_list, includes_used, - symnum * symbol_size, valu, + symnum * symbol_size, + valu > pst->texthigh ? valu : pst->texthigh, dependency_list, dependencies_used); pst = (struct partial_symtab *) 0; includes_used = 0; @@ -365,6 +368,22 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ SET_NAMESTRING(); +#ifdef DBXREAD_ONLY + /* See if this is an end of function stab. */ + if (CUR_SYMBOL_TYPE == N_FUN && ! strcmp (namestring, "")) + { + unsigned long valu; + + /* It's value is the size (in bytes) of the function for + function relative stabs, or the address of the function's + end for old style stabs. */ + valu = CUR_SYMBOL_VALUE + last_function_start; + if (pst->texthigh == 0 || valu > pst->texthigh) + pst->texthigh = valu; + break; + } +#endif + p = (char *) strchr (namestring, ':'); if (!p) continue; /* Not a debugging symbol. */ @@ -527,6 +546,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ case 'f': CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_TEXT); #ifdef DBXREAD_ONLY + /* Keep track of the start of the last function so we + can handle end of function symbols. */ + last_function_start = CUR_SYMBOL_VALUE; /* Kludges for ELF/STABS with Sun ACC */ last_function_name = namestring; #ifdef SOFUN_ADDRESS_MAYBE_MISSING @@ -541,6 +563,13 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ startup_file_end = CUR_SYMBOL_VALUE; #endif /* End kludge. */ + + /* In reordered executables this function may lie outside + the bounds created by N_SO symbols. If that's the case + use the address of this function as the low bound for + the partial symbol table. */ + if (pst->textlow == 0 || CUR_SYMBOL_VALUE < pst->textlow) + pst->textlow = CUR_SYMBOL_VALUE; #endif /* DBXREAD_ONLY */ ADD_PSYMBOL_TO_LIST (namestring, p - namestring, VAR_NAMESPACE, LOC_BLOCK, @@ -554,6 +583,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ case 'F': CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_TEXT); #ifdef DBXREAD_ONLY + /* Keep track of the start of the last function so we + can handle end of function symbols. */ + last_function_start = CUR_SYMBOL_VALUE; /* Kludges for ELF/STABS with Sun ACC */ last_function_name = namestring; #ifdef SOFUN_ADDRESS_MAYBE_MISSING @@ -568,6 +600,12 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ startup_file_end = CUR_SYMBOL_VALUE; #endif /* End kludge. */ + /* In reordered executables this function may lie outside + the bounds created by N_SO symbols. If that's the case + use the address of this function as the low bound for + the partial symbol table. */ + if (pst->textlow == 0 || CUR_SYMBOL_VALUE < pst->textlow) + pst->textlow = CUR_SYMBOL_VALUE; #endif /* DBXREAD_ONLY */ ADD_PSYMBOL_TO_LIST (namestring, p - namestring, VAR_NAMESPACE, LOC_BLOCK, diff --git a/gdb/somread.c b/gdb/somread.c index 522b6b5091..ab8d531cc2 100644 --- a/gdb/somread.c +++ b/gdb/somread.c @@ -1,5 +1,5 @@ /* Read HP PA/Risc object files for GDB. - Copyright 1991, 1992 Free Software Foundation, Inc. + Copyright 1991, 1992, 1996 Free Software Foundation, Inc. Written by Fred Fish at Cygnus Support. This file is part of GDB. @@ -408,13 +408,16 @@ som_symfile_finish (objfile) hpread_symfile_finish (objfile); } -/* SOM specific initialization routine for reading symbols. +/* SOM specific initialization routine for reading symbols. */ - Nothing SOM specific left to do anymore. */ static void som_symfile_init (objfile) struct objfile *objfile; { + /* SOM objects may be reordered, so set OBJF_REORDERED. If we + find this causes a significant slowdown in gdb then we could + set it in the debug symbol readers only when necessary. */ + objfile->flags |= OBJF_REORDERED; hpread_symfile_init (objfile); } diff --git a/gdb/xcoffread.c b/gdb/xcoffread.c index c94cb76540..b5531024da 100644 --- a/gdb/xcoffread.c +++ b/gdb/xcoffread.c @@ -1,5 +1,5 @@ /* Read AIX xcoff symbol tables and convert to internal format, for GDB. - Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995 + Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996 Free Software Foundation, Inc. Derived from coffread.c, dbxread.c, and a lot of hacking. Contributed by IBM Corporation. @@ -1023,7 +1023,7 @@ read_xcoff_symtab (pst) if (last_source_file) { pst->symtab = - end_symtab (cur_src_end_addr, 1, 0, objfile, SECT_OFF_TEXT); + end_symtab (cur_src_end_addr, objfile, SECT_OFF_TEXT); end_stabs (); } @@ -1087,8 +1087,7 @@ read_xcoff_symtab (pst) { complete_symtab (filestring, file_start_addr); cur_src_end_addr = file_end_addr; - end_symtab (file_end_addr, 1, 0, objfile, - SECT_OFF_TEXT); + end_symtab (file_end_addr, objfile, SECT_OFF_TEXT); end_stabs (); start_stabs (); /* Give all csects for this source file the same @@ -1203,7 +1202,7 @@ read_xcoff_symtab (pst) complete_symtab (filestring, file_start_addr); cur_src_end_addr = file_end_addr; - end_symtab (file_end_addr, 1, 0, objfile, SECT_OFF_TEXT); + end_symtab (file_end_addr, objfile, SECT_OFF_TEXT); end_stabs (); /* XCOFF, according to the AIX 3.2 documentation, puts the filename @@ -1393,7 +1392,7 @@ read_xcoff_symtab (pst) complete_symtab (filestring, file_start_addr); cur_src_end_addr = file_end_addr; - s = end_symtab (file_end_addr, 1, 0, objfile, SECT_OFF_TEXT); + s = end_symtab (file_end_addr, objfile, SECT_OFF_TEXT); /* When reading symbols for the last C_FILE of the objfile, try to make sure that we set pst->symtab to the symtab for the file, not to the _globals_ symtab. I'm not sure whether this @@ -1844,6 +1843,12 @@ xcoff_symfile_init (objfile) /* Allocate struct to keep track of the symfile */ objfile -> sym_private = xmmalloc (objfile -> md, sizeof (struct coff_symfile_info)); + + /* XCOFF objects may be reordered, so set OBJF_REORDERED. If we + find this causes a significant slowdown in gdb then we could + set it in the debug symbol readers only when necessary. */ + objfile->flags |= OBJF_REORDERED; + init_entry_point_info (objfile); }