static file_ptr
mem_bfd_iovec_pread (struct bfd *abfd, void *stream, void *buf,
- file_ptr nbytes, file_ptr offset)
+ file_ptr nbytes, file_ptr offset)
{
int err;
struct target_buffer *buffer = (struct target_buffer *) stream;
if (jit_debug)
fprintf_unfiltered (gdb_stdlog, _("Opening shared object %s.\n"),
- file_name);
+ file_name);
gdb_dlhandle_up so = gdb_dlopen (file_name);
init_fn = (reader_init_fn_type *) gdb_dlsym (so, reader_init_fn_sym);
if (!init_fn)
error (_("Could not locate initialization function: %s."),
- reader_init_fn_sym);
+ reader_init_fn_sym);
if (gdb_dlsym (so, "plugin_is_GPL_compatible") == NULL)
error (_("Reader not GPL compatible."));
struct gdb_symtab
{
+ explicit gdb_symtab (const char *file_name)
+ : file_name (file_name != nullptr ? file_name : "")
+ {}
+
+ ~gdb_symtab ()
+ {
+ gdb_block *gdb_block_iter, *gdb_block_iter_tmp;
+
+ for ((gdb_block_iter = this->blocks,
+ gdb_block_iter_tmp = gdb_block_iter->next);
+ gdb_block_iter;
+ gdb_block_iter = gdb_block_iter_tmp)
+ {
+ gdb_block_iter_tmp = gdb_block_iter->next;
+ xfree ((void *) gdb_block_iter->name);
+ xfree (gdb_block_iter);
+ }
+ }
+
/* The list of blocks in this symtab. These will eventually be
converted to real blocks. */
- struct gdb_block *blocks;
+ struct gdb_block *blocks = nullptr;
/* The number of blocks inserted. */
- int nblocks;
+ int nblocks = 0;
/* A mapping between line numbers to PC. */
- struct linetable *linetable;
+ gdb::unique_xmalloc_ptr<struct linetable> linetable;
/* The source file for this symtab. */
- const char *file_name;
- struct gdb_symtab *next;
+ std::string file_name;
+
+ struct gdb_symtab *next = nullptr;
};
/* Proxy object for building an object. */
static struct gdb_symtab *
jit_symtab_open_impl (struct gdb_symbol_callbacks *cb,
- struct gdb_object *object,
- const char *file_name)
+ struct gdb_object *object,
+ const char *file_name)
{
- struct gdb_symtab *ret;
-
/* CB stays unused. See comment in jit_object_open_impl. */
- ret = XCNEW (struct gdb_symtab);
- ret->file_name = file_name ? xstrdup (file_name) : xstrdup ("");
+ gdb_symtab *ret = new gdb_symtab (file_name);
ret->next = object->symtabs;
object->symtabs = ret;
return ret;
static int
compare_block (const struct gdb_block *const old,
- const struct gdb_block *const newobj)
+ const struct gdb_block *const newobj)
{
if (old == NULL)
return 1;
else if (old->begin == newobj->begin)
{
if (old->end > newobj->end)
- return 1;
+ return 1;
else
- return 0;
+ return 0;
}
else
return 0;
static struct gdb_block *
jit_block_open_impl (struct gdb_symbol_callbacks *cb,
- struct gdb_symtab *symtab, struct gdb_block *parent,
- GDB_CORE_ADDR begin, GDB_CORE_ADDR end, const char *name)
+ struct gdb_symtab *symtab, struct gdb_block *parent,
+ GDB_CORE_ADDR begin, GDB_CORE_ADDR end, const char *name)
{
struct gdb_block *block = XCNEW (struct gdb_block);
struct gdb_block *i = symtab->blocks;
for (;; i = i->next)
- {
- /* Guaranteed to terminate, since compare_block (NULL, _)
- returns 1. */
- if (compare_block (i->next, block))
- {
- block->next = i->next;
- i->next = block;
- break;
- }
- }
+ {
+ /* Guaranteed to terminate, since compare_block (NULL, _)
+ returns 1. */
+ if (compare_block (i->next, block))
+ {
+ block->next = i->next;
+ i->next = block;
+ break;
+ }
+ }
}
symtab->nblocks++;
static void
jit_symtab_line_mapping_add_impl (struct gdb_symbol_callbacks *cb,
- struct gdb_symtab *stab, int nlines,
- struct gdb_line_mapping *map)
+ struct gdb_symtab *stab, int nlines,
+ struct gdb_line_mapping *map)
{
int i;
int alloc_len;
alloc_len = sizeof (struct linetable)
+ (nlines - 1) * sizeof (struct linetable_entry);
- stab->linetable = (struct linetable *) xmalloc (alloc_len);
+ stab->linetable.reset (XNEWVAR (struct linetable, alloc_len));
stab->linetable->nitems = nlines;
for (i = 0; i < nlines; i++)
{
static void
jit_symtab_close_impl (struct gdb_symbol_callbacks *cb,
- struct gdb_symtab *stab)
+ struct gdb_symtab *stab)
{
/* Right now nothing needs to be done here. We may need to do some
cleanup here in the future (again, without breaking the plugin
finalize_symtab (struct gdb_symtab *stab, struct objfile *objfile)
{
struct compunit_symtab *cust;
- struct gdb_block *gdb_block_iter, *gdb_block_iter_tmp;
+ struct gdb_block *gdb_block_iter;
struct block *block_iter;
int actual_nblocks, i;
size_t blockvector_size;
actual_nblocks = FIRST_LOCAL_BLOCK + stab->nblocks;
- cust = allocate_compunit_symtab (objfile, stab->file_name);
- allocate_symtab (cust, stab->file_name);
+ cust = allocate_compunit_symtab (objfile, stab->file_name.c_str ());
+ allocate_symtab (cust, stab->file_name.c_str ());
add_compunit_symtab_to_objfile (cust);
/* JIT compilers compile in memory. */
+ sizeof (struct linetable));
SYMTAB_LINETABLE (COMPUNIT_FILETABS (cust))
= (struct linetable *) obstack_alloc (&objfile->objfile_obstack, size);
- memcpy (SYMTAB_LINETABLE (COMPUNIT_FILETABS (cust)), stab->linetable,
- size);
+ memcpy (SYMTAB_LINETABLE (COMPUNIT_FILETABS (cust)),
+ stab->linetable.get (), size);
}
blockvector_size = (sizeof (struct blockvector)
- + (actual_nblocks - 1) * sizeof (struct block *));
+ + (actual_nblocks - 1) * sizeof (struct block *));
bv = (struct blockvector *) obstack_alloc (&objfile->objfile_obstack,
blockvector_size);
COMPUNIT_BLOCKVECTOR (cust) = bv;
BLOCKVECTOR_BLOCK (bv, i) = new_block;
if (begin > BLOCK_START (new_block))
- begin = BLOCK_START (new_block);
+ begin = BLOCK_START (new_block);
if (end < BLOCK_END (new_block))
- end = BLOCK_END (new_block);
+ end = BLOCK_END (new_block);
gdb_block_iter->real_block = new_block;
}
}
}
- /* Free memory. */
- gdb_block_iter = stab->blocks;
-
- for (gdb_block_iter = stab->blocks, gdb_block_iter_tmp = gdb_block_iter->next;
- gdb_block_iter;
- gdb_block_iter = gdb_block_iter_tmp)
- {
- xfree ((void *) gdb_block_iter->name);
- xfree (gdb_block_iter);
- }
- xfree (stab->linetable);
- xfree ((char *) stab->file_name);
- xfree (stab);
+ delete stab;
}
/* Called when closing a gdb_objfile. Converts OBJ to a proper
static void
jit_object_close_impl (struct gdb_symbol_callbacks *cb,
- struct gdb_object *obj)
+ struct gdb_object *obj)
{
struct gdb_symtab *i, *j;
struct objfile *objfile;
priv_data = (jit_dbg_reader_data *) cb->priv_data;
- objfile = new struct objfile (NULL, "<< JIT compiled code >>",
- OBJF_NOT_FILENAME);
+ objfile = objfile::make (nullptr, "<< JIT compiled code >>",
+ OBJF_NOT_FILENAME);
objfile->per_bfd->gdbarch = target_gdbarch ();
j = NULL;
static int
jit_reader_try_read_symtab (struct jit_code_entry *code_entry,
- CORE_ADDR entry_addr)
+ CORE_ADDR entry_addr)
{
- gdb_byte *gdb_mem;
int status;
jit_dbg_reader_data priv_data;
struct gdb_reader_funcs *funcs;
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
{
- 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;
}
if (status)
{
funcs = loaded_jit_reader->functions;
- if (funcs->read (funcs, &callbacks, gdb_mem, code_entry->symfile_size)
- != GDB_SUCCESS)
- status = 0;
+ 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");
+ "Could not read symtab using the loaded JIT reader.\n");
return status;
}
static void
jit_bfd_try_read_symtab (struct jit_code_entry *code_entry,
- CORE_ADDR entry_addr,
- struct gdbarch *gdbarch)
+ CORE_ADDR entry_addr,
+ struct gdbarch *gdbarch)
{
struct bfd_section *sec;
struct objfile *objfile;
b = gdbarch_bfd_arch_info (gdbarch);
if (b->compatible (b, bfd_get_arch_info (nbfd.get ())) != b)
warning (_("JITed object file architecture %s is not compatible "
- "with target architecture %s."),
+ "with target architecture %s."),
bfd_get_arch_info (nbfd.get ())->printable_name,
b->printable_name);
for (sec = nbfd->sections; sec != NULL; sec = sec->next)
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. */
+ /* We assume that these virtual addresses are absolute, and do not
+ treat them as offsets. */
sai.emplace_back (bfd_section_vma (sec),
bfd_section_name (sec),
sec->index);
static void
jit_register_code (struct gdbarch *gdbarch,
- CORE_ADDR entry_addr, struct jit_code_entry *code_entry)
+ CORE_ADDR entry_addr, struct jit_code_entry *code_entry)
{
int success;
if (jit_debug)
fprintf_unfiltered (gdb_stdlog,
- "jit_register_code, symfile_addr = %s, "
- "symfile_size = %s\n",
- paddress (gdbarch, code_entry->symfile_addr),
- pulongest (code_entry->symfile_size));
+ "jit_register_code, symfile_addr = %s, "
+ "symfile_size = %s\n",
+ paddress (gdbarch, code_entry->symfile_addr),
+ pulongest (code_entry->symfile_size));
success = jit_reader_try_read_symtab (code_entry, entry_addr);
jit_bfd_try_read_symtab (code_entry, entry_addr, gdbarch);
}
-/* This function unregisters JITed code and frees the corresponding
- objfile. */
-
-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;
-}
-
/* Look up the objfile with this code entry address. */
static struct objfile *
objf_data
= (struct jit_objfile_data *) objfile_data (objf, jit_objfile_data);
if (objf_data != NULL && objf_data->addr == entry_addr)
- return objf;
+ return objf;
}
return NULL;
}
static void
jit_unwind_reg_set_impl (struct gdb_unwind_callbacks *cb, int dwarf_regnum,
- struct gdb_reg_value *value)
+ struct gdb_reg_value *value)
{
struct jit_unwind_private *priv;
int gdb_reg;
priv = (struct jit_unwind_private *) cb->priv_data;
gdb_reg = gdbarch_dwarf2_reg_to_regnum (get_frame_arch (priv->this_frame),
- dwarf_regnum);
+ dwarf_regnum);
if (gdb_reg == -1)
{
if (jit_debug)
- fprintf_unfiltered (gdb_stdlog,
- _("Could not recognize DWARF regnum %d"),
- dwarf_regnum);
+ fprintf_unfiltered (gdb_stdlog,
+ _("Could not recognize DWARF regnum %d"),
+ dwarf_regnum);
value->free (value);
return;
}
static int
jit_frame_sniffer (const struct frame_unwind *self,
- struct frame_info *this_frame, void **cache)
+ struct frame_info *this_frame, void **cache)
{
struct jit_unwind_private *priv_data;
struct gdb_unwind_callbacks callbacks;
if (funcs->unwind (funcs, &callbacks) == GDB_SUCCESS)
{
if (jit_debug)
- fprintf_unfiltered (gdb_stdlog, _("Successfully unwound frame using "
- "JIT reader.\n"));
+ fprintf_unfiltered (gdb_stdlog, _("Successfully unwound frame using "
+ "JIT reader.\n"));
return 1;
}
if (jit_debug)
fprintf_unfiltered (gdb_stdlog, _("Could not unwind frame using "
- "JIT reader.\n"));
+ "JIT reader.\n"));
jit_dealloc_cache (this_frame, *cache);
*cache = NULL;
static void
jit_frame_this_id (struct frame_info *this_frame, void **cache,
- struct frame_id *this_id)
+ struct frame_id *this_id)
{
struct jit_unwind_private priv;
struct gdb_frame_id frame_id;
jit_read_code_entry (gdbarch, cur_entry_addr, &cur_entry);
/* This hook may be called many times during setup, so make sure we don't
- add the same symbol file twice. */
+ add the same symbol file twice. */
if (jit_find_objf_with_entry_addr (cur_entry_addr) != NULL)
- continue;
+ continue;
jit_register_code (gdbarch, cur_entry_addr, &cur_entry);
}
= (struct jit_objfile_data *) objfile_data (objf, jit_objfile_data);
if (objf_data != NULL && objf_data->addr != 0)
- jit_unregister_code (objf);
+ objf->unlink ();
}
}
"entry at address: %s\n"),
paddress (gdbarch, entry_addr));
else
- jit_unregister_code (objf);
+ objf->unlink ();
break;
default:
_initialize_jit (void)
{
jit_reader_dir = relocate_gdb_directory (JIT_READER_DIR,
- JIT_READER_DIR_RELOCATABLE);
+ JIT_READER_DIR_RELOCATABLE);
add_setshow_zuinteger_cmd ("jit", class_maintenance, &jit_debug,
_("Set JIT debugging."),
_("Show JIT debugging."),