*** empty log message ***
[binutils-gdb.git] / gdb / dbxread.c
index 54d8b51fdc707fc0c69ef790ac8b74ded9823761..25bf07b5af5f249612e7e56cac1072c211139255 100644 (file)
@@ -1,6 +1,6 @@
 /* Read dbx symbol tables and convert to internal format, for GDB.
    Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
-   1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2008, 2009.
+   1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2008, 2009, 2010.
    Free Software Foundation, Inc.
 
    This file is part of GDB.
@@ -55,6 +55,7 @@
 #include "complaints.h"
 #include "cp-abi.h"
 #include "cp-support.h"
+#include "psympriv.h"
 
 #include "gdb_assert.h"
 #include "gdb_string.h"
@@ -489,6 +490,7 @@ record_minimal_symbol (char *name, CORE_ADDR address, int type,
       /* Same with virtual function tables, both global and static.  */
       {
        char *tempstring = name;
+
        if (tempstring[0] == bfd_get_symbol_leading_char (objfile->obfd))
          ++tempstring;
        if (is_vtable_name (tempstring))
@@ -520,13 +522,10 @@ record_minimal_symbol (char *name, CORE_ADDR address, int type,
 /* Scan and build partial symbols for a symbol file.
    We have been initialized by a call to dbx_symfile_init, which 
    put all the relevant info into a "struct dbx_symfile_info",
-   hung off the objfile structure.
-
-   MAINLINE is true if we are reading the main symbol
-   table (as opposed to a shared lib or dynamically loaded file).  */
+   hung off the objfile structure.  */
 
 static void
-dbx_symfile_read (struct objfile *objfile, int mainline)
+dbx_symfile_read (struct objfile *objfile, int symfile_flags)
 {
   bfd *sym_bfd;
   int val;
@@ -556,10 +555,8 @@ dbx_symfile_read (struct objfile *objfile, int mainline)
   if (val < 0)
     perror_with_name (objfile->name);
 
-  /* If we are reinitializing, or if we have never loaded syms yet, init */
-  if (mainline
-      || (objfile->global_psymbols.size == 0
-         &&  objfile->static_psymbols.size == 0))
+  /* Size the symbol table.  */
+  if (objfile->global_psymbols.size == 0 && objfile->static_psymbols.size == 0)
     init_psymbol_list (objfile, DBX_SYMCOUNT (objfile));
 
   symbol_size = DBX_SYMBOL_SIZE (objfile);
@@ -814,6 +811,7 @@ fill_symbuf (bfd *sym_bfd)
       if (symbuf_left <= 0)
        {
          file_ptr filepos = symbuf_sections->section->filepos;
+
          if (bfd_seek (sym_bfd, filepos, SEEK_SET) != 0)
            perror_with_name (bfd_get_filename (sym_bfd));
          symbuf_left = bfd_section_size (sym_bfd, symbuf_sections->section);
@@ -906,6 +904,7 @@ add_bincl_to_list (struct partial_symtab *pst, char *name, int instance)
   if (next_bincl >= bincl_list + bincls_allocated)
     {
       int offset = next_bincl - bincl_list;
+
       bincls_allocated *= 2;
       bincl_list = (struct header_file_location *)
        xrealloc ((char *) bincl_list,
@@ -965,8 +964,9 @@ set_namestring (struct objfile *objfile, const struct internal_nlist *nlist)
 {
   char *namestring;
 
-  if (((unsigned) nlist->n_strx + file_string_table_offset)
-      >= DBX_STRINGTAB_SIZE (objfile))
+  if (nlist->n_strx + file_string_table_offset
+      >= DBX_STRINGTAB_SIZE (objfile)
+      || nlist->n_strx + file_string_table_offset < nlist->n_strx)
     {
       complaint (&symfile_complaints, _("bad string table offset in symbol %d"),
                 symnum);
@@ -1094,8 +1094,8 @@ read_dbx_dynamic_symtab (struct objfile *objfile)
     {
       arelent *rel = *relptr;
       CORE_ADDR address =
-      rel->address + ANOFFSET (objfile->section_offsets,
-                              SECT_OFF_DATA (objfile));
+       rel->address + ANOFFSET (objfile->section_offsets,
+                                SECT_OFF_DATA (objfile));
 
       switch (bfd_get_arch (abfd))
        {
@@ -1557,6 +1557,7 @@ read_dbx_symtab (struct objfile *objfile)
        case N_BINCL:
          {
            enum language tmp_language;
+
            /* Add this bincl to the bincl_list for future EXCLs.  No
               need to save the string; it'll be around until
               read_dbx_symtab function returns */
@@ -1593,8 +1594,8 @@ pos %d"),
        case N_SOL:
          {
            enum language tmp_language;
-           /* Mark down an include file in the current psymtab */
 
+           /* Mark down an include file in the current psymtab */
            namestring = set_namestring (objfile, &nlist);
            tmp_language = deduce_language_from_filename (namestring);
 
@@ -1621,6 +1622,7 @@ pos %d"),
              continue;
            {
              int i;
+
              for (i = 0; i < includes_used; i++)
                if (strcmp (namestring, psymtab_include_list[i]) == 0)
                  {
@@ -1691,6 +1693,7 @@ pos %d"),
            {
              char *new_name, *name = xmalloc (p - namestring + 1);
              memcpy (name, namestring, p - namestring);
+
              name[p - namestring] = '\0';
              new_name = cp_canonicalize_string (name);
              if (new_name != NULL)
@@ -1868,6 +1871,7 @@ pos %d"),
                {
                  int name_len = p - namestring;
                  char *name = xmalloc (name_len + 1);
+
                  memcpy (name, namestring, name_len);
                  name[name_len] = '\0';
                  function_outside_compilation_unit_complaint (name);
@@ -1887,6 +1891,7 @@ pos %d"),
                    find_stab_function_addr (namestring, 
                                             pst ? pst->filename : NULL, 
                                             objfile);
+
                  /* find_stab_function_addr will return 0 if the minimal
                     symbol wasn't found.  (Unfortunately, this might also
                     be a valid address.)  Anyway, if it *does* return 0,
@@ -1936,6 +1941,7 @@ pos %d"),
                {
                  int name_len = p - namestring;
                  char *name = xmalloc (name_len + 1);
+
                  memcpy (name, namestring, name_len);
                  name[name_len] = '\0';
                  function_outside_compilation_unit_complaint (name);
@@ -1955,6 +1961,7 @@ pos %d"),
                    find_stab_function_addr (namestring, 
                                             pst ? pst->filename : NULL, 
                                             objfile);
+
                  /* find_stab_function_addr will return 0 if the minimal
                     symbol wasn't found.  (Unfortunately, this might also
                     be a valid address.)  Anyway, if it *does* return 0,
@@ -2077,6 +2084,7 @@ pos %d"),
                if (dependencies_used >= dependencies_allocated)
                  {
                    struct partial_symtab **orig = dependency_list;
+
                    dependency_list =
                      (struct partial_symtab **)
                      alloca ((dependencies_allocated *= 2)
@@ -2189,11 +2197,11 @@ start_psymtab (struct objfile *objfile, char *filename, CORE_ADDR textlow,
               struct partial_symbol **static_syms)
 {
   struct partial_symtab *result =
-  start_psymtab_common (objfile, objfile->section_offsets,
-                       filename, textlow, global_syms, static_syms);
+    start_psymtab_common (objfile, objfile->section_offsets,
+                         filename, textlow, global_syms, static_syms);
 
-  result->read_symtab_private = (char *)
-    obstack_alloc (&objfile->objfile_obstack, sizeof (struct symloc));
+  result->read_symtab_private = obstack_alloc (&objfile->objfile_obstack,
+                                              sizeof (struct symloc));
   LDSYMOFF (result) = ldsymoff;
   result->read_symtab = dbx_psymtab_to_symtab;
   SYMBOL_SIZE (result) = symbol_size;
@@ -2332,13 +2340,12 @@ end_psymtab (struct partial_symtab *pst, char **include_list, int num_includes,
   for (i = 0; i < num_includes; i++)
     {
       struct partial_symtab *subpst =
-      allocate_psymtab (include_list[i], objfile);
+       allocate_psymtab (include_list[i], objfile);
 
       /* Copy the sesction_offsets array from the main psymtab. */
       subpst->section_offsets = pst->section_offsets;
       subpst->read_symtab_private =
-       (char *) obstack_alloc (&objfile->objfile_obstack,
-                               sizeof (struct symloc));
+       obstack_alloc (&objfile->objfile_obstack, sizeof (struct symloc));
       LDSYMOFF (subpst) =
        LDSYMLEN (subpst) =
        subpst->textlow =
@@ -2364,11 +2371,6 @@ end_psymtab (struct partial_symtab *pst, char **include_list, int num_includes,
 
   sort_pst_symbols (pst);
 
-  /* If there is already a psymtab or symtab for a file of this name, remove it.
-     (If there is a symtab, more drastic things also happen.)
-     This happens in VxWorks.  */
-  free_named_symtabs (pst->filename);
-
   if (num_includes == 0
       && number_dependencies == 0
       && pst->n_global_syms == 0
@@ -2482,9 +2484,10 @@ Shouldn't happen.\n",
       if (DBX_STAB_SECTION (pst->objfile))
        {
          stabs_data
-           = symfile_relocate_debug_section (pst->objfile->obfd,
+           = symfile_relocate_debug_section (pst->objfile,
                                              DBX_STAB_SECTION (pst->objfile),
                                              NULL);
+
          if (stabs_data)
            back_to = make_cleanup (free_current_contents,
                                    (void *) &stabs_data);
@@ -2667,8 +2670,7 @@ read_ofile_symtab (struct partial_symtab *pst)
 #endif
        }
       else if (type & N_EXT || type == (unsigned char) N_TEXT
-              || type == (unsigned char) N_NBTEXT
-       )
+              || type == (unsigned char) N_NBTEXT)
        {
          /* Global symbol: see if we came across a dbx defintion for
             a corresponding symbol.  If so, store the value.  Remove
@@ -2796,6 +2798,7 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, char *name,
          if (sline_found_in_function)
            {
              CORE_ADDR addr = last_function_start + valu;
+
              record_line (current_subfile, 0,
                           gdbarch_addr_bits_remove (gdbarch, addr));
            }
@@ -3016,6 +3019,7 @@ no enclosing block"));
        {
          CORE_ADDR addr = processing_gcc_compilation == 2 ?
                           last_function_start : valu;
+
          record_line (current_subfile, desc,
                       gdbarch_addr_bits_remove (gdbarch, addr));
          sline_found_in_function = 1;
@@ -3150,6 +3154,7 @@ no enclosing block"));
        {
          int deftype;
          char *colon_pos = strchr (name, ':');
+
          if (colon_pos == NULL)
            deftype = '\0';
          else
@@ -3319,8 +3324,6 @@ no enclosing block"));
    OBJFILE is the object file we are reading symbols from.
    ADDR is the address relative to which the symbols are (e.g.
    the base address of the text segment).
-   MAINLINE is true if we are reading the main symbol
-   table (as opposed to a shared lib or dynamically loaded file).
    TEXTADDR is the address of the text section.
    TEXTSIZE is the size of the text section.
    STABSECTS is the list of .stab sections in OBJFILE.
@@ -3331,7 +3334,7 @@ no enclosing block"));
    adjusted for coff details. */
 
 void
-coffstab_build_psymtabs (struct objfile *objfile, int mainline,
+coffstab_build_psymtabs (struct objfile *objfile,
                         CORE_ADDR textaddr, unsigned int textsize,
                         struct stab_section_list *stabsects,
                         file_ptr stabstroffset, unsigned int stabstrsize)
@@ -3414,8 +3417,6 @@ coffstab_build_psymtabs (struct objfile *objfile, int mainline,
    OBJFILE is the object file we are reading symbols from.
    ADDR is the address relative to which the symbols are (e.g.
    the base address of the text segment).
-   MAINLINE is true if we are reading the main symbol
-   table (as opposed to a shared lib or dynamically loaded file).
    STABSECT is the BFD section information for the .stab section.
    STABSTROFFSET and STABSTRSIZE define the location in OBJFILE where the
    .stabstr section exists.
@@ -3424,8 +3425,7 @@ coffstab_build_psymtabs (struct objfile *objfile, int mainline,
    adjusted for elf details. */
 
 void
-elfstab_build_psymtabs (struct objfile *objfile, int mainline,
-                       asection *stabsect,
+elfstab_build_psymtabs (struct objfile *objfile, asection *stabsect,
                        file_ptr stabstroffset, unsigned int stabstrsize)
 {
   int val;
@@ -3474,7 +3474,7 @@ elfstab_build_psymtabs (struct objfile *objfile, int mainline,
 
   symbuf_read = 0;
   symbuf_left = bfd_section_size (objfile->obfd, stabsect);
-  stabs_data = symfile_relocate_debug_section (objfile->obfd, stabsect, NULL);
+  stabs_data = symfile_relocate_debug_section (objfile, stabsect, NULL);
   if (stabs_data)
     back_to = make_cleanup (free_current_contents, (void *) &stabs_data);
 
@@ -3500,15 +3500,13 @@ elfstab_build_psymtabs (struct objfile *objfile, int mainline,
    OBJFILE is the object file we are reading symbols from.
    ADDR is the address relative to which the symbols are (e.g. the base address
    of the text segment).
-   MAINLINE is true if we are reading the main symbol table (as opposed to a
-   shared lib or dynamically loaded file).
    STAB_NAME is the name of the section that contains the stabs.
    STABSTR_NAME is the name of the section that contains the stab strings.
 
    This routine is mostly copied from dbx_symfile_init and dbx_symfile_read. */
 
 void
-stabsect_build_psymtabs (struct objfile *objfile, int mainline, char *stab_name,
+stabsect_build_psymtabs (struct objfile *objfile, char *stab_name,
                         char *stabstr_name, char *text_name)
 {
   int val;
@@ -3587,6 +3585,8 @@ static struct sym_fns aout_sym_fns =
   default_symfile_segments,    /* sym_segments: Get segment information from
                                   a file.  */
   NULL,                         /* sym_read_linetable */
+  default_symfile_relocate,    /* sym_relocate: Relocate a debug section.  */
+  &psym_functions,
   NULL                         /* next: pointer to next struct sym_fns */
 };