+2020-07-22 Simon Marchi <simon.marchi@polymtl.ca>
+
+ * jit.h: Forward-declare `struct minimal_symbol`.
+ (struct jit_objfile_data): Migrate to here from jit.c; also add a
+ constructor, destructor, and an objfile* field.
+ * jit.c (jit_objfile_data): Remove.
+ (struct jit_objfile_data): Migrate from here to jit.h.
+ (jit_objfile_data::~jit_objfile_data): New destructor
+ implementation with code moved from free_objfile_data.
+ (free_objfile_data): Delete.
+ (get_jit_objfile_data): Update to use the jit_data field of objfile.
+ (jit_find_objf_with_entry_addr): Ditto.
+ (jit_inferior_exit_hook): Ditto.
+ (_initialize_jit): Remove the call to
+ register_objfile_data_with_cleanup.
+ * objfiles.h (struct objfile) <jit_data>: New field.
+
2020-07-22 Tankut Baris Aktemur <tankut.baris.aktemur@intel.com>
* jit.h: Forward-declare `struct objfile`.
static std::string jit_reader_dir;
-static const struct objfile_data *jit_objfile_data;
-
static const char *const jit_break_name = "__jit_debug_register_code";
static const char *const jit_descriptor_name = "__jit_debug_descriptor";
static program_space_key<jit_program_space_data> 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
- JIT-created objfiles, it holds some information about the
- jit_code_entry. */
+/* Destructor for jit_objfile_data. */
-struct jit_objfile_data
+jit_objfile_data::~jit_objfile_data ()
{
- /* Symbol for __jit_debug_register_code. */
- struct minimal_symbol *register_code;
-
- /* Symbol for __jit_debug_descriptor. */
- struct minimal_symbol *descriptor;
+ /* Free the data allocated in the jit_program_space_data slot. */
+ if (this->register_code != NULL)
+ {
+ struct jit_program_space_data *ps_data;
- /* Address of struct jit_code_entry in this objfile. This is only
- non-zero for objfiles that represent code created by the JIT. */
- CORE_ADDR addr;
-};
+ ps_data = jit_program_space_key.get (this->objfile->pspace);
+ if (ps_data != NULL && ps_data->objfile == this->objfile)
+ {
+ ps_data->objfile = NULL;
+ if (ps_data->jit_breakpoint != NULL)
+ delete_breakpoint (ps_data->jit_breakpoint);
+ ps_data->cached_code_address = 0;
+ }
+ }
+}
/* Fetch the jit_objfile_data associated with OBJF. If no data exists
yet, make a new structure and attach it. */
static struct jit_objfile_data *
get_jit_objfile_data (struct objfile *objf)
{
- struct jit_objfile_data *objf_data;
+ if (objf->jit_data == nullptr)
+ objf->jit_data.reset (new jit_objfile_data (objf));
- objf_data = (struct jit_objfile_data *) objfile_data (objf, jit_objfile_data);
- if (objf_data == NULL)
- {
- objf_data = XCNEW (struct jit_objfile_data);
- set_objfile_data (objf, jit_objfile_data, objf_data);
- }
-
- return objf_data;
+ return objf->jit_data.get ();
}
/* Remember OBJFILE has been created for struct jit_code_entry located
{
for (objfile *objf : current_program_space->objfiles ())
{
- struct jit_objfile_data *objf_data;
-
- objf_data
- = (struct jit_objfile_data *) objfile_data (objf, jit_objfile_data);
- if (objf_data != NULL && objf_data->addr == entry_addr)
+ if (objf->jit_data != nullptr && objf->jit_data->addr == entry_addr)
return objf;
}
+
return NULL;
}
{
for (objfile *objf : current_program_space->objfiles_safe ())
{
- struct jit_objfile_data *objf_data
- = (struct jit_objfile_data *) objfile_data (objf, jit_objfile_data);
-
- if (objf_data != NULL && objf_data->addr != 0)
+ if (objf->jit_data != nullptr && objf->jit_data->addr != 0)
objf->unlink ();
}
}
}
}
-/* Called to free the data allocated to the jit_program_space_data slot. */
-
-static void
-free_objfile_data (struct objfile *objfile, void *data)
-{
- struct jit_objfile_data *objf_data = (struct jit_objfile_data *) data;
-
- if (objf_data->register_code != NULL)
- {
- struct jit_program_space_data *ps_data;
-
- ps_data = jit_program_space_key.get (objfile->pspace);
- if (ps_data != NULL && ps_data->objfile == objfile)
- {
- ps_data->objfile = NULL;
- if (ps_data->jit_breakpoint != NULL)
- delete_breakpoint (ps_data->jit_breakpoint);
- ps_data->cached_code_address = 0;
- }
- }
-
- xfree (data);
-}
-
/* Initialize the jit_gdbarch_data slot with an instance of struct
jit_gdbarch_data_type */
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);
jit_gdbarch_data = gdbarch_data_register_pre_init (jit_gdbarch_data_init);
if (is_dl_available ())
{
#define JIT_H
struct objfile;
+struct minimal_symbol;
/* When the JIT breakpoint fires, the inferior wants us to take one of
these actions. These values are used by the inferior, so the
CORE_ADDR first_entry;
};
+/* 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
+ JIT-created objfiles, it holds some information about the
+ jit_code_entry. */
+
+struct jit_objfile_data
+{
+ jit_objfile_data (struct objfile *objfile)
+ : objfile (objfile)
+ {}
+
+ ~jit_objfile_data ();
+
+ /* Back-link to the objfile. */
+ struct objfile *objfile;
+
+ /* Symbol for __jit_debug_register_code. */
+ minimal_symbol *register_code = nullptr;
+
+ /* Symbol for __jit_debug_descriptor. */
+ minimal_symbol *descriptor = nullptr;
+
+ /* Address of struct jit_code_entry in this objfile. This is only
+ non-zero for objfiles that represent code created by the JIT. */
+ CORE_ADDR addr = 0;
+};
+
/* Looks for the descriptor and registration symbols and breakpoints
the registration function. If it finds both, it registers all the
already JITed code. If it has already found the symbols, then it