Introduce assign_operation
[deliverable/binutils-gdb.git] / gdb / xcoffread.c
index 1ac01c801174daa32c0283cdbcf7590d837cb4aa..b1768702e26fe414f545a790114b09093af3e0f4 100644 (file)
@@ -1,5 +1,5 @@
 /* Read AIX xcoff symbol tables and convert to internal format, for GDB.
-   Copyright (C) 1986-2020 Free Software Foundation, Inc.
+   Copyright (C) 1986-2021 Free Software Foundation, Inc.
    Derived from coffread.c, dbxread.c, and a lot of hacking.
    Contributed by IBM Corporation.
 
@@ -47,6 +47,7 @@
 #include "expression.h"
 #include "complaints.h"
 #include "psympriv.h"
+#include "dwarf2/sect-names.h"
 
 #include "gdb-stabs.h"
 
@@ -450,7 +451,7 @@ arrange_linetable (struct linetable *oldLineTb)
          ++function_count;
 
          /* If the function was compiled with XLC, we may have to add an
-             extra line entry later.  Reserve space for that.  */
+            extra line entry later.  Reserve space for that.  */
          if (ii + 1 < oldLineTb->nitems
              && oldLineTb->item[ii].pc != oldLineTb->item[ii + 1].pc)
            extra_lines++;
@@ -465,7 +466,7 @@ arrange_linetable (struct linetable *oldLineTb)
   else if (function_count > 1)
     std::sort (fentry, fentry + function_count,
               [] (const linetable_entry &lte1, const linetable_entry& lte2)
-               { return lte1.pc < lte2.pc; });
+               { return lte1.pc < lte2.pc; });
 
   /* Allocate a new line table.  */
   newLineTb = (struct linetable *)
@@ -487,7 +488,7 @@ arrange_linetable (struct linetable *oldLineTb)
   for (ii = 0; ii < function_count; ++ii)
     {
       /* If the function was compiled with XLC, we may have to add an
-         extra line to cover the function prologue.  */
+        extra line to cover the function prologue.  */
       jj = fentry[ii].line;
       if (jj + 1 < oldLineTb->nitems
          && oldLineTb->item[jj].pc != oldLineTb->item[jj + 1].pc)
@@ -542,11 +543,11 @@ record_include_begin (struct coff_symbol *cs)
   if (inclDepth)
     {
       /* In xcoff, we assume include files cannot be nested (not in .c files
-         of course, but in corresponding .s files.).  */
+        of course, but in corresponding .s files.).  */
 
       /* This can happen with old versions of GCC.
-         GCC 2.3.3-930426 does not exhibit this on a test case which
-         a user said produced the message for him.  */
+        GCC 2.3.3-930426 does not exhibit this on a test case which
+        a user said produced the message for him.  */
       complaint (_("Nested C_BINCL symbols"));
     }
   ++inclDepth;
@@ -659,8 +660,8 @@ process_linenos (CORE_ADDR start, CORE_ADDR end)
 
          if (strcmp (inclTable[ii].name, get_last_source_file ()) == 0)
            {
-              /* The entry in the include table refers to the main source
-                 file.  Add the lines to the main subfile.  */
+             /* The entry in the include table refers to the main source
+                file.  Add the lines to the main subfile.  */
 
              main_source_baseline = inclTable[ii].funStartLine;
              enter_line_range
@@ -687,7 +688,7 @@ process_linenos (CORE_ADDR start, CORE_ADDR end)
        }
 
       /* All the include files' line have been processed at this point.  Now,
-         enter remaining lines of the main file, if any left.  */
+        enter remaining lines of the main file, if any left.  */
       if (offset < max_offset + 1 - linesz)
        {
          enter_line_range (&main_subfile, offset, 0, start, end,
@@ -703,7 +704,7 @@ process_linenos (CORE_ADDR start, CORE_ADDR end)
       lv = main_subfile.line_vector;
 
       /* Line numbers are not necessarily ordered.  xlc compilation will
-         put static function to the end.  */
+        put static function to the end.  */
 
       struct subfile *current_subfile = get_current_subfile ();
       lineTb = arrange_linetable (lv);
@@ -728,7 +729,7 @@ process_linenos (CORE_ADDR start, CORE_ADDR end)
   for (ii = 0; ii < inclIndx; ++ii)
     {
       if (inclTable[ii].subfile != ((struct subfile *) &main_subfile)
-          && (inclTable[ii].subfile)->line_vector)     /* Useless if!!!
+         && (inclTable[ii].subfile)->line_vector)      /* Useless if!!!
                                                           FIXMEmgo */
        {
          struct linetable *lineTb, *lv;
@@ -815,9 +816,9 @@ aix_process_linenos (struct objfile *objfile)
 /* Enter a given range of lines into the line vector.
    can be called in the following two ways:
    enter_line_range (subfile, beginoffset, endoffset,
-                     startaddr, 0, firstLine)  or
+                    startaddr, 0, firstLine)  or
    enter_line_range (subfile, beginoffset, 0, 
-                     startaddr, endaddr, firstLine)
+                    startaddr, endaddr, firstLine)
 
    endoffset points to the last line table entry that we should pay
    attention to.  */
@@ -829,7 +830,7 @@ enter_line_range (struct subfile *subfile, unsigned beginoffset,
                  CORE_ADDR endaddr, unsigned *firstLine)
 {
   struct objfile *objfile = this_symtab_objfile;
-  struct gdbarch *gdbarch = get_objfile_arch (objfile);
+  struct gdbarch *gdbarch = objfile->arch ();
   unsigned int curoffset;
   CORE_ADDR addr;
   void *ext_lnno;
@@ -971,7 +972,7 @@ xcoff_next_symbol_text (struct objfile *objfile)
       complaint (_("Unexpected symbol continuation"));
 
       /* Return something which points to '\0' and hope the symbol reading
-         code does something reasonable.  */
+        code does something reasonable.  */
       retval = "";
     }
   else if (symbol.n_sclass & 0x80)
@@ -985,7 +986,7 @@ xcoff_next_symbol_text (struct objfile *objfile)
       complaint (_("Unexpected symbol continuation"));
 
       /* Return something which points to '\0' and hope the symbol reading
-         code does something reasonable.  */
+        code does something reasonable.  */
       retval = "";
     }
   return retval;
@@ -1054,10 +1055,10 @@ read_xcoff_symtab (struct objfile *objfile, legacy_psymtab *pst)
 
       /* READ_ONE_SYMBOL (symbol, cs, symname_alloced); */
       /* read one symbol into `cs' structure.  After processing the
-         whole symbol table, only string table will be kept in memory,
-         symbol table and debug section of xcoff will be freed.  Thus
-         we can mark symbols with names in string table as
-         `alloced'.  */
+        whole symbol table, only string table will be kept in memory,
+        symbol table and debug section of xcoff will be freed.  Thus
+        we can mark symbols with names in string table as
+        `alloced'.  */
       {
        int ii;
 
@@ -1203,15 +1204,15 @@ read_xcoff_symtab (struct objfile *objfile, legacy_psymtab *pst)
                    {
 
                      /* A program csect is seen.  We have to allocate one
-                        symbol table for each program csect.  Normally gdb
-                        prefers one symtab for each source file.  In case
-                        of AIX, one source file might include more than one
-                        [PR] csect, and they don't have to be adjacent in
-                        terms of the space they occupy in memory.  Thus, one
-                        single source file might get fragmented in the
-                        memory and gdb's file start and end address
-                        approach does not work!  GCC (and I think xlc) seem
-                        to put all the code in the unnamed program csect.  */
+                        symbol table for each program csect.  Normally gdb
+                        prefers one symtab for each source file.  In case
+                        of AIX, one source file might include more than one
+                        [PR] csect, and they don't have to be adjacent in
+                        terms of the space they occupy in memory.  Thus, one
+                        single source file might get fragmented in the
+                        memory and gdb's file start and end address
+                        approach does not work!  GCC (and I think xlc) seem
+                        to put all the code in the unnamed program csect.  */
 
                      if (last_csect_name)
                        {
@@ -1228,7 +1229,7 @@ read_xcoff_symtab (struct objfile *objfile, legacy_psymtab *pst)
                        }
 
                      /* If this is the very first csect seen,
-                        basically `__start'.  */
+                        basically `__start'.  */
                      if (just_started)
                        {
                          first_object_file_end
@@ -1372,7 +1373,7 @@ read_xcoff_symtab (struct objfile *objfile, legacy_psymtab *pst)
                (fcn_cs_saved.c_value + off,
                 fcn_stab_saved.c_name, 0, 0, objfile);
              if (newobj->name != NULL)
-               SYMBOL_SECTION (newobj->name) = SECT_OFF_TEXT (objfile);
+               newobj->name->set_section_index (SECT_OFF_TEXT (objfile));
            }
          else if (strcmp (cs->c_name, ".ef") == 0)
            {
@@ -1380,9 +1381,9 @@ read_xcoff_symtab (struct objfile *objfile, legacy_psymtab *pst)
                                    0, cs->c_naux, &main_aux);
 
              /* The value of .ef is the address of epilogue code;
-                not useful for gdb.  */
+                not useful for gdb.  */
              /* { main_aux.x_sym.x_misc.x_lnsz.x_lnno
-                contains number of lines to '}' */
+                contains number of lines to '}' */
 
              if (outermost_context_p ())
                {       /* We attempted to pop an empty context stack.  */
@@ -1512,20 +1513,15 @@ read_xcoff_symtab (struct objfile *objfile, legacy_psymtab *pst)
       cur_src_end_addr = file_end_addr;
       cust = end_symtab (file_end_addr, SECT_OFF_TEXT (objfile));
       /* When reading symbols for the last C_FILE of the objfile, try
-         to make sure that we set pst->compunit_symtab to the symtab for the
-         file, not to the _globals_ symtab.  I'm not sure whether this
-         actually works right or when/if it comes up.  */
+        to make sure that we set pst->compunit_symtab to the symtab for the
+        file, not to the _globals_ symtab.  I'm not sure whether this
+        actually works right or when/if it comes up.  */
       if (pst->compunit_symtab == NULL)
        pst->compunit_symtab = cust;
       end_stabs ();
     }
 }
 
-#define        SYMBOL_DUP(SYMBOL1, SYMBOL2)    \
-  (SYMBOL2) = new (&objfile->objfile_obstack) symbol (); \
-  *(SYMBOL2) = *(SYMBOL1);
-
-
 #define        SYMNAME_ALLOC(NAME, ALLOCED)    \
   ((ALLOCED) ? (NAME) : obstack_strdup (&objfile->objfile_obstack, \
                                        (NAME)))
@@ -1547,7 +1543,7 @@ process_xcoff_symbol (struct coff_symbol *cs, struct objfile *objfile)
   if (cs->c_secnum < 0)
     {
       /* The value is a register number, offset within a frame, etc.,
-         and does not get relocated.  */
+        and does not get relocated.  */
       off = 0;
       sec = -1;
     }
@@ -1561,24 +1557,22 @@ process_xcoff_symbol (struct coff_symbol *cs, struct objfile *objfile)
   if (name[0] == '.')
     ++name;
 
-  initialize_objfile_symbol (sym);
-
   /* default assumptions */
   SET_SYMBOL_VALUE_ADDRESS (sym, cs->c_value + off);
   SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
-  SYMBOL_SECTION (sym) = secnum_to_section (cs->c_secnum, objfile);
+  sym->set_section_index (secnum_to_section (cs->c_secnum, objfile));
 
   if (ISFCN (cs->c_type))
     {
       /* At this point, we don't know the type of the function.  This
-         will be patched with the type from its stab entry later on in
-         patch_block_stabs (), unless the file was compiled without -g.  */
+        will be patched with the type from its stab entry later on in
+        patch_block_stabs (), unless the file was compiled without -g.  */
 
       sym->set_linkage_name (SYMNAME_ALLOC (name, symname_alloced));
       SYMBOL_TYPE (sym) = objfile_type (objfile)->nodebug_text_symbol;
 
       SYMBOL_ACLASS_INDEX (sym) = LOC_BLOCK;
-      SYMBOL_DUP (sym, sym2);
+      sym2 = new (&objfile->objfile_obstack) symbol (*sym);
 
       if (cs->c_sclass == C_EXT || C_WEAKEXT)
        add_symbol_to_list (sym2, get_global_symbols ());
@@ -1632,7 +1626,7 @@ process_xcoff_symbol (struct coff_symbol *cs, struct objfile *objfile)
            sym = define_symbol (cs->c_value + off, cs->c_name, 0, 0, objfile);
            if (sym != NULL)
              {
-               SYMBOL_SECTION (sym) = sec;
+               sym->set_section_index (sec);
              }
            return sym;
          }
@@ -1664,7 +1658,7 @@ process_xcoff_symbol (struct coff_symbol *cs, struct objfile *objfile)
              SET_SYMBOL_VALUE_ADDRESS (sym,
                                        SYMBOL_VALUE_ADDRESS (sym)
                                        + static_block_base);
-             SYMBOL_SECTION (sym) = static_block_section;
+             sym->set_section_index (static_block_section);
            }
          return sym;
 
@@ -1821,7 +1815,7 @@ find_linenos (struct bfd *abfd, struct bfd_section *asect, void *vpinfo)
 }
 \f
 static void
-xcoff_psymtab_to_symtab_1 (legacy_psymtab *pst, struct objfile *objfile)
+xcoff_expand_psymtab (legacy_psymtab *pst, struct objfile *objfile)
 {
   gdb_assert (!pst->readin);
 
@@ -1856,7 +1850,7 @@ xcoff_read_symtab (legacy_psymtab *self, struct objfile *objfile)
       self->expand_psymtab (objfile);
 
       /* Match with global symbols.  This only needs to be done once,
-         after all of the symtabs and dependencies have been read in.   */
+        after all of the symtabs and dependencies have been read in.   */
       scan_file_globals (objfile);
     }
 }
@@ -1974,7 +1968,7 @@ xcoff_start_psymtab (struct objfile *objfile,
     XOBNEW (&objfile->objfile_obstack, struct symloc);
   ((struct symloc *) result->read_symtab_private)->first_symnum = first_symnum;
   result->legacy_read_symtab = xcoff_read_symtab;
-  result->legacy_expand_psymtab = xcoff_psymtab_to_symtab_1;
+  result->legacy_expand_psymtab = xcoff_expand_psymtab;
 
   /* Deduce the source language from the filename for this psymtab.  */
   psymtab_language = deduce_language_from_filename (filename);
@@ -2007,7 +2001,7 @@ xcoff_end_psymtab (struct objfile *objfile, legacy_psymtab *pst,
     first_fun_line_offset;
   first_fun_line_offset = 0;
 
-  end_psymtab_common (objfile, pst);
+  pst->end ();
 
   pst->number_of_dependencies = number_dependencies;
   if (number_dependencies)
@@ -2030,7 +2024,7 @@ xcoff_end_psymtab (struct objfile *objfile, legacy_psymtab *pst,
       ((struct symloc *) subpst->read_symtab_private)->numsyms = 0;
 
       /* We could save slight bits of space by only making one of these,
-         shared by the entire set of include files.  FIXME-someday.  */
+        shared by the entire set of include files.  FIXME-someday.  */
       subpst->dependencies =
        objfile->partial_symtabs->allocate_dependencies (1);
       subpst->dependencies[0] = pst;
@@ -2042,13 +2036,11 @@ xcoff_end_psymtab (struct objfile *objfile, legacy_psymtab *pst,
 
   if (num_includes == 0
       && number_dependencies == 0
-      && pst->n_global_syms == 0
-      && pst->n_static_syms == 0)
+      && pst->empty ())
     {
-      /* Throw away this psymtab, it's empty.  We can't deallocate it, since
-         it is on the obstack, but we can forget to chain it on the list.  */
+      /* Throw away this psymtab, it's empty.  */
       /* Empty psymtabs happen as a result of header files which don't have
-         any symbols in them.  There can be a lot of them.  */
+        any symbols in them.  There can be a lot of them.  */
 
       objfile->partial_symtabs->discard_psymtab (pst);
 
@@ -2071,7 +2063,7 @@ swap_sym (struct internal_syment *symbol, union internal_auxent *aux,
   if (symbol->n_zeroes)
     {
       /* If it's exactly E_SYMNMLEN characters long it isn't
-         '\0'-terminated.  */
+        '\0'-terminated.  */
       if (symbol->n_name[E_SYMNMLEN - 1] != '\0')
        {
          /* FIXME: wastes memory for symbols which we don't end up putting
@@ -2121,7 +2113,6 @@ static void
 scan_xcoff_symtab (minimal_symbol_reader &reader,
                   struct objfile *objfile)
 {
-  struct gdbarch *gdbarch = get_objfile_arch (objfile);
   CORE_ADDR toc_offset = 0;    /* toc offset value in data section.  */
   const char *filestring = NULL;
 
@@ -2584,29 +2575,25 @@ scan_xcoff_symtab (minimal_symbol_reader &reader,
            switch (p[1])
              {
              case 'S':
-               if (gdbarch_static_transform_name_p (gdbarch))
-                 namestring = gdbarch_static_transform_name
-                                (gdbarch, namestring);
-
-               add_psymbol_to_list (gdb::string_view (namestring,
-                                                      p - namestring),
-                                    true, VAR_DOMAIN, LOC_STATIC,
-                                    SECT_OFF_DATA (objfile),
-                                    psymbol_placement::STATIC,
-                                    symbol.n_value,
-                                    psymtab_language, objfile);
+               pst->add_psymbol (gdb::string_view (namestring,
+                                                   p - namestring),
+                                 true, VAR_DOMAIN, LOC_STATIC,
+                                 SECT_OFF_DATA (objfile),
+                                 psymbol_placement::STATIC,
+                                 symbol.n_value,
+                                 psymtab_language, objfile);
                continue;
 
              case 'G':
                /* The addresses in these entries are reported to be
                   wrong.  See the code that reads 'G's for symtabs.  */
-               add_psymbol_to_list (gdb::string_view (namestring,
-                                                      p - namestring),
-                                    true, VAR_DOMAIN, LOC_STATIC,
-                                    SECT_OFF_DATA (objfile),
-                                    psymbol_placement::GLOBAL,
-                                    symbol.n_value,
-                                    psymtab_language, objfile);
+               pst->add_psymbol (gdb::string_view (namestring,
+                                                   p - namestring),
+                                 true, VAR_DOMAIN, LOC_STATIC,
+                                 SECT_OFF_DATA (objfile),
+                                 psymbol_placement::GLOBAL,
+                                 symbol.n_value,
+                                 psymtab_language, objfile);
                continue;
 
              case 'T':
@@ -2620,19 +2607,19 @@ scan_xcoff_symtab (minimal_symbol_reader &reader,
                    || (p == namestring + 1
                        && namestring[0] != ' '))
                  {
-                   add_psymbol_to_list (gdb::string_view (namestring,
-                                                          p - namestring),
-                                        true, STRUCT_DOMAIN, LOC_TYPEDEF, -1,
-                                        psymbol_placement::STATIC,
-                                        0, psymtab_language, objfile);
+                   pst->add_psymbol (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 (gdb::string_view (namestring,
-                                                              p - namestring),
-                                            true, VAR_DOMAIN, LOC_TYPEDEF, -1,
-                                            psymbol_placement::STATIC,
-                                            0, psymtab_language, objfile);
+                       pst->add_psymbol (gdb::string_view (namestring,
+                                                           p - namestring),
+                                         true, VAR_DOMAIN, LOC_TYPEDEF, -1,
+                                         psymbol_placement::STATIC,
+                                         0, psymtab_language, objfile);
                        p += 1;
                      }
                  }
@@ -2641,11 +2628,11 @@ scan_xcoff_symtab (minimal_symbol_reader &reader,
              case 't':
                if (p != namestring)    /* a name is there, not just :T...  */
                  {
-                   add_psymbol_to_list (gdb::string_view (namestring,
-                                                          p - namestring),
-                                        true, VAR_DOMAIN, LOC_TYPEDEF, -1,
-                                        psymbol_placement::STATIC,
-                                        0, psymtab_language, objfile);
+                   pst->add_psymbol (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
@@ -2704,10 +2691,10 @@ scan_xcoff_symtab (minimal_symbol_reader &reader,
                          ;
                        /* Note that the value doesn't matter for
                           enum constants in psymtabs, just in symtabs.  */
-                       add_psymbol_to_list (gdb::string_view (p, q - p), true,
-                                            VAR_DOMAIN, LOC_CONST, -1,
-                                            psymbol_placement::STATIC,
-                                            0, psymtab_language, objfile);
+                       pst->add_psymbol (gdb::string_view (p, q - p), true,
+                                         VAR_DOMAIN, LOC_CONST, -1,
+                                         psymbol_placement::STATIC,
+                                         0, psymtab_language, objfile);
                        /* Point past the name.  */
                        p = q;
                        /* Skip over the value.  */
@@ -2722,11 +2709,11 @@ scan_xcoff_symtab (minimal_symbol_reader &reader,
 
              case 'c':
                /* Constant, e.g. from "const" in Pascal.  */
-               add_psymbol_to_list (gdb::string_view (namestring,
-                                                      p - namestring),
-                                    true, VAR_DOMAIN, LOC_CONST, -1,
-                                    psymbol_placement::STATIC,
-                                    0, psymtab_language, objfile);
+               pst->add_psymbol (gdb::string_view (namestring,
+                                                   p - namestring),
+                                 true, VAR_DOMAIN, LOC_CONST, -1,
+                                 psymbol_placement::STATIC,
+                                 0, psymtab_language, objfile);
                continue;
 
              case 'f':
@@ -2740,13 +2727,13 @@ scan_xcoff_symtab (minimal_symbol_reader &reader,
                    function_outside_compilation_unit_complaint (name);
                    xfree (name);
                  }
-               add_psymbol_to_list (gdb::string_view (namestring,
-                                                      p - namestring),
-                                    true, VAR_DOMAIN, LOC_BLOCK,
-                                    SECT_OFF_TEXT (objfile),
-                                    psymbol_placement::STATIC,
-                                    symbol.n_value,
-                                    psymtab_language, objfile);
+               pst->add_psymbol (gdb::string_view (namestring,
+                                                   p - namestring),
+                                 true, VAR_DOMAIN, LOC_BLOCK,
+                                 SECT_OFF_TEXT (objfile),
+                                 psymbol_placement::STATIC,
+                                 symbol.n_value,
+                                 psymtab_language, objfile);
                continue;
 
                /* Global functions were ignored here, but now they
@@ -2771,13 +2758,13 @@ scan_xcoff_symtab (minimal_symbol_reader &reader,
                if (startswith (namestring, "@FIX"))
                  continue;
 
-               add_psymbol_to_list (gdb::string_view (namestring,
-                                                      p - namestring),
-                                    true, VAR_DOMAIN, LOC_BLOCK,
-                                    SECT_OFF_TEXT (objfile),
-                                    psymbol_placement::GLOBAL,
-                                    symbol.n_value,
-                                    psymtab_language, objfile);
+               pst->add_psymbol (gdb::string_view (namestring,
+                                                   p - namestring),
+                                 true, VAR_DOMAIN, LOC_BLOCK,
+                                 SECT_OFF_TEXT (objfile),
+                                 psymbol_placement::GLOBAL,
+                                 symbol.n_value,
+                                 psymtab_language, objfile);
                continue;
 
                /* Two things show up here (hopefully); static symbols of
@@ -2936,12 +2923,6 @@ xcoff_initial_scan (struct objfile *objfile, symfile_add_flags symfile_flags)
   if (val != size)
     perror_with_name (_("reading symbol table"));
 
-  /* I'm not sure how how good num_symbols is; the rule of thumb in
-     init_psymbol_list was developed for a.out.  On the one hand,
-     num_symbols includes auxents.  On the other hand, it doesn't
-     include N_SLINE.  */
-  init_psymbol_list (objfile, num_symbols);
-
   scoped_free_pendings free_pending;
   minimal_symbol_reader reader (objfile);
 
This page took 0.034867 seconds and 4 git commands to generate.