Record minimal symbols directly in reader.
authorTom Tromey <tom@tromey.com>
Thu, 22 Sep 2016 20:25:08 +0000 (14:25 -0600)
committerTom Tromey <tom@tromey.com>
Fri, 21 Oct 2016 20:17:33 +0000 (14:17 -0600)
This patch changes minimal symbol creation in two ways.  First, it
removes global variables in favor of members of minimal_symbol_reader.
Second, it changes functions like prim_record_minimal_symbol to be
member functions of minimal_symbol_reader.

2016-10-21  Tom Tromey  <tom@tromey.com>

* xcoffread.c (record_minimal_symbol, scan_xcoff_symtab): Add
"reader" argument.  Update.
(xcoff_initial_scan): Update.
* symfile.h (mdebug_build_psymtabs): Add "reader" argument.
* mipsread.c (mipscoff_symfile_read): Update.
(read_alphacoff_dynamic_symtab): Add "reader" argument.  Update.
* minsyms.h (minimal_symbol_reader) <record, record_full>:
Declare.
<m_msym_bunch, m_msym_bunch_index, m_msym_count>: New members.
<record_with_info>: New function, renamed from
prim_record_minimal_symbol_and_info.
* minsyms.c (msym_bunch, msym_bunch_index, msym_count): Remove
globals.
(minimal_symbol_reader): Initialize new members.
(minimal_symbol_reader::record): Renamed from
prim_record_minimal_symbol.
(minimal_symbol_reader::record_full): Renamed from
prim_record_minimal_symbol_full.
(prim_record_minimal_symbol_and_info): Move to minsyms.h; rename.
* mdebugread.c (mdebug_build_psymtabs, parse_partial_symbols)
(record_minimal_symbol): Add "reader" argument.  Update.
(elfmdebug_build_psymtabs): Update.
* machoread.c (macho_symtab_add_minsym, macho_symtab_read): Add
"reader" argument.  Update.
(macho_symfile_read): Update.
* elfread.c (record_minimal_symbol, elf_symtab_read)
(elf_rel_plt_read): Add "reader" argument.  Update.
(elf_read_minimal_symbols): Update.
* dbxread.c (record_minimal_symbol, read_dbx_dynamic_symtab)
(read_dbx_symtab): Add "reader" argument.  Update.
(dbx_symfile_read): Update.
* coffread.c (record_minimal_symbol, coff_symtab_read): Add
"reader" argument.  Update.
(coff_symfile_read): Update.
* coff-pe-read.h (read_pe_exported_syms): Add "reader" argument.
* coff-pe-read.c (add_pe_exported_sym, add_pe_forwarded_sym)
(read_pe_exported_syms): Add "reader" argument.  Update.

13 files changed:
gdb/ChangeLog
gdb/coff-pe-read.c
gdb/coff-pe-read.h
gdb/coffread.c
gdb/dbxread.c
gdb/elfread.c
gdb/machoread.c
gdb/mdebugread.c
gdb/minsyms.c
gdb/minsyms.h
gdb/mipsread.c
gdb/symfile.h
gdb/xcoffread.c

index e8a997acc33443b3f27abf3966a2ea824e0b9aa2..b242be74a57430dfe18612f7a3dbd477bf242a00 100644 (file)
@@ -1,3 +1,43 @@
+2016-10-21  Tom Tromey  <tom@tromey.com>
+
+       * xcoffread.c (record_minimal_symbol, scan_xcoff_symtab): Add
+       "reader" argument.  Update.
+       (xcoff_initial_scan): Update.
+       * symfile.h (mdebug_build_psymtabs): Add "reader" argument.
+       * mipsread.c (mipscoff_symfile_read): Update.
+       (read_alphacoff_dynamic_symtab): Add "reader" argument.  Update.
+       * minsyms.h (minimal_symbol_reader) <record, record_full>:
+       Declare.
+       <m_msym_bunch, m_msym_bunch_index, m_msym_count>: New members.
+       <record_with_info>: New function, renamed from
+       prim_record_minimal_symbol_and_info.
+       * minsyms.c (msym_bunch, msym_bunch_index, msym_count): Remove
+       globals.
+       (minimal_symbol_reader): Initialize new members.
+       (minimal_symbol_reader::record): Renamed from
+       prim_record_minimal_symbol.
+       (minimal_symbol_reader::record_full): Renamed from
+       prim_record_minimal_symbol_full.
+       (prim_record_minimal_symbol_and_info): Move to minsyms.h; rename.
+       * mdebugread.c (mdebug_build_psymtabs, parse_partial_symbols)
+       (record_minimal_symbol): Add "reader" argument.  Update.
+       (elfmdebug_build_psymtabs): Update.
+       * machoread.c (macho_symtab_add_minsym, macho_symtab_read): Add
+       "reader" argument.  Update.
+       (macho_symfile_read): Update.
+       * elfread.c (record_minimal_symbol, elf_symtab_read)
+       (elf_rel_plt_read): Add "reader" argument.  Update.
+       (elf_read_minimal_symbols): Update.
+       * dbxread.c (record_minimal_symbol, read_dbx_dynamic_symtab)
+       (read_dbx_symtab): Add "reader" argument.  Update.
+       (dbx_symfile_read): Update.
+       * coffread.c (record_minimal_symbol, coff_symtab_read): Add
+       "reader" argument.  Update.
+       (coff_symfile_read): Update.
+       * coff-pe-read.h (read_pe_exported_syms): Add "reader" argument.
+       * coff-pe-read.c (add_pe_exported_sym, add_pe_forwarded_sym)
+       (read_pe_exported_syms): Add "reader" argument.  Update.
+
 2016-10-21  Tom Tromey  <tom@tromey.com>
 
        * xcoffread.c (xcoff_initial_scan): Update.
index 883636131f3a19f4e707ca757bb7c6cc77956a92..b0201d18d5d28adc89b3fe850932942d6a6a0e1b 100644 (file)
@@ -150,7 +150,8 @@ get_section_vmas (bfd *abfd, asection *sectp, void *context)
    OBJFILE is the objfile struct of DLL_NAME.  */
 
 static void
-add_pe_exported_sym (const char *sym_name,
+add_pe_exported_sym (minimal_symbol_reader &reader,
+                    const char *sym_name,
                     unsigned long func_rva,
                     int ordinal,
                     const struct read_pe_section_data *section_data,
@@ -176,13 +177,12 @@ add_pe_exported_sym (const char *sym_name,
                        " for entry \"%s\" in dll \"%s\"\n"),
                        section_data->section_name, sym_name, dll_name);
 
-  prim_record_minimal_symbol_and_info (qualified_name, vma,
-                                      section_data->ms_type,
-                                      section_data->index, objfile);
+  reader.record_with_info (qualified_name, vma, section_data->ms_type,
+                          section_data->index);
 
   /* Enter the plain name as well, which might not be unique.  */
-  prim_record_minimal_symbol_and_info (bare_name, vma, section_data->ms_type,
-                                      section_data->index, objfile);
+  reader.record_with_info (bare_name, vma, section_data->ms_type,
+                          section_data->index);
   if (debug_coff_pe_read > 1)
     fprintf_unfiltered (gdb_stdlog, _("Adding exported symbol \"%s\""
                        " in dll \"%s\"\n"), sym_name, dll_name);
@@ -200,7 +200,8 @@ add_pe_exported_sym (const char *sym_name,
    OBJFILE is the objfile struct of DLL_NAME.  */
 
 static int
-add_pe_forwarded_sym (const char *sym_name, const char *forward_dll_name,
+add_pe_forwarded_sym (minimal_symbol_reader &reader,
+                     const char *sym_name, const char *forward_dll_name,
                      const char *forward_func_name, int ordinal,
                      const char *dll_name, struct objfile *objfile)
 {
@@ -266,12 +267,10 @@ add_pe_forwarded_sym (const char *sym_name, const char *forward_dll_name,
      code.  */
   baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
 
-  prim_record_minimal_symbol_and_info (qualified_name, vma - baseaddr,
-                                      msymtype, section, objfile);
+  reader.record_with_info (qualified_name, vma - baseaddr, msymtype, section);
 
   /* Enter the plain name as well, which might not be unique.  */
-  prim_record_minimal_symbol_and_info (bare_name, vma - baseaddr, msymtype,
-                                      section, objfile);
+  reader.record_with_info (bare_name, vma - baseaddr, msymtype, section);
   xfree (qualified_name);
   xfree (bare_name);
 
@@ -331,7 +330,8 @@ pe_as32 (void *ptr)
    pe_implied_import_dll in pe-dll.c.  */
 
 void
-read_pe_exported_syms (struct objfile *objfile)
+read_pe_exported_syms (minimal_symbol_reader &reader,
+                      struct objfile *objfile)
 {
   bfd *dll = objfile->obfd;
   unsigned long nbnormal, nbforward;
@@ -580,7 +580,7 @@ read_pe_exported_syms (struct objfile *objfile)
              forward_dll_name[len] = '\0';
              forward_func_name = ++sep;
            }
-         if (add_pe_forwarded_sym (funcname, forward_dll_name,
+         if (add_pe_forwarded_sym (reader, funcname, forward_dll_name,
                                    forward_func_name, ordinal,
                                    dll_name, objfile) != 0)
            ++nbforward;
@@ -595,7 +595,7 @@ read_pe_exported_syms (struct objfile *objfile)
              char *sym_name = (char *) (erva + name_rva);
 
              section_found = 1;
-             add_pe_exported_sym (sym_name, func_rva, ordinal,
+             add_pe_exported_sym (reader, sym_name, func_rva, ordinal,
                                   section_data + sectix, dll_name, objfile);
              ++nbnormal;
              break;
@@ -607,7 +607,7 @@ read_pe_exported_syms (struct objfile *objfile)
 
          if (name_rva == 0)
            {
-             add_pe_exported_sym (NULL, func_rva, ordinal,
+             add_pe_exported_sym (reader, NULL, func_rva, ordinal,
                                   section_data, dll_name, objfile);
              ++nbnormal;
            }
index 8a74a6033e7fff22f2eaffb12b09b058b1627d49..6a82e4cfd2a26f49f1f20a223686bc7f76fd2212 100644 (file)
@@ -27,7 +27,8 @@ struct bfd;
 
 /* Read the export table and convert it to minimal symbol table
    entries */
-extern void read_pe_exported_syms (struct objfile *objfile);
+extern void read_pe_exported_syms (minimal_symbol_reader &reader,
+                                  struct objfile *objfile);
 
 /* Extract from ABFD the offset of the .text section.
    Returns default value 0x1000 if information is not found.  */
index b4de08e76ff0cd06ad7ed11487ff7b5caa657964..3125fb1d557b677458e271dab8cbbceb42658200 100644 (file)
@@ -207,7 +207,8 @@ static void read_one_sym (struct coff_symbol *,
                          struct internal_syment *,
                          union internal_auxent *);
 
-static void coff_symtab_read (long, unsigned int, struct objfile *);
+static void coff_symtab_read (minimal_symbol_reader &,
+                             long, unsigned int, struct objfile *);
 \f
 /* We are called once per section from coff_symfile_read.  We
    need to examine each section we are passed, check to see
@@ -461,7 +462,8 @@ is_import_fixup_symbol (struct coff_symbol *cs,
 }
 
 static struct minimal_symbol *
-record_minimal_symbol (struct coff_symbol *cs, CORE_ADDR address,
+record_minimal_symbol (minimal_symbol_reader &reader,
+                      struct coff_symbol *cs, CORE_ADDR address,
                       enum minimal_symbol_type type, int section, 
                       struct objfile *objfile)
 {
@@ -479,8 +481,7 @@ record_minimal_symbol (struct coff_symbol *cs, CORE_ADDR address,
       return NULL;
     }
 
-  return prim_record_minimal_symbol_and_info (cs->c_name, address,
-                                             type, section, objfile);
+  return reader.record_with_info (cs->c_name, address, type, section);
 }
 \f
 /* coff_symfile_init ()
@@ -650,7 +651,7 @@ coff_symfile_read (struct objfile *objfile, int symfile_flags)
   /* Now that the executable file is positioned at symbol table,
      process it and define symbols accordingly.  */
 
-  coff_symtab_read ((long) symtab_offset, num_symbols, objfile);
+  coff_symtab_read (reader, (long) symtab_offset, num_symbols, objfile);
 
   /* Install any minimal symbols that have been collected as the
      current minimal symbols for this objfile.  */
@@ -778,7 +779,8 @@ coff_symfile_finish (struct objfile *objfile)
    We read them one at a time using read_one_sym ().  */
 
 static void
-coff_symtab_read (long symtab_offset, unsigned int nsyms,
+coff_symtab_read (minimal_symbol_reader &reader,
+                 long symtab_offset, unsigned int nsyms,
                  struct objfile *objfile)
 {
   struct gdbarch *gdbarch = get_objfile_arch (objfile);
@@ -876,7 +878,7 @@ coff_symtab_read (long symtab_offset, unsigned int nsyms,
          int section = cs_to_section (cs, objfile);
 
          tmpaddr = cs->c_value;
-         record_minimal_symbol (cs, tmpaddr, mst_text,
+         record_minimal_symbol (reader, cs, tmpaddr, mst_text,
                                 section, objfile);
 
          fcn_line_ptr = main_aux.x_sym.x_fcnary.x_fcn.x_lnnoptr;
@@ -1036,7 +1038,7 @@ coff_symtab_read (long symtab_offset, unsigned int nsyms,
                  ms_type = mst_unknown;
              }
 
-           msym = record_minimal_symbol (cs, tmpaddr, ms_type,
+           msym = record_minimal_symbol (reader, cs, tmpaddr, ms_type,
                                          sec, objfile);
            if (msym)
              gdbarch_coff_make_msymbol_special (gdbarch,
@@ -1198,7 +1200,7 @@ coff_symtab_read (long symtab_offset, unsigned int nsyms,
     {
       /* We've got no debugging symbols, but it's a portable
         executable, so try to read the export table.  */
-      read_pe_exported_syms (objfile);
+      read_pe_exported_syms (reader, objfile);
     }
 
   if (get_last_source_file ())
index a5bb2e05c63843d0f9ccb23fc870ff77d729bfa2..9e6df696ed1a86c0704328582ed358044d31ca83 100644 (file)
@@ -262,9 +262,10 @@ static void dbx_read_symtab (struct partial_symtab *self,
 
 static void dbx_psymtab_to_symtab_1 (struct objfile *, struct partial_symtab *);
 
-static void read_dbx_dynamic_symtab (struct objfile *objfile);
+static void read_dbx_dynamic_symtab (minimal_symbol_reader &reader,
+                                    struct objfile *objfile);
 
-static void read_dbx_symtab (struct objfile *);
+static void read_dbx_symtab (minimal_symbol_reader &, struct objfile *);
 
 static void free_bincl_list (struct objfile *);
 
@@ -286,7 +287,8 @@ static void dbx_symfile_read (struct objfile *, int);
 
 static void dbx_symfile_finish (struct objfile *);
 
-static void record_minimal_symbol (const char *, CORE_ADDR, int,
+static void record_minimal_symbol (minimal_symbol_reader &,
+                                  const char *, CORE_ADDR, int,
                                   struct objfile *);
 
 static void add_new_header_file (char *, int);
@@ -429,7 +431,8 @@ explicit_lookup_type (int real_filenum, int index)
 #endif
 \f
 static void
-record_minimal_symbol (const char *name, CORE_ADDR address, int type,
+record_minimal_symbol (minimal_symbol_reader &reader,
+                      const char *name, CORE_ADDR address, int type,
                       struct objfile *objfile)
 {
   enum minimal_symbol_type ms_type;
@@ -508,8 +511,7 @@ record_minimal_symbol (const char *name, CORE_ADDR address, int type,
       && address < lowest_text_address)
     lowest_text_address = address;
 
-  prim_record_minimal_symbol_and_info
-    (name, address, ms_type, section, objfile);
+  reader.record_with_info (name, address, ms_type, section);
 }
 \f
 /* Scan and build partial symbols for a symbol file.
@@ -562,11 +564,11 @@ dbx_symfile_read (struct objfile *objfile, int symfile_flags)
 
   /* Read stabs data from executable file and define symbols.  */
 
-  read_dbx_symtab (objfile);
+  read_dbx_symtab (reader, objfile);
 
   /* Add the dynamic symbols.  */
 
-  read_dbx_dynamic_symtab (objfile);
+  read_dbx_dynamic_symtab (reader, objfile);
 
   /* Install any minimal symbols that have been collected as the current
      minimal symbols for this objfile.  */
@@ -978,7 +980,8 @@ set_namestring (struct objfile *objfile, const struct internal_nlist *nlist)
    add them to the minimal symbol table.  */
 
 static void
-read_dbx_dynamic_symtab (struct objfile *objfile)
+read_dbx_dynamic_symtab (minimal_symbol_reader &reader,
+                        struct objfile *objfile)
 {
   bfd *abfd = objfile->obfd;
   struct cleanup *back_to;
@@ -1052,7 +1055,7 @@ read_dbx_dynamic_symtab (struct objfile *objfile)
          if (sym->flags & BSF_GLOBAL)
            type |= N_EXT;
 
-         record_minimal_symbol (bfd_asymbol_name (sym), sym_value,
+         record_minimal_symbol (reader, bfd_asymbol_name (sym), sym_value,
                                 type, objfile);
        }
     }
@@ -1105,8 +1108,7 @@ read_dbx_dynamic_symtab (struct objfile *objfile)
        }
 
       name = bfd_asymbol_name (*rel->sym_ptr_ptr);
-      prim_record_minimal_symbol (name, address, mst_solib_trampoline,
-                                 objfile);
+      reader.record (name, address, mst_solib_trampoline);
     }
 
   do_cleanups (back_to);
@@ -1169,7 +1171,7 @@ function_outside_compilation_unit_complaint (const char *arg1)
    debugging information is available.  */
 
 static void
-read_dbx_symtab (struct objfile *objfile)
+read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
 {
   struct gdbarch *gdbarch = get_objfile_arch (objfile);
   struct external_nlist *bufp = 0;     /* =0 avoids gcc -Wall glitch.  */
@@ -1325,7 +1327,7 @@ read_dbx_symtab (struct objfile *objfile)
          record_it:
          namestring = set_namestring (objfile, &nlist);
 
-         record_minimal_symbol (namestring, nlist.n_value,
+         record_minimal_symbol (reader, namestring, nlist.n_value,
                                 nlist.n_type, objfile);        /* Always */
          continue;
 
index 58e0cbc1da11410c45f1985f31fe746c8555b105..56fac2831e7f47ae2abdb367b7edf018ef5c06ab 100644 (file)
@@ -191,7 +191,8 @@ elf_locate_sections (bfd *ignore_abfd, asection *sectp, void *eip)
 }
 
 static struct minimal_symbol *
-record_minimal_symbol (const char *name, int name_len, int copy_name,
+record_minimal_symbol (minimal_symbol_reader &reader,
+                      const char *name, int name_len, int copy_name,
                       CORE_ADDR address,
                       enum minimal_symbol_type ms_type,
                       asection *bfd_section, struct objfile *objfile)
@@ -202,11 +203,10 @@ record_minimal_symbol (const char *name, int name_len, int copy_name,
       || ms_type == mst_text_gnu_ifunc)
     address = gdbarch_addr_bits_remove (gdbarch, address);
 
-  return prim_record_minimal_symbol_full (name, name_len, copy_name, address,
-                                         ms_type,
-                                         gdb_bfd_section_index (objfile->obfd,
-                                                                bfd_section),
-                                         objfile);
+  return reader.record_full (name, name_len, copy_name, address,
+                            ms_type,
+                            gdb_bfd_section_index (objfile->obfd,
+                                                   bfd_section));
 }
 
 /* Read the symbol table of an ELF file.
@@ -226,7 +226,8 @@ record_minimal_symbol (const char *name, int name_len, int copy_name,
 #define ST_SYNTHETIC 2
 
 static void
-elf_symtab_read (struct objfile *objfile, int type,
+elf_symtab_read (minimal_symbol_reader &reader,
+                struct objfile *objfile, int type,
                 long number_of_symbols, asymbol **symbol_table,
                 int copy_names)
 {
@@ -318,7 +319,7 @@ elf_symtab_read (struct objfile *objfile, int type,
            continue;
 
          msym = record_minimal_symbol
-           (sym->name, strlen (sym->name), copy_names,
+           (reader, sym->name, strlen (sym->name), copy_names,
             symaddr, mst_solib_trampoline, sect, objfile);
          if (msym != NULL)
            {
@@ -458,7 +459,7 @@ elf_symtab_read (struct objfile *objfile, int type,
              continue; /* Skip this symbol.  */
            }
          msym = record_minimal_symbol
-           (sym->name, strlen (sym->name), copy_names, symaddr,
+           (reader, sym->name, strlen (sym->name), copy_names, symaddr,
             ms_type, sym->section, objfile);
 
          if (msym)
@@ -487,7 +488,7 @@ elf_symtab_read (struct objfile *objfile, int type,
                {
                  int len = atsign - sym->name;
 
-                 record_minimal_symbol (sym->name, len, 1, symaddr,
+                 record_minimal_symbol (reader, sym->name, len, 1, symaddr,
                                         ms_type, sym->section, objfile);
                }
            }
@@ -504,7 +505,7 @@ elf_symtab_read (struct objfile *objfile, int type,
                {
                  struct minimal_symbol *mtramp;
 
-                 mtramp = record_minimal_symbol (sym->name, len - 4, 1,
+                 mtramp = record_minimal_symbol (reader, sym->name, len - 4, 1,
                                                  symaddr,
                                                  mst_solib_trampoline,
                                                  sym->section, objfile);
@@ -531,7 +532,8 @@ elf_symtab_read (struct objfile *objfile, int type,
    DYN_SYMBOL_TABLE is no longer easily available for OBJFILE.  */
 
 static void
-elf_rel_plt_read (struct objfile *objfile, asymbol **dyn_symbol_table)
+elf_rel_plt_read (minimal_symbol_reader &reader,
+                 struct objfile *objfile, asymbol **dyn_symbol_table)
 {
   bfd *obfd = objfile->obfd;
   const struct elf_backend_data *bed = get_elf_backend_data (obfd);
@@ -608,7 +610,8 @@ elf_rel_plt_read (struct objfile *objfile, asymbol **dyn_symbol_table)
       memcpy (&string_buffer[name_len], SYMBOL_GOT_PLT_SUFFIX,
              got_suffix_len + 1);
 
-      msym = record_minimal_symbol (string_buffer, name_len + got_suffix_len,
+      msym = record_minimal_symbol (reader, string_buffer,
+                                   name_len + got_suffix_len,
                                     1, address, mst_slot_got_plt, got_plt,
                                    objfile);
       if (msym)
@@ -1077,7 +1080,7 @@ elf_read_minimal_symbols (struct objfile *objfile, int symfile_flags,
               bfd_get_filename (objfile->obfd),
               bfd_errmsg (bfd_get_error ()));
 
-      elf_symtab_read (objfile, ST_REGULAR, symcount, symbol_table, 0);
+      elf_symtab_read (reader, objfile, ST_REGULAR, symcount, symbol_table, 0);
     }
 
   /* Add the dynamic symbols.  */
@@ -1102,9 +1105,10 @@ elf_read_minimal_symbols (struct objfile *objfile, int symfile_flags,
               bfd_get_filename (objfile->obfd),
               bfd_errmsg (bfd_get_error ()));
 
-      elf_symtab_read (objfile, ST_DYNAMIC, dynsymcount, dyn_symbol_table, 0);
+      elf_symtab_read (reader, objfile, ST_DYNAMIC, dynsymcount,
+                      dyn_symbol_table, 0);
 
-      elf_rel_plt_read (objfile, dyn_symbol_table);
+      elf_rel_plt_read (reader, objfile, dyn_symbol_table);
     }
 
   /* Contrary to binutils --strip-debug/--only-keep-debug the strip command from
@@ -1139,7 +1143,7 @@ elf_read_minimal_symbols (struct objfile *objfile, int symfile_flags,
       for (i = 0; i < synthcount; i++)
        synth_symbol_table[i] = synthsyms + i;
       make_cleanup (xfree, synth_symbol_table);
-      elf_symtab_read (objfile, ST_SYNTHETIC, synthcount,
+      elf_symtab_read (reader, objfile, ST_SYNTHETIC, synthcount,
                       synth_symbol_table, 1);
     }
 
index 1f82f2bb856101d47e2a36152e9a7f275e1d87eb..7889b00df31101f167fdb893832c96d0336d3e24 100644 (file)
@@ -97,7 +97,8 @@ macho_register_oso (VEC (oso_el) **oso_vector_ptr,
 /* Add symbol SYM to the minimal symbol table of OBJFILE.  */
 
 static void
-macho_symtab_add_minsym (struct objfile *objfile, const asymbol *sym)
+macho_symtab_add_minsym (minimal_symbol_reader &reader,
+                        struct objfile *objfile, const asymbol *sym)
 {
   if (sym->name == NULL || *sym->name == '\0')
     {
@@ -147,10 +148,9 @@ macho_symtab_add_minsym (struct objfile *objfile, const asymbol *sym)
       else
         return;        /* Skip this symbol.  */
 
-      prim_record_minimal_symbol_and_info
-        (sym->name, symaddr, ms_type,
-        gdb_bfd_section_index (objfile->obfd, sym->section),
-        objfile);
+      reader.record_with_info (sym->name, symaddr, ms_type,
+                              gdb_bfd_section_index (objfile->obfd,
+                                                     sym->section));
     }
 }
 
@@ -158,7 +158,8 @@ macho_symtab_add_minsym (struct objfile *objfile, const asymbol *sym)
    NUMBER_OF_SYMBOLS for OBJFILE.  Registers OSO filenames found.  */
 
 static void
-macho_symtab_read (struct objfile *objfile,
+macho_symtab_read (minimal_symbol_reader &reader,
+                  struct objfile *objfile,
                   long number_of_symbols, asymbol **symbol_table,
                   VEC (oso_el) **oso_vector_ptr)
 {
@@ -227,7 +228,7 @@ macho_symtab_read (struct objfile *objfile,
           else
             {
               /* Non-debugging symbols go to the minimal symbol table.  */
-              macho_symtab_add_minsym (objfile, sym);
+              macho_symtab_add_minsym (reader, objfile, sym);
             }
           break;
 
@@ -864,7 +865,8 @@ macho_symfile_read (struct objfile *objfile, int symfile_flags)
                   bfd_get_filename (objfile->obfd),
                   bfd_errmsg (bfd_get_error ()));
 
-         macho_symtab_read (objfile, symcount, symbol_table, &oso_vector);
+         macho_symtab_read (reader, objfile, symcount, symbol_table,
+                            &oso_vector);
 
           reader.install ();
        }
index 1285db4fca6261297c19473e8909259d4aa1c6da..a149ee9afef02d034112bd34a2eaf848f3e38c28 100644 (file)
@@ -222,7 +222,8 @@ static int found_ecoff_debugging_info;
 static int upgrade_type (int, struct type **, int, union aux_ext *,
                         int, char *);
 
-static void parse_partial_symbols (struct objfile *);
+static void parse_partial_symbols (minimal_symbol_reader &,
+                                  struct objfile *);
 
 static int has_opaque_xref (FDR *, SYMR *);
 
@@ -336,7 +337,8 @@ fdr_name (FDR *f)
    different sections are relocated via the SECTION_OFFSETS.  */
 
 void
-mdebug_build_psymtabs (struct objfile *objfile,
+mdebug_build_psymtabs (minimal_symbol_reader &reader,
+                      struct objfile *objfile,
                       const struct ecoff_debug_swap *swap,
                       struct ecoff_debug_info *info)
 {
@@ -367,7 +369,7 @@ mdebug_build_psymtabs (struct objfile *objfile,
        (*swap->swap_fdr_in) (objfile->obfd, fdr_src, fdr_ptr);
     }
 
-  parse_partial_symbols (objfile);
+  parse_partial_symbols (reader, objfile);
 
 #if 0
   /* Check to make sure file was compiled with -g.  If not, warn the
@@ -2260,7 +2262,8 @@ function_outside_compilation_unit_complaint (const char *arg1)
    belongs to, and then records this new minimal symbol.  */
 
 static void
-record_minimal_symbol (const char *name, const CORE_ADDR address,
+record_minimal_symbol (minimal_symbol_reader &reader,
+                      const char *name, const CORE_ADDR address,
                        enum minimal_symbol_type ms_type, int storage_class,
                        struct objfile *objfile)
 {
@@ -2316,15 +2319,15 @@ record_minimal_symbol (const char *name, const CORE_ADDR address,
         section = -1;
     }
 
-  prim_record_minimal_symbol_and_info (name, address, ms_type,
-                                       section, objfile);
+  reader.record_with_info (name, address, ms_type, section);
 }
 
 /* Master parsing procedure for first-pass reading of file symbols
    into a partial_symtab.  */
 
 static void
-parse_partial_symbols (struct objfile *objfile)
+parse_partial_symbols (minimal_symbol_reader &reader,
+                      struct objfile *objfile)
 {
   struct gdbarch *gdbarch = get_objfile_arch (objfile);
   const bfd_size_type external_sym_size = debug_swap->external_sym_size;
@@ -2624,7 +2627,7 @@ parse_partial_symbols (struct objfile *objfile)
          unknown_ext_complaint (name);
        }
       if (!ECOFF_IN_ELF (cur_bfd))
-        record_minimal_symbol (name, svalue, ms_type, ext_in->asym.sc,
+        record_minimal_symbol (reader, name, svalue, ms_type, ext_in->asym.sc,
                                objfile);
     }
 
@@ -2741,7 +2744,7 @@ parse_partial_symbols (struct objfile *objfile)
                      if (sh.st == stStaticProc)
                        {
                          namestring = debug_info->ss + fh->issBase + sh.iss;
-                          record_minimal_symbol (namestring, sh.value,
+                          record_minimal_symbol (reader, namestring, sh.value,
                                                  mst_file_text, sh.sc,
                                                  objfile);
                        }
@@ -2786,7 +2789,7 @@ parse_partial_symbols (struct objfile *objfile)
                        case scPData:
                        case scXData:
                          namestring = debug_info->ss + fh->issBase + sh.iss;
-                          record_minimal_symbol (namestring, sh.value,
+                          record_minimal_symbol (reader, namestring, sh.value,
                                                  mst_file_data, sh.sc,
                                                  objfile);
                          sh.value += ANOFFSET (objfile->section_offsets,
@@ -2797,7 +2800,7 @@ parse_partial_symbols (struct objfile *objfile)
                          /* FIXME!  Shouldn't this use cases for bss, 
                             then have the default be abs?  */
                          namestring = debug_info->ss + fh->issBase + sh.iss;
-                          record_minimal_symbol (namestring, sh.value,
+                          record_minimal_symbol (reader, namestring, sh.value,
                                                  mst_file_bss, sh.sc,
                                                  objfile);
                          sh.value += ANOFFSET (objfile->section_offsets,
@@ -3467,10 +3470,9 @@ parse_partial_symbols (struct objfile *objfile)
                  int new_sdx;
 
                case stStaticProc:
-                 prim_record_minimal_symbol_and_info (name, minsym_value,
-                                                      mst_file_text,
-                                                      SECT_OFF_TEXT (objfile),
-                                                      objfile);
+                 reader.record_with_info (name, minsym_value,
+                                          mst_file_text,
+                                          SECT_OFF_TEXT (objfile));
 
                  /* FALLTHROUGH */
 
@@ -3553,15 +3555,13 @@ parse_partial_symbols (struct objfile *objfile)
 
                case stStatic:  /* Variable */
                  if (SC_IS_DATA (sh.sc))
-                   prim_record_minimal_symbol_and_info (name, minsym_value,
-                                                        mst_file_data,
-                                                        SECT_OFF_DATA (objfile),
-                                                        objfile);
+                   reader.record_with_info (name, minsym_value,
+                                            mst_file_data,
+                                            SECT_OFF_DATA (objfile));
                  else
-                   prim_record_minimal_symbol_and_info (name, minsym_value,
-                                                        mst_file_bss,
-                                                        SECT_OFF_BSS (objfile),
-                                                        objfile);
+                   reader.record_with_info (name, minsym_value,
+                                            mst_file_bss,
+                                            SECT_OFF_BSS (objfile));
                  theclass = LOC_STATIC;
                  break;
 
@@ -4885,7 +4885,7 @@ elfmdebug_build_psymtabs (struct objfile *objfile,
     error (_("Error reading ECOFF debugging information: %s"),
           bfd_errmsg (bfd_get_error ()));
 
-  mdebug_build_psymtabs (objfile, swap, info);
+  mdebug_build_psymtabs (reader, objfile, swap, info);
 
   reader.install ();
 }
index 9de572295e1fbf461d109dd8c3789daa99cbbe0e..5f6db60ecabfb3b69362052de01ec893d390ff4a 100644 (file)
@@ -64,19 +64,6 @@ struct msym_bunch
     struct minimal_symbol contents[BUNCH_SIZE];
   };
 
-/* Bunch currently being filled up.
-   The next field points to chain of filled bunches.  */
-
-static struct msym_bunch *msym_bunch;
-
-/* Number of slots filled in current bunch.  */
-
-static int msym_bunch_index;
-
-/* Total number of minimal symbols recorded so far for the objfile.  */
-
-static int msym_count;
-
 /* See minsyms.h.  */
 
 unsigned int
@@ -922,14 +909,14 @@ get_symbol_leading_char (bfd *abfd)
 /* See minsyms.h.  */
 
 minimal_symbol_reader::minimal_symbol_reader (struct objfile *obj)
-: m_objfile (obj)
-{
-  msym_count = 0;
-  msym_bunch = NULL;
-  /* Note that presetting msym_bunch_index to BUNCH_SIZE causes the
+: m_objfile (obj),
+  m_msym_bunch (NULL),
+  /* Note that presetting m_msym_bunch_index to BUNCH_SIZE causes the
      first call to save a minimal symbol to allocate the memory for
      the first bunch.  */
-  msym_bunch_index = BUNCH_SIZE;
+  m_msym_bunch_index (BUNCH_SIZE),
+  m_msym_count (0)
+{
 }
 
 /* Discard the currently collected minimal symbols, if any.  If we wish
@@ -944,20 +931,19 @@ minimal_symbol_reader::~minimal_symbol_reader ()
 {
   struct msym_bunch *next;
 
-  while (msym_bunch != NULL)
+  while (m_msym_bunch != NULL)
     {
-      next = msym_bunch->next;
-      xfree (msym_bunch);
-      msym_bunch = next;
+      next = m_msym_bunch->next;
+      xfree (m_msym_bunch);
+      m_msym_bunch = next;
     }
 }
 
 /* See minsyms.h.  */
 
 void
-prim_record_minimal_symbol (const char *name, CORE_ADDR address,
-                           enum minimal_symbol_type ms_type,
-                           struct objfile *objfile)
+minimal_symbol_reader::record (const char *name, CORE_ADDR address,
+                                     enum minimal_symbol_type ms_type)
 {
   int section;
 
@@ -967,32 +953,31 @@ prim_record_minimal_symbol (const char *name, CORE_ADDR address,
     case mst_text_gnu_ifunc:
     case mst_file_text:
     case mst_solib_trampoline:
-      section = SECT_OFF_TEXT (objfile);
+      section = SECT_OFF_TEXT (m_objfile);
       break;
     case mst_data:
     case mst_file_data:
-      section = SECT_OFF_DATA (objfile);
+      section = SECT_OFF_DATA (m_objfile);
       break;
     case mst_bss:
     case mst_file_bss:
-      section = SECT_OFF_BSS (objfile);
+      section = SECT_OFF_BSS (m_objfile);
       break;
     default:
       section = -1;
     }
 
-  prim_record_minimal_symbol_and_info (name, address, ms_type,
-                                      section, objfile);
+  record_with_info (name, address, ms_type, section);
 }
 
 /* See minsyms.h.  */
 
 struct minimal_symbol *
-prim_record_minimal_symbol_full (const char *name, int name_len, int copy_name,
-                                CORE_ADDR address,
-                                enum minimal_symbol_type ms_type,
-                                int section,
-                                struct objfile *objfile)
+minimal_symbol_reader::record_full (const char *name, int name_len,
+                                          int copy_name,
+                                          CORE_ADDR address,
+                                          enum minimal_symbol_type ms_type,
+                                          int section)
 {
   struct msym_bunch *newobj;
   struct minimal_symbol *msymbol;
@@ -1009,7 +994,7 @@ prim_record_minimal_symbol_full (const char *name, int name_len, int copy_name,
 
   /* It's safe to strip the leading char here once, since the name
      is also stored stripped in the minimal symbol table.  */
-  if (name[0] == get_symbol_leading_char (objfile->obfd))
+  if (name[0] == get_symbol_leading_char (m_objfile->obfd))
     {
       ++name;
       --name_len;
@@ -1018,17 +1003,17 @@ prim_record_minimal_symbol_full (const char *name, int name_len, int copy_name,
   if (ms_type == mst_file_text && startswith (name, "__gnu_compiled"))
     return (NULL);
 
-  if (msym_bunch_index == BUNCH_SIZE)
+  if (m_msym_bunch_index == BUNCH_SIZE)
     {
       newobj = XCNEW (struct msym_bunch);
-      msym_bunch_index = 0;
-      newobj->next = msym_bunch;
-      msym_bunch = newobj;
+      m_msym_bunch_index = 0;
+      newobj->next = m_msym_bunch;
+      m_msym_bunch = newobj;
     }
-  msymbol = &msym_bunch->contents[msym_bunch_index];
+  msymbol = &m_msym_bunch->contents[m_msym_bunch_index];
   MSYMBOL_SET_LANGUAGE (msymbol, language_auto,
-                       &objfile->per_bfd->storage_obstack);
-  MSYMBOL_SET_NAMES (msymbol, name, name_len, copy_name, objfile);
+                       &m_objfile->per_bfd->storage_obstack);
+  MSYMBOL_SET_NAMES (msymbol, name, name_len, copy_name, m_objfile);
 
   SET_MSYMBOL_VALUE_ADDRESS (msymbol, address);
   MSYMBOL_SECTION (msymbol) = section;
@@ -1047,28 +1032,15 @@ prim_record_minimal_symbol_full (const char *name, int name_len, int copy_name,
 
   /* If we already read minimal symbols for this objfile, then don't
      ever allocate a new one.  */
-  if (!objfile->per_bfd->minsyms_read)
+  if (!m_objfile->per_bfd->minsyms_read)
     {
-      msym_bunch_index++;
-      objfile->per_bfd->n_minsyms++;
+      m_msym_bunch_index++;
+      m_objfile->per_bfd->n_minsyms++;
     }
-  msym_count++;
+  m_msym_count++;
   return msymbol;
 }
 
-/* See minsyms.h.  */
-
-struct minimal_symbol *
-prim_record_minimal_symbol_and_info (const char *name, CORE_ADDR address,
-                                    enum minimal_symbol_type ms_type,
-                                    int section,
-                                    struct objfile *objfile)
-{
-  return prim_record_minimal_symbol_full (name, strlen (name), 1,
-                                         address, ms_type,
-                                         section, objfile);
-}
-
 /* Compare two minimal symbols by address and return a signed result based
    on unsigned comparisons, so that we sort into unsigned numeric order.
    Within groups with the same address, sort by name.  */
@@ -1244,13 +1216,13 @@ minimal_symbol_reader::install ()
   if (m_objfile->per_bfd->minsyms_read)
     return;
 
-  if (msym_count > 0)
+  if (m_msym_count > 0)
     {
       if (symtab_create_debug)
        {
          fprintf_unfiltered (gdb_stdlog,
                              "Installing %d minimal symbols of objfile %s.\n",
-                             msym_count, objfile_name (m_objfile));
+                             m_msym_count, objfile_name (m_objfile));
        }
 
       /* Allocate enough space in the obstack, into which we will gather the
@@ -1258,7 +1230,7 @@ minimal_symbol_reader::install ()
          compact out the duplicate entries.  Once we have a final table,
          we will give back the excess space.  */
 
-      alloc_count = msym_count + m_objfile->per_bfd->minimal_symbol_count + 1;
+      alloc_count = m_msym_count + m_objfile->per_bfd->minimal_symbol_count + 1;
       obstack_blank (&m_objfile->per_bfd->storage_obstack,
                     alloc_count * sizeof (struct minimal_symbol));
       msymbols = (struct minimal_symbol *)
@@ -1278,11 +1250,11 @@ minimal_symbol_reader::install ()
 
       mcount = m_objfile->per_bfd->minimal_symbol_count;
 
-      for (bunch = msym_bunch; bunch != NULL; bunch = bunch->next)
+      for (bunch = m_msym_bunch; bunch != NULL; bunch = bunch->next)
        {
-         for (bindex = 0; bindex < msym_bunch_index; bindex++, mcount++)
+         for (bindex = 0; bindex < m_msym_bunch_index; bindex++, mcount++)
            msymbols[mcount] = bunch->contents[bindex];
-         msym_bunch_index = BUNCH_SIZE;
+         m_msym_bunch_index = BUNCH_SIZE;
        }
 
       /* Sort the minimal symbols by address.  */
index b83e2d08b56032b2874406a2c80a33bb03eb666b..b22920b08d80830bef3a4a1ad995b6e6fa907fc2 100644 (file)
@@ -53,16 +53,17 @@ struct bound_minimal_symbol
    as opaque and use functions provided by minsyms.c to inspect them.
 */
 
+struct msym_bunch;
+
 /* An RAII-based object that is used to record minimal symbols while
    they are being read.  */
 class minimal_symbol_reader
 {
  public:
 
-  /* Prepare to start collecting minimal symbols.  This should be called
-     by a symbol reader to initialize the minimal symbol module.
-     Currently, minimal symbol table creation is not reentrant; it
-     relies on global (static) variables in minsyms.c.  */
+  /* Prepare to start collecting minimal symbols.  This should be
+     called by a symbol reader to initialize the minimal symbol
+     module.  */
 
   explicit minimal_symbol_reader (struct objfile *);
 
@@ -73,6 +74,56 @@ class minimal_symbol_reader
 
   void install ();
 
+  /* Record a new minimal symbol.  This is the "full" entry point;
+     simpler convenience entry points are also provided below.
+   
+     This returns a new minimal symbol.  It is ok to modify the returned
+     minimal symbol (though generally not necessary).  It is not ok,
+     though, to stash the pointer anywhere; as minimal symbols may be
+     moved after creation.  The memory for the returned minimal symbol
+     is still owned by the minsyms.c code, and should not be freed.
+   
+     Arguments are:
+
+     NAME - the symbol's name
+     NAME_LEN - the length of the name
+     COPY_NAME - if true, the minsym code must make a copy of NAME.  If
+     false, then NAME must be NUL-terminated, and must have a lifetime
+     that is at least as long as OBJFILE's lifetime.
+     ADDRESS - the address of the symbol
+     MS_TYPE - the type of the symbol
+     SECTION - the symbol's section
+     appropriate obj_section for the minimal symbol.  This can be NULL.
+     OBJFILE - the objfile associated with the minimal symbol.  */
+
+  struct minimal_symbol *record_full (const char *name,
+                                     int name_len,
+                                     int copy_name,
+                                     CORE_ADDR address,
+                                     enum minimal_symbol_type ms_type,
+                                     int section);
+
+  /* Like record_full, but:
+     - uses strlen to compute NAME_LEN,
+     - passes COPY_NAME = 1,
+     - and passes a default SECTION, depending on the type
+
+     This variant does not return the new symbol.  */
+
+  void record (const char *, CORE_ADDR, enum minimal_symbol_type);
+
+  /* Like record_full, but:
+     - uses strlen to compute NAME_LEN,
+     - passes COPY_NAME = 1.  */
+
+  struct minimal_symbol *record_with_info (const char *name,
+                                          CORE_ADDR address,
+                                          enum minimal_symbol_type ms_type,
+                                          int section)
+  {
+    return record_full (name, strlen (name), 1, address, ms_type, section);
+  }
+
  private:
 
   /* No need for these.  They are intentionally not defined anywhere.  */
@@ -81,60 +132,21 @@ class minimal_symbol_reader
   minimal_symbol_reader (const minimal_symbol_reader &);
 
   struct objfile *m_objfile;
-};
 
-/* Record a new minimal symbol.  This is the "full" entry point;
-   simpler convenience entry points are also provided below.
-   
-   This returns a new minimal symbol.  It is ok to modify the returned
-   minimal symbol (though generally not necessary).  It is not ok,
-   though, to stash the pointer anywhere; as minimal symbols may be
-   moved after creation.  The memory for the returned minimal symbol
-   is still owned by the minsyms.c code, and should not be freed.
-   
-   Arguments are:
-
-   NAME - the symbol's name
-   NAME_LEN - the length of the name
-   COPY_NAME - if true, the minsym code must make a copy of NAME.  If
-   false, then NAME must be NUL-terminated, and must have a lifetime
-   that is at least as long as OBJFILE's lifetime.
-   ADDRESS - the address of the symbol
-   MS_TYPE - the type of the symbol
-   SECTION - the symbol's section
-   appropriate obj_section for the minimal symbol.  This can be NULL.
-   OBJFILE - the objfile associated with the minimal symbol.  */
-
-struct minimal_symbol *prim_record_minimal_symbol_full
-    (const char *name,
-     int name_len,
-     int copy_name,
-     CORE_ADDR address,
-     enum minimal_symbol_type ms_type,
-     int section,
-     struct objfile *objfile);
-
-/* Like prim_record_minimal_symbol_full, but:
-   - uses strlen to compute NAME_LEN,
-   - passes COPY_NAME = 1,
-   - and passes a default SECTION, depending on the type
-   
-   This variant does not return the new symbol.  */
+  /* Bunch currently being filled up.
+     The next field points to chain of filled bunches.  */
 
-void prim_record_minimal_symbol (const char *, CORE_ADDR,
-                                enum minimal_symbol_type,
-                                struct objfile *);
+  struct msym_bunch *m_msym_bunch;
 
-/* Like prim_record_minimal_symbol_full, but:
-   - uses strlen to compute NAME_LEN,
-   - passes COPY_NAME = 1.  */
+  /* Number of slots filled in current bunch.  */
 
-struct minimal_symbol *prim_record_minimal_symbol_and_info
-    (const char *,
-     CORE_ADDR,
-     enum minimal_symbol_type,
-     int section,
-     struct objfile *);
+  int m_msym_bunch_index;
+
+  /* Total number of minimal symbols recorded so far for the
+     objfile.  */
+
+  int m_msym_count;
+};
 
 /* Create the terminating entry of OBJFILE's minimal symbol table.
    If OBJFILE->msymbols is zero, allocate a single entry from
index 256b26222c893c9993211aab43eae03462ebdbcc..39af0d335c1241787ec44ae63e1e80ff58f36936 100644 (file)
@@ -42,7 +42,8 @@
 #include "psymtab.h"
 
 static void
-read_alphacoff_dynamic_symtab (struct section_offsets *,
+read_alphacoff_dynamic_symtab (minimal_symbol_reader &,
+                              struct section_offsets *,
                               struct objfile *objfile);
 
 /* Initialize anything that needs initializing when a completely new
@@ -79,12 +80,12 @@ mipscoff_symfile_read (struct objfile *objfile, int symfile_flags)
        (abfd, (asection *) 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->section_offsets, objfile);
 
   /* Install any minimal symbols that have been collected as the current
      minimal symbols for this objfile.  */
@@ -173,7 +174,8 @@ 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 section_offsets *section_offsets,
                               struct objfile *objfile)
 {
   bfd *abfd = objfile->obfd;
@@ -388,7 +390,7 @@ 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);
index a11c48aa4fa0373dc38bb52763210e63b709f74f..32902cb26b074bcd8b3e9e748ddaba509cd9d3aa 100644 (file)
@@ -652,7 +652,8 @@ void dwarf2_free_objfile (struct objfile *);
 
 /* From mdebugread.c */
 
-extern void mdebug_build_psymtabs (struct objfile *,
+extern void mdebug_build_psymtabs (minimal_symbol_reader &,
+                                  struct objfile *,
                                   const struct ecoff_debug_swap *,
                                   struct ecoff_debug_info *);
 
index ccd6149a8521f0e3bbca13f5479dedafc93b45df..974152f80917476cc61b9efb710114a264283395 100644 (file)
@@ -197,7 +197,8 @@ eb_complaint (int arg1)
 
 static void xcoff_initial_scan (struct objfile *, int);
 
-static void scan_xcoff_symtab (struct objfile *);
+static void scan_xcoff_symtab (minimal_symbol_reader &,
+                              struct objfile *);
 
 static char *xcoff_next_symbol_text (struct objfile *);
 
@@ -908,10 +909,10 @@ enter_line_range (struct subfile *subfile, unsigned beginoffset,
    This function can read past the end of the symbol table
    (into the string table) but this does no harm.  */
 
-/* Create a new minimal symbol (using prim_record_minimal_symbol_and_info).
+/* Create a new minimal symbol (using record_with_info).
 
    Creation of all new minimal symbols should go through this function
-   rather than calling the various prim_record_[...] functions in order
+   rather than calling the various record functions in order
    to make sure that all symbol addresses get properly relocated.
 
    Arguments are:
@@ -925,18 +926,17 @@ enter_line_range (struct subfile *subfile, unsigned beginoffset,
    OBJFILE - the objfile associated with the minimal symbol.  */
 
 static void
-record_minimal_symbol (const char *name, CORE_ADDR address,
+record_minimal_symbol (minimal_symbol_reader &reader,
+                      const char *name, CORE_ADDR address,
                       enum minimal_symbol_type ms_type,
                       int n_scnum,
                       struct objfile *objfile)
 {
-
   if (name[0] == '.')
     ++name;
 
-  prim_record_minimal_symbol_and_info (name, address, ms_type,
-                                      secnum_to_section (n_scnum, objfile),
-                                      objfile);
+  reader.record_with_info (name, address, ms_type,
+                          secnum_to_section (n_scnum, objfile));
 }
 
 /* xcoff has static blocks marked in `.bs', `.es' pairs.  They cannot be
@@ -2178,7 +2178,8 @@ function_outside_compilation_unit_complaint (const char *arg1)
 }
 
 static void
-scan_xcoff_symtab (struct objfile *objfile)
+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.  */
@@ -2288,7 +2289,7 @@ scan_xcoff_symtab (struct objfile *objfile)
                        if (!misc_func_recorded)
                          {
                            record_minimal_symbol
-                             (last_csect_name, last_csect_val,
+                             (reader, last_csect_name, last_csect_val,
                               mst_text, last_csect_sec, objfile);
                            misc_func_recorded = 1;
                          }
@@ -2343,7 +2344,7 @@ scan_xcoff_symtab (struct objfile *objfile)
                       table, except for section symbols.  */
                    if (*namestring != '.')
                      record_minimal_symbol
-                       (namestring, symbol.n_value,
+                       (reader, namestring, symbol.n_value,
                         sclass == C_HIDEXT ? mst_file_data : mst_data,
                         symbol.n_scnum, objfile);
                    break;
@@ -2381,7 +2382,7 @@ scan_xcoff_symtab (struct objfile *objfile)
                        main_aux[0].x_sym.x_fcnary.x_fcn.x_lnnoptr;
 
                    record_minimal_symbol
-                     (namestring, symbol.n_value,
+                     (reader, namestring, symbol.n_value,
                       sclass == C_HIDEXT ? mst_file_text : mst_text,
                       symbol.n_scnum, objfile);
                    misc_func_recorded = 1;
@@ -2396,7 +2397,7 @@ scan_xcoff_symtab (struct objfile *objfile)
                       symbols, we will choose mst_text over
                       mst_solib_trampoline.  */
                    record_minimal_symbol
-                     (namestring, symbol.n_value,
+                     (reader, namestring, symbol.n_value,
                       mst_solib_trampoline, symbol.n_scnum, objfile);
                    misc_func_recorded = 1;
                    break;
@@ -2418,7 +2419,7 @@ scan_xcoff_symtab (struct objfile *objfile)
                       XMC_BS might be possible too.  */
                    if (*namestring != '.')
                      record_minimal_symbol
-                       (namestring, symbol.n_value,
+                       (reader, namestring, symbol.n_value,
                         sclass == C_HIDEXT ? mst_file_data : mst_data,
                         symbol.n_scnum, objfile);
                    break;
@@ -2434,7 +2435,7 @@ scan_xcoff_symtab (struct objfile *objfile)
                       table, except for section symbols.  */
                    if (*namestring != '.')
                      record_minimal_symbol
-                       (namestring, symbol.n_value,
+                       (reader, namestring, symbol.n_value,
                         sclass == C_HIDEXT ? mst_file_bss : mst_bss,
                         symbol.n_scnum, objfile);
                    break;
@@ -2462,7 +2463,7 @@ scan_xcoff_symtab (struct objfile *objfile)
                   it as a function.  This will take care of functions like
                   strcmp() compiled by xlc.  */
 
-               record_minimal_symbol (last_csect_name, last_csect_val,
+               record_minimal_symbol (reader, last_csect_name, last_csect_val,
                                       mst_text, last_csect_sec, objfile);
                misc_func_recorded = 1;
              }
@@ -3011,7 +3012,7 @@ xcoff_initial_scan (struct objfile *objfile, int symfile_flags)
   /* Now that the symbol table data of the executable file are all in core,
      process them and define symbols accordingly.  */
 
-  scan_xcoff_symtab (objfile);
+  scan_xcoff_symtab (reader, objfile);
 
   /* Install any minimal symbols that have been collected as the current
      minimal symbols for this objfile.  */