ld/plugins: avoid shadowing a C library symbol
[deliverable/binutils-gdb.git] / gdb / dbxread.c
index db49243eb7af60e5ec99cf837c731e9eb380cf5f..307debd2824fa763320e6f18af1e47c45b032095 100644 (file)
@@ -1,5 +1,5 @@
 /* Read dbx symbol tables and convert to internal format, for GDB.
-   Copyright (C) 1986-2018 Free Software Foundation, Inc.
+   Copyright (C) 1986-2019 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -45,7 +45,7 @@
 #include "libaout.h"           /* FIXME Secret internal BFD stuff for a.out */
 #include "filenames.h"
 #include "objfiles.h"
-#include "buildsym.h"
+#include "buildsym-legacy.h"
 #include "stabsread.h"
 #include "gdb-stabs.h"
 #include "demangle.h"
@@ -298,9 +298,7 @@ static void add_old_header_file (const char *, int);
 static void add_this_object_header_file (int);
 
 static struct partial_symtab *start_psymtab (struct objfile *, const char *,
-                                            CORE_ADDR, int,
-                                            std::vector<partial_symbol *> &,
-                                            std::vector<partial_symbol *> &);
+                                            CORE_ADDR, int);
 
 /* Free up old header file tables.  */
 
@@ -538,9 +536,7 @@ dbx_symfile_read (struct objfile *objfile, symfile_add_flags symfile_flags)
     perror_with_name (objfile_name (objfile));
 
   /* Size the symbol table.  */
-  if (objfile->global_psymbols.capacity () == 0
-      && objfile->static_psymbols.capacity () == 0)
-    init_psymbol_list (objfile, DBX_SYMCOUNT (objfile));
+  init_psymbol_list (objfile, DBX_SYMCOUNT (objfile));
 
   symbol_size = DBX_SYMBOL_SIZE (objfile);
   symbol_table_offset = DBX_SYMTAB_OFFSET (objfile);
@@ -751,7 +747,8 @@ static char *stringtab_global;
 /* These variables are used to control fill_symbuf when the stabs
    symbols are not contiguous (as may be the case when a COFF file is
    linked using --split-by-reloc).  */
-static struct stab_section_list *symbuf_sections;
+static const std::vector<asection *> *symbuf_sections;
+static size_t sect_idx;
 static unsigned int symbuf_left;
 static unsigned int symbuf_read;
 
@@ -787,13 +784,13 @@ fill_symbuf (bfd *sym_bfd)
     {
       if (symbuf_left <= 0)
        {
-         file_ptr filepos = symbuf_sections->section->filepos;
+         file_ptr filepos = (*symbuf_sections)[sect_idx]->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);
+         symbuf_left = bfd_section_size (sym_bfd, (*symbuf_sections)[sect_idx]);
          symbol_table_offset = filepos - symbuf_read;
-         symbuf_sections = symbuf_sections->next;
+         ++sect_idx;
        }
 
       count = symbuf_left;
@@ -902,9 +899,9 @@ set_namestring (struct objfile *objfile, const struct internal_nlist *nlist)
   return namestring;
 }
 
-static CORE_ADDR
-find_stab_function_addr (const char *namestring, const char *filename,
-                        struct objfile *objfile)
+static struct bound_minimal_symbol
+find_stab_function (const char *namestring, const char *filename,
+                   struct objfile *objfile)
 {
   struct bound_minimal_symbol msym;
   int n;
@@ -944,7 +941,7 @@ find_stab_function_addr (const char *namestring, const char *filename,
       msym = lookup_minimal_symbol (p, NULL, objfile);
     }
 
-  return msym.minsym == NULL ? 0 : BMSYMBOL_VALUE_ADDRESS (msym);
+  return msym;
 }
 
 static void
@@ -1137,18 +1134,15 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
              || (namestring[(nsl = strlen (namestring)) - 1] == 'o'
                  && namestring[nsl - 2] == '.'))
            {
-             nlist.n_value += ANOFFSET (objfile->section_offsets,
-                                        SECT_OFF_TEXT (objfile));
-
              if (past_first_source_file && pst
                  /* The gould NP1 uses low values for .o and -l symbols
                     which are not the address.  */
-                 && nlist.n_value >= pst->textlow)
+                 && nlist.n_value >= pst->raw_text_low ())
                {
                  dbx_end_psymtab (objfile, pst, psymtab_include_list,
                                   includes_used, symnum * symbol_size,
-                                  nlist.n_value > pst->texthigh
-                                  ? nlist.n_value : pst->texthigh,
+                                  nlist.n_value > pst->raw_text_high ()
+                                  ? nlist.n_value : pst->raw_text_high (),
                                   dependency_list, dependencies_used,
                                   textlow_not_set);
                  pst = (struct partial_symtab *) 0;
@@ -1235,8 +1229,7 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
            static const char *dirname_nso;
            int prev_textlow_not_set;
 
-           valu = nlist.n_value + ANOFFSET (objfile->section_offsets,
-                                            SECT_OFF_TEXT (objfile));
+           valu = nlist.n_value;
 
            prev_textlow_not_set = textlow_not_set;
 
@@ -1263,8 +1256,8 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
                  {
                    dbx_end_psymtab (objfile, pst, psymtab_include_list,
                                     includes_used, symnum * symbol_size,
-                                    valu > pst->texthigh
-                                    ? valu : pst->texthigh,
+                                    (valu > pst->raw_text_high ()
+                                     ? valu : pst->raw_text_high ()),
                                     dependency_list, dependencies_used,
                                     prev_textlow_not_set);
                    pst = (struct partial_symtab *) 0;
@@ -1306,9 +1299,7 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
              {
                pst = start_psymtab (objfile,
                                     namestring, valu,
-                                    first_so_symnum * symbol_size,
-                                    objfile->global_psymbols,
-                                    objfile->static_psymbols);
+                                    first_so_symnum * symbol_size);
                pst->dirname = dirname_nso;
                dirname_nso = NULL;
              }
@@ -1438,8 +1429,8 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
                 function relative stabs, or the address of the function's
                 end for old style stabs.  */
              valu = nlist.n_value + last_function_start;
-             if (pst->texthigh == 0 || valu > pst->texthigh)
-               pst->texthigh = valu;
+             if (pst->raw_text_high () == 0 || valu > pst->raw_text_high ())
+               pst->set_text_high (valu);
              break;
            }
 
@@ -1478,26 +1469,23 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
          switch (p[1])
            {
            case 'S':
-             nlist.n_value += ANOFFSET (objfile->section_offsets,
-                                        data_sect_index);
-
              if (gdbarch_static_transform_name_p (gdbarch))
                gdbarch_static_transform_name (gdbarch, namestring);
 
              add_psymbol_to_list (sym_name, sym_len, 1,
                                   VAR_DOMAIN, LOC_STATIC,
-                                  &objfile->static_psymbols,
+                                  data_sect_index,
+                                  psymbol_placement::STATIC,
                                   nlist.n_value, psymtab_language, objfile);
              continue;
 
            case 'G':
-             nlist.n_value += ANOFFSET (objfile->section_offsets,
-                                        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, 1,
                                   VAR_DOMAIN, LOC_STATIC,
-                                  &objfile->global_psymbols,
+                                  data_sect_index,
+                                  psymbol_placement::GLOBAL,
                                   nlist.n_value, psymtab_language, objfile);
              continue;
 
@@ -1513,15 +1501,15 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
                      && namestring[0] != ' '))
                {
                  add_psymbol_to_list (sym_name, sym_len, 1,
-                                      STRUCT_DOMAIN, LOC_TYPEDEF,
-                                      &objfile->static_psymbols,
+                                      STRUCT_DOMAIN, LOC_TYPEDEF, -1,
+                                      psymbol_placement::STATIC,
                                       0, psymtab_language, objfile);
                  if (p[2] == 't')
                    {
                      /* Also a typedef with the same name.  */
                      add_psymbol_to_list (sym_name, sym_len, 1,
-                                          VAR_DOMAIN, LOC_TYPEDEF,
-                                          &objfile->static_psymbols,
+                                          VAR_DOMAIN, LOC_TYPEDEF, -1,
+                                          psymbol_placement::STATIC,
                                           0, psymtab_language, objfile);
                      p += 1;
                    }
@@ -1532,8 +1520,8 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
              if (p != namestring)      /* a name is there, not just :T...  */
                {
                  add_psymbol_to_list (sym_name, sym_len, 1,
-                                      VAR_DOMAIN, LOC_TYPEDEF,
-                                      &objfile->static_psymbols,
+                                      VAR_DOMAIN, LOC_TYPEDEF, -1,
+                                      psymbol_placement::STATIC,
                                       0, psymtab_language, objfile);
                }
            check_enum:
@@ -1593,8 +1581,8 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
                      /* Note that the value doesn't matter for
                         enum constants in psymtabs, just in symtabs.  */
                      add_psymbol_to_list (p, q - p, 1,
-                                          VAR_DOMAIN, LOC_CONST,
-                                          &objfile->static_psymbols, 0,
+                                          VAR_DOMAIN, LOC_CONST, -1,
+                                          psymbol_placement::STATIC, 0,
                                           psymtab_language, objfile);
                      /* Point past the name.  */
                      p = q;
@@ -1611,8 +1599,8 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
            case 'c':
              /* Constant, e.g. from "const" in Pascal.  */
              add_psymbol_to_list (sym_name, sym_len, 1,
-                                  VAR_DOMAIN, LOC_CONST,
-                                  &objfile->static_psymbols, 0,
+                                  VAR_DOMAIN, LOC_CONST, -1,
+                                  psymbol_placement::STATIC, 0,
                                   psymtab_language, objfile);
              continue;
 
@@ -1627,33 +1615,24 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
                  function_outside_compilation_unit_complaint (name);
                  xfree (name);
                }
-             nlist.n_value += ANOFFSET (objfile->section_offsets, 
-                                        SECT_OFF_TEXT (objfile));
              /* Kludges for ELF/STABS with Sun ACC.  */
              last_function_name = namestring;
              /* Do not fix textlow==0 for .o or NLM files, as 0 is a legit
                 value for the bottom of the text seg in those cases.  */
-             if (nlist.n_value == ANOFFSET (objfile->section_offsets, 
-                                            SECT_OFF_TEXT (objfile))
+             if (nlist.n_value == 0
                  && gdbarch_sofun_address_maybe_missing (gdbarch))
                {
-                 CORE_ADDR minsym_valu = 
-                   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,
-                    it is likely that the value was set correctly to begin
-                    with...  */
-                 if (minsym_valu != 0)
-                   nlist.n_value = minsym_valu;
+                 struct bound_minimal_symbol minsym
+                   = find_stab_function (namestring,
+                                         pst ? pst->filename : NULL,
+                                         objfile);
+                 if (minsym.minsym != NULL)
+                   nlist.n_value = MSYMBOL_VALUE_RAW_ADDRESS (minsym.minsym);
                }
              if (pst && textlow_not_set
                  && gdbarch_sofun_address_maybe_missing (gdbarch))
                {
-                 pst->textlow = nlist.n_value;
+                 pst->set_text_low (nlist.n_value);
                  textlow_not_set = 0;
                }
              /* End kludge.  */
@@ -1668,17 +1647,16 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
                 the partial symbol table.  */
              if (pst
                  && (textlow_not_set
-                     || (nlist.n_value < pst->textlow
-                         && (nlist.n_value
-                             != ANOFFSET (objfile->section_offsets,
-                                          SECT_OFF_TEXT (objfile))))))
+                     || (nlist.n_value < pst->raw_text_low ()
+                         && (nlist.n_value != 0))))
                {
-                 pst->textlow = nlist.n_value;
+                 pst->set_text_low (nlist.n_value);
                  textlow_not_set = 0;
                }
              add_psymbol_to_list (sym_name, sym_len, 1,
                                   VAR_DOMAIN, LOC_BLOCK,
-                                  &objfile->static_psymbols,
+                                  SECT_OFF_TEXT (objfile),
+                                  psymbol_placement::STATIC,
                                   nlist.n_value, psymtab_language, objfile);
              continue;
 
@@ -1696,33 +1674,24 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
                  function_outside_compilation_unit_complaint (name);
                  xfree (name);
                }
-             nlist.n_value += ANOFFSET (objfile->section_offsets, 
-                                        SECT_OFF_TEXT (objfile));
              /* Kludges for ELF/STABS with Sun ACC.  */
              last_function_name = namestring;
              /* Do not fix textlow==0 for .o or NLM files, as 0 is a legit
                 value for the bottom of the text seg in those cases.  */
-             if (nlist.n_value == ANOFFSET (objfile->section_offsets, 
-                                            SECT_OFF_TEXT (objfile))
+             if (nlist.n_value == 0
                  && gdbarch_sofun_address_maybe_missing (gdbarch))
                {
-                 CORE_ADDR minsym_valu = 
-                   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,
-                    it is likely that the value was set correctly to begin
-                    with...  */
-                 if (minsym_valu != 0)
-                   nlist.n_value = minsym_valu;
+                 struct bound_minimal_symbol minsym
+                   = find_stab_function (namestring,
+                                         pst ? pst->filename : NULL,
+                                         objfile);
+                 if (minsym.minsym != NULL)
+                   nlist.n_value = MSYMBOL_VALUE_RAW_ADDRESS (minsym.minsym);
                }
              if (pst && textlow_not_set
                  && gdbarch_sofun_address_maybe_missing (gdbarch))
                {
-                 pst->textlow = nlist.n_value;
+                 pst->set_text_low (nlist.n_value);
                  textlow_not_set = 0;
                }
              /* End kludge.  */
@@ -1737,17 +1706,16 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
                 the partial symbol table.  */
              if (pst
                  && (textlow_not_set
-                     || (nlist.n_value < pst->textlow
-                         && (nlist.n_value
-                             != ANOFFSET (objfile->section_offsets,
-                                          SECT_OFF_TEXT (objfile))))))
+                     || (nlist.n_value < pst->raw_text_low ()
+                         && (nlist.n_value != 0))))
                {
-                 pst->textlow = nlist.n_value;
+                 pst->set_text_low (nlist.n_value);
                  textlow_not_set = 0;
                }
              add_psymbol_to_list (sym_name, sym_len, 1,
                                   VAR_DOMAIN, LOC_BLOCK,
-                                  &objfile->global_psymbols,
+                                  SECT_OFF_TEXT (objfile),
+                                  psymbol_placement::GLOBAL,
                                   nlist.n_value, psymtab_language, objfile);
              continue;
 
@@ -1854,10 +1822,10 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
          continue;
 
        case N_ENDM:
-         /* Solaris 2 end of module, finish current partial symbol table.
-            dbx_end_psymtab will set pst->texthigh to the proper value, which
-            is necessary if a module compiled without debugging info
-            follows this module.  */
+         /* Solaris 2 end of module, finish current partial symbol
+            table.  dbx_end_psymtab will set the high text address of
+            PST to the proper value, which is necessary if a module
+            compiled without debugging info follows this module.  */
          if (pst && gdbarch_sofun_address_maybe_missing (gdbarch))
            {
              dbx_end_psymtab (objfile, pst,
@@ -1918,17 +1886,18 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
   /* If there's stuff to be cleaned up, clean it up.  */
   if (pst)
     {
-      /* Don't set pst->texthigh lower than it already is.  */
+      /* Don't set high text address of PST lower than it already
+        is.  */
       CORE_ADDR text_end =
        (lowest_text_address == (CORE_ADDR) -1
-        ? (text_addr + ANOFFSET (objfile->section_offsets,
-                                 SECT_OFF_TEXT (objfile)))
+        ? text_addr
         : lowest_text_address)
        + text_size;
 
       dbx_end_psymtab (objfile, pst, psymtab_include_list, includes_used,
                       symnum * symbol_size,
-                      text_end > pst->texthigh ? text_end : pst->texthigh,
+                      (text_end > pst->raw_text_high ()
+                       ? text_end : pst->raw_text_high ()),
                       dependency_list, dependencies_used, textlow_not_set);
     }
 }
@@ -1942,12 +1911,10 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
 
 static struct partial_symtab *
 start_psymtab (struct objfile *objfile, const char *filename, CORE_ADDR textlow,
-              int ldsymoff, std::vector<partial_symbol *> &global_psymbols,
-              std::vector<partial_symbol *> &static_psymbols)
+              int ldsymoff)
 {
   struct partial_symtab *result =
-    start_psymtab_common (objfile, filename, textlow,
-                         global_psymbols, static_psymbols);
+    start_psymtab_common (objfile, filename, textlow);
 
   result->read_symtab_private =
     XOBNEW (&objfile->objfile_obstack, struct symloc);
@@ -1983,7 +1950,7 @@ dbx_end_psymtab (struct objfile *objfile, struct partial_symtab *pst,
 
   if (capping_symbol_offset != -1)
     LDSYMLEN (pst) = capping_symbol_offset - LDSYMOFF (pst);
-  pst->texthigh = capping_text;
+  pst->set_text_high (capping_text);
 
   /* Under Solaris, the N_SO symbols always have a value of 0,
      instead of the usual address of the .o file.  Therefore,
@@ -2000,7 +1967,7 @@ dbx_end_psymtab (struct objfile *objfile, struct partial_symtab *pst,
      a reliable texthigh by taking the address plus size of the
      last function in the file.  */
 
-  if (pst->texthigh == 0 && last_function_name
+  if (!pst->text_high_valid && last_function_name
       && gdbarch_sofun_address_maybe_missing (gdbarch))
     {
       int n;
@@ -2027,8 +1994,8 @@ dbx_end_psymtab (struct objfile *objfile, struct partial_symtab *pst,
        }
 
       if (minsym.minsym)
-       pst->texthigh = (BMSYMBOL_VALUE_ADDRESS (minsym)
-                        + MSYMBOL_SIZE (minsym.minsym));
+       pst->set_text_high (MSYMBOL_VALUE_RAW_ADDRESS (minsym.minsym)
+                           + MSYMBOL_SIZE (minsym.minsym));
 
       last_function_name = NULL;
     }
@@ -2037,28 +2004,17 @@ dbx_end_psymtab (struct objfile *objfile, struct partial_symtab *pst,
     ;
   /* This test will be true if the last .o file is only data.  */
   else if (textlow_not_set)
-    pst->textlow = pst->texthigh;
+    pst->set_text_low (pst->raw_text_high ());
   else
     {
-      struct partial_symtab *p1;
-
       /* If we know our own starting text address, then walk through all other
          psymtabs for this objfile, and if any didn't know their ending text
          address, set it to our starting address.  Take care to not set our
-         own ending address to our starting address, nor to set addresses on
-         `dependency' files that have both textlow and texthigh zero.  */
+         own ending address to our starting address.  */
 
-      ALL_OBJFILE_PSYMTABS (objfile, p1)
-      {
-       if (p1->texthigh == 0 && p1->textlow != 0 && p1 != pst)
-         {
-           p1->texthigh = pst->textlow;
-           /* If this file has only data, then make textlow match
-              texthigh.  */
-           if (p1->textlow == 0)
-             p1->textlow = p1->texthigh;
-         }
-      }
+      for (partial_symtab *p1 : objfile->psymtabs ())
+       if (!p1->text_high_valid && p1->text_low_valid && p1 != pst)
+         p1->set_text_high (pst->raw_text_low ());
     }
 
   /* End of kludge for patching Solaris textlow and texthigh.  */
@@ -2068,9 +2024,8 @@ dbx_end_psymtab (struct objfile *objfile, struct partial_symtab *pst,
   pst->number_of_dependencies = number_dependencies;
   if (number_dependencies)
     {
-      pst->dependencies = XOBNEWVEC (&objfile->objfile_obstack,
-                                    struct partial_symtab *,
-                                    number_dependencies);
+      pst->dependencies
+       = objfile->partial_symtabs->allocate_dependencies (number_dependencies);
       memcpy (pst->dependencies, dependency_list,
              number_dependencies * sizeof (struct partial_symtab *));
     }
@@ -2085,24 +2040,15 @@ dbx_end_psymtab (struct objfile *objfile, struct partial_symtab *pst,
       subpst->read_symtab_private =
        XOBNEW (&objfile->objfile_obstack, struct symloc);
       LDSYMOFF (subpst) =
-       LDSYMLEN (subpst) =
-       subpst->textlow =
-       subpst->texthigh = 0;
+       LDSYMLEN (subpst) = 0;
 
       /* We could save slight bits of space by only making one of these,
          shared by the entire set of include files.  FIXME-someday.  */
       subpst->dependencies =
-       XOBNEW (&objfile->objfile_obstack, struct partial_symtab *);
+       objfile->partial_symtabs->allocate_dependencies (1);
       subpst->dependencies[0] = pst;
       subpst->number_of_dependencies = 1;
 
-      subpst->globals_offset =
-       subpst->n_global_syms =
-       subpst->statics_offset =
-       subpst->n_static_syms = 0;
-
-      subpst->readin = 0;
-      subpst->compunit_symtab = 0;
       subpst->read_symtab = pst->read_symtab;
     }
 
@@ -2245,8 +2191,8 @@ read_ofile_symtab (struct objfile *objfile, struct partial_symtab *pst)
 
   sym_offset = LDSYMOFF (pst);
   sym_size = LDSYMLEN (pst);
-  text_offset = pst->textlow;
-  text_size = pst->texthigh - pst->textlow;
+  text_offset = pst->text_low (objfile);
+  text_size = pst->text_high (objfile) - pst->text_low (objfile);
   section_offsets = objfile->section_offsets;
 
   dbxread_objfile = objfile;
@@ -2373,15 +2319,15 @@ read_ofile_symtab (struct objfile *objfile, struct partial_symtab *pst)
        }
     }
 
-  /* In a Solaris elf file, this variable, which comes from the
-     value of the N_SO symbol, will still be 0.  Luckily, text_offset,
-     which comes from pst->textlow is correct.  */
+  /* In a Solaris elf file, this variable, which comes from the value
+     of the N_SO symbol, will still be 0.  Luckily, text_offset, which
+     comes from low text address of PST, is correct.  */
   if (get_last_source_start_addr () == 0)
     set_last_source_start_addr (text_offset);
 
   /* In reordered executables last_source_start_addr may not be the
      lower bound for this symtab, instead use text_offset which comes
-     from pst->textlow which is correct.  */
+     from the low text address of PST, which is correct.  */
   if (get_last_source_start_addr () > text_offset)
     set_last_source_start_addr (text_offset);
 
@@ -2856,18 +2802,11 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, const char *name,
                                       SECT_OFF_TEXT (objfile))
                  && gdbarch_sofun_address_maybe_missing (gdbarch))
                {
-                 CORE_ADDR minsym_valu = 
-                   find_stab_function_addr (name, get_last_source_file (),
-                                            objfile);
-
-                 /* The function 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, it is
-                    likely that the value was set correctly to begin
-                    with...  */
-                 if (minsym_valu != 0)
-                   valu = minsym_valu;
+                 struct bound_minimal_symbol minsym
+                   = find_stab_function (name, get_last_source_file (),
+                                         objfile);
+                 if (minsym.minsym != NULL)
+                   valu = BMSYMBOL_VALUE_ADDRESS (minsym);
                }
 
              /* These addresses are absolute.  */
@@ -3004,7 +2943,7 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, const char *name,
 void
 coffstab_build_psymtabs (struct objfile *objfile,
                         CORE_ADDR textaddr, unsigned int textsize,
-                        struct stab_section_list *stabsects,
+                        const std::vector<asection *> &stabsects,
                         file_ptr stabstroffset, unsigned int stabstrsize)
 {
   int val;
@@ -3012,6 +2951,10 @@ coffstab_build_psymtabs (struct objfile *objfile,
   char *name = bfd_get_filename (sym_bfd);
   unsigned int stabsize;
 
+  /* Allocate struct to keep track of stab reading.  */
+  struct dbx_symfile_info *dbx = XCNEW (struct dbx_symfile_info);
+  set_objfile_data (objfile, dbx_objfile_data_key, dbx);
+
   DBX_TEXT_ADDR (objfile) = textaddr;
   DBX_TEXT_SIZE (objfile) = textsize;
 
@@ -3043,27 +2986,28 @@ coffstab_build_psymtabs (struct objfile *objfile,
   /* In a coff file, we've already installed the minimal symbols that came
      from the coff (non-stab) symbol table, so always act like an
      incremental load here.  */
-  if (stabsects->next == NULL)
+  scoped_restore save_symbuf_sections
+    = make_scoped_restore (&symbuf_sections);
+  if (stabsects.size () == 1)
     {
-      stabsize = bfd_section_size (sym_bfd, stabsects->section);
+      stabsize = bfd_section_size (sym_bfd, stabsects[0]);
       DBX_SYMCOUNT (objfile) = stabsize / DBX_SYMBOL_SIZE (objfile);
-      DBX_SYMTAB_OFFSET (objfile) = stabsects->section->filepos;
+      DBX_SYMTAB_OFFSET (objfile) = stabsects[0]->filepos;
     }
   else
     {
-      struct stab_section_list *stabsect;
-
       DBX_SYMCOUNT (objfile) = 0;
-      for (stabsect = stabsects; stabsect != NULL; stabsect = stabsect->next)
+      for (asection *section : stabsects)
        {
-         stabsize = bfd_section_size (sym_bfd, stabsect->section);
+         stabsize = bfd_section_size (sym_bfd, section);
          DBX_SYMCOUNT (objfile) += stabsize / DBX_SYMBOL_SIZE (objfile);
        }
 
-      DBX_SYMTAB_OFFSET (objfile) = stabsects->section->filepos;
+      DBX_SYMTAB_OFFSET (objfile) = stabsects[0]->filepos;
 
-      symbuf_sections = stabsects->next;
-      symbuf_left = bfd_section_size (sym_bfd, stabsects->section);
+      sect_idx = 1;
+      symbuf_sections = &stabsects;
+      symbuf_left = bfd_section_size (sym_bfd, stabsects[0]);
       symbuf_read = 0;
     }
 
@@ -3094,6 +3038,12 @@ elfstab_build_psymtabs (struct objfile *objfile, asection *stabsect,
   bfd *sym_bfd = objfile->obfd;
   char *name = bfd_get_filename (sym_bfd);
 
+  stabsread_new_init ();
+
+  /* Allocate struct to keep track of stab reading.  */
+  struct dbx_symfile_info *dbx = XCNEW (struct dbx_symfile_info);
+  set_objfile_data (objfile, dbx_objfile_data_key, dbx);
+
   /* Find the first and last text address.  dbx_symfile_read seems to
      want this.  */
   find_text_range (sym_bfd, objfile);
This page took 0.040797 seconds and 4 git commands to generate.