X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fjit.c;h=8cd645cb66e9930ac081bf7936edd28ed34916c1;hb=10b2ded43caa3298cded1df8b620caaaee3f9209;hp=01ead4577f43942b468586e18cd3f7496ff953d7;hpb=3f5a868b2277a3678f7eeb8fdf88935913b5918b;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/jit.c b/gdb/jit.c index 01ead4577f..8cd645cb66 100644 --- a/gdb/jit.c +++ b/gdb/jit.c @@ -30,7 +30,7 @@ #include "gdbcmd.h" #include "gdbcore.h" #include "inferior.h" -#include "observer.h" +#include "observable.h" #include "objfiles.h" #include "regcache.h" #include "symfile.h" @@ -413,8 +413,8 @@ jit_read_code_entry (struct gdbarch *gdbarch, ptr_type = builtin_type (gdbarch)->builtin_data_ptr; ptr_size = TYPE_LENGTH (ptr_type); - /* Figure out where the longlong value will be. */ - align_bytes = gdbarch_long_long_align_bit (gdbarch) / 8; + /* Figure out where the uint64_t value will be. */ + align_bytes = type_align (builtin_type (gdbarch)->builtin_uint64); off = 3 * ptr_size; off = (off + (align_bytes - 1)) & ~(align_bytes - 1); @@ -888,11 +888,8 @@ jit_bfd_try_read_symtab (struct jit_code_entry *code_entry, CORE_ADDR entry_addr, struct gdbarch *gdbarch) { - struct section_addr_info *sai; struct bfd_section *sec; struct objfile *objfile; - struct cleanup *old_cleanups; - int i; const struct bfd_arch_info *b; if (jit_debug) @@ -931,27 +928,23 @@ JITed symbol file is not an object file, ignoring it.\n")); /* Read the section address information out of the symbol file. Since the file is generated by the JIT at runtime, it should all of the absolute addresses that we care about. */ - sai = alloc_section_addr_info (bfd_count_sections (nbfd.get ())); - old_cleanups = make_cleanup_free_section_addr_info (sai); - i = 0; + section_addr_info sai; for (sec = nbfd->sections; sec != NULL; sec = sec->next) if ((bfd_get_section_flags (nbfd.get (), sec) & (SEC_ALLOC|SEC_LOAD)) != 0) { /* We assume that these virtual addresses are absolute, and do not treat them as offsets. */ - sai->other[i].addr = bfd_get_section_vma (nbfd.get (), sec); - sai->other[i].name = xstrdup (bfd_get_section_name (nbfd.get (), sec)); - sai->other[i].sectindex = sec->index; - ++i; + sai.emplace_back (bfd_get_section_vma (nbfd.get (), sec), + bfd_get_section_name (nbfd.get (), sec), + sec->index); } - sai->num_sections = i; /* This call does not take ownership of SAI. */ objfile = symbol_file_add_from_bfd (nbfd.get (), - bfd_get_filename (nbfd.get ()), 0, sai, + bfd_get_filename (nbfd.get ()), 0, + &sai, OBJF_SHARED | OBJF_NOT_FILENAME, NULL); - do_cleanups (old_cleanups); add_objfile_entry (objfile, entry_addr); } @@ -1097,7 +1090,7 @@ struct jit_unwind_private { /* Cached register values. See jit_frame_sniffer to see how this works. */ - struct regcache *regcache; + detached_regcache *regcache; /* The frame being unwound. */ struct frame_info *this_frame; @@ -1126,7 +1119,7 @@ jit_unwind_reg_set_impl (struct gdb_unwind_callbacks *cb, int dwarf_regnum, return; } - regcache_raw_set_cached_value (priv->regcache, gdb_reg, value->value); + priv->regcache->raw_supply (gdb_reg, value->value); value->free (value); } @@ -1188,7 +1181,6 @@ jit_frame_sniffer (const struct frame_unwind *self, struct jit_unwind_private *priv_data; struct gdb_unwind_callbacks callbacks; struct gdb_reader_funcs *funcs; - struct gdbarch *gdbarch; callbacks.reg_get = jit_unwind_reg_get_impl; callbacks.reg_set = jit_unwind_reg_set_impl; @@ -1201,11 +1193,11 @@ jit_frame_sniffer (const struct frame_unwind *self, gdb_assert (!*cache); - gdbarch = get_frame_arch (this_frame); - *cache = XCNEW (struct jit_unwind_private); priv_data = (struct jit_unwind_private *) *cache; - priv_data->regcache = new regcache (gdbarch); + /* Take a snapshot of current regcache. */ + priv_data->regcache = new detached_regcache (get_frame_arch (this_frame), + true); priv_data->this_frame = this_frame; callbacks.priv_data = priv_data; @@ -1507,9 +1499,9 @@ _initialize_jit (void) show_jit_debug, &setdebuglist, &showdebuglist); - observer_attach_inferior_created (jit_inferior_created); - observer_attach_inferior_exit (jit_inferior_exit_hook); - observer_attach_breakpoint_deleted (jit_breakpoint_deleted); + gdb::observers::inferior_created.attach (jit_inferior_created); + gdb::observers::inferior_exit.attach (jit_inferior_exit_hook); + gdb::observers::breakpoint_deleted.attach (jit_breakpoint_deleted); jit_objfile_data = register_objfile_data_with_cleanup (NULL, free_objfile_data);