+2020-07-22 Simon Marchi <simon.marchi@polymtl.ca>
+
+ * jit.h (struct jit_objfile_data): Split into...
+ (struct jiter_objfile_data): ... this ...
+ (struct jited_objfile_data): ... and this.
+ * objfiles.h (struct objfile) <jit_data>: Remove.
+ <jiter_data, jited_data>: New fields.
+ * jit.c (jit_objfile_data::~jit_objfile_data): Rename to ...
+ (jiter_objfile_data::~jiter_objfile_data): ... this.
+ (get_jit_objfile_data): Rename to ...
+ (get_jiter_objfile_data): ... this.
+ (add_objfile_entry): Update.
+ (jit_read_descriptor): Use get_jiter_objfile_data.
+ (jit_find_objf_with_entry_addr): Use objfile's jited_data field.
+ (jit_breakpoint_re_set_internal): Use get_jiter_objfile_data.
+ (jit_inferior_exit_hook): Use objfile's jited_data field.
+
2020-07-22 Simon Marchi <simon.marchi@polymtl.ca>
* jit.h: Forward-declare `struct minimal_symbol`.
static program_space_key<jit_program_space_data> jit_program_space_key;
-/* Destructor for jit_objfile_data. */
+/* Destructor for jiter_objfile_data. */
-jit_objfile_data::~jit_objfile_data ()
+jiter_objfile_data::~jiter_objfile_data ()
{
/* Free the data allocated in the jit_program_space_data slot. */
if (this->register_code != NULL)
}
}
-/* Fetch the jit_objfile_data associated with OBJF. If no data exists
+/* Fetch the jiter_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)
+static jiter_objfile_data *
+get_jiter_objfile_data (objfile *objf)
{
- if (objf->jit_data == nullptr)
- objf->jit_data.reset (new jit_objfile_data (objf));
+ if (objf->jiter_data == nullptr)
+ objf->jiter_data.reset (new jiter_objfile_data (objf));
- return objf->jit_data.get ();
+ return objf->jiter_data.get ();
}
/* Remember OBJFILE has been created for struct jit_code_entry located
static void
add_objfile_entry (struct objfile *objfile, CORE_ADDR entry)
{
- struct jit_objfile_data *objf_data;
+ gdb_assert (objfile->jited_data == nullptr);
- objf_data = get_jit_objfile_data (objfile);
- objf_data->addr = entry;
+ objfile->jited_data.reset (new jited_objfile_data (entry));
}
/* Return jit_program_space_data for current program space. Allocate
int desc_size;
gdb_byte *desc_buf;
enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
- struct jit_objfile_data *objf_data;
gdb_assert (jiter != nullptr);
- objf_data = get_jit_objfile_data (jiter);
+ jiter_objfile_data *objf_data = get_jiter_objfile_data (jiter);
if (objf_data->descriptor == NULL)
return false;
{
for (objfile *objf : current_program_space->objfiles ())
{
- if (objf->jit_data != nullptr && objf->jit_data->addr == entry_addr)
+ if (objf->jited_data != nullptr && objf->jited_data->addr == entry_addr)
return objf;
}
{
struct bound_minimal_symbol reg_symbol;
struct bound_minimal_symbol desc_symbol;
- struct jit_objfile_data *objf_data;
+ jiter_objfile_data *objf_data;
CORE_ADDR addr;
if (ps_data->objfile == NULL)
|| BMSYMBOL_VALUE_ADDRESS (desc_symbol) == 0)
return false;
- objf_data = get_jit_objfile_data (reg_symbol.objfile);
+ objf_data = get_jiter_objfile_data (reg_symbol.objfile);
objf_data->register_code = reg_symbol.minsym;
objf_data->descriptor = desc_symbol.minsym;
ps_data->objfile = reg_symbol.objfile;
}
else
- objf_data = get_jit_objfile_data (ps_data->objfile);
+ objf_data = get_jiter_objfile_data (ps_data->objfile);
addr = MSYMBOL_VALUE_ADDRESS (ps_data->objfile, objf_data->register_code);
{
for (objfile *objf : current_program_space->objfiles_safe ())
{
- if (objf->jit_data != nullptr && objf->jit_data->addr != 0)
+ if (objf->jited_data != nullptr && objf->jited_data->addr != 0)
objf->unlink ();
}
}
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. */
+/* An objfile that defines the required symbols of the JIT interface has an
+ instance of this type attached to it. */
-struct jit_objfile_data
+struct jiter_objfile_data
{
- jit_objfile_data (struct objfile *objfile)
+ jiter_objfile_data (struct objfile *objfile)
: objfile (objfile)
{}
- ~jit_objfile_data ();
+ ~jiter_objfile_data ();
/* Back-link to the objfile. */
struct objfile *objfile;
/* Symbol for __jit_debug_descriptor. */
minimal_symbol *descriptor = nullptr;
+};
+
+/* An objfile that is the product of JIT compilation and was registered
+ using the JIT interface has an instance of this type attached to it. */
+
+struct jited_objfile_data
+{
+ jited_objfile_data (CORE_ADDR addr)
+ : addr (addr)
+ {}
- /* 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;
+ /* Address of struct jit_code_entry for this objfile. */
+ CORE_ADDR addr;
};
/* Looks for the descriptor and registration symbols and breakpoints
allocated on the objfile's obstack. */
htab_up static_links;
- /* JIT-related data for this objfile. */
- std::unique_ptr<jit_objfile_data> jit_data = nullptr;
+ /* JIT-related data for this objfile, if the objfile is a JITer;
+ that is, it produces JITed objfiles. */
+ std::unique_ptr<jiter_objfile_data> jiter_data = nullptr;
+
+ /* JIT-related data for this objfile, if the objfile is JITed;
+ that is, it was produced by a JITer. */
+ std::unique_ptr<jited_objfile_data> jited_data = nullptr;
};
/* A deleter for objfile. */