/* 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.
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)
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;
{
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);
}
}
{
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)
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);
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
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);
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;
}
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);
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. */
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);
}
&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
which will do this. */
reader.install ();
- do_cleanups (back_to);
if (symtab_create_debug)
fprintf_unfiltered (gdb_stdlog, "Done reading minimal symbols.\n");
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;
&& 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);
}
}
}