/* Read ELF (Executable and Linking Format) object files for GDB.
- Copyright (C) 1991-2017 Free Software Foundation, Inc.
+ Copyright (C) 1991-2018 Free Software Foundation, Inc.
Written by Fred Fish at Cygnus Support.
#include "location.h"
#include "auxv.h"
-extern void _initialize_elfread (void);
-
/* Forward declarations. */
extern const struct sym_fns elf_sym_fns_gdb_index;
+extern const struct sym_fns elf_sym_fns_debug_names;
extern const struct sym_fns elf_sym_fns_lazy_psyms;
/* The struct elfinfo is available only during ELF symbol table and
/* Name of the last file symbol. This is either a constant string or is
saved on the objfile's filename cache. */
const char *filesymname = "";
- struct dbx_symfile_info *dbx = DBX_SYMFILE_INFO (objfile);
int stripped = (bfd_get_symcount (objfile->obfd) == 0);
int elf_make_msymbol_special_p
= gdbarch_elf_make_msymbol_special_p (gdbarch);
target_auxv_search (¤t_target, AT_HWCAP, &hwcap);
hwcap_val = value_from_longest (builtin_type (gdbarch)
->builtin_unsigned_long, hwcap);
- address_val = call_function_by_hand (function, 1, &hwcap_val);
+ address_val = call_function_by_hand (function, NULL, 1, &hwcap_val);
address = value_as_address (address_val);
address = gdbarch_convert_from_func_ptr_addr (gdbarch, address,
¤t_target);
if (b_return == b)
{
- struct symtab_and_line sal;
-
/* No need to call find_pc_line for symbols resolving as this is only
a helper breakpointer never shown to the user. */
- init_sal (&sal);
+ symtab_and_line sal;
sal.pspace = current_inferior ()->pspace;
sal.pc = prev_pc;
sal.section = find_pc_overlay (sal.pc);
sal.explicit_pc = 1;
- b_return = set_momentary_breakpoint (get_frame_arch (prev_frame), sal,
- prev_frame_id,
- bp_gnu_ifunc_resolver_return);
+ b_return
+ = set_momentary_breakpoint (get_frame_arch (prev_frame), sal,
+ prev_frame_id,
+ bp_gnu_ifunc_resolver_return).release ();
/* set_momentary_breakpoint invalidates PREV_FRAME. */
prev_frame = NULL;
struct value *func_func;
struct value *value;
CORE_ADDR resolved_address, resolved_pc;
- struct symtab_and_line sal;
- struct symtabs_and_lines sals, sals_end;
gdb_assert (b->type == bp_gnu_ifunc_resolver_return);
elf_gnu_ifunc_record_cache (event_location_to_string (b->location.get ()),
resolved_pc);
- sal = find_pc_line (resolved_pc, 0);
- sals.nelts = 1;
- sals.sals = &sal;
- sals_end.nelts = 0;
-
b->type = bp_breakpoint;
- update_breakpoint_locations (b, current_program_space, sals, sals_end);
+ update_breakpoint_locations (b, current_program_space,
+ find_pc_line (resolved_pc, 0), {});
}
/* A helper function for elf_symfile_read that reads the minimal
struct elfinfo ei;
memset ((char *) &ei, 0, sizeof (ei));
- bfd_map_over_sections (abfd, elf_locate_sections, (void *) & ei);
+ if (!(objfile->flags & OBJF_READNEVER))
+ bfd_map_over_sections (abfd, elf_locate_sections, (void *) & ei);
elf_read_minimal_symbols (objfile, symfile_flags, &ei);
if (dwarf2_has_info (objfile, NULL))
{
- /* elf_sym_fns_gdb_index cannot handle simultaneous non-DWARF debug
- information present in OBJFILE. If there is such debug info present
- never use .gdb_index. */
+ dw_index_kind index_kind;
+ /* elf_sym_fns_gdb_index cannot handle simultaneous non-DWARF
+ debug information present in OBJFILE. If there is such debug
+ info present never use an index. */
if (!objfile_has_partial_symbols (objfile)
- && dwarf2_initialize_objfile (objfile))
- objfile_set_sym_fns (objfile, &elf_sym_fns_gdb_index);
+ && dwarf2_initialize_objfile (objfile, &index_kind))
+ {
+ switch (index_kind)
+ {
+ case dw_index_kind::GDB_INDEX:
+ objfile_set_sym_fns (objfile, &elf_sym_fns_gdb_index);
+ break;
+ case dw_index_kind::DEBUG_NAMES:
+ objfile_set_sym_fns (objfile, &elf_sym_fns_debug_names);
+ break;
+ }
+ }
else
{
/* It is ok to do this even if the stabs reader made some
/* Implementation of `sym_get_probes', as documented in symfile.h. */
-static VEC (probe_p) *
+static const std::vector<probe *> &
elf_get_probes (struct objfile *objfile)
{
- VEC (probe_p) *probes_per_bfd;
+ std::vector<probe *> *probes_per_bfd;
/* Have we parsed this objfile's probes already? */
- probes_per_bfd = (VEC (probe_p) *) bfd_data (objfile->obfd, probe_key);
+ probes_per_bfd = (std::vector<probe *> *) bfd_data (objfile->obfd, probe_key);
- if (!probes_per_bfd)
+ if (probes_per_bfd == NULL)
{
- int ix;
- const struct probe_ops *probe_ops;
+ probes_per_bfd = new std::vector<probe *>;
/* Here we try to gather information about all types of probes from the
objfile. */
- for (ix = 0; VEC_iterate (probe_ops_cp, all_probe_ops, ix, probe_ops);
- ix++)
- probe_ops->get_probes (&probes_per_bfd, objfile);
-
- if (probes_per_bfd == NULL)
- {
- VEC_reserve (probe_p, probes_per_bfd, 1);
- gdb_assert (probes_per_bfd != NULL);
- }
+ for (const static_probe_ops *ops : all_static_probe_ops)
+ ops->get_probes (probes_per_bfd, objfile);
set_bfd_data (objfile->obfd, probe_key, probes_per_bfd);
}
- return probes_per_bfd;
+ return *probes_per_bfd;
}
/* Helper function used to free the space allocated for storing SystemTap
static void
probe_key_free (bfd *abfd, void *d)
{
- int ix;
- VEC (probe_p) *probes = (VEC (probe_p) *) d;
- struct probe *probe;
+ std::vector<probe *> *probes = (std::vector<probe *> *) d;
- for (ix = 0; VEC_iterate (probe_p, probes, ix, probe); ix++)
- probe->pops->destroy (probe);
+ for (probe *p : *probes)
+ delete p;
- VEC_free (probe_p, probes);
+ delete probes;
}
\f
&dwarf2_gdb_index_functions
};
+/* The same as elf_sym_fns, but not registered and uses the
+ DWARF-specific .debug_names index rather than psymtab. */
+const struct sym_fns elf_sym_fns_debug_names =
+{
+ elf_new_init, /* init anything gbl to entire symab */
+ elf_symfile_init, /* read initial info, setup for sym_red() */
+ elf_symfile_read, /* read a symbol file into symtab */
+ NULL, /* sym_read_psymbols */
+ elf_symfile_finish, /* finished with file, cleanup */
+ default_symfile_offsets, /* Translate ext. to int. relocatin */
+ elf_symfile_segments, /* Get segment information from a file. */
+ NULL,
+ default_symfile_relocate, /* Relocate a debug section. */
+ &elf_probe_fns, /* sym_probe_fns */
+ &dwarf2_debug_names_functions
+};
+
/* STT_GNU_IFUNC resolver vector to be installed to gnu_ifunc_fns_p. */
static const struct gnu_ifunc_fns elf_gnu_ifunc_fns =