Use an accessor function for general_symbol_info::language
[deliverable/binutils-gdb.git] / gdb / mdebugread.c
index 98f10b465e580e98f8e10a0d7dae0c4d9ed6d5f1..ceffc012c11f7fca6aa19567e7436277d2da2d65 100644 (file)
@@ -1,6 +1,6 @@
 /* Read a symbol table in ECOFF format (Third-Eye).
 
-   Copyright (C) 1986-2018 Free Software Foundation, Inc.
+   Copyright (C) 1986-2019 Free Software Foundation, Inc.
 
    Original version contributed by Alessandro Forin (af@cs.cmu.edu) at
    CMU.  Major work by Per Bothner, John Gilmore and Ian Lance Taylor
@@ -46,7 +46,7 @@
 #include "filenames.h"
 #include "objfiles.h"
 #include "gdb_obstack.h"
-#include "buildsym.h"
+#include "buildsym-legacy.h"
 #include "stabsread.h"
 #include "complaints.h"
 #include "demangle.h"
@@ -68,6 +68,8 @@
 
 #include "expression.h"
 
+#include <algorithm>
+
 /* Provide a way to test if we have both ECOFF and ELF symbol tables.
    We use this define in order to know whether we should override a 
    symbol's ECOFF section with its ELF section.  This is necessary in 
@@ -187,7 +189,7 @@ static const struct ecoff_debug_swap *debug_swap;
 
 static struct ecoff_debug_info *debug_info;
 
-/* Pointer to current file decriptor record, and its index.  */
+/* Pointer to current file descriptor record, and its index.  */
 
 static FDR *cur_fdr;
 static int cur_fd;
@@ -344,12 +346,11 @@ mdebug_build_psymtabs (minimal_symbol_reader &reader,
   debug_info = info;
 
   stabsread_new_init ();
-  buildsym_new_init ();
   free_header_files ();
   init_header_files ();
         
   /* Make sure all the FDR information is swapped in.  */
-  if (info->fdr == (FDR *) NULL)
+  if (info->fdr == NULL)
     {
       char *fdr_src;
       char *fdr_end;
@@ -378,7 +379,6 @@ mdebug_build_psymtabs (minimal_symbol_reader &reader,
                           objfile->name);
       printf_unfiltered (_("You should compile with -g2 or "
                           "-g3 for best debugging support.\n"));
-      gdb_flush (gdb_stdout);
     }
 #endif
 }
@@ -538,14 +538,10 @@ mdebug_reg_to_regnum (struct symbol *sym, struct gdbarch *gdbarch)
 {
   int regno = gdbarch_ecoff_reg_to_regnum (gdbarch, SYMBOL_VALUE (sym));
 
-  if (regno < 0
-      || regno >= (gdbarch_num_regs (gdbarch)
-                  + gdbarch_num_pseudo_regs (gdbarch)))
+  if (regno < 0 || regno >= gdbarch_num_cooked_regs (gdbarch))
     {
-      reg_value_complaint (regno,
-                          gdbarch_num_regs (gdbarch)
-                            + gdbarch_num_pseudo_regs (gdbarch),
-                          SYMBOL_PRINT_NAME (sym));
+      reg_value_complaint (regno, gdbarch_num_cooked_regs (gdbarch),
+                          sym->print_name ());
 
       regno = gdbarch_sp_regnum (gdbarch); /* Known safe, though useless.  */
     }
@@ -594,13 +590,12 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
   struct block *b;
   struct mdebug_pending *pend;
   struct type *t;
-  struct field *f;
   int count = 1;
   TIR tir;
   long svalue = sh->value;
   int bitsize;
 
-  if (ext_sh == (char *) NULL)
+  if (ext_sh == NULL)
     name = debug_info->ssext + sh->iss;
   else
     name = debug_info->ss + cur_fdr->issBase + sh->iss;
@@ -639,7 +634,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
       b = BLOCKVECTOR_BLOCK (SYMTAB_BLOCKVECTOR (top_stack->cur_st),
                             GLOBAL_BLOCK);
       s = new_symbol (name);
-      SYMBOL_VALUE_ADDRESS (s) = (CORE_ADDR) sh->value;
+      SET_SYMBOL_VALUE_ADDRESS (s, (CORE_ADDR) sh->value);
       add_data_symbol (sh, ax, bigend, s, LOC_STATIC, b, objfile, name);
       break;
 
@@ -651,12 +646,12 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
          /* It is a FORTRAN common block.  At least for SGI Fortran the
             address is not in the symbol; we need to fix it later in
             scan_file_globals.  */
-         int bucket = hashname (SYMBOL_LINKAGE_NAME (s));
+         int bucket = hashname (s->linkage_name ());
          SYMBOL_VALUE_CHAIN (s) = global_sym_chain[bucket];
          global_sym_chain[bucket] = s;
        }
       else
-       SYMBOL_VALUE_ADDRESS (s) = (CORE_ADDR) sh->value;
+       SET_SYMBOL_VALUE_ADDRESS (s, (CORE_ADDR) sh->value);
       add_data_symbol (sh, ax, bigend, s, LOC_STATIC, b, objfile, name);
       break;
 
@@ -713,7 +708,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
       s = new_symbol (name);
       SYMBOL_DOMAIN (s) = VAR_DOMAIN;  /* So that it can be used */
       SYMBOL_ACLASS_INDEX (s) = LOC_LABEL;     /* but not misused.  */
-      SYMBOL_VALUE_ADDRESS (s) = (CORE_ADDR) sh->value;
+      SET_SYMBOL_VALUE_ADDRESS (s, (CORE_ADDR) sh->value);
       SYMBOL_TYPE (s) = objfile_type (objfile)->builtin_int;
       add_symbol (s, top_stack->cur_st, top_stack->cur_block);
       break;
@@ -799,11 +794,11 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
 
       /* All functions in C++ have prototypes.  For C we don't have enough
          information in the debug info.  */
-      if (SYMBOL_LANGUAGE (s) == language_cplus)
+      if (s->language () == language_cplus)
        TYPE_PROTOTYPED (SYMBOL_TYPE (s)) = 1;
 
       /* Create and enter a new lexical context.  */
-      b = new_block (FUNCTION_BLOCK, SYMBOL_LANGUAGE (s));
+      b = new_block (FUNCTION_BLOCK, s->language ());
       SYMBOL_BLOCK_VALUE (s) = b;
       BLOCK_FUNCTION (b) = s;
       BLOCK_START (b) = BLOCK_END (b) = sh->value;
@@ -1012,7 +1007,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
 
        /* Create a new type or use the pending type.  */
        pend = is_pending_symbol (cur_fdr, ext_sh);
-       if (pend == (struct mdebug_pending *) NULL)
+       if (pend == NULL)
          {
            t = new_type (NULL);
            add_pending (cur_fdr, ext_sh, t);
@@ -1071,10 +1066,9 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
                FIELD_BITSIZE (*f) = 0;
 
                enum_sym = allocate_symbol (mdebugread_objfile);
-               SYMBOL_SET_LINKAGE_NAME
-                 (enum_sym,
-                  (char *) obstack_copy0 (&mdebugread_objfile->objfile_obstack,
-                                          f->name, strlen (f->name)));
+               enum_sym->set_linkage_name
+                 (obstack_strdup (&mdebugread_objfile->objfile_obstack,
+                                  f->name));
                SYMBOL_ACLASS_INDEX (enum_sym) = LOC_CONST;
                SYMBOL_TYPE (enum_sym) = t;
                SYMBOL_DOMAIN (enum_sym) = VAR_DOMAIN;
@@ -1156,7 +1150,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
          const struct blockvector *bv
            = SYMTAB_BLOCKVECTOR (top_stack->cur_st);
          struct mdebug_extra_func_info *e;
-         struct block *b = top_stack->cur_block;
+         struct block *cblock = top_stack->cur_block;
          struct type *ftype = top_stack->cur_type;
          int i;
 
@@ -1180,12 +1174,12 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
            {
              struct block *b_bad = BLOCKVECTOR_BLOCK (bv, i);
 
-             if (BLOCK_SUPERBLOCK (b_bad) == b
+             if (BLOCK_SUPERBLOCK (b_bad) == cblock
                  && BLOCK_START (b_bad) == top_stack->procadr
                  && BLOCK_END (b_bad) == top_stack->procadr)
                {
-                 BLOCK_START (b_bad) = BLOCK_START (b);
-                 BLOCK_END (b_bad) = BLOCK_END (b);
+                 BLOCK_START (b_bad) = BLOCK_START (cblock);
+                 BLOCK_END (b_bad) = BLOCK_END (cblock);
                }
            }
 
@@ -1206,7 +1200,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
                    TYPE_ALLOC (ftype, nparams * sizeof (struct field));
 
                  iparams = 0;
-                 ALL_BLOCK_SYMBOLS (b, iter, sym)
+                 ALL_BLOCK_SYMBOLS (cblock, iter, sym)
                    {
                      if (iparams == nparams)
                        break;
@@ -1247,13 +1241,16 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
       break;
 
     case stMember:             /* member of struct or union */
-      f = &TYPE_FIELDS (top_stack->cur_type)[top_stack->cur_field++];
-      FIELD_NAME (*f) = name;
-      SET_FIELD_BITPOS (*f, sh->value);
-      bitsize = 0;
-      FIELD_TYPE (*f) = parse_type (cur_fd, ax, sh->index,
-                                   &bitsize, bigend, name);
-      FIELD_BITSIZE (*f) = bitsize;
+      {
+       struct field *f
+         = &TYPE_FIELDS (top_stack->cur_type)[top_stack->cur_field++];
+       FIELD_NAME (*f) = name;
+       SET_FIELD_BITPOS (*f, sh->value);
+       bitsize = 0;
+       FIELD_TYPE (*f) = parse_type (cur_fd, ax, sh->index,
+                                     &bitsize, bigend, name);
+       FIELD_BITSIZE (*f) = bitsize;
+      }
       break;
 
     case stIndirect:           /* forward declaration on Irix5 */
@@ -1271,9 +1268,9 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
 
       /* Parse the type or use the pending type.  */
       pend = is_pending_symbol (cur_fdr, ext_sh);
-      if (pend == (struct mdebug_pending *) NULL)
+      if (pend == NULL)
        {
-         t = parse_type (cur_fd, ax, sh->index, (int *) NULL, bigend, name);
+         t = parse_type (cur_fd, ax, sh->index, NULL, bigend, name);
          add_pending (cur_fdr, ext_sh, t);
        }
       else
@@ -1336,7 +1333,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
                 for anything except pointers or functions.  */
            }
          else
-           TYPE_NAME (SYMBOL_TYPE (s)) = SYMBOL_LINKAGE_NAME (s);
+           TYPE_NAME (SYMBOL_TYPE (s)) = s->linkage_name ();
        }
       break;
 
@@ -1362,14 +1359,15 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
 
 /* Basic types.  */
 
-static const struct objfile_data *basic_type_data;
+static const struct objfile_key<struct type *,
+                               gdb::noop_deleter<struct type *>>
+  basic_type_data;
 
 static struct type *
 basic_type (int bt, struct objfile *objfile)
 {
   struct gdbarch *gdbarch = get_objfile_arch (objfile);
-  struct type **map_bt
-    = (struct type **) objfile_data (objfile, basic_type_data);
+  struct type **map_bt = basic_type_data.get (objfile);
   struct type *tp;
 
   if (bt >= btMax)
@@ -1379,7 +1377,7 @@ basic_type (int bt, struct objfile *objfile)
     {
       map_bt = OBSTACK_CALLOC (&objfile->objfile_obstack,
                               btMax, struct type *);
-      set_objfile_data (objfile, basic_type_data, map_bt);
+      basic_type_data.set (objfile, map_bt);
     }
 
   if (map_bt[bt])
@@ -1582,7 +1580,7 @@ parse_type (int fd, union aux_ext *ax, unsigned int aux_index, int *bs,
       int width = AUX_GET_WIDTH (bigend, ax);
 
       /* Inhibit core dumps if TIR is corrupted.  */
-      if (bs == (int *) NULL)
+      if (bs == NULL)
        {
          /* Alpha cc -migrate encodes char and unsigned char types
             as short and unsigned short types with a field width of 8.
@@ -1629,7 +1627,7 @@ parse_type (int fd, union aux_ext *ax, unsigned int aux_index, int *bs,
       xref_fh = get_rfd (fd, rf);
       xref_fd = xref_fh - debug_info->fdr;
       tp = parse_type (xref_fd, debug_info->external_aux + xref_fh->iauxBase,
-                   rn->index, (int *) NULL, xref_fh->fBigendian, sym_name);
+                   rn->index, NULL, xref_fh->fBigendian, sym_name);
     }
 
   /* All these types really point to some (common) MIPS type
@@ -1647,7 +1645,7 @@ parse_type (int fd, union aux_ext *ax, unsigned int aux_index, int *bs,
 
       /* Try to cross reference this type, build new type on failure.  */
       ax += cross_ref (fd, ax, &tp, type_code, &name, bigend, sym_name);
-      if (tp == (struct type *) NULL)
+      if (tp == NULL)
        tp = init_type (mdebugread_objfile, type_code, 0, NULL);
 
       /* DEC c89 produces cross references to qualified aggregate types,
@@ -1691,9 +1689,7 @@ parse_type (int fd, union aux_ext *ax, unsigned int aux_index, int *bs,
          else if (TYPE_NAME (tp) == NULL
                   || strcmp (TYPE_NAME (tp), name) != 0)
            TYPE_NAME (tp)
-             = ((const char *)
-                obstack_copy0 (&mdebugread_objfile->objfile_obstack,
-                               name, strlen (name)));
+             = obstack_strdup (&mdebugread_objfile->objfile_obstack, name);
        }
     }
 
@@ -1707,7 +1703,7 @@ parse_type (int fd, union aux_ext *ax, unsigned int aux_index, int *bs,
 
       /* Try to cross reference this type, build new type on failure.  */
       ax += cross_ref (fd, ax, &tp, type_code, &name, bigend, sym_name);
-      if (tp == (struct type *) NULL)
+      if (tp == NULL)
        tp = init_type (mdebugread_objfile, type_code, 0, NULL);
 
       /* Make sure that TYPE_CODE(tp) has an expected type code.
@@ -1729,9 +1725,7 @@ parse_type (int fd, union aux_ext *ax, unsigned int aux_index, int *bs,
          if (TYPE_NAME (tp) == NULL
              || strcmp (TYPE_NAME (tp), name) != 0)
            TYPE_NAME (tp)
-             = ((const char *)
-                obstack_copy0 (&mdebugread_objfile->objfile_obstack,
-                               name, strlen (name)));
+             = obstack_strdup (&mdebugread_objfile->objfile_obstack, name);
        }
     }
   if (t->bt == btTypedef)
@@ -1740,7 +1734,7 @@ parse_type (int fd, union aux_ext *ax, unsigned int aux_index, int *bs,
 
       /* Try to cross reference this type, it should succeed.  */
       ax += cross_ref (fd, ax, &tp, type_code, &name, bigend, sym_name);
-      if (tp == (struct type *) NULL)
+      if (tp == NULL)
        {
          complaint (_("unable to cross ref btTypedef for %s"), sym_name);
          tp = basic_type (btInt, mdebugread_objfile);
@@ -1844,7 +1838,7 @@ upgrade_type (int fd, struct type **tpp, int tq, union aux_ext *ax, int bigend,
 
       indx = parse_type (fh - debug_info->fdr,
                         debug_info->external_aux + fh->iauxBase,
-                        id, (int *) NULL, bigend, sym_name);
+                        id, NULL, bigend, sym_name);
 
       /* The bounds type should be an integer type, but might be anything
          else due to corrupt aux entries.  */
@@ -1863,10 +1857,9 @@ upgrade_type (int fd, struct type **tpp, int tq, union aux_ext *ax, int bigend,
       ax++;
       rf = AUX_GET_WIDTH (bigend, ax); /* bit size of array element */
 
-      range = create_static_range_type ((struct type *) NULL, indx,
-                                       lower, upper);
+      range = create_static_range_type (NULL, indx, lower, upper);
 
-      t = create_array_type ((struct type *) NULL, *tpp, range);
+      t = create_array_type (NULL, *tpp, range);
 
       /* We used to fill in the supplied array element bitsize
          here if the TYPE_LENGTH of the target type was zero.
@@ -2001,7 +1994,7 @@ parse_procedure (PDR *pr, struct compunit_symtab *search_symtab,
       s = new_symbol (sh_name);
       SYMBOL_DOMAIN (s) = VAR_DOMAIN;
       SYMBOL_CLASS (s) = LOC_BLOCK;
-      /* Donno its type, hope int is ok.  */
+      /* Don't know its type, hope int is ok.  */
       SYMBOL_TYPE (s)
        = lookup_function_type (objfile_type (pst->objfile)->builtin_int);
       add_symbol (s, top_stack->cur_st, top_stack->cur_block);
@@ -2147,7 +2140,7 @@ parse_external (EXTR *es, int bigend, struct section_offsets *section_offsets,
 
       /* Note that the case of a symbol with indexNil must be handled
          anyways by parse_symbol().  */
-      parse_symbol (&es->asym, ax, (char *) NULL,
+      parse_symbol (&es->asym, ax, NULL,
                    bigend, section_offsets, objfile);
       break;
     default:
@@ -2161,12 +2154,9 @@ parse_external (EXTR *es, int bigend, struct section_offsets *section_offsets,
    numbers can go back and forth, apparently we can live
    with that and do not need to reorder our linetables.  */
 
-static void parse_lines (FDR *, PDR *, struct linetable *, int,
-                        struct partial_symtab *, CORE_ADDR);
-
 static void
 parse_lines (FDR *fh, PDR *pr, struct linetable *lt, int maxlines,
-            struct partial_symtab *pst, CORE_ADDR lowest_pdr_addr)
+            CORE_ADDR textlow, CORE_ADDR lowest_pdr_addr)
 {
   unsigned char *base;
   int j, k;
@@ -2197,7 +2187,7 @@ parse_lines (FDR *fh, PDR *pr, struct linetable *lt, int maxlines,
        halt = base + fh->cbLine;
       base += pr->cbLineOffset;
 
-      adr = pst->textlow + pr->adr - lowest_pdr_addr;
+      adr = textlow + pr->adr - lowest_pdr_addr;
 
       l = adr >> 2;            /* in words */
       for (lineno = pr->lnLow; base < halt;)
@@ -2349,7 +2339,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
      the text section (and fh->adr) really starts at zero.  */
   text_sect = bfd_get_section_by_name (cur_bfd, ".text");
   if (text_sect != NULL
-      && (bfd_get_section_flags (cur_bfd, text_sect) & SEC_RELOC))
+      && (bfd_section_flags (text_sect) & SEC_RELOC))
     relocatable = 1;
 
   extern_tab = XOBNEWVEC (&objfile->objfile_obstack, EXTR, hdr->iextMax);
@@ -2387,10 +2377,10 @@ parse_partial_symbols (minimal_symbol_reader &reader,
   fdr_to_pst = fdr_to_pst_holder.data ();
   fdr_to_pst++;
   {
-    struct partial_symtab *pst = new_psymtab ("", objfile);
+    struct partial_symtab *new_pst = new_psymtab ("", objfile);
 
-    fdr_to_pst[-1].pst = pst;
-    FDR_IDX (pst) = -1;
+    fdr_to_pst[-1].pst = new_pst;
+    FDR_IDX (new_pst) = -1;
   }
 
   /* Allocate the global pending list.  */
@@ -2453,7 +2443,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
      (inefficient; 
      assumes no side-effects result from ignoring ECOFF symbol)
      3) create it, but lookup ELF's minimal symbol and use it's section
-     during relocation, then modify "uniqify" phase to merge and 
+     during relocation, then modify "uniquify" phase to merge and
      eliminate the duplicate symbol
      (highly inefficient)
 
@@ -2620,19 +2610,12 @@ parse_partial_symbols (minimal_symbol_reader &reader,
       /* Determine the start address for this object file from the
          file header and relocate it, except for Irix 5.2 zero fh->adr.  */
       if (fh->cpd)
-       {
-         textlow = fh->adr;
-         if (relocatable || textlow != 0)
-           textlow += ANOFFSET (objfile->section_offsets,
-                                SECT_OFF_TEXT (objfile));
-       }
+       textlow = fh->adr;
       else
        textlow = 0;
       pst = start_psymtab_common (objfile,
                                  fdr_name (fh),
-                                 textlow,
-                                 objfile->global_psymbols,
-                                 objfile->static_psymbols);
+                                 textlow);
       pst->read_symtab_private = XOBNEW (&objfile->objfile_obstack, symloc);
       memset (pst->read_symtab_private, 0, sizeof (struct symloc));
 
@@ -2672,7 +2655,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
        psymtab_language = prev_language;
       PST_PRIVATE (pst)->pst_language = psymtab_language;
 
-      pst->texthigh = pst->textlow;
+      pst->set_text_high (pst->raw_text_low ());
 
       /* For stabs-in-ecoff files, the second symbol must be @stab.
          This symbol is emitted by mips-tfile to signal that the
@@ -2718,8 +2701,6 @@ parse_partial_symbols (minimal_symbol_reader &reader,
                                                  mst_file_text, sh.sc,
                                                  objfile);
                        }
-                     sh.value += ANOFFSET (objfile->section_offsets,
-                                           SECT_OFF_TEXT (objfile));
                      procaddr = sh.value;
 
                      isym = AUX_GET_ISYM (fh->fBigendian,
@@ -2737,10 +2718,11 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 
                          /* Kludge for Irix 5.2 zero fh->adr.  */
                          if (!relocatable
-                         && (pst->textlow == 0 || procaddr < pst->textlow))
-                           pst->textlow = procaddr;
-                         if (high > pst->texthigh)
-                           pst->texthigh = high;
+                             && (!pst->text_low_valid
+                                 || procaddr < pst->raw_text_low ()))
+                           pst->set_text_low (procaddr);
+                         if (high > pst->raw_text_high ())
+                           pst->set_text_high (high);
                        }
                    }
                  else if (sh.st == stStatic)
@@ -2762,8 +2744,6 @@ parse_partial_symbols (minimal_symbol_reader &reader,
                           record_minimal_symbol (reader, namestring, sh.value,
                                                  mst_file_data, sh.sc,
                                                  objfile);
-                         sh.value += ANOFFSET (objfile->section_offsets,
-                                               SECT_OFF_DATA (objfile));
                          break;
 
                        default:
@@ -2773,8 +2753,6 @@ parse_partial_symbols (minimal_symbol_reader &reader,
                           record_minimal_symbol (reader, namestring, sh.value,
                                                  mst_file_bss, sh.sc,
                                                  objfile);
-                         sh.value += ANOFFSET (objfile->section_offsets,
-                                               SECT_OFF_BSS (objfile));
                          break;
                        }
                    }
@@ -2783,6 +2761,9 @@ parse_partial_symbols (minimal_symbol_reader &reader,
              /* Handle stabs continuation.  */
              {
                char *stabstring = debug_info->ss + fh->issBase + sh.iss;
+               /* If we need to heap-allocate STABSTRING, this owns
+                  it.  */
+               gdb::unique_xmalloc_ptr<char> stabstring_storage;
                int len = strlen (stabstring);
 
                while (stabstring[len - 1] == '\\')
@@ -2805,14 +2786,19 @@ parse_partial_symbols (minimal_symbol_reader &reader,
                    stabstring2 = debug_info->ss + fh->issBase + sh2.iss;
                    len2 = strlen (stabstring2);
 
-                   /* Concatinate stabstring2 with stabstring1.  */
-                   if (stabstring
-                    && stabstring != debug_info->ss + fh->issBase + sh.iss)
-                     stabstring
-                       = (char *) xrealloc (stabstring, len + len2 + 1);
+                   /* Concatenate stabstring2 with stabstring1.  */
+                   if (stabstring_storage != nullptr)
+                     {
+                       stabstring_storage.reset
+                         ((char *) xrealloc (stabstring_storage.release (),
+                                             len + len2 + 1));
+                       stabstring = stabstring_storage.get ();
+                     }
                    else
                      {
-                       stabstring = (char *) xmalloc (len + len2 + 1);
+                       stabstring_storage.reset
+                         ((char *) xmalloc (len + len2 + 1));
+                       stabstring = stabstring_storage.get ();
                        strcpy (stabstring, stabstring1);
                      }
                    strcpy (stabstring + len, stabstring2);
@@ -2827,22 +2813,16 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 
                  case N_TEXT | N_EXT:
                  case N_NBTEXT | N_EXT:
-                   sh.value += ANOFFSET (objfile->section_offsets,
-                                         SECT_OFF_TEXT (objfile));
                    goto record_it;
 
                  case N_DATA | N_EXT:
                  case N_NBDATA | N_EXT:
-                   sh.value += ANOFFSET (objfile->section_offsets,
-                                         SECT_OFF_DATA (objfile));
                    goto record_it;
 
                  case N_BSS:
                  case N_BSS | N_EXT:
                  case N_NBBSS | N_EXT:
                  case N_SETV | N_EXT:          /* FIXME, is this in BSS?  */
-                   sh.value += ANOFFSET (objfile->section_offsets,
-                                         SECT_OFF_BSS (objfile));
                    goto record_it;
 
                  case N_ABS | N_EXT:
@@ -2865,8 +2845,6 @@ parse_partial_symbols (minimal_symbol_reader &reader,
                    continue;
 
                  case N_DATA:
-                   sh.value += ANOFFSET (objfile->section_offsets,
-                                         SECT_OFF_DATA (objfile));
                    goto record_it;
 
                  case N_UNDF | N_EXT:
@@ -2907,7 +2885,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
                  case N_SO:
                    {
                      static int prev_so_symnum = -10;
-                     const char *p;
+                     const char *basename;
 
                      /* A zero value is probably an indication for the
                         SunPRO 3.0 compiler.  dbx_end_psymtab explicitly tests
@@ -2947,8 +2925,8 @@ parse_partial_symbols (minimal_symbol_reader &reader,
                         the second the file name.  If pst exists, is
                         empty, and has a filename ending in '/', we assume
                         the previous N_SO was a directory name.  */
-                     p = lbasename (namestring);
-                     if (p != namestring && *p == '\000')
+                     basename = lbasename (namestring);
+                     if (basename != namestring && *basename == '\000')
                        continue;               /* Simply ignore directory
                                                   name SOs.  */
 
@@ -3067,28 +3045,27 @@ parse_partial_symbols (minimal_symbol_reader &reader,
                    switch (p[1])
                      {
                      case 'S':
-                       sh.value += ANOFFSET (objfile->section_offsets,
-                                             SECT_OFF_DATA (objfile));
-
                        if (gdbarch_static_transform_name_p (gdbarch))
                          namestring = gdbarch_static_transform_name
                                         (gdbarch, namestring);
 
-                       add_psymbol_to_list (namestring, p - namestring, 1,
-                                            VAR_DOMAIN, LOC_STATIC,
-                                            &objfile->static_psymbols,
+                       add_psymbol_to_list (gdb::string_view (namestring,
+                                                              p - namestring),
+                                            true, VAR_DOMAIN, LOC_STATIC,
+                                            SECT_OFF_DATA (objfile),
+                                            psymbol_placement::STATIC,
                                             sh.value,
                                             psymtab_language, objfile);
                        continue;
                      case 'G':
-                       sh.value += ANOFFSET (objfile->section_offsets,
-                                             SECT_OFF_DATA (objfile));
                        /* The addresses in these entries are reported
                           to be wrong.  See the code that reads 'G's
                           for symtabs.  */
-                       add_psymbol_to_list (namestring, p - namestring, 1,
-                                            VAR_DOMAIN, LOC_STATIC,
-                                            &objfile->global_psymbols,
+                       add_psymbol_to_list (gdb::string_view (namestring,
+                                                              p - namestring),
+                                            true, VAR_DOMAIN, LOC_STATIC,
+                                            SECT_OFF_DATA (objfile),
+                                            psymbol_placement::GLOBAL,
                                             sh.value,
                                             psymtab_language, objfile);
                        continue;
@@ -3104,19 +3081,20 @@ parse_partial_symbols (minimal_symbol_reader &reader,
                            || (p == namestring + 1
                                && namestring[0] != ' '))
                          {
-                           add_psymbol_to_list (namestring, p - namestring, 1,
-                                                STRUCT_DOMAIN, LOC_TYPEDEF,
-                                                &objfile->static_psymbols,
-                                                0, psymtab_language, objfile);
+                           add_psymbol_to_list
+                             (gdb::string_view (namestring, p - namestring),
+                              true, 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 (namestring,
-                                                    p - namestring, 1,
-                                                    VAR_DOMAIN, LOC_TYPEDEF,
-                                                    &objfile->static_psymbols,
-                                                    0, psymtab_language,
-                                                    objfile);
+                               add_psymbol_to_list
+                                 (gdb::string_view (namestring,
+                                                    p - namestring),
+                                  true, VAR_DOMAIN, LOC_TYPEDEF, -1,
+                                  psymbol_placement::STATIC, 0,
+                                  psymtab_language, objfile);
                                p += 1;
                              }
                          }
@@ -3125,10 +3103,12 @@ parse_partial_symbols (minimal_symbol_reader &reader,
                        if (p != namestring)    /* a name is there, not
                                                   just :T...  */
                          {
-                           add_psymbol_to_list (namestring, p - namestring, 1,
-                                                VAR_DOMAIN, LOC_TYPEDEF,
-                                                &objfile->static_psymbols,
-                                                0, psymtab_language, objfile);
+                           add_psymbol_to_list
+                             (gdb::string_view (namestring,
+                                                p - namestring),
+                              true, VAR_DOMAIN, LOC_TYPEDEF, -1,
+                              psymbol_placement::STATIC, 0, psymtab_language,
+                              objfile);
                          }
                      check_enum:
                        /* If this is an enumerated type, we need to add
@@ -3189,9 +3169,11 @@ parse_partial_symbols (minimal_symbol_reader &reader,
                                /* 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,
+                               add_psymbol_to_list (gdb::string_view (p,
+                                                                      q - p),
+                                                    true, VAR_DOMAIN,
+                                                    LOC_CONST, -1,
+                                                    psymbol_placement::STATIC,
                                                     0, psymtab_language,
                                                     objfile);
                                /* Point past the name.  */
@@ -3207,28 +3189,25 @@ parse_partial_symbols (minimal_symbol_reader &reader,
                        continue;
                      case 'c':
                        /* Constant, e.g. from "const" in Pascal.  */
-                       add_psymbol_to_list (namestring, p - namestring, 1,
-                                            VAR_DOMAIN, LOC_CONST,
-                                            &objfile->static_psymbols,
+                       add_psymbol_to_list (gdb::string_view (namestring,
+                                                              p - namestring),
+                                            true, VAR_DOMAIN, LOC_CONST, -1,
+                                            psymbol_placement::STATIC,
                                             0, psymtab_language, objfile);
                        continue;
 
                      case 'f':
                        if (! pst)
                          {
-                           int name_len = p - namestring;
-                           char *name = (char *) xmalloc (name_len + 1);
-
-                           memcpy (name, namestring, name_len);
-                           name[name_len] = '\0';
-                           function_outside_compilation_unit_complaint (name);
-                           xfree (name);
+                           std::string copy (namestring, p);
+                           function_outside_compilation_unit_complaint
+                             (copy.c_str ());
                          }
-                       sh.value += ANOFFSET (objfile->section_offsets,
-                                             SECT_OFF_TEXT (objfile));
-                       add_psymbol_to_list (namestring, p - namestring, 1,
-                                            VAR_DOMAIN, LOC_BLOCK,
-                                            &objfile->static_psymbols,
+                       add_psymbol_to_list (gdb::string_view (namestring,
+                                                              p - namestring),
+                                            true, VAR_DOMAIN, LOC_BLOCK,
+                                            SECT_OFF_TEXT (objfile),
+                                            psymbol_placement::STATIC,
                                             sh.value,
                                             psymtab_language, objfile);
                        continue;
@@ -3240,19 +3219,15 @@ parse_partial_symbols (minimal_symbol_reader &reader,
                      case 'F':
                        if (! pst)
                          {
-                           int name_len = p - namestring;
-                           char *name = (char *) xmalloc (name_len + 1);
-
-                           memcpy (name, namestring, name_len);
-                           name[name_len] = '\0';
-                           function_outside_compilation_unit_complaint (name);
-                           xfree (name);
+                           std::string copy (namestring, p);
+                           function_outside_compilation_unit_complaint
+                             (copy.c_str ());
                          }
-                       sh.value += ANOFFSET (objfile->section_offsets,
-                                             SECT_OFF_TEXT (objfile));
-                       add_psymbol_to_list (namestring, p - namestring, 1,
-                                            VAR_DOMAIN, LOC_BLOCK,
-                                            &objfile->global_psymbols,
+                       add_psymbol_to_list (gdb::string_view (namestring,
+                                                              p - namestring),
+                                            true, VAR_DOMAIN, LOC_BLOCK,
+                                            SECT_OFF_TEXT (objfile),
+                                            psymbol_placement::GLOBAL,
                                             sh.value,
                                             psymtab_language, objfile);
                        continue;
@@ -3309,9 +3284,9 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 
                  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
+                      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))
@@ -3323,8 +3298,8 @@ parse_partial_symbols (minimal_symbol_reader &reader,
                    continue;
 
                  case N_RBRAC:
-                   if (sh.value > save_pst->texthigh)
-                     save_pst->texthigh = sh.value;
+                   if (sh.value > save_pst->raw_text_high ())
+                     save_pst->set_text_high (sh.value);
                    continue;
                  case N_EINCL:
                  case N_DSLINE:
@@ -3365,9 +3340,6 @@ parse_partial_symbols (minimal_symbol_reader &reader,
                               hex_string (type_code)); /* CUR_SYMBOL_TYPE */
                    continue;
                  }
-               if (stabstring
-                   && stabstring != debug_info->ss + fh->issBase + sh.iss)
-                 xfree (stabstring);
              }
              /* end - Handle continuation */
            }
@@ -3376,9 +3348,10 @@ parse_partial_symbols (minimal_symbol_reader &reader,
        {
          for (cur_sdx = 0; cur_sdx < fh->csym;)
            {
-             char *name;
+             char *sym_name;
              enum address_class theclass;
              CORE_ADDR minsym_value;
+             short section = -1;
 
              (*swap_sym_in) (cur_bfd,
                              ((char *) debug_info->external_sym
@@ -3402,7 +3375,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
                  continue;
                }
 
-             name = debug_info->ss + fh->issBase + sh.iss;
+             sym_name = debug_info->ss + fh->issBase + sh.iss;
 
              minsym_value = sh.value;
 
@@ -3413,21 +3386,18 @@ parse_partial_symbols (minimal_symbol_reader &reader,
                  /* The value of a stEnd symbol is the displacement from the
                     corresponding start symbol value, do not relocate it.  */
                  if (sh.st != stEnd)
-                   sh.value += ANOFFSET (objfile->section_offsets,
-                                         SECT_OFF_TEXT (objfile));
+                   section = SECT_OFF_TEXT (objfile);
                  break;
                case scData:
                case scSData:
                case scRData:
                case scPData:
                case scXData:
-                 sh.value += ANOFFSET (objfile->section_offsets,
-                                       SECT_OFF_DATA (objfile));
+                 section = SECT_OFF_DATA (objfile);
                  break;
                case scBss:
                case scSBss:
-                 sh.value += ANOFFSET (objfile->section_offsets,
-                                       SECT_OFF_BSS (objfile));
+                 section = SECT_OFF_BSS (objfile);
                  break;
                }
 
@@ -3438,7 +3408,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
                  int new_sdx;
 
                case stStaticProc:
-                 reader.record_with_info (name, minsym_value,
+                 reader.record_with_info (sym_name, minsym_value,
                                           mst_file_text,
                                           SECT_OFF_TEXT (objfile));
 
@@ -3450,7 +3420,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
                    {
                      /* Should not happen, but does when cross-compiling
                         with the MIPS compiler.  FIXME -- pull later.  */
-                     index_complaint (name);
+                     index_complaint (sym_name);
                      new_sdx = cur_sdx + 1;    /* Don't skip at all.  */
                    }
                  else
@@ -3463,7 +3433,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
                    {
                      /* This should not happen either... FIXME.  */
                      complaint (_("bad proc end in aux found from symbol %s"),
-                                name);
+                                sym_name);
                      new_sdx = cur_sdx + 1;    /* Don't skip backward.  */
                    }
 
@@ -3479,7 +3449,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 
                  /* Usually there is a local and a global stProc symbol
                     for a function.  This means that the function name
-                    has already been entered into the mimimal symbol table
+                    has already been entered into the minimal symbol table
                     while processing the global symbols in pass 2 above.
                     One notable exception is the PROGRAM name from
                     f77 compiled executables, it is only put out as
@@ -3489,14 +3459,16 @@ parse_partial_symbols (minimal_symbol_reader &reader,
                     symbol table, and the MAIN__ symbol via the minimal
                     symbol table.  */
                  if (sh.st == stProc)
-                   add_psymbol_to_list (name, strlen (name), 1,
+                   add_psymbol_to_list (sym_name, true,
                                         VAR_DOMAIN, LOC_BLOCK,
-                                        &objfile->global_psymbols,
+                                        section,
+                                        psymbol_placement::GLOBAL,
                                         sh.value, psymtab_language, objfile);
                  else
-                   add_psymbol_to_list (name, strlen (name), 1,
+                   add_psymbol_to_list (sym_name, true,
                                         VAR_DOMAIN, LOC_BLOCK,
-                                        &objfile->static_psymbols,
+                                        section,
+                                        psymbol_placement::STATIC,
                                         sh.value, psymtab_language, objfile);
 
                  procaddr = sh.value;
@@ -3512,21 +3484,22 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 
                  /* Kludge for Irix 5.2 zero fh->adr.  */
                  if (!relocatable
-                     && (pst->textlow == 0 || procaddr < pst->textlow))
-                   pst->textlow = procaddr;
+                     && (!pst->text_low_valid
+                         || procaddr < pst->raw_text_low ()))
+                   pst->set_text_low (procaddr);
 
                  high = procaddr + sh.value;
-                 if (high > pst->texthigh)
-                   pst->texthigh = high;
+                 if (high > pst->raw_text_high ())
+                   pst->set_text_high (high);
                  continue;
 
                case stStatic:  /* Variable */
                  if (SC_IS_DATA (sh.sc))
-                   reader.record_with_info (name, minsym_value,
+                   reader.record_with_info (sym_name, minsym_value,
                                             mst_file_data,
                                             SECT_OFF_DATA (objfile));
                  else
-                   reader.record_with_info (name, minsym_value,
+                   reader.record_with_info (sym_name, minsym_value,
                                             mst_file_bss,
                                             SECT_OFF_BSS (objfile));
                  theclass = LOC_STATIC;
@@ -3559,9 +3532,9 @@ parse_partial_symbols (minimal_symbol_reader &reader,
                      && sh.iss != 0
                      && sh.index != cur_sdx + 2)
                    {
-                     add_psymbol_to_list (name, strlen (name), 1,
-                                          STRUCT_DOMAIN, LOC_TYPEDEF,
-                                          &objfile->static_psymbols,
+                     add_psymbol_to_list (sym_name, true,
+                                          STRUCT_DOMAIN, LOC_TYPEDEF, -1,
+                                          psymbol_placement::STATIC,
                                           0, psymtab_language, objfile);
                    }
                  handle_psymbol_enumerators (objfile, fh, sh.st, sh.value);
@@ -3571,7 +3544,8 @@ parse_partial_symbols (minimal_symbol_reader &reader,
                  if (new_sdx <= cur_sdx)
                    {
                      /* This happens with the Ultrix kernel.  */
-                     complaint (_("bad aux index at block symbol %s"), name);
+                     complaint (_("bad aux index at block symbol %s"),
+                                sym_name);
                      new_sdx = cur_sdx + 1;    /* Don't skip backward.  */
                    }
                  cur_sdx = new_sdx;
@@ -3589,18 +3563,18 @@ parse_partial_symbols (minimal_symbol_reader &reader,
                  goto skip;
 
                default:
-                 /* Both complaints are valid:  one gives symbol name,
+                 /* Both complaints are valid:  one gives symbol sym_name,
                     the other the offending symbol type.  */
                  complaint (_("unknown local symbol %s"),
-                            name);
+                            sym_name);
                  complaint (_("with type %d"), sh.st);
                  cur_sdx++;
                  continue;
                }
              /* Use this gdb symbol.  */
-             add_psymbol_to_list (name, strlen (name), 1,
-                                  VAR_DOMAIN, theclass,
-                                  &objfile->static_psymbols,
+             add_psymbol_to_list (sym_name, true,
+                                  VAR_DOMAIN, theclass, section,
+                                  psymbol_placement::STATIC,
                                   sh.value, psymtab_language, objfile);
            skip:
              cur_sdx++;        /* Go to next file symbol.  */
@@ -3615,8 +3589,8 @@ parse_partial_symbols (minimal_symbol_reader &reader,
            {
              enum address_class theclass;
              SYMR *psh;
-             char *name;
              CORE_ADDR svalue;
+             short section;
 
              if (ext_ptr->ifd != f_idx)
                internal_error (__FILE__, __LINE__,
@@ -3630,23 +3604,21 @@ parse_partial_symbols (minimal_symbol_reader &reader,
              svalue = psh->value;
              switch (psh->sc)
                {
+               default:
                case scText:
                case scRConst:
-                 svalue += ANOFFSET (objfile->section_offsets,
-                                     SECT_OFF_TEXT (objfile));
+                 section = SECT_OFF_TEXT (objfile);
                  break;
                case scData:
                case scSData:
                case scRData:
                case scPData:
                case scXData:
-                 svalue += ANOFFSET (objfile->section_offsets,
-                                     SECT_OFF_DATA (objfile));
+                 section = SECT_OFF_DATA (objfile);
                  break;
                case scBss:
                case scSBss:
-                 svalue += ANOFFSET (objfile->section_offsets,
-                                     SECT_OFF_BSS (objfile));
+                 section = SECT_OFF_BSS (objfile);
                  break;
                }
 
@@ -3678,10 +3650,11 @@ parse_partial_symbols (minimal_symbol_reader &reader,
                  theclass = LOC_STATIC;
                  break;
                }
-             name = debug_info->ssext + psh->iss;
-             add_psymbol_to_list (name, strlen (name), 1,
+             char *sym_name = debug_info->ssext + psh->iss;
+             add_psymbol_to_list (sym_name, true,
                                   VAR_DOMAIN, theclass,
-                                  &objfile->global_psymbols,
+                                  section,
+                                  psymbol_placement::GLOBAL,
                                   svalue, psymtab_language, objfile);
            }
        }
@@ -3691,7 +3664,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
       fdr_to_pst[f_idx].pst
        = dbx_end_psymtab (objfile, save_pst,
                           psymtab_include_list, includes_used,
-                          -1, save_pst->texthigh,
+                          -1, save_pst->raw_text_high (),
                           dependency_list, dependencies_used,
                           textlow_not_set);
       includes_used = 0;
@@ -3710,20 +3683,20 @@ parse_partial_symbols (minimal_symbol_reader &reader,
          other cases.  */
       save_pst = fdr_to_pst[f_idx].pst;
       if (save_pst != NULL
-         && save_pst->textlow != 0
+         && save_pst->text_low_valid
          && !(objfile->flags & OBJF_REORDERED))
        {
-         ALL_OBJFILE_PSYMTABS (objfile, pst)
-         {
-           if (save_pst != pst
-               && save_pst->textlow >= pst->textlow
-               && save_pst->textlow < pst->texthigh
-               && save_pst->texthigh > pst->texthigh)
-             {
-               objfile->flags |= OBJF_REORDERED;
-               break;
-             }
-         }
+         for (partial_symtab *iter : objfile->psymtabs ())
+           {
+             if (save_pst != iter
+                 && save_pst->raw_text_low () >= iter->raw_text_low ()
+                 && save_pst->raw_text_low () < iter->raw_text_high ()
+                 && save_pst->raw_text_high () > iter->raw_text_high ())
+               {
+                 objfile->flags |= OBJF_REORDERED;
+                 break;
+               }
+           }
        }
     }
 
@@ -3733,7 +3706,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
       fh = f_idx + debug_info->fdr;
       pst = fdr_to_pst[f_idx].pst;
 
-      if (pst == (struct partial_symtab *) NULL)
+      if (pst == NULL)
        continue;
 
       /* This should catch stabs-in-ecoff.  */
@@ -3743,8 +3716,8 @@ parse_partial_symbols (minimal_symbol_reader &reader,
       /* Skip the first file indirect entry as it is a self dependency for
          source files or a reverse .h -> .c dependency for header files.  */
       pst->number_of_dependencies = 0;
-      pst->dependencies = XOBNEWVEC (&objfile->objfile_obstack,
-                                    partial_symtab *, (fh->crfd - 1));
+      pst->dependencies
+       = objfile->partial_symtabs->allocate_dependencies (fh->crfd - 1);
       for (s_idx = 1; s_idx < fh->crfd; s_idx++)
        {
          RFDT rh;
@@ -3763,8 +3736,8 @@ parse_partial_symbols (minimal_symbol_reader &reader,
          if (rh == f_idx)
            continue;
 
-         /* Do not add to dependeny list if psymtab was empty.  */
-         if (fdr_to_pst[rh].pst == (struct partial_symtab *) NULL)
+         /* Do not add to dependency list if psymtab was empty.  */
+         if (fdr_to_pst[rh].pst == NULL)
            continue;
          pst->dependencies[pst->number_of_dependencies++]
            = fdr_to_pst[rh].pst;
@@ -3773,11 +3746,12 @@ parse_partial_symbols (minimal_symbol_reader &reader,
 
   /* Remove the dummy psymtab created for -O3 images above, if it is
      still empty, to enable the detection of stripped executables.  */
-  if (objfile->psymtabs->next == NULL
-      && objfile->psymtabs->number_of_dependencies == 0
-      && objfile->psymtabs->n_global_syms == 0
-      && objfile->psymtabs->n_static_syms == 0)
-    objfile->psymtabs = NULL;
+  pst = objfile->partial_symtabs->psymtabs;
+  if (pst->next == NULL
+      && pst->number_of_dependencies == 0
+      && pst->n_global_syms == 0
+      && pst->n_static_syms == 0)
+    objfile->partial_symtabs->psymtabs = NULL;
 }
 
 /* If the current psymbol has an enumerated type, we need to add
@@ -3840,10 +3814,10 @@ handle_psymbol_enumerators (struct objfile *objfile, FDR *fh, int stype,
 
       /* Note that the value doesn't matter for enum constants
          in psymtabs, just in symtabs.  */
-      add_psymbol_to_list (name, strlen (name), 1,
-                          VAR_DOMAIN, LOC_CONST,
-                          &objfile->static_psymbols,
-                          0, psymtab_language, objfile);
+      add_psymbol_to_list (name, true,
+                          VAR_DOMAIN, LOC_CONST, -1,
+                          psymbol_placement::STATIC, 0,
+                          psymtab_language, objfile);
       ext_sym += external_sym_size;
     }
 }
@@ -3894,7 +3868,7 @@ psymtab_to_symtab_1 (struct objfile *objfile,
     return;
   pst->readin = 1;
 
-  /* Read in all partial symbtabs on which this one is dependent.
+  /* Read in all partial symtabs on which this one is dependent.
      NOTE that we do have circular dependencies, sigh.  We solved
      that by setting pst->readin before this point.  */
 
@@ -3921,7 +3895,7 @@ psymtab_to_symtab_1 (struct objfile *objfile,
   /* Do nothing if this is a dummy psymtab.  */
 
   if (pst->n_global_syms == 0 && pst->n_static_syms == 0
-      && pst->textlow == 0 && pst->texthigh == 0)
+      && !pst->text_low_valid && !pst->text_high_valid)
     return;
 
   /* Now read the symbols for this symtab.  */
@@ -3937,13 +3911,13 @@ psymtab_to_symtab_1 (struct objfile *objfile,
   mdebugread_objfile = objfile;
   cur_fd = FDR_IDX (pst);
   fh = ((cur_fd == -1)
-       ? (FDR *) NULL
+       ? NULL
        : debug_info->fdr + cur_fd);
   cur_fdr = fh;
 
   /* See comment in parse_partial_symbols about the @stabs sentinel.  */
   processing_gcc_compilation = 0;
-  if (fh != (FDR *) NULL && fh->csym >= 2)
+  if (fh != NULL && fh->csym >= 2)
     {
       SYMR sh;
 
@@ -4040,7 +4014,7 @@ psymtab_to_symtab_1 (struct objfile *objfile,
                  SYMBOL_TYPE (s) = objfile_type (objfile)->builtin_void;
                  SYMBOL_VALUE_BYTES (s) = (gdb_byte *) e;
                  e->pdr.framereg = -1;
-                 add_symbol_to_list (s, &local_symbols);
+                 add_symbol_to_list (s, get_local_symbols ());
                }
            }
          else if (sh.st == stLabel)
@@ -4056,7 +4030,7 @@ psymtab_to_symtab_1 (struct objfile *objfile,
                  /* Handle encoded stab line number.  */
                  valu += ANOFFSET (section_offsets,
                                    SECT_OFF_TEXT (objfile));
-                 record_line (current_subfile, sh.index,
+                 record_line (get_current_subfile (), sh.index,
                               gdbarch_addr_bits_remove (gdbarch, valu));
                }
            }
@@ -4070,7 +4044,7 @@ psymtab_to_symtab_1 (struct objfile *objfile,
 
       if (! last_symtab_ended)
        {
-         cust = end_symtab (pst->texthigh, SECT_OFF_TEXT (objfile));
+         cust = end_symtab (pst->raw_text_high (), SECT_OFF_TEXT (objfile));
          end_stabs ();
        }
 
@@ -4146,7 +4120,7 @@ psymtab_to_symtab_1 (struct objfile *objfile,
       top_stack->cur_st = COMPUNIT_FILETABS (cust);
       top_stack->cur_block
        = BLOCKVECTOR_BLOCK (COMPUNIT_BLOCKVECTOR (cust), STATIC_BLOCK);
-      BLOCK_START (top_stack->cur_block) = pst->textlow;
+      BLOCK_START (top_stack->cur_block) = pst->text_low (objfile);
       BLOCK_END (top_stack->cur_block) = 0;
       top_stack->blocktype = stFile;
       top_stack->cur_type = 0;
@@ -4207,7 +4181,7 @@ psymtab_to_symtab_1 (struct objfile *objfile,
                }
 
              parse_lines (fh, pr_block.data (), lines, maxlines,
-                          pst, lowest_pdr_addr);
+                          pst->text_low (objfile), lowest_pdr_addr);
              if (lines->nitems < fh->cline)
                lines = shrink_linetable (lines);
 
@@ -4453,7 +4427,7 @@ cross_ref (int fd, union aux_ext *ax, struct type **tpp,
              *tpp = parse_type (xref_fd,
                                 debug_info->external_aux + fh->iauxBase,
                                 sh.index,
-                                (int *) NULL,
+                                NULL,
                                 fh->fBigendian,
                                 debug_info->ss + fh->issBase + sh.iss);
              add_pending (fh, esh, *tpp);
@@ -4479,7 +4453,7 @@ cross_ref (int fd, union aux_ext *ax, struct type **tpp,
          *tpp = parse_type (xref_fd,
                             debug_info->external_aux + fh->iauxBase,
                             sh.index,
-                            (int *) NULL,
+                            NULL,
                             fh->fBigendian,
                             debug_info->ss + fh->issBase + sh.iss);
        }
@@ -4514,10 +4488,10 @@ mylookup_symbol (const char *name, const struct block *block,
   inc = name[0];
   ALL_BLOCK_SYMBOLS (block, iter, sym)
     {
-      if (SYMBOL_LINKAGE_NAME (sym)[0] == inc
+      if (sym->linkage_name ()[0] == inc
          && SYMBOL_DOMAIN (sym) == domain
          && SYMBOL_CLASS (sym) == theclass
-         && strcmp (SYMBOL_LINKAGE_NAME (sym), name) == 0)
+         && strcmp (sym->linkage_name (), name) == 0)
        return sym;
     }
 
@@ -4534,7 +4508,7 @@ static void
 add_symbol (struct symbol *s, struct symtab *symtab, struct block *b)
 {
   symbol_set_symtab (s, symtab);
-  dict_add_symbol (BLOCK_DICT (b), s);
+  mdict_add_symbol (BLOCK_MULTIDICT (b), s);
 }
 
 /* Add a new block B to a symtab S.  */
@@ -4593,17 +4567,16 @@ add_line (struct linetable *lt, int lineno, CORE_ADDR adr, int last)
 
 /* Blocks with a smaller low bound should come first.  */
 
-static int
-compare_blocks (const void *arg1, const void *arg2)
+static bool
+block_is_less_than (const struct block *b1, const struct block *b2)
 {
-  LONGEST addr_diff;
-  struct block **b1 = (struct block **) arg1;
-  struct block **b2 = (struct block **) arg2;
-
-  addr_diff = (BLOCK_START ((*b1))) - (BLOCK_START ((*b2)));
-  if (addr_diff == 0)
-    return (BLOCK_END ((*b2))) - (BLOCK_END ((*b1)));
-  return addr_diff;
+  CORE_ADDR start1 = BLOCK_START (b1);
+  CORE_ADDR start2 = BLOCK_START (b2);
+
+  if (start1 != start2)
+    return start1 < start2;
+
+  return (BLOCK_END (b2)) < (BLOCK_END (b1));
 }
 
 /* Sort the blocks of a symtab S.
@@ -4633,10 +4606,9 @@ sort_blocks (struct symtab *s)
    * to detect -O3 images in advance.
    */
   if (BLOCKVECTOR_NBLOCKS (bv) > FIRST_LOCAL_BLOCK + 1)
-    qsort (&BLOCKVECTOR_BLOCK (bv, FIRST_LOCAL_BLOCK),
-          BLOCKVECTOR_NBLOCKS (bv) - FIRST_LOCAL_BLOCK,
-          sizeof (struct block *),
-          compare_blocks);
+    std::sort (&BLOCKVECTOR_BLOCK (bv, FIRST_LOCAL_BLOCK),
+              &BLOCKVECTOR_BLOCK (bv, BLOCKVECTOR_NBLOCKS (bv)),
+              block_is_less_than);
 
   {
     CORE_ADDR high = 0;
@@ -4762,7 +4734,7 @@ new_bvect (int nblocks)
 }
 
 /* Allocate and zero a new block of language LANGUAGE, and set its
-   BLOCK_DICT.  If function is non-zero, assume the block is
+   BLOCK_MULTIDICT.  If function is non-zero, assume the block is
    associated to a function, and make sure that the symbols are stored
    linearly; otherwise, store them hashed.  */
 
@@ -4775,9 +4747,9 @@ new_block (enum block_type type, enum language language)
   struct block *retval = XCNEW (struct block);
 
   if (type == FUNCTION_BLOCK)
-    BLOCK_DICT (retval) = dict_create_linear_expandable (language);
+    BLOCK_MULTIDICT (retval) = mdict_create_linear_expandable (language);
   else
-    BLOCK_DICT (retval) = dict_create_hashed_expandable (language);
+    BLOCK_MULTIDICT (retval) = mdict_create_hashed_expandable (language);
 
   return retval;
 }
@@ -4791,7 +4763,7 @@ new_symbol (const char *name)
 
   SYMBOL_SET_LANGUAGE (s, psymtab_language,
                       &mdebugread_objfile->objfile_obstack);
-  SYMBOL_SET_NAMES (s, name, strlen (name), 1, mdebugread_objfile);
+  SYMBOL_SET_NAMES (s, name, true, mdebugread_objfile);
   return s;
 }
 
@@ -4840,8 +4812,6 @@ elfmdebug_build_psymtabs (struct objfile *objfile,
 void
 _initialize_mdebugread (void)
 {
-  basic_type_data = register_objfile_data ();
-
   mdebug_register_index
     = register_symbol_register_impl (LOC_REGISTER, &mdebug_register_funcs);
   mdebug_regparm_index
This page took 0.045619 seconds and 4 git commands to generate.