]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
* buildsym.c (end_symtab): Remove sort_pending and sort_linevec
authorJeff Law <law@redhat.com>
Mon, 8 Jan 1996 17:55:25 +0000 (17:55 +0000)
committerJeff Law <law@redhat.com>
Mon, 8 Jan 1996 17:55:25 +0000 (17:55 +0000)
        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.

Support for debugging reordered executables.  Remaining mentor vm
changes.

12 files changed:
gdb/ChangeLog
gdb/buildsym.c
gdb/buildsym.h
gdb/dwarfread.c
gdb/elfread.c
gdb/hpread.c
gdb/mdebugread.c
gdb/minsyms.c
gdb/os9kread.c
gdb/partial-stab.h
gdb/somread.c
gdb/xcoffread.c

index 0bd8350f13a9c0ce1db47788332edc7841c1469b..759a6b50a0d178499a462c448475843c53e3bbb3 100644 (file)
@@ -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
index c9c30b01995bf45beee7a1904cf91a287e901c52..5a5847a823f45185ae32dc4b0ceaf7e66f8c6332 100644 (file)
@@ -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);
index 36732f047a4e196b0e7218a67e2d2b305db1a8af..58529c709b3d13446b15d70cf744388b13e9e56b 100644 (file)
@@ -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 *));
index 41f2a6cce55fcf6a13c0f357bbb6cc776cf8e01f..fa7c9a2080b451edadc4b1bda10e7da422f0b4de 100644 (file)
@@ -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;
index 0372abb77d6bfb89e06262a0b7b7650e26229550..9a7a0fe3e1990894608657347b3d189475f40d0e 100644 (file)
@@ -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.
index 79d5ee4caeb12e6769e9b7c8a04231044d86da51..bfd7330aa1be869ebc367bef383c7b9f7b28e1b8 100644 (file)
@@ -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);
 }
 \f
 
@@ -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:
index 1c88f5110f30605e4a6664857bd5f72e1f3ee308..07dca2b3b00082353fb9412aa3e493c1e4b009cc 100644 (file)
@@ -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.
index c0200626157034559539ce9dded0ff29fd1ee8cd..e36302ea8ed92c80d74ae0b40eec52d261adf49f 100644 (file)
@@ -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. */
index 110d4cffbada495e6f758c07b6803921a041a474..bcdf30834d3530faa21aea577d30477bb8479726 100644 (file)
@@ -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 ();
index 1ea1eb04211677dd45db1ee09effdc63b025d8c2..b01eb1e44cf7ee927b2b8c035001b3b1d3f2173c 100644 (file)
@@ -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,
index 522b6b509103774a7892d778a1db64294eadffc2..ab8d531cc275354b1e58ad8d0da887dd5fdfda12 100644 (file)
@@ -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);
 }
 
index c94cb765408ff82921d5c064b6e01206b366232f..b5531024da4fd45d329a4bebce94d733f09d5478 100644 (file)
@@ -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);
 }