Change section_offsets to a std::vector
[deliverable/binutils-gdb.git] / gdb / mipsread.c
index 697f784ed567f3d9736286f71bf3dd5d06ed3f73..2c11873d4449ce6021335f833779c0f82ecf3355 100644 (file)
@@ -1,8 +1,6 @@
 /* Read a symbol table in MIPS' format (Third-Eye).
 
-   Copyright (C) 1986, 1987, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
-   1998, 1999, 2000, 2001, 2003, 2004, 2007, 2008, 2009, 2010, 2011
-   Free Software Foundation, Inc.
+   Copyright (C) 1986-2020 Free Software Foundation, Inc.
 
    Contributed by Alessandro Forin (af@cs.cmu.edu) at CMU.  Major work
    by Per Bothner, John Gilmore and Ian Lance Taylor at Cygnus Support.
    mdebugread.c.  */
 
 #include "defs.h"
-#include "gdb_string.h"
 #include "bfd.h"
 #include "symtab.h"
 #include "objfiles.h"
-#include "buildsym.h"
 #include "stabsread.h"
+#include "mdebugread.h"
 
 #include "coff/sym.h"
 #include "coff/internal.h"
@@ -45,7 +42,7 @@
 #include "psymtab.h"
 
 static void
-read_alphacoff_dynamic_symtab (struct section_offsets *,
+read_alphacoff_dynamic_symtab (minimal_symbol_reader &,
                               struct objfile *objfile);
 
 /* Initialize anything that needs initializing when a completely new
@@ -56,7 +53,6 @@ static void
 mipscoff_new_init (struct objfile *ignore)
 {
   stabsread_new_init ();
-  buildsym_new_init ();
 }
 
 /* Initialize to read a symbol file (nothing to do).  */
@@ -69,33 +65,30 @@ mipscoff_symfile_init (struct objfile *objfile)
 /* Read a symbol file from a file.  */
 
 static void
-mipscoff_symfile_read (struct objfile *objfile, int symfile_flags)
+mipscoff_symfile_read (struct objfile *objfile, symfile_add_flags symfile_flags)
 {
   bfd *abfd = objfile->obfd;
-  struct cleanup *back_to;
 
-  init_minimal_symbol_collection ();
-  back_to = make_cleanup_discard_minimal_symbols ();
+  minimal_symbol_reader reader (objfile);
 
   /* Now that the executable file is positioned at symbol table,
      process it and define symbols accordingly.  */
 
   if (!((*ecoff_backend (abfd)->debug_swap.read_debug_info)
-       (abfd, (asection *) NULL, &ecoff_data (abfd)->debug_info)))
+       (abfd, NULL, &ecoff_data (abfd)->debug_info)))
     error (_("Error reading symbol table: %s"), bfd_errmsg (bfd_get_error ()));
 
-  mdebug_build_psymtabs (objfile, &ecoff_backend (abfd)->debug_swap,
+  mdebug_build_psymtabs (reader, objfile, &ecoff_backend (abfd)->debug_swap,
                         &ecoff_data (abfd)->debug_info);
 
   /* Add alpha coff dynamic symbols.  */
 
-  read_alphacoff_dynamic_symtab (objfile->section_offsets, objfile);
+  read_alphacoff_dynamic_symtab (reader, objfile);
 
   /* Install any minimal symbols that have been collected as the current
      minimal symbols for this objfile.  */
 
-  install_minimal_symbols (objfile);
-  do_cleanups (back_to);
+  reader.install ();
 }
 
 /* Perform any local cleanups required when we are done with a
@@ -179,29 +172,20 @@ alphacoff_locate_sections (bfd *ignore_abfd, asection *sectp, void *sip)
    them to the minimal symbol table.  */
 
 static void
-read_alphacoff_dynamic_symtab (struct section_offsets *section_offsets,
+read_alphacoff_dynamic_symtab (minimal_symbol_reader &reader,
                               struct objfile *objfile)
 {
   bfd *abfd = objfile->obfd;
   struct alphacoff_dynsecinfo si;
-  char *sym_secptr;
-  char *str_secptr;
-  char *dyninfo_secptr;
-  char *got_secptr;
-  bfd_size_type sym_secsize;
-  bfd_size_type str_secsize;
-  bfd_size_type dyninfo_secsize;
-  bfd_size_type got_secsize;
   int sym_count;
   int i;
   int stripped;
   Elfalpha_External_Sym *x_symp;
-  char *dyninfo_p;
-  char *dyninfo_end;
+  gdb_byte *dyninfo_p;
+  gdb_byte *dyninfo_end;
   int got_entry_size = 8;
   int dt_mips_local_gotno = -1;
   int dt_mips_gotsym = -1;
-  struct cleanup *cleanups;
 
   /* We currently only know how to handle alpha dynamic symbols.  */
   if (bfd_get_arch (abfd) != bfd_arch_alpha)
@@ -214,35 +198,28 @@ read_alphacoff_dynamic_symtab (struct section_offsets *section_offsets,
       || si.dyninfo_sect == NULL || si.got_sect == NULL)
     return;
 
-  sym_secsize = bfd_get_section_size (si.sym_sect);
-  str_secsize = bfd_get_section_size (si.str_sect);
-  dyninfo_secsize = bfd_get_section_size (si.dyninfo_sect);
-  got_secsize = bfd_get_section_size (si.got_sect);
-  sym_secptr = xmalloc (sym_secsize);
-  cleanups = make_cleanup (xfree, sym_secptr);
-  str_secptr = xmalloc (str_secsize);
-  make_cleanup (xfree, str_secptr);
-  dyninfo_secptr = xmalloc (dyninfo_secsize);
-  make_cleanup (xfree, dyninfo_secptr);
-  got_secptr = xmalloc (got_secsize);
-  make_cleanup (xfree, got_secptr);
-
-  if (!bfd_get_section_contents (abfd, si.sym_sect, sym_secptr,
-                                (file_ptr) 0, sym_secsize))
+  gdb::byte_vector sym_sec (bfd_section_size (si.sym_sect));
+  gdb::byte_vector str_sec (bfd_section_size (si.str_sect));
+  gdb::byte_vector dyninfo_sec (bfd_section_size (si.dyninfo_sect));
+  gdb::byte_vector got_sec (bfd_section_size (si.got_sect));
+
+  if (!bfd_get_section_contents (abfd, si.sym_sect, sym_sec.data (),
+                                (file_ptr) 0, sym_sec.size ()))
     return;
-  if (!bfd_get_section_contents (abfd, si.str_sect, str_secptr,
-                                (file_ptr) 0, str_secsize))
+  if (!bfd_get_section_contents (abfd, si.str_sect, str_sec.data (),
+                                (file_ptr) 0, str_sec.size ()))
     return;
-  if (!bfd_get_section_contents (abfd, si.dyninfo_sect, dyninfo_secptr,
-                                (file_ptr) 0, dyninfo_secsize))
+  if (!bfd_get_section_contents (abfd, si.dyninfo_sect, dyninfo_sec.data (),
+                                (file_ptr) 0, dyninfo_sec.size ()))
     return;
-  if (!bfd_get_section_contents (abfd, si.got_sect, got_secptr,
-                                (file_ptr) 0, got_secsize))
+  if (!bfd_get_section_contents (abfd, si.got_sect, got_sec.data (),
+                                (file_ptr) 0, got_sec.size ()))
     return;
 
-  /* Find the number of local GOT entries and the index for the the
+  /* Find the number of local GOT entries and the index for the
      first dynamic symbol in the GOT.  */
-  for (dyninfo_p = dyninfo_secptr, dyninfo_end = dyninfo_p + dyninfo_secsize;
+  for ((dyninfo_p = dyninfo_sec.data (),
+       dyninfo_end = dyninfo_p + dyninfo_sec.size ());
        dyninfo_p < dyninfo_end;
        dyninfo_p += sizeof (Elfalpha_External_Dyn))
     {
@@ -270,11 +247,11 @@ read_alphacoff_dynamic_symtab (struct section_offsets *section_offsets,
 
   /* Scan all dynamic symbols and enter them into the minimal symbol
      table if appropriate.  */
-  sym_count = sym_secsize / sizeof (Elfalpha_External_Sym);
+  sym_count = sym_sec.size () / sizeof (Elfalpha_External_Sym);
   stripped = (bfd_get_symcount (abfd) == 0);
 
   /* Skip first symbol, which is a null dummy.  */
-  for (i = 1, x_symp = (Elfalpha_External_Sym *) sym_secptr + 1;
+  for (i = 1, x_symp = (Elfalpha_External_Sym *) sym_sec.data () + 1;
        i < sym_count;
        i++, x_symp++)
     {
@@ -287,9 +264,9 @@ read_alphacoff_dynamic_symtab (struct section_offsets *section_offsets,
       enum minimal_symbol_type ms_type;
 
       strx = bfd_h_get_32 (abfd, (bfd_byte *) x_symp->st_name);
-      if (strx >= str_secsize)
+      if (strx >= str_sec.size ())
        continue;
-      name = str_secptr + strx;
+      name = (char *) (str_sec.data () + strx);
       if (*name == '\0' || *name == '.')
        continue;
 
@@ -330,11 +307,13 @@ read_alphacoff_dynamic_symtab (struct section_offsets *section_offsets,
              int got_entry_offset =
                (i - dt_mips_gotsym + dt_mips_local_gotno) * got_entry_size;
 
-             if (got_entry_offset < 0 || got_entry_offset >= got_secsize)
+             if (got_entry_offset < 0
+                 || got_entry_offset >= got_sec.size ())
                continue;
              sym_value =
                bfd_h_get_64 (abfd,
-                             (bfd_byte *) (got_secptr + got_entry_offset));
+                             (bfd_byte *) (got_sec.data ()
+                                           + got_entry_offset));
              if (sym_value == 0)
                continue;
            }
@@ -354,7 +333,6 @@ read_alphacoff_dynamic_symtab (struct section_offsets *section_offsets,
                ms_type = mst_text;
              else
                ms_type = mst_file_text;
-             sym_value += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
            }
          else if (sym_shndx == SHN_MIPS_DATA)
            {
@@ -362,7 +340,6 @@ read_alphacoff_dynamic_symtab (struct section_offsets *section_offsets,
                ms_type = mst_data;
              else
                ms_type = mst_file_data;
-             sym_value += ANOFFSET (section_offsets, SECT_OFF_DATA (objfile));
            }
          else if (sym_shndx == SHN_MIPS_ACOMMON)
            {
@@ -370,7 +347,6 @@ read_alphacoff_dynamic_symtab (struct section_offsets *section_offsets,
                ms_type = mst_bss;
              else
                ms_type = mst_file_bss;
-             sym_value += ANOFFSET (section_offsets, SECT_OFF_BSS (objfile));
            }
          else if (sym_shndx == SHN_ABS)
            {
@@ -382,33 +358,29 @@ read_alphacoff_dynamic_symtab (struct section_offsets *section_offsets,
            }
        }
 
-      prim_record_minimal_symbol (name, sym_value, ms_type, objfile);
+      reader.record (name, sym_value, ms_type);
     }
-
-  do_cleanups (cleanups);
 }
 
 /* Initialization.  */
 
 static const struct sym_fns ecoff_sym_fns =
 {
-  bfd_target_ecoff_flavour,
   mipscoff_new_init,           /* init anything gbl to entire symtab */
   mipscoff_symfile_init,       /* read initial info, setup for sym_read() */
   mipscoff_symfile_read,       /* read a symbol file into symtab */
+  NULL,                                /* sym_read_psymbols */
   mipscoff_symfile_finish,     /* finished with file, cleanup */
   default_symfile_offsets,     /* dummy FIXME til implem sym reloc */
   default_symfile_segments,    /* Get segment information from a file.  */
   NULL,
   default_symfile_relocate,    /* Relocate a debug section.  */
+  NULL,                                /* sym_probe_fns */
   &psym_functions
 };
 
-/* Provide a prototype to silence -Wmissing-prototypes.  */
-void _initialize_mipsread (void);
-
 void
 _initialize_mipsread (void)
 {
-  add_symtab_fns (&ecoff_sym_fns);
+  add_symtab_fns (bfd_target_ecoff_flavour, &ecoff_sym_fns);
 }
This page took 0.027178 seconds and 4 git commands to generate.