diff options
Diffstat (limited to 'gdb/elfread.c')
-rw-r--r-- | gdb/elfread.c | 77 |
1 files changed, 24 insertions, 53 deletions
diff --git a/gdb/elfread.c b/gdb/elfread.c index fba2026..436d9b5 100644 --- a/gdb/elfread.c +++ b/gdb/elfread.c @@ -48,8 +48,6 @@ #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_lazy_psyms; @@ -540,9 +538,6 @@ elf_rel_plt_read (minimal_symbol_reader &reader, asection *plt, *relplt, *got_plt; int plt_elf_idx; bfd_size_type reloc_count, reloc; - char *string_buffer = NULL; - size_t string_buffer_size = 0; - struct cleanup *back_to; struct gdbarch *gdbarch = get_objfile_arch (objfile); struct type *ptr_type = builtin_type (gdbarch)->builtin_data_ptr; size_t ptr_size = TYPE_LENGTH (ptr_type); @@ -576,7 +571,7 @@ elf_rel_plt_read (minimal_symbol_reader &reader, if (! bed->s->slurp_reloc_table (obfd, relplt, dyn_symbol_table, TRUE)) return; - back_to = make_cleanup (free_current_contents, &string_buffer); + std::string string_buffer; reloc_count = relplt->size / elf_section_data (relplt)->this_hdr.sh_entsize; for (reloc = 0; reloc < reloc_count; reloc++) @@ -584,11 +579,10 @@ elf_rel_plt_read (minimal_symbol_reader &reader, const char *name; struct minimal_symbol *msym; CORE_ADDR address; + const char *got_suffix = SYMBOL_GOT_PLT_SUFFIX; const size_t got_suffix_len = strlen (SYMBOL_GOT_PLT_SUFFIX); - size_t name_len; name = bfd_asymbol_name (*relplt->relocation[reloc].sym_ptr_ptr); - name_len = strlen (name); address = relplt->relocation[reloc].address; /* Does the pointer reside in the .got.plt section? */ @@ -601,24 +595,16 @@ elf_rel_plt_read (minimal_symbol_reader &reader, OBJFILE the symbol is undefined and the objfile having NAME defined may not yet have been loaded. */ - if (string_buffer_size < name_len + got_suffix_len + 1) - { - string_buffer_size = 2 * (name_len + got_suffix_len); - string_buffer = (char *) xrealloc (string_buffer, string_buffer_size); - } - memcpy (string_buffer, name, name_len); - memcpy (&string_buffer[name_len], SYMBOL_GOT_PLT_SUFFIX, - got_suffix_len + 1); + string_buffer.assign (name); + string_buffer.append (got_suffix, got_suffix + got_suffix_len); - msym = record_minimal_symbol (reader, string_buffer, - name_len + got_suffix_len, + msym = record_minimal_symbol (reader, string_buffer.c_str (), + string_buffer.size (), true, address, mst_slot_got_plt, got_plt, objfile); if (msym) SET_MSYMBOL_SIZE (msym, ptr_size); } - - do_cleanups (back_to); } /* The data pointer is htab_t for gnu_ifunc_record_cache_unchecked. */ @@ -889,7 +875,7 @@ elf_gnu_ifunc_resolve_addr (struct gdbarch *gdbarch, CORE_ADDR pc) 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); @@ -929,12 +915,10 @@ elf_gnu_ifunc_resolver_stop (struct breakpoint *b) 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); @@ -965,8 +949,6 @@ elf_gnu_ifunc_resolver_return_stop (struct breakpoint *b) 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); @@ -1009,13 +991,9 @@ elf_gnu_ifunc_resolver_return_stop (struct breakpoint *b) 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 @@ -1144,6 +1122,9 @@ elf_read_minimal_symbols (struct objfile *objfile, int symfile_flags, synth_symbol_table[i] = synthsyms + i; elf_symtab_read (reader, objfile, ST_SYNTHETIC, synthcount, synth_symbol_table.get (), true); + + xfree (synthsyms); + synthsyms = NULL; } /* Install any minimal symbols that have been collected as the current @@ -1328,35 +1309,27 @@ elf_symfile_init (struct objfile *objfile) /* 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 probe_ops *ops : all_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 @@ -1365,14 +1338,12 @@ elf_get_probes (struct objfile *objfile) 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++) + for (struct probe *probe : *probes) probe->pops->destroy (probe); - VEC_free (probe_p, probes); + delete probes; } |