* 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 "bfd.h"
-#include "symfile.h"
-#include "objfiles.h"
-#include "buildsym.h"
-#include "gdb-stabs.h"
-#include "complaints.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 "symfile.h"
+#include "objfiles.h"
+#include "buildsym.h"
+#include "gdb-stabs.h"
+#include "stabsread.h"
+#include "complaints.h"
+
 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;
-
-  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.  */
@@ -84,13 +78,10 @@ struct coff_symfile_info {
 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).  */
 
-static FILE *nlist_stream_global;
+static GDB_FILE *nlist_stream_global;
 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 char *
-getfilename PARAMS ((union internal_auxent *));
-
 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
-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 *));
@@ -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.
 
-   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)
@@ -371,6 +362,9 @@ coff_alloc_type (index)
   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;
@@ -486,15 +480,17 @@ coff_end_symtab (objfile)
 }
 \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;
+     struct objfile *objfile;
 {
   /* 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 ()
@@ -516,9 +512,15 @@ static void
 coff_symfile_init (objfile)
      struct objfile *objfile;
 {
-  asection     *section, *strsection;
+  asection     *section;
   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));
@@ -589,6 +591,7 @@ coff_symfile_read (objfile, section_offsets, mainline)
      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);
@@ -601,10 +604,11 @@ coff_symfile_read (objfile, section_offsets, mainline)
   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!  */
-   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 */
@@ -657,7 +661,13 @@ coff_symfile_read (objfile, section_offsets, mainline)
 
   /* 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. */
@@ -668,8 +678,9 @@ coff_symfile_read (objfile, section_offsets, mainline)
 
   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);
@@ -717,7 +728,7 @@ read_coff_symtab (symtab_offset, nsyms, 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;
@@ -730,7 +741,6 @@ read_coff_symtab (symtab_offset, nsyms, objfile)
   
   /* A .file is open.  */
   int in_source_file = 0;
-  int num_object_files = 0;
   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 ();
-         complete_symtab ("_globals_", 0, first_object_file_end);
+         complete_symtab ("_globals_", 0, 0);
          /* 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. */
-         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;
@@ -843,7 +853,7 @@ read_coff_symtab (symtab_offset, nsyms, objfile)
             */
            next_file_symnum = cs->c_value;
            if (cs->c_naux > 0)
-             filestring = getfilename (&main_aux);
+             filestring = coff_getfilename (&main_aux);
            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 (++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.  */
@@ -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,
-                                                  mst_text);
+                                                  mst_text, objfile);
                            break;
                    } else {
                            record_minimal_symbol (cs->c_name, cs->c_value,
-                                                  mst_data);
+                                                  mst_data, objfile);
                            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,
-                         (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++)
@@ -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.  */
 
-static char *
-getfilename (aux_entry)
+char *
+coff_getfilename (aux_entry)
     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;
+
+  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));
+                  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;
@@ -2048,8 +2054,7 @@ coff_symfile_offsets (objfile, addr)
 
 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 */
This page took 0.028346 seconds and 4 git commands to generate.