X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fjit.c;h=b6e51e4f8b4dc45aababed6d5ed5b7c20edddb3c;hb=7190276c52b9d86a52aae73d3a0f8b56e7a1f4f1;hp=1f87bf2538d010f160b0a5af4ef7b5e8ddf5a765;hpb=741d7538b7540fea1086fe6ab962227d2cf7418e;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/jit.c b/gdb/jit.c index 1f87bf2538..b6e51e4f8b 100644 --- a/gdb/jit.c +++ b/gdb/jit.c @@ -36,13 +36,13 @@ #include "symfile.h" #include "symtab.h" #include "target.h" -#include "gdb-dlfcn.h" +#include "gdbsupport/gdb-dlfcn.h" #include #include "gdb_bfd.h" #include "readline/tilde.h" #include "completer.h" -static const char *jit_reader_dir = NULL; +static std::string jit_reader_dir; static const struct objfile_data *jit_objfile_data; @@ -50,8 +50,6 @@ static const char *const jit_break_name = "__jit_debug_register_code"; static const char *const jit_descriptor_name = "__jit_debug_descriptor"; -static const struct program_space_data *jit_program_space_data = NULL; - static void jit_inferior_init (struct gdbarch *gdbarch); static void jit_inferior_exit_hook (struct inferior *inf); @@ -78,7 +76,7 @@ struct target_buffer ULONGEST size; }; -/* Openning the file is a no-op. */ +/* Opening the file is a no-op. */ static void * mem_bfd_iovec_open (struct bfd *abfd, void *open_closure) @@ -218,7 +216,7 @@ jit_reader_load_command (const char *args, int from_tty) error (_("JIT reader already loaded. Run jit-reader-unload first.")); if (!IS_ABSOLUTE_PATH (file.get ())) - file.reset (xstrprintf ("%s%s%s", jit_reader_dir, SLASH_STRING, + file.reset (xstrprintf ("%s%s%s", jit_reader_dir.c_str (), SLASH_STRING, file.get ())); loaded_jit_reader = jit_reader_load (file.get ()); @@ -249,20 +247,22 @@ struct jit_program_space_data /* The objfile. This is NULL if no objfile holds the JIT symbols. */ - struct objfile *objfile; + struct objfile *objfile = nullptr; /* If this program space has __jit_debug_register_code, this is the cached address from the minimal symbol. This is used to detect relocations requiring the breakpoint to be re-created. */ - CORE_ADDR cached_code_address; + CORE_ADDR cached_code_address = 0; /* This is the JIT event breakpoint, or NULL if it has not been set. */ - struct breakpoint *jit_breakpoint; + struct breakpoint *jit_breakpoint = nullptr; }; +static program_space_key jit_program_space_key; + /* Per-objfile structure recording the addresses in the program space. This object serves two purposes: for ordinary objfiles, it may cache some symbols related to the JIT interface; and for @@ -316,29 +316,16 @@ add_objfile_entry (struct objfile *objfile, CORE_ADDR entry) if not already present. */ static struct jit_program_space_data * -get_jit_program_space_data (void) +get_jit_program_space_data () { struct jit_program_space_data *ps_data; - ps_data - = ((struct jit_program_space_data *) - program_space_data (current_program_space, jit_program_space_data)); + ps_data = jit_program_space_key.get (current_program_space); if (ps_data == NULL) - { - ps_data = XCNEW (struct jit_program_space_data); - set_program_space_data (current_program_space, jit_program_space_data, - ps_data); - } - + ps_data = jit_program_space_key.emplace (current_program_space); return ps_data; } -static void -jit_program_space_data_cleanup (struct program_space *ps, void *arg) -{ - xfree (arg); -} - /* Helper function for reading the global JIT descriptor from remote memory. Returns 1 if all went well, 0 otherwise. */ @@ -713,10 +700,8 @@ finalize_symtab (struct gdb_symtab *stab, struct objfile *objfile) SYMBOL_TYPE (block_name) = lookup_function_type (block_type); SYMBOL_BLOCK_VALUE (block_name) = new_block; - block_name->ginfo.name - = (const char *) obstack_copy0 (&objfile->objfile_obstack, - gdb_block_iter->name, - strlen (gdb_block_iter->name)); + block_name->name = obstack_strdup (&objfile->objfile_obstack, + gdb_block_iter->name); BLOCK_FUNCTION (new_block) = block_name; @@ -823,7 +808,6 @@ static int jit_reader_try_read_symtab (struct jit_code_entry *code_entry, CORE_ADDR entry_addr) { - gdb_byte *gdb_mem; int status; jit_dbg_reader_data priv_data; struct gdb_reader_funcs *funcs; @@ -846,30 +830,29 @@ jit_reader_try_read_symtab (struct jit_code_entry *code_entry, if (!loaded_jit_reader) return 0; - gdb_mem = (gdb_byte *) xmalloc (code_entry->symfile_size); + gdb::byte_vector gdb_mem (code_entry->symfile_size); status = 1; - TRY + try { - if (target_read_memory (code_entry->symfile_addr, gdb_mem, + if (target_read_memory (code_entry->symfile_addr, gdb_mem.data (), code_entry->symfile_size)) status = 0; } - CATCH (e, RETURN_MASK_ALL) + catch (const gdb_exception &e) { status = 0; } - END_CATCH if (status) { funcs = loaded_jit_reader->functions; - if (funcs->read (funcs, &callbacks, gdb_mem, code_entry->symfile_size) + if (funcs->read (funcs, &callbacks, gdb_mem.data (), + code_entry->symfile_size) != GDB_SUCCESS) status = 0; } - xfree (gdb_mem); if (jit_debug && status == 0) fprintf_unfiltered (gdb_stdlog, "Could not read symtab using the loaded JIT reader.\n"); @@ -890,7 +873,7 @@ jit_bfd_try_read_symtab (struct jit_code_entry *code_entry, if (jit_debug) fprintf_unfiltered (gdb_stdlog, - "jit_register_code, symfile_addr = %s, " + "jit_bfd_try_read_symtab, symfile_addr = %s, " "symfile_size = %s\n", paddress (gdbarch, code_entry->symfile_addr), pulongest (code_entry->symfile_size)); @@ -926,12 +909,12 @@ JITed symbol file is not an object file, ignoring it.\n")); addresses that we care about. */ 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) + if ((bfd_section_flags (sec) & (SEC_ALLOC|SEC_LOAD)) != 0) { /* We assume that these virtual addresses are absolute, and do not treat them as offsets. */ - sai.emplace_back (bfd_get_section_vma (nbfd.get (), sec), - bfd_get_section_name (nbfd.get (), sec), + sai.emplace_back (bfd_section_vma (sec), + bfd_section_name (sec), sec->index); } @@ -974,6 +957,9 @@ jit_register_code (struct gdbarch *gdbarch, static void jit_unregister_code (struct objfile *objfile) { + if (jit_debug) + fprintf_unfiltered (gdb_stdlog, "jit_unregister_code (%s)\n", + host_address_to_string (objfile)); delete objfile; } @@ -1009,8 +995,7 @@ jit_breakpoint_deleted (struct breakpoint *b) { struct jit_program_space_data *ps_data; - ps_data = ((struct jit_program_space_data *) - program_space_data (iter->pspace, jit_program_space_data)); + ps_data = jit_program_space_key.get (iter->pspace); if (ps_data != NULL && ps_data->jit_breakpoint == iter->owner) { ps_data->cached_code_address = 0; @@ -1449,9 +1434,7 @@ free_objfile_data (struct objfile *objfile, void *data) { struct jit_program_space_data *ps_data; - ps_data - = ((struct jit_program_space_data *) - program_space_data (objfile->pspace, jit_program_space_data)); + ps_data = jit_program_space_key.get (objfile->pspace); if (ps_data != NULL && ps_data->objfile == objfile) { ps_data->objfile = NULL; @@ -1497,9 +1480,6 @@ _initialize_jit (void) jit_objfile_data = register_objfile_data_with_cleanup (NULL, free_objfile_data); - jit_program_space_data = - register_program_space_data_with_cleanup (NULL, - jit_program_space_data_cleanup); jit_gdbarch_data = gdbarch_data_register_pre_init (jit_gdbarch_data_init); if (is_dl_available ()) {