* coffread.c, dbxread.c, elfread.c, mipsread.c, nlmread.c,
authorMark Alexander <marka@cygnus>
Wed, 3 Jul 1996 05:11:40 +0000 (05:11 +0000)
committerMark Alexander <marka@cygnus>
Wed, 3 Jul 1996 05:11:40 +0000 (05:11 +0000)
os9kread.c: Replace identical sym_offsets functions with
default_symfile_offsets.
* somread.c (som_symfile_offsets): Use new SIZEOF_SECTION_OFFSETS
macro to allocate section_offsets.
* symfile.c (default_symfile_offsets): New function.
* symfile.h: Declare default_symfile_offsets.
* symtab.h: Define SIZEOF_SECTION_OFFSETS macro to
simplify allocation of section_offsets.

gdb/ChangeLog
gdb/coffread.c
gdb/dbxread.c
gdb/elfread.c
gdb/mipsread.c
gdb/nlmread.c
gdb/os9kread.c
gdb/somread.c
gdb/symfile.c
gdb/symfile.h
gdb/symtab.h

index 79aeb168d1b47ea03b54ea0b1186bd89c5471328..605bae329a5fd138717fababb4a10bcfd92f0b51 100644 (file)
@@ -1,3 +1,15 @@
+Tue Jul 02 21:41:20 1996  Mark Alexander  <marka@cygnus.com>
+
+       * coffread.c, dbxread.c, elfread.c, mipsread.c, nlmread.c, 
+       os9kread.c: Replace identical sym_offsets functions with
+       default_symfile_offsets.
+       * somread.c (som_symfile_offsets): Use new SIZEOF_SECTION_OFFSETS
+       macro to allocate section_offsets.
+       * symfile.c (default_symfile_offsets): New function.
+       * symfile.h: Declare default_symfile_offsets.
+       * symtab.h: Define SIZEOF_SECTION_OFFSETS macro to
+       simplify allocation of section_offsets.
+
 Tue Jul  2 15:04:20 1996  Michael Meissner  <meissner@tiktok.cygnus.com>
 
        * config/powerpc/{linux.mh,xm-linux.h}: New files, for Linux on
index ec7aef24346fffc284931d464a5593d57bb2944e..c2a96a8f7b27e112e5449c9288dfadf26fd99a8e 100644 (file)
@@ -1,5 +1,5 @@
 /* Read coff symbol tables and convert to internal format, for GDB.
-   Copyright 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994
+   Copyright 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1996
              Free Software Foundation, Inc.
    Contributed by David D. Johnson, Brown University (ddj@cs.brown.edu).
 
@@ -17,7 +17,7 @@ GNU General Public License for more details.
 
 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.  */
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 #include "defs.h"
 #include "symtab.h"
@@ -25,7 +25,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include "breakpoint.h"
 
 #include "bfd.h"
-#include <obstack.h>
+#include "obstack.h"
 
 #include "gdb_string.h"
 #include <ctype.h>
@@ -139,6 +139,12 @@ static struct symbol *opaque_type_chain[HASHSIZE];
 struct complaint ef_complaint = 
   {"Unmatched .ef symbol(s) ignored starting at symnum %d", 0, 0};
 
+struct complaint ef_stack_complaint = 
+  {"`.ef' symbol without matching `.bf' symbol ignored starting at symnum %d", 0, 0};
+
+struct complaint eb_stack_complaint = 
+  {"`.eb' symbol without matching `.bb' symbol ignored starting at symnum %d", 0, 0};
+
 struct complaint bf_no_aux_complaint =
   {"`.bf' symbol %d has no aux entry", 0, 0};
 
@@ -510,9 +516,7 @@ coff_end_symtab (objfile)
   subfiles->line_vector = line_vector;
   subfiles->name = last_source_file;
 
-  /* sort_pending is needed for amdcoff, at least.
-     sort_linevec is needed for the SCO compiler.  */
-  symtab = end_symtab (current_source_end_addr, 1, 1, objfile, 0);
+  symtab = end_symtab (current_source_end_addr, objfile, 0);
 
   if (symtab != NULL)
     free_named_symtabs (symtab->filename);
@@ -568,6 +572,11 @@ coff_symfile_init (objfile)
 
   memset (objfile->sym_private, 0, sizeof (struct coff_symfile_info));
 
+  /* COFF 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);
 }
 
@@ -892,6 +901,10 @@ coff_symtab_read (symtab_offset, nsyms, section_offsets, objfile)
            in_source_file = 1;
            break;
 
+         /* C_LABEL is used for labels and static functions.  Including
+            it here allows gdb to see static functions when no debug
+            info is available.  */
+         case C_LABEL:
           case C_STAT:
            if (cs->c_name[0] == '.')
              {
@@ -1029,6 +1042,14 @@ coff_symtab_read (symtab_offset, nsyms, section_offsets, objfile)
                   not useful for gdb.  */
                /* { main_aux.x_sym.x_misc.x_lnsz.x_lnno
                            contains number of lines to '}' */
+
+               if (context_stack_depth <= 0)
+                 {             /* We attempted to pop an empty context stack */
+                   complain (&ef_stack_complaint, cs->c_symnum);
+                   within_function = 0;
+                   break;
+                 }
+
                new = pop_context ();
                /* Stack must be empty now.  */
                if (context_stack_depth > 0 || new == NULL)
@@ -1082,6 +1103,12 @@ coff_symtab_read (symtab_offset, nsyms, section_offsets, objfile)
              }
            else if (STREQ (cs->c_name, ".eb"))
              {
+               if (context_stack_depth <= 0)
+                 {             /* We attempted to pop an empty context stack */
+                   complain (&eb_stack_complaint, cs->c_symnum);
+                   break;
+                 }
+
                new = pop_context ();
                if (depth-- != new->depth)
                  {
@@ -1182,7 +1209,7 @@ init_stringtab (abfd, offset)
 
   val = bfd_read ((char *)lengthbuf, sizeof lengthbuf, 1, abfd);
   length = bfd_h_get_32 (symfile_bfd, lengthbuf);
-
+       
   /* If no string table is needed, then the file may end immediately
      after the symbols.  Just return with `stringtab' set to null. */
   if (val != sizeof lengthbuf || length < sizeof lengthbuf)
@@ -1802,6 +1829,9 @@ decode_base_type (cs, c_type, aux)
       case T_DOUBLE:
        return lookup_fundamental_type (current_objfile, FT_DBL_PREC_FLOAT);
 
+      case T_LNGDBL:
+       return lookup_fundamental_type (current_objfile, FT_EXT_PREC_FLOAT);
+
       case T_STRUCT:
        if (cs->c_naux != 1)
          {
@@ -2098,26 +2128,6 @@ coff_read_enum_type (index, length, lastsym)
   return type;
 }
 
-struct section_offsets *
-coff_symfile_offsets (objfile, addr)
-     struct objfile *objfile;
-     CORE_ADDR addr;
-{
-  struct section_offsets *section_offsets;
-  int i;
-
-  objfile->num_sections = SECT_OFF_MAX;
-  section_offsets = (struct section_offsets *)
-    obstack_alloc (&objfile -> psymbol_obstack,
-                  sizeof (struct section_offsets)
-                  + sizeof (section_offsets->offsets) * SECT_OFF_MAX);
-
-  for (i = 0; i < SECT_OFF_MAX; i++)
-    ANOFFSET (section_offsets, i) = addr;
-  
-  return section_offsets;
-}
-
 /* Register our ability to parse symbols for coff BFD files. */
 
 static struct sym_fns coff_sym_fns =
@@ -2127,7 +2137,8 @@ static struct sym_fns coff_sym_fns =
   coff_symfile_init,   /* sym_init: read initial info, setup for sym_read() */
   coff_symfile_read,   /* sym_read: read a symbol file into symtab */
   coff_symfile_finish, /* sym_finish: finished with file, cleanup */
-  coff_symfile_offsets, /* sym_offsets:  xlate external to internal form */
+  default_symfile_offsets,
+                       /* sym_offsets:  xlate external to internal form */
   NULL                 /* next: pointer to next struct sym_fns */
 };
 
index 720c6b4fc270b1583376e7d1bbe53acd2292f909..e7091c0dc3c17f2a578e55375146d4c0c0acc1a4 100644 (file)
@@ -66,7 +66,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 #include "aout/stab_gnu.h"     /* We always use GNU stabs, not native, now */
 
 /* defined in stabsread.c; used for completing cfront stabs strings */
-extern void resolve_cont PARAMS((struct objfile * objfile, struct symbol * sym, char * p));
+extern void 
+resolve_cfront_continuation PARAMS((struct objfile * objfile, 
+               struct symbol * sym, char * p));
 
 \f
 /* We put a pointer to this structure in the read_symtab_private field
@@ -798,7 +800,7 @@ process_now(objfile)
       symbuf_idx = cont_list[i].sym_idx;   /* statics used by gdb */
       symbuf_end = cont_list[i].sym_end;  
       symnum = cont_list[i].symnum;  
-      resolve_cont(objfile,cont_list[i].sym,cont_list[i].stabs);
+      resolve_cfront_continuation(objfile,cont_list[i].sym,cont_list[i].stabs);
     }
   /* restore original state */
   symbuf_idx = save_symbuf_idx;
@@ -2584,29 +2586,6 @@ stabsect_build_psymtabs (objfile, section_offsets, mainline, stab_name,
   dbx_symfile_read (objfile, section_offsets, 0);
 }
 \f
-/* Parse the user's idea of an offset for dynamic linking, into our idea
-   of how to represent it for fast symbol reading.  */
-
-static struct section_offsets *
-dbx_symfile_offsets (objfile, addr)
-     struct objfile *objfile;
-     CORE_ADDR addr;
-{
-  struct section_offsets *section_offsets;
-  int i;
-
-  objfile->num_sections = SECT_OFF_MAX;
-  section_offsets = (struct section_offsets *)
-    obstack_alloc (&objfile -> psymbol_obstack,
-                  sizeof (struct section_offsets)
-                  + sizeof (section_offsets->offsets) * (SECT_OFF_MAX-1));
-
-  for (i = 0; i < SECT_OFF_MAX; i++)
-    ANOFFSET (section_offsets, i) = addr;
-  
-  return section_offsets;
-}
-\f
 static struct sym_fns aout_sym_fns =
 {
   bfd_target_aout_flavour,
@@ -2614,7 +2593,8 @@ static struct sym_fns aout_sym_fns =
   dbx_symfile_init,    /* sym_init: read initial info, setup for sym_read() */
   dbx_symfile_read,    /* sym_read: read a symbol file into symtab */
   dbx_symfile_finish,  /* sym_finish: finished with file, cleanup */
-  dbx_symfile_offsets, /* sym_offsets: parse user's offsets to internal form */
+  default_symfile_offsets,
+                       /* sym_offsets: parse user's offsets to internal form */
   NULL                 /* next: pointer to next struct sym_fns */
 };
 
index 9a7a0fe3e1990894608657347b3d189475f40d0e..a38a5f4f97b605472dbeca5e2957d1e38ac2c657 100644 (file)
@@ -78,9 +78,6 @@ elf_symtab_read PARAMS ((bfd *,  CORE_ADDR, struct objfile *, int));
 static void
 free_elfinfo PARAMS ((void *));
 
-static struct section_offsets *
-elf_symfile_offsets PARAMS ((struct objfile *, CORE_ADDR));
-
 static struct minimal_symbol *
 record_minimal_symbol_and_info PARAMS ((char *, CORE_ADDR,
                                        enum minimal_symbol_type, char *,
@@ -714,31 +711,6 @@ elf_symfile_init (objfile)
   objfile->flags |= OBJF_REORDERED;
 }
 
-/* ELF specific parsing routine for section offsets.
-
-   Plain and simple for now.  */
-
-static
-struct section_offsets *
-elf_symfile_offsets (objfile, addr)
-     struct objfile *objfile;
-     CORE_ADDR addr;
-{
-  struct section_offsets *section_offsets;
-  int i;
-
-  objfile->num_sections = SECT_OFF_MAX;
-  section_offsets = (struct section_offsets *)
-    obstack_alloc (&objfile -> psymbol_obstack,
-                  sizeof (struct section_offsets)
-                  + sizeof (section_offsets->offsets) * (SECT_OFF_MAX-1));
-
-  for (i = 0; i < SECT_OFF_MAX; i++)
-    ANOFFSET (section_offsets, i) = addr;
-
-  return section_offsets;
-}
-\f
 /* When handling an ELF file that contains Sun STABS debug info,
    some of the debug info is relative to the particular chunk of the
    section that was generated in its individual .o file.  E.g.
@@ -815,7 +787,8 @@ static struct sym_fns elf_sym_fns =
   elf_symfile_init,    /* sym_init: read initial info, setup for sym_read() */
   elf_symfile_read,    /* sym_read: read a symbol file into symtab */
   elf_symfile_finish,  /* sym_finish: finished with file, cleanup */
-  elf_symfile_offsets, /* sym_offsets:  Translate ext. to int. relocation */
+  default_symfile_offsets,
+                       /* sym_offsets:  Translate ext. to int. relocation */
   NULL                 /* next: pointer to next struct sym_fns */
 };
 
index 80fcec7d5e5b6167440bea3a71151c878c420dc8..8e7d19d33d8d3a1ef966b51c784639c3dc33e93f 100644 (file)
@@ -1,5 +1,5 @@
 /* Read a symbol table in MIPS' format (Third-Eye).
-   Copyright 1986, 1987, 1989, 1990, 1991, 1992, 1993, 1994
+   Copyright 1986, 1987, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996
    Free Software Foundation, Inc.
    Contributed by Alessandro Forin (af@cs.cmu.edu) at CMU.  Major work
    by Per Bothner, John Gilmore and Ian Lance Taylor at Cygnus Support.
@@ -18,7 +18,7 @@ GNU General Public License for more details.
 
 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.  */
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 /* Read symbols from an ECOFF file.  Most of the work is done in
    mdebugread.c.  */
@@ -54,9 +54,6 @@ mipscoff_symfile_read PARAMS ((struct objfile *, struct section_offsets *,
 static void
 mipscoff_symfile_finish PARAMS ((struct objfile *));
 
-static struct section_offsets *
-mipscoff_symfile_offsets PARAMS ((struct objfile *, CORE_ADDR));
-
 static void
 read_alphacoff_dynamic_symtab PARAMS ((struct section_offsets *,
                                       struct objfile *objfile));
@@ -108,16 +105,33 @@ mipscoff_symfile_read (objfile, section_offsets, mainline)
   mdebug_build_psymtabs (objfile, &ecoff_backend (abfd)->debug_swap,
                         &ecoff_data (abfd)->debug_info, section_offsets);
 
-  /* Add the dynamic symbols if we are reading the main symbol table.  */
+  /* Add alpha coff dynamic symbols.  */
 
-  if (mainline)
-    read_alphacoff_dynamic_symtab (section_offsets, objfile);
+  read_alphacoff_dynamic_symtab (section_offsets, objfile);
 
   /* Install any minimal symbols that have been collected as the current
      minimal symbols for this objfile. */
 
   install_minimal_symbols (objfile);
 
+  /* If the entry_file bounds are still unknown after processing the
+     partial symbols, then try to set them from the minimal symbols
+     surrounding the entry_point.  */
+
+  if (mainline
+      && objfile->ei.entry_point != INVALID_ENTRY_POINT
+      && objfile->ei.entry_file_lowpc == INVALID_ENTRY_LOWPC)
+    {
+      struct minimal_symbol *m;
+
+      m = lookup_minimal_symbol_by_pc (objfile->ei.entry_point);
+      if (m && SYMBOL_NAME (m + 1))
+       {
+         objfile->ei.entry_file_lowpc = SYMBOL_VALUE_ADDRESS (m);
+         objfile->ei.entry_file_highpc = SYMBOL_VALUE_ADDRESS (m + 1);
+       }
+    }
+
   do_cleanups (back_to);
 }
 
@@ -130,29 +144,6 @@ mipscoff_symfile_finish (objfile)
 {
 }
 
-/* Fake up identical offsets for all sections.  */
-
-static struct section_offsets *
-mipscoff_symfile_offsets (objfile, addr)
-     struct objfile *objfile;
-     CORE_ADDR addr;
-{
-  struct section_offsets *section_offsets;
-  int i;
-
-  objfile->num_sections = SECT_OFF_MAX;
-  section_offsets = ((struct section_offsets *)
-                    obstack_alloc (&objfile->psymbol_obstack,
-                                   (sizeof (struct section_offsets)
-                                    + (sizeof (section_offsets->offsets)
-                                       * (SECT_OFF_MAX - 1)))));
-
-  for (i = 0; i < SECT_OFF_MAX; i++)
-    ANOFFSET (section_offsets, i) = addr;
-
-  return section_offsets;
-}
-
 /* Alpha OSF/1 encapsulates the dynamic symbols in ELF format in a
    standard coff section.  The ELF format for the symbols differs from
    the format defined in elf/external.h. It seems that a normal ELF 32 bit
@@ -309,12 +300,15 @@ read_alphacoff_dynamic_symtab (section_offsets, objfile)
        break;
       else if (dyn_tag == DT_MIPS_LOCAL_GOTNO)
        {
-         dt_mips_local_gotno = bfd_h_get_32 (abfd,
-                                             (bfd_byte *) x_dynp->d_un.d_val);
+         if (dt_mips_local_gotno < 0)
+           dt_mips_local_gotno
+             = bfd_h_get_32 (abfd, (bfd_byte *) x_dynp->d_un.d_val);
        }
       else if (dyn_tag == DT_MIPS_GOTSYM)
        {
-         dt_mips_gotsym = bfd_h_get_32 (abfd, (bfd_byte *) x_dynp->d_un.d_val);
+         if (dt_mips_gotsym < 0)
+           dt_mips_gotsym
+             = bfd_h_get_32 (abfd, (bfd_byte *) x_dynp->d_un.d_val);
        }
     }
   if (dt_mips_local_gotno < 0 || dt_mips_gotsym < 0)
@@ -446,7 +440,7 @@ static struct sym_fns ecoff_sym_fns =
   mipscoff_symfile_init,       /* sym_init: read initial info, setup for sym_read() */
   mipscoff_symfile_read,       /* sym_read: read a symbol file into symtab */
   mipscoff_symfile_finish,     /* sym_finish: finished with file, cleanup */
-  mipscoff_symfile_offsets,    /* sym_offsets: dummy FIXME til implem sym reloc */
+  default_symfile_offsets,     /* sym_offsets: dummy FIXME til implem sym reloc */
   NULL                         /* next: pointer to next struct sym_fns */
 };
 
index b61dc97d94d6decee90e3a7546168336df80eb93..bc16d004a7e8dc85f29706efbca04f4c33a7d155 100644 (file)
@@ -43,9 +43,6 @@ nlm_symfile_finish PARAMS ((struct objfile *));
 static void
 nlm_symtab_read PARAMS ((bfd *,  CORE_ADDR, struct objfile *));
 
-static struct section_offsets *
-nlm_symfile_offsets PARAMS ((struct objfile *, CORE_ADDR));
-
 static void
 record_minimal_symbol PARAMS ((char *, CORE_ADDR, enum minimal_symbol_type,
                               struct objfile *));
@@ -260,34 +257,6 @@ nlm_symfile_finish (objfile)
     }
 }
 
-/* NLM specific parsing routine for section offsets.
-   FIXME:  This may or may not be necessary.  All the symbol readers seem
-   to have similar code.  See if it can be generalized and moved elsewhere. */
-
-static
-struct section_offsets *
-nlm_symfile_offsets (objfile, addr)
-     struct objfile *objfile;
-     CORE_ADDR addr;
-{
-  struct section_offsets *section_offsets;
-  int i;
-
-  objfile->num_sections = SECT_OFF_MAX;
-  section_offsets = (struct section_offsets *)
-    obstack_alloc (&objfile -> psymbol_obstack,
-                  sizeof (struct section_offsets) +
-                  sizeof (section_offsets->offsets) * (SECT_OFF_MAX-1));
-
-  for (i = 0; i < SECT_OFF_MAX; i++)
-    {
-      ANOFFSET (section_offsets, i) = addr;
-    }
-  
-  return (section_offsets);
-}
-
-\f
 /* Register that we are able to handle NLM file format. */
 
 static struct sym_fns nlm_sym_fns =
@@ -297,7 +266,8 @@ static struct sym_fns nlm_sym_fns =
   nlm_symfile_init,    /* sym_init: read initial info, setup for sym_read() */
   nlm_symfile_read,    /* sym_read: read a symbol file into symtab */
   nlm_symfile_finish,  /* sym_finish: finished with file, cleanup */
-  nlm_symfile_offsets, /* sym_offsets:  Translate ext. to int. relocation */
+  default_symfile_offsets,
+                       /* sym_offsets:  Translate ext. to int. relocation */
   NULL                 /* next: pointer to next struct sym_fns */
 };
 
index f80cb1b86bebf62ab44b3e31f5a4cfa2c34104ca..44ae0be36ed2b5433380a92a45e78d3615544fb2 100644 (file)
@@ -1617,30 +1617,7 @@ os9k_process_one_symbol (type, desc, valu, name, section_offsets, objfile)
     }
   previous_stab_code = type;
 }
-\f
-/* Parse the user's idea of an offset for dynamic linking, into our idea
-   of how to represent it for fast symbol reading.  */
-
-static struct section_offsets *
-os9k_symfile_offsets (objfile, addr)
-     struct objfile *objfile;
-     CORE_ADDR addr;
-{
-  struct section_offsets *section_offsets;
-  int i;
-
-  objfile->num_sections = SECT_OFF_MAX;
-  section_offsets = (struct section_offsets *)
-    obstack_alloc (&objfile -> psymbol_obstack,
-                  sizeof (struct section_offsets)
-                  + sizeof (section_offsets->offsets) * (SECT_OFF_MAX-1));
 
-  for (i = 0; i < SECT_OFF_MAX; i++)
-    ANOFFSET (section_offsets, i) = addr;
-  
-  return section_offsets;
-}
-\f
 static struct sym_fns os9k_sym_fns =
 {
   bfd_target_os9k_flavour,
@@ -1648,7 +1625,8 @@ static struct sym_fns os9k_sym_fns =
   os9k_symfile_init,   /* sym_init: read initial info, setup for sym_read() */
   os9k_symfile_read,   /* sym_read: read a symbol file into symtab */
   os9k_symfile_finish, /* sym_finish: finished with file, cleanup */
-  os9k_symfile_offsets,        /* sym_offsets: parse user's offsets to internal form*/
+  default_symfile_offsets,
+                       /* sym_offsets: parse user's offsets to internal form*/
   NULL                 /* next: pointer to next struct sym_fns */
 };
 
index ab8d531cc275354b1e58ad8d0da887dd5fdfda12..4951f109e40e4d4f53455c9620e011303124028c 100644 (file)
@@ -435,9 +435,7 @@ som_symfile_offsets (objfile, addr)
 
   objfile->num_sections = SECT_OFF_MAX;
   section_offsets = (struct section_offsets *)
-    obstack_alloc (&objfile -> psymbol_obstack,
-                  sizeof (struct section_offsets)
-                  + sizeof (section_offsets->offsets) * (SECT_OFF_MAX-1));
+    obstack_alloc (&objfile -> psymbol_obstack, SIZEOF_SECTION_OFFSETS);
 
   /* First see if we're a shared library.  If so, get the section
      offsets from the library, else get them from addr.  */
index f9a99ae49f5ce86c4abd58bafab738319c5a02e2..2850af3c54d6e6b88c06ca78da2ec8559a07681e 100644 (file)
@@ -34,10 +34,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 #include "complaints.h"
 #include "demangle.h"
 #include "inferior.h" /* for write_pc */
-
+#include "gdb-stabs.h"
 #include "obstack.h"
-#include <assert.h>
 
+#include <assert.h>
 #include <sys/types.h>
 #include <fcntl.h>
 #include "gdb_string.h"
@@ -365,6 +365,31 @@ find_lowest_section (abfd, sect, obj)
     *lowest = sect;
 }
 
+/* Parse the user's idea of an offset for dynamic linking, into our idea
+   of how to represent it for fast symbol reading.  This is the default 
+   version of the sym_fns.sym_offsets function for symbol readers that
+   don't need to do anything special.  It allocates a section_offsets table
+   for the objectfile OBJFILE and stuffs ADDR into all of the offsets.  */
+
+struct section_offsets *
+default_symfile_offsets (objfile, addr)
+     struct objfile *objfile;
+     CORE_ADDR addr;
+{
+  struct section_offsets *section_offsets;
+  int i;
+
+  objfile->num_sections = SECT_OFF_MAX;
+  section_offsets = (struct section_offsets *)
+    obstack_alloc (&objfile -> psymbol_obstack, SIZEOF_SECTION_OFFSETS);
+
+  for (i = 0; i < SECT_OFF_MAX; i++)
+    ANOFFSET (section_offsets, i) = addr;
+  
+  return section_offsets;
+}
+
+
 /* Process a symbol file, as either the main file or as a dynamically
    loaded file.
 
index 3c968f64bae3e690ddc5e6dd8c355e60171113c2..5921cbbaaeceb5831c104ebe55f469a811434fed 100644 (file)
@@ -32,9 +32,24 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
    to the single saved instance. */
 
 struct psymbol_allocation_list {
-  struct partial_symbol **list;        /* Pointer to first partial symbol pointer*/
-  struct partial_symbol **next;        /* Pointer to next avail storage for pointer */
-  int size;                    /* Number of symbols */
+
+  /* Pointer to beginning of dynamically allocated array of pointers to
+   partial symbols.  The array is dynamically expanded as necessary to
+   accommodate more pointers. */
+
+  struct partial_symbol **list;
+
+  /* Pointer to next available slot in which to store a pointer to a partial
+     symbol. */
+
+  struct partial_symbol **next;
+
+  /* Number of allocated pointer slots in current dynamic array (not the
+     number of bytes of storage).  The "next" pointer will always point
+     somewhere between list[0] and list[size], and when at list[size] the
+     array will be expanded on the next attempt to store a pointer. */
+
+  int size;
 };
 
 /* Structure to keep track of symbol reading functions for various
@@ -94,65 +109,25 @@ struct sym_fns {
 
 };
 
+/* The default version of sym_fns.sym_offsets for readers that don't
+   do anything special.  */
+
+extern struct section_offsets *
+default_symfile_offsets PARAMS ((struct objfile *objfile, CORE_ADDR addr));
+
+
 extern void
 extend_psymbol_list PARAMS ((struct psymbol_allocation_list *,
                             struct objfile *));
 
 /* Add any kind of symbol to a psymbol_allocation_list. */
 
-#ifndef INLINE_ADD_PSYMBOL
-/* Default this to off for now, and probably eventually remove support for inlining via
-   macros.  Real world tests show no performance improvements by inlining, and the macros
-   just make debugging gdb more complicated and make gdb larger by up to 150 Kb. */
-#define INLINE_ADD_PSYMBOL 0
-#endif
-
-#include "demangle.h"
-
-#if !INLINE_ADD_PSYMBOL
+/* #include "demangle.h" */
 
-/* Since one arg is a struct, we have to pass in a ptr and deref it (sigh) */
-
-#define        ADD_PSYMBOL_TO_LIST(name, namelength, namespace, class, list, value, language, objfile) \
-  add_psymbol_to_list (name, namelength, namespace, class, &list, value, language, objfile)
-
-#define        ADD_PSYMBOL_ADDR_TO_LIST(name, namelength, namespace, class, list, value, language, objfile) \
-  add_psymbol_addr_to_list (name, namelength, namespace, class, &list, value, language, objfile)
-
-#else  /* !INLINE_ADD_PSYMBOL */
-
-#define        ADD_PSYMBOL_VT_TO_LIST(NAME,NAMELENGTH,NAMESPACE,CLASS,LIST,VALUE,VT,LANGUAGE, OBJFILE) \
-  do {                                                                 \
-    register struct partial_symbol *psym;                              \
-    char *buf = alloca ((NAMELENGTH) + 1);                             \
-    struct partial_symbol psymbol;                                     \
-    memcpy (buf, (NAME), (NAMELENGTH));                                        \
-    buf[(NAMELENGTH)] = '\0';                                          \
-    SYMBOL_NAME (&psymbol) = bcache (buf, (NAMELENGTH) + 1, &(OBJFILE)->psymbol_cache); \
-    VT (&psymbol) = (VALUE);                                           \
-    SYMBOL_SECTION (&psymbol) = 0;                                     \
-    SYMBOL_LANGUAGE (&psymbol) = (LANGUAGE);                           \
-    PSYMBOL_NAMESPACE (&psymbol) = (NAMESPACE);                                \
-    PSYMBOL_CLASS (&psymbol) = (CLASS);                                        \
-    SYMBOL_INIT_LANGUAGE_SPECIFIC (&psymbol, (LANGUAGE));              \
-    psym = bcache (&psymbol, sizeof (struct partial_symbol), &(OBJFILE)->psymbol_cache); \
-    if ((LIST).next >= (LIST).list + (LIST).size)                      \
-      extend_psymbol_list (&(LIST), (OBJFILE));                                \
-    *(LIST).next++ = psym;                                             \
-    OBJSTAT ((OBJFILE), n_psyms++);                                    \
-  } while (0)
-
-/* Add a symbol with an integer value to a psymtab. */
-
-#define ADD_PSYMBOL_TO_LIST(name, namelength, namespace, class, list, value, language, objfile) \
-  ADD_PSYMBOL_VT_TO_LIST (name, namelength, namespace, class, list, value, SYMBOL_VALUE, language, objfile)
-
-/* Add a symbol with a CORE_ADDR value to a psymtab. */
-
-#define        ADD_PSYMBOL_ADDR_TO_LIST(name, namelength, namespace, class, list, value, language, objfile)\
-  ADD_PSYMBOL_VT_TO_LIST (name, namelength, namespace, class, list, value, SYMBOL_VALUE_ADDRESS, language, objfile)
-
-#endif /* INLINE_ADD_PSYMBOL */
+extern void
+add_psymbol_to_list PARAMS ((char *, int, namespace_enum, enum address_class,
+                            struct psymbol_allocation_list *, long, CORE_ADDR,
+                            enum language, struct objfile *));
 
 extern void init_psymbol_list PARAMS ((struct objfile *, int));
 
@@ -219,6 +194,8 @@ extern int auto_solib_add;
 extern struct partial_symtab *
 allocate_psymtab PARAMS ((char *, struct objfile *));
 
+extern void find_lowest_section PARAMS ((bfd *, asection *, PTR));
+
 /* Remote targets may wish to use this as their load function.  */
 extern void generic_load PARAMS ((char *name, int from_tty));
 
index c7703dd7fd4335953ee27d290aba80fcf26d4c1c..6d1b22e7e071eccaea2fbd7aa386d36e2c0d01fe 100644 (file)
@@ -717,6 +717,13 @@ struct section_offsets
 
 #define        ANOFFSET(secoff, whichone)      (secoff->offsets[whichone])
 
+/* The maximum possible size of a section_offsets table.  */
+#define SIZEOF_SECTION_OFFSETS \
+  (sizeof (struct section_offsets) \
+   + sizeof (((struct section_offsets *) 0)->offsets) * (SECT_OFF_MAX-1))
+
+
 /* Each source file or header is represented by a struct symtab. 
    These objects are chained through the `next' field.  */
 
@@ -1062,6 +1069,11 @@ lookup_minimal_symbol PARAMS ((const char *, const char *, struct objfile *));
 extern struct minimal_symbol *
 lookup_minimal_symbol_text PARAMS ((const char *, const char *, struct objfile *));
 
+struct minimal_symbol *
+lookup_minimal_symbol_solib_trampoline PARAMS ((const char *,
+                                               const char *,
+                                               struct objfile *));
+
 extern struct minimal_symbol *
 lookup_minimal_symbol_by_pc PARAMS ((CORE_ADDR));