* ldmisc.c (vfinfo): Change symbol reading slightly for recent BFD
[deliverable/binutils-gdb.git] / gdb / coffread.c
index 8b3530dd33656eff2fe722afdfe5e6f064d71b2c..0797a931a9d6cdc382c87188ae17dc78dcd73022 100644 (file)
@@ -23,12 +23,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include "symtab.h"
 #include "gdbtypes.h"
 #include "breakpoint.h"
 #include "symtab.h"
 #include "gdbtypes.h"
 #include "breakpoint.h"
+
 #include "bfd.h"
 #include "bfd.h"
-#include "symfile.h"
-#include "objfiles.h"
-#include "buildsym.h"
-#include "gdb-stabs.h"
-#include "complaints.h"
 #include <obstack.h>
 
 #include <string.h>
 #include <obstack.h>
 
 #include <string.h>
@@ -39,23 +35,21 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include "coff/internal.h"     /* Internal format of COFF symbols in BFD */
 #include "libcoff.h"           /* FIXME secret internal data from BFD */
 
 #include "coff/internal.h"     /* Internal format of COFF symbols in BFD */
 #include "libcoff.h"           /* FIXME secret internal data from BFD */
 
+#include "symfile.h"
+#include "objfiles.h"
+#include "buildsym.h"
+#include "gdb-stabs.h"
+#include "stabsread.h"
+#include "complaints.h"
+
 struct coff_symfile_info {
 struct coff_symfile_info {
-  asection *text_sect;         /* Text section accessor */
-  int symcount;                        /* How many symbols are there in the file */
-  char *stringtab;             /* The actual string table */
-  int stringtab_size;          /* Its size */
-  file_ptr symtab_offset;      /* Offset in file to symbol table */
-  int symbol_size;             /* Bytes in a single symbol */
-  struct stab_section_info *stab_section_info;         /* section starting points
-                                  of the original .o files before linking. */
+  file_ptr min_lineno_offset;          /* Where in file lowest line#s are */
+  file_ptr max_lineno_offset;          /* 1+last byte of line#s in file */
 
   asection *stabsect;          /* Section pointer for .stab section */
   asection *stabstrsect;               /* Section pointer for .stab section */
   asection *stabindexsect;     /* Section pointer for .stab.index section */
   char *stabstrdata;
 
   asection *stabsect;          /* Section pointer for .stab section */
   asection *stabstrsect;               /* Section pointer for .stab section */
   asection *stabindexsect;     /* Section pointer for .stab.index section */
   char *stabstrdata;
-
-  file_ptr min_lineno_offset;          /* Where in file lowest line#s are */
-  file_ptr max_lineno_offset;          /* 1+last byte of line#s in file */
 };
 
 /* Translate an external name string into a user-visible name.  */
 };
 
 /* Translate an external name string into a user-visible name.  */
@@ -84,13 +78,10 @@ struct coff_symfile_info {
 static CORE_ADDR cur_src_start_addr;
 static CORE_ADDR cur_src_end_addr;
 
 static CORE_ADDR cur_src_start_addr;
 static CORE_ADDR cur_src_end_addr;
 
-/* Core address of the end of the first object file.  */
-static CORE_ADDR first_object_file_end;
-
 /* The addresses of the symbol table stream and number of symbols
    of the object file we are reading (as copied into core).  */
 
 /* The addresses of the symbol table stream and number of symbols
    of the object file we are reading (as copied into core).  */
 
-static FILE *nlist_stream_global;
+static GDB_FILE *nlist_stream_global;
 static int nlist_nsyms_global;
 
 /* Vector of line number information.  */
 static int nlist_nsyms_global;
 
 /* Vector of line number information.  */
@@ -232,9 +223,6 @@ free_linetab PARAMS ((void));
 static int
 init_lineno PARAMS ((int, long, int));
 
 static int
 init_lineno PARAMS ((int, long, int));
 
-static char *
-getfilename PARAMS ((union internal_auxent *));
-
 static char *
 getsymname PARAMS ((struct internal_syment *));
 
 static char *
 getsymname PARAMS ((struct internal_syment *));
 
@@ -266,8 +254,8 @@ coff_symfile_read PARAMS ((struct objfile *, struct section_offsets *, int));
 static void
 coff_symfile_finish PARAMS ((struct objfile *));
 
 static void
 coff_symfile_finish PARAMS ((struct objfile *));
 
-static void
-record_minimal_symbol PARAMS ((char *, CORE_ADDR, enum minimal_symbol_type));
+static void record_minimal_symbol
+  PARAMS ((char *, CORE_ADDR, enum minimal_symbol_type, struct objfile *));
 
 static void
 coff_end_symtab PARAMS ((struct objfile *));
 
 static void
 coff_end_symtab PARAMS ((struct objfile *));
@@ -296,7 +284,10 @@ coff_locate_sections PARAMS ((bfd *, asection *, PTR));
    if it is something we are interested in processing, and
    if so, stash away some access information for the section.
 
    if it is something we are interested in processing, and
    if so, stash away some access information for the section.
 
-   FIXME:  The section names should not be hardwired strings. */
+   FIXME: The section names should not be hardwired strings (what
+   should they be?  I don't think most object file formats have enough
+   section flags to specify what kind of debug section it is
+   -kingdon).  */
 
 static void
 coff_locate_sections (ignore_abfd, sectp, csip)
 
 static void
 coff_locate_sections (ignore_abfd, sectp, csip)
@@ -371,6 +362,9 @@ coff_alloc_type (index)
   return type;
 }
 \f
   return type;
 }
 \f
+/* Record a line number entry for line LINE at address PC.
+   FIXME:  Use record_line instead.  */
+
 static void
 coff_record_line (line, pc)
      int line;
 static void
 coff_record_line (line, pc)
      int line;
@@ -486,15 +480,17 @@ coff_end_symtab (objfile)
 }
 \f
 static void
 }
 \f
 static void
-record_minimal_symbol (name, address, type)
+record_minimal_symbol (name, address, type, objfile)
      char *name;
      CORE_ADDR address;
      enum minimal_symbol_type type;
      char *name;
      CORE_ADDR address;
      enum minimal_symbol_type type;
+     struct objfile *objfile;
 {
   /* We don't want TDESC entry points in the minimal symbol table */
   if (name[0] == '@') return;
 
 {
   /* We don't want TDESC entry points in the minimal symbol table */
   if (name[0] == '@') return;
 
-  prim_record_minimal_symbol (savestring (name, strlen (name)), address, type);
+  prim_record_minimal_symbol (savestring (name, strlen (name)), address, type,
+                             objfile);
 }
 \f
 /* coff_symfile_init ()
 }
 \f
 /* coff_symfile_init ()
@@ -516,9 +512,15 @@ static void
 coff_symfile_init (objfile)
      struct objfile *objfile;
 {
 coff_symfile_init (objfile)
      struct objfile *objfile;
 {
-  asection     *section, *strsection;
+  asection     *section;
   bfd *abfd = objfile->obfd;
 
   bfd *abfd = objfile->obfd;
 
+  /* Allocate struct to keep track of stab reading. */
+  objfile->sym_stab_info = (PTR)
+    xmmalloc (objfile -> md, sizeof (struct dbx_symfile_info));
+
+  memset ((PTR) objfile->sym_stab_info, 0, sizeof (struct dbx_symfile_info));
+
   /* Allocate struct to keep track of the symfile */
   objfile -> sym_private = xmmalloc (objfile -> md,
                                     sizeof (struct coff_symfile_info));
   /* Allocate struct to keep track of the symfile */
   objfile -> sym_private = xmmalloc (objfile -> md,
                                     sizeof (struct coff_symfile_info));
@@ -589,6 +591,7 @@ coff_symfile_read (objfile, section_offsets, mainline)
      int mainline;
 {
   struct coff_symfile_info *info;
      int mainline;
 {
   struct coff_symfile_info *info;
+  struct dbx_symfile_info *dbxinfo;
   bfd *abfd = objfile->obfd;
   coff_data_type *cdata = coff_data (abfd);
   char *name = bfd_get_filename (abfd);
   bfd *abfd = objfile->obfd;
   coff_data_type *cdata = coff_data (abfd);
   char *name = bfd_get_filename (abfd);
@@ -601,10 +604,11 @@ coff_symfile_read (objfile, section_offsets, mainline)
   int stabsize, stabstrsize;
 
   info = (struct coff_symfile_info *) objfile -> sym_private;
   int stabsize, stabstrsize;
 
   info = (struct coff_symfile_info *) objfile -> sym_private;
+  dbxinfo = (struct dbx_symfile_info *) objfile->sym_stab_info;
   symfile_bfd = abfd;                  /* Kludge for swap routines */
 
 /* WARNING WILL ROBINSON!  ACCESSING BFD-PRIVATE DATA HERE!  FIXME!  */
   symfile_bfd = abfd;                  /* Kludge for swap routines */
 
 /* WARNING WILL ROBINSON!  ACCESSING BFD-PRIVATE DATA HERE!  FIXME!  */
-   desc = fileno ((FILE *)(abfd->iostream));   /* File descriptor */
+   desc = fileno ((GDB_FILE *)(abfd->iostream));       /* File descriptor */
    num_symbols = bfd_get_symcount (abfd);      /* How many syms */
    symtab_offset = cdata->sym_filepos;         /* Symbol table file offset */
    stringtab_offset = symtab_offset +          /* String table file offset */
    num_symbols = bfd_get_symcount (abfd);      /* How many syms */
    symtab_offset = cdata->sym_filepos;         /* Symbol table file offset */
    stringtab_offset = symtab_offset +          /* String table file offset */
@@ -657,7 +661,13 @@ coff_symfile_read (objfile, section_offsets, mainline)
 
   /* Sort symbols alphabetically within each block.  */
 
 
   /* Sort symbols alphabetically within each block.  */
 
-  sort_all_symtab_syms ();
+  {
+    struct symtab *s;
+    for (s = objfile -> symtabs; s != NULL; s = s -> next)
+      {
+       sort_symtab_syms (s);
+      }
+  }
 
   /* Install any minimal symbols that have been collected as the current
      minimal symbols for this objfile. */
 
   /* Install any minimal symbols that have been collected as the current
      minimal symbols for this objfile. */
@@ -668,8 +678,9 @@ coff_symfile_read (objfile, section_offsets, mainline)
 
   if (info->stabsect)
     {
 
   if (info->stabsect)
     {
-      /* dubious */
-      fseek ((FILE *) abfd->iostream, abfd->where, 0);
+      /* FIXME: dubious.  Why can't we use something normal like
+        bfd_get_section_contents?  */
+      fseek ((GDB_FILE *) abfd->iostream, abfd->where, 0);
 
       stabsize = bfd_section_size (abfd, info->stabsect);
       stabstrsize = bfd_section_size (abfd, info->stabstrsect);
 
       stabsize = bfd_section_size (abfd, info->stabsect);
       stabstrsize = bfd_section_size (abfd, info->stabstrsect);
@@ -717,7 +728,7 @@ read_coff_symtab (symtab_offset, nsyms, objfile)
      int nsyms;
      struct objfile *objfile;
 {
      int nsyms;
      struct objfile *objfile;
 {
-  FILE *stream; 
+  GDB_FILE *stream; 
   register struct context_stack *new;
   struct coff_symbol coff_symbol;
   register struct coff_symbol *cs = &coff_symbol;
   register struct context_stack *new;
   struct coff_symbol coff_symbol;
   register struct coff_symbol *cs = &coff_symbol;
@@ -730,7 +741,6 @@ read_coff_symtab (symtab_offset, nsyms, objfile)
   
   /* A .file is open.  */
   int in_source_file = 0;
   
   /* A .file is open.  */
   int in_source_file = 0;
-  int num_object_files = 0;
   int next_file_symnum = -1;
 
   /* Name of the current file.  */
   int next_file_symnum = -1;
 
   /* Name of the current file.  */
@@ -801,7 +811,7 @@ read_coff_symtab (symtab_offset, nsyms, objfile)
            coff_end_symtab (objfile);
 
          coff_start_symtab ();
            coff_end_symtab (objfile);
 
          coff_start_symtab ();
-         complete_symtab ("_globals_", 0, first_object_file_end);
+         complete_symtab ("_globals_", 0, 0);
          /* done with all files, everything from here on out is globals */
        }
 
          /* done with all files, everything from here on out is globals */
        }
 
@@ -814,7 +824,7 @@ read_coff_symtab (symtab_offset, nsyms, objfile)
       if (ISFCN (cs->c_type) && cs->c_sclass != C_TPDEF)
        {
          /* Record all functions -- external and static -- in minsyms. */
       if (ISFCN (cs->c_type) && cs->c_sclass != C_TPDEF)
        {
          /* Record all functions -- external and static -- in minsyms. */
-         record_minimal_symbol (cs->c_name, cs->c_value, mst_text);
+         record_minimal_symbol (cs->c_name, cs->c_value, mst_text, objfile);
 
          fcn_line_ptr = main_aux.x_sym.x_fcnary.x_fcn.x_lnnoptr;
          fcn_start_addr = cs->c_value;
 
          fcn_line_ptr = main_aux.x_sym.x_fcnary.x_fcn.x_lnnoptr;
          fcn_start_addr = cs->c_value;
@@ -843,7 +853,7 @@ read_coff_symtab (symtab_offset, nsyms, objfile)
             */
            next_file_symnum = cs->c_value;
            if (cs->c_naux > 0)
             */
            next_file_symnum = cs->c_value;
            if (cs->c_naux > 0)
-             filestring = getfilename (&main_aux);
+             filestring = coff_getfilename (&main_aux);
            else
              filestring = "";
 
            else
              filestring = "";
 
@@ -864,11 +874,6 @@ read_coff_symtab (symtab_offset, nsyms, objfile)
                    if (STREQ (cs->c_name, ".text")) {
                            /* FIXME:  don't wire in ".text" as section name
                                       or symbol name! */
                    if (STREQ (cs->c_name, ".text")) {
                            /* FIXME:  don't wire in ".text" as section name
                                       or symbol name! */
-                           if (++num_object_files == 1) {
-                                   /* last address of startup file */
-                                   first_object_file_end = cs->c_value +
-                                           main_aux.x_scn.x_scnlen;
-                           }
                            /* Check for in_source_file deals with case of
                               a file with debugging symbols
                               followed by a later file with no symbols.  */
                            /* Check for in_source_file deals with case of
                               a file with debugging symbols
                               followed by a later file with no symbols.  */
@@ -909,11 +914,11 @@ read_coff_symtab (symtab_offset, nsyms, objfile)
                But why are absolute syms recorded as functions, anyway?  */
                    if (cs->c_secnum <= text_bfd_scnum+1) {/* text or abs */
                            record_minimal_symbol (cs->c_name, cs->c_value,
                But why are absolute syms recorded as functions, anyway?  */
                    if (cs->c_secnum <= text_bfd_scnum+1) {/* text or abs */
                            record_minimal_symbol (cs->c_name, cs->c_value,
-                                                  mst_text);
+                                                  mst_text, objfile);
                            break;
                    } else {
                            record_minimal_symbol (cs->c_name, cs->c_value,
                            break;
                    } else {
                            record_minimal_symbol (cs->c_name, cs->c_value,
-                                                  mst_data);
+                                                  mst_data, objfile);
                            break;
                    }
            }
                            break;
                    }
            }
@@ -1113,7 +1118,7 @@ read_one_sym (cs, sym, aux)
     {
     fread (temp_aux, local_auxesz, 1, nlist_stream_global);
     bfd_coff_swap_aux_in (symfile_bfd, temp_aux, sym->n_type, sym->n_sclass,
     {
     fread (temp_aux, local_auxesz, 1, nlist_stream_global);
     bfd_coff_swap_aux_in (symfile_bfd, temp_aux, sym->n_type, sym->n_sclass,
-                         (char *)aux);
+                         0, cs->c_naux, (char *)aux);
     /* If more than one aux entry, read past it (only the first aux
        is important). */
     for (i = 1; i < cs->c_naux; i++)
     /* If more than one aux entry, read past it (only the first aux
        is important). */
     for (i = 1; i < cs->c_naux; i++)
@@ -1200,8 +1205,8 @@ getsymname (symbol_entry)
    only the last component of the name.  Result is in static storage and
    is only good for temporary use.  */
 
    only the last component of the name.  Result is in static storage and
    is only good for temporary use.  */
 
-static char *
-getfilename (aux_entry)
+char *
+coff_getfilename (aux_entry)
     union internal_auxent *aux_entry;
 {
   static char buffer[BUFSIZ];
     union internal_auxent *aux_entry;
 {
   static char buffer[BUFSIZ];
@@ -2032,11 +2037,12 @@ coff_symfile_offsets (objfile, addr)
 {
   struct section_offsets *section_offsets;
   int i;
 {
   struct section_offsets *section_offsets;
   int i;
+
+  objfile->num_sections = SECT_OFF_MAX;
   section_offsets = (struct section_offsets *)
     obstack_alloc (&objfile -> psymbol_obstack,
   section_offsets = (struct section_offsets *)
     obstack_alloc (&objfile -> psymbol_obstack,
-                  sizeof (struct section_offsets) +
-                         sizeof (section_offsets->offsets) * (SECT_OFF_MAX-1));
+                  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;
 
   for (i = 0; i < SECT_OFF_MAX; i++)
     ANOFFSET (section_offsets, i) = addr;
@@ -2048,8 +2054,7 @@ coff_symfile_offsets (objfile, addr)
 
 static struct sym_fns coff_sym_fns =
 {
 
 static struct sym_fns coff_sym_fns =
 {
-  "coff",              /* sym_name: name or name prefix of BFD target type */
-  4,                   /* sym_namelen: number of significant sym_name chars */
+  bfd_target_coff_flavour,
   coff_new_init,       /* sym_new_init: init anything gbl to entire symtab */
   coff_symfile_init,   /* sym_init: read initial info, setup for sym_read() */
   coff_symfile_read,   /* sym_read: read a symbol file into symtab */
   coff_new_init,       /* sym_new_init: init anything gbl to entire symtab */
   coff_symfile_init,   /* sym_init: read initial info, setup for sym_read() */
   coff_symfile_read,   /* sym_read: read a symbol file into symtab */
This page took 0.027782 seconds and 4 git commands to generate.