2010-12-31 Michael Snyder <msnyder@vmware.com>
[deliverable/binutils-gdb.git] / gdb / dbxread.c
index d520266d54cdd170b88c4708e7d772c9ddfe4225..af9465951a26afee340764484bfc84135f86b716 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.
+   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"
@@ -395,7 +396,7 @@ add_new_header_file (char *name, int instance)
 
   i = N_HEADER_FILES (current_objfile)++;
   hfile = HEADER_FILES (current_objfile) + i;
-  hfile->name = savestring (name, strlen (name));
+  hfile->name = xstrdup (name);
   hfile->instance = instance;
   hfile->length = 10;
   hfile->vector
@@ -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))
        {
@@ -1125,7 +1125,7 @@ read_dbx_dynamic_symtab (struct objfile *objfile)
 }
 
 static CORE_ADDR
-find_stab_function_addr (char *namestring, char *filename,
+find_stab_function_addr (char *namestring, const char *filename,
                         struct objfile *objfile)
 {
   struct minimal_symbol *msym;
@@ -1384,6 +1384,7 @@ read_dbx_symtab (struct objfile *objfile)
                  pst = (struct partial_symtab *) 0;
                  includes_used = 0;
                  dependencies_used = 0;
+                 has_line_numbers = 0;
                }
              else
                past_first_source_file = 1;
@@ -1508,6 +1509,7 @@ read_dbx_symtab (struct objfile *objfile)
                    pst = (struct partial_symtab *) 0;
                    includes_used = 0;
                    dependencies_used = 0;
+                   has_line_numbers = 0;
                  }
              }
 
@@ -1555,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 */
@@ -1591,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);
 
@@ -1619,6 +1622,7 @@ pos %d"),
              continue;
            {
              int i;
+
              for (i = 0; i < includes_used; i++)
                if (strcmp (namestring, psymtab_include_list[i]) == 0)
                  {
@@ -1684,10 +1688,12 @@ pos %d"),
            continue;                   /* Not a debugging symbol.   */
 
          sym_len = 0;
+         sym_name = NULL;      /* pacify "gcc -Werror" */
          if (psymtab_language == language_cplus)
            {
-             char *new_name, *name = alloca (p - namestring + 1);
+             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)
@@ -1697,6 +1703,7 @@ pos %d"),
                                           &objfile->objfile_obstack);
                  xfree (new_name);
                }
+              xfree (name);
            }
 
          if (sym_len == 0)
@@ -1722,7 +1729,7 @@ pos %d"),
                namestring = gdbarch_static_transform_name (gdbarch,
                                                            namestring);
 
-             add_psymbol_to_list (sym_name, sym_len,
+             add_psymbol_to_list (sym_name, sym_len, 1,
                                   VAR_DOMAIN, LOC_STATIC,
                                   &objfile->static_psymbols,
                                   0, nlist.n_value,
@@ -1734,7 +1741,7 @@ pos %d"),
                                         data_sect_index);
              /* The addresses in these entries are reported to be
                 wrong.  See the code that reads 'G's for symtabs. */
-             add_psymbol_to_list (sym_name, sym_len,
+             add_psymbol_to_list (sym_name, sym_len, 1,
                                   VAR_DOMAIN, LOC_STATIC,
                                   &objfile->global_psymbols,
                                   0, nlist.n_value,
@@ -1752,7 +1759,7 @@ pos %d"),
                  || (p == namestring + 1
                      && namestring[0] != ' '))
                {
-                 add_psymbol_to_list (sym_name, sym_len,
+                 add_psymbol_to_list (sym_name, sym_len, 1,
                                       STRUCT_DOMAIN, LOC_TYPEDEF,
                                       &objfile->static_psymbols,
                                       nlist.n_value, 0,
@@ -1760,7 +1767,7 @@ pos %d"),
                  if (p[2] == 't')
                    {
                      /* Also a typedef with the same name.  */
-                     add_psymbol_to_list (sym_name, sym_len,
+                     add_psymbol_to_list (sym_name, sym_len, 1,
                                           VAR_DOMAIN, LOC_TYPEDEF,
                                           &objfile->static_psymbols,
                                           nlist.n_value, 0,
@@ -1773,7 +1780,7 @@ pos %d"),
            case 't':
              if (p != namestring)      /* a name is there, not just :T... */
                {
-                 add_psymbol_to_list (sym_name, sym_len,
+                 add_psymbol_to_list (sym_name, sym_len, 1,
                                       VAR_DOMAIN, LOC_TYPEDEF,
                                       &objfile->static_psymbols,
                                       nlist.n_value, 0,
@@ -1835,7 +1842,7 @@ pos %d"),
                        ;
                      /* Note that the value doesn't matter for
                         enum constants in psymtabs, just in symtabs.  */
-                     add_psymbol_to_list (p, q - p,
+                     add_psymbol_to_list (p, q - p, 1,
                                           VAR_DOMAIN, LOC_CONST,
                                           &objfile->static_psymbols, 0,
                                           0, psymtab_language, objfile);
@@ -1853,7 +1860,7 @@ pos %d"),
 
            case 'c':
              /* Constant, e.g. from "const" in Pascal.  */
-             add_psymbol_to_list (sym_name, sym_len,
+             add_psymbol_to_list (sym_name, sym_len, 1,
                                   VAR_DOMAIN, LOC_CONST,
                                   &objfile->static_psymbols, nlist.n_value,
                                   0, psymtab_language, objfile);
@@ -1864,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);
@@ -1883,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,
@@ -1917,7 +1926,7 @@ pos %d"),
                  pst->textlow = nlist.n_value;
                  textlow_not_set = 0;
                }
-             add_psymbol_to_list (sym_name, sym_len,
+             add_psymbol_to_list (sym_name, sym_len, 1,
                                   VAR_DOMAIN, LOC_BLOCK,
                                   &objfile->static_psymbols,
                                   0, nlist.n_value,
@@ -1932,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);
@@ -1951,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,
@@ -1985,7 +1996,7 @@ pos %d"),
                  pst->textlow = nlist.n_value;
                  textlow_not_set = 0;
                }
-             add_psymbol_to_list (sym_name, sym_len,
+             add_psymbol_to_list (sym_name, sym_len, 1,
                                   VAR_DOMAIN, LOC_BLOCK,
                                   &objfile->global_psymbols,
                                   0, nlist.n_value,
@@ -2073,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)
@@ -2106,6 +2118,7 @@ pos %d"),
              pst = (struct partial_symtab *) 0;
              includes_used = 0;
              dependencies_used = 0;
+             has_line_numbers = 0;
            }
          continue;
 
@@ -2184,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;
@@ -2327,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 =
@@ -2359,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
@@ -2477,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);
@@ -2662,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
@@ -2789,7 +2796,12 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, char *name,
             which may have an N_FUN stabs at the end of the function,
             but no N_SLINE stabs.  */
          if (sline_found_in_function)
-           record_line (current_subfile, 0, last_function_start + valu);
+           {
+             CORE_ADDR addr = last_function_start + valu;
+
+             record_line (current_subfile, 0,
+                          gdbarch_addr_bits_remove (gdbarch, addr));
+           }
 
          within_function = 0;
          new = pop_context ();
@@ -3005,14 +3017,16 @@ no enclosing block"));
 
       if (within_function && sline_found_in_function == 0)
        {
-         if (processing_gcc_compilation == 2)
-           record_line (current_subfile, desc, last_function_start);
-         else
-           record_line (current_subfile, desc, valu);
+         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;
        }
       else
-       record_line (current_subfile, desc, valu);
+       record_line (current_subfile, desc,
+                    gdbarch_addr_bits_remove (gdbarch, valu));
       break;
 
     case N_BCOMM:
@@ -3140,6 +3154,7 @@ no enclosing block"));
        {
          int deftype;
          char *colon_pos = strchr (name, ':');
+
          if (colon_pos == NULL)
            deftype = '\0';
          else
@@ -3309,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.
@@ -3321,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)
@@ -3404,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.
@@ -3414,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;
@@ -3464,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);
 
@@ -3490,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;
@@ -3565,7 +3573,7 @@ section (%s)"),
   dbx_symfile_read (objfile, 0);
 }
 \f
-static struct sym_fns aout_sym_fns =
+static const struct sym_fns aout_sym_fns =
 {
   bfd_target_aout_flavour,
   dbx_new_init,                /* sym_new_init: init anything gbl to entire symtab */
@@ -3577,7 +3585,8 @@ static struct sym_fns aout_sym_fns =
   default_symfile_segments,    /* sym_segments: Get segment information from
                                   a file.  */
   NULL,                         /* sym_read_linetable */
-  NULL                         /* next: pointer to next struct sym_fns */
+  default_symfile_relocate,    /* sym_relocate: Relocate a debug section.  */
+  &psym_functions
 };
 
 void
This page took 0.03573 seconds and 4 git commands to generate.