Use class to manage BFD reference counts
[deliverable/binutils-gdb.git] / gdb / elfread.c
index 56fac2831e7f47ae2abdb367b7edf018ef5c06ab..2ca10f8fdd7e9aedd432a2fcb2027b622ac16c77 100644 (file)
@@ -1,6 +1,6 @@
 /* Read ELF (Executable and Linking Format) object files for GDB.
 
-   Copyright (C) 1991-2016 Free Software Foundation, Inc.
+   Copyright (C) 1991-2017 Free Software Foundation, Inc.
 
    Written by Fred Fish at Cygnus Support.
 
@@ -192,7 +192,7 @@ elf_locate_sections (bfd *ignore_abfd, asection *sectp, void *eip)
 
 static struct minimal_symbol *
 record_minimal_symbol (minimal_symbol_reader &reader,
-                      const char *name, int name_len, int copy_name,
+                      const char *name, int name_len, bool copy_name,
                       CORE_ADDR address,
                       enum minimal_symbol_type ms_type,
                       asection *bfd_section, struct objfile *objfile)
@@ -229,7 +229,7 @@ static void
 elf_symtab_read (minimal_symbol_reader &reader,
                 struct objfile *objfile, int type,
                 long number_of_symbols, asymbol **symbol_table,
-                int copy_names)
+                bool copy_names)
 {
   struct gdbarch *gdbarch = get_objfile_arch (objfile);
   asymbol *sym;
@@ -488,7 +488,7 @@ elf_symtab_read (minimal_symbol_reader &reader,
                {
                  int len = atsign - sym->name;
 
-                 record_minimal_symbol (reader, sym->name, len, 1, symaddr,
+                 record_minimal_symbol (reader, sym->name, len, true, symaddr,
                                         ms_type, sym->section, objfile);
                }
            }
@@ -505,8 +505,8 @@ elf_symtab_read (minimal_symbol_reader &reader,
                {
                  struct minimal_symbol *mtramp;
 
-                 mtramp = record_minimal_symbol (reader, sym->name, len - 4, 1,
-                                                 symaddr,
+                 mtramp = record_minimal_symbol (reader, sym->name, len - 4,
+                                                 true, symaddr,
                                                  mst_solib_trampoline,
                                                  sym->section, objfile);
                  if (mtramp)
@@ -612,7 +612,7 @@ elf_rel_plt_read (minimal_symbol_reader &reader,
 
       msym = record_minimal_symbol (reader, string_buffer,
                                    name_len + got_suffix_len,
-                                    1, address, mst_slot_got_plt, got_plt,
+                                    true, address, mst_slot_got_plt, got_plt,
                                    objfile);
       if (msym)
        SET_MSYMBOL_SIZE (msym, ptr_size);
@@ -879,6 +879,7 @@ elf_gnu_ifunc_resolve_addr (struct gdbarch *gdbarch, CORE_ADDR pc)
     name_at_pc = NULL;
 
   function = allocate_value (func_func_type);
+  VALUE_LVAL (function) = lval_memory;
   set_value_address (function, pc);
 
   /* STT_GNU_IFUNC resolver functions usually receive the HWCAP vector as
@@ -992,6 +993,7 @@ elf_gnu_ifunc_resolver_return_stop (struct breakpoint *b)
   gdb_assert (b->loc->next == NULL);
 
   func_func = allocate_value (func_func_type);
+  VALUE_LVAL (func_func) = lval_memory;
   set_value_address (func_func, b->loc->related_address);
 
   value = allocate_value (value_type);
@@ -1024,7 +1026,6 @@ elf_read_minimal_symbols (struct objfile *objfile, int symfile_flags,
                          const struct elfinfo *ei)
 {
   bfd *synth_abfd, *abfd = objfile->obfd;
-  struct cleanup *back_to;
   long symcount = 0, dynsymcount = 0, synthcount, storage_needed;
   asymbol **symbol_table = NULL, **dyn_symbol_table = NULL;
   asymbol *synthsyms;
@@ -1053,7 +1054,6 @@ elf_read_minimal_symbols (struct objfile *objfile, int symfile_flags,
     }
 
   minimal_symbol_reader reader (objfile);
-  back_to = make_cleanup (null_cleanup, NULL);
 
   /* Allocate struct to keep track of the symfile.  */
   dbx = XCNEW (struct dbx_symfile_info);
@@ -1080,7 +1080,8 @@ elf_read_minimal_symbols (struct objfile *objfile, int symfile_flags,
               bfd_get_filename (objfile->obfd),
               bfd_errmsg (bfd_get_error ()));
 
-      elf_symtab_read (reader, objfile, ST_REGULAR, symcount, symbol_table, 0);
+      elf_symtab_read (reader, objfile, ST_REGULAR, symcount, symbol_table,
+                      false);
     }
 
   /* Add the dynamic symbols.  */
@@ -1106,7 +1107,7 @@ elf_read_minimal_symbols (struct objfile *objfile, int symfile_flags,
               bfd_errmsg (bfd_get_error ()));
 
       elf_symtab_read (reader, objfile, ST_DYNAMIC, dynsymcount,
-                      dyn_symbol_table, 0);
+                      dyn_symbol_table, false);
 
       elf_rel_plt_read (reader, objfile, dyn_symbol_table);
     }
@@ -1135,16 +1136,14 @@ elf_read_minimal_symbols (struct objfile *objfile, int symfile_flags,
                                         &synthsyms);
   if (synthcount > 0)
     {
-      asymbol **synth_symbol_table;
       long i;
 
-      make_cleanup (xfree, synthsyms);
-      synth_symbol_table = XNEWVEC (asymbol *, synthcount);
+      std::unique_ptr<asymbol *[]>
+       synth_symbol_table (new asymbol *[synthcount]);
       for (i = 0; i < synthcount; i++)
        synth_symbol_table[i] = synthsyms + i;
-      make_cleanup (xfree, synth_symbol_table);
       elf_symtab_read (reader, objfile, ST_SYNTHETIC, synthcount,
-                      synth_symbol_table, 1);
+                      synth_symbol_table.get (), true);
     }
 
   /* Install any minimal symbols that have been collected as the current
@@ -1154,7 +1153,6 @@ elf_read_minimal_symbols (struct objfile *objfile, int symfile_flags,
      which will do this.  */
 
   reader.install ();
-  do_cleanups (back_to);
 
   if (symtab_create_debug)
     fprintf_unfiltered (gdb_stdlog, "Done reading minimal symbols.\n");
@@ -1185,7 +1183,7 @@ elf_read_minimal_symbols (struct objfile *objfile, int symfile_flags,
    capability even for files compiled without -g.  */
 
 static void
-elf_symfile_read (struct objfile *objfile, int symfile_flags)
+elf_symfile_read (struct objfile *objfile, symfile_add_flags symfile_flags)
 {
   bfd *abfd = objfile->obfd;
   struct elfinfo ei;
@@ -1267,21 +1265,18 @@ elf_symfile_read (struct objfile *objfile, int symfile_flags)
           && objfile->separate_debug_objfile == NULL
           && objfile->separate_debug_objfile_backlink == NULL)
     {
-      char *debugfile;
-
-      debugfile = find_separate_debug_file_by_buildid (objfile);
+      gdb::unique_xmalloc_ptr<char> debugfile
+       (find_separate_debug_file_by_buildid (objfile));
 
       if (debugfile == NULL)
-       debugfile = find_separate_debug_file_by_debuglink (objfile);
+       debugfile.reset (find_separate_debug_file_by_debuglink (objfile));
 
-      if (debugfile)
+      if (debugfile != NULL)
        {
-         struct cleanup *cleanup = make_cleanup (xfree, debugfile);
-         bfd *abfd = symfile_bfd_open (debugfile);
+         gdb_bfd_ref_ptr abfd (symfile_bfd_open (debugfile.get ()));
 
-         make_cleanup_bfd_unref (abfd);
-         symbol_file_add_separate (abfd, debugfile, symfile_flags, objfile);
-         do_cleanups (cleanup);
+         symbol_file_add_separate (abfd.get (), debugfile.get (),
+                                   symfile_flags, objfile);
        }
     }
 }
This page took 0.028959 seconds and 4 git commands to generate.