gdb/jit: split jit_objfile_data in two
The jit_objfile_data is currently used to hold information about both objfiles that are the result of JIT compilation (JITed) and objfiles that can produce JITed objfiles (JITers). I think that this double use of the type is confusing, and that things would be more obvious if we had one type for each role. This patch splits it into: - jited_objfile_data: for data about an objfile that is the result of a JIT compilation - jiter_objfile_data: for data about an objfile which produces JITed objfiles There are now two JIT-related fields in an objfile, one for each kind. With this change, the following invariants hold: - an objfile has a non-null `jiter_data` field iff it defines the required symbols of the JIT interface - an objfile has a non-null `jited_data` field iff it is the product of JIT compilation (has been produced by some JITer) gdb/ChangeLog: 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.
This commit is contained in:
parent
238b5c9f08
commit
0e74a041c0
4 changed files with 57 additions and 31 deletions
|
@ -1,3 +1,20 @@
|
|||
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`.
|
||||
|
|
34
gdb/jit.c
34
gdb/jit.c
|
@ -263,9 +263,9 @@ struct jit_program_space_data
|
|||
|
||||
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)
|
||||
|
@ -283,16 +283,16 @@ jit_objfile_data::~jit_objfile_data ()
|
|||
}
|
||||
}
|
||||
|
||||
/* 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
|
||||
|
@ -301,10 +301,9 @@ get_jit_objfile_data (struct objfile *objf)
|
|||
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
|
||||
|
@ -335,10 +334,9 @@ jit_read_descriptor (gdbarch *gdbarch,
|
|||
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;
|
||||
|
@ -908,7 +906,7 @@ jit_find_objf_with_entry_addr (CORE_ADDR entry_addr)
|
|||
{
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -948,7 +946,7 @@ jit_breakpoint_re_set_internal (struct gdbarch *gdbarch,
|
|||
{
|
||||
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)
|
||||
|
@ -966,14 +964,14 @@ jit_breakpoint_re_set_internal (struct gdbarch *gdbarch,
|
|||
|| 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);
|
||||
|
||||
|
@ -1315,7 +1313,7 @@ jit_inferior_exit_hook (struct inferior *inf)
|
|||
{
|
||||
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 ();
|
||||
}
|
||||
}
|
||||
|
|
28
gdb/jit.h
28
gdb/jit.h
|
@ -67,19 +67,16 @@ struct jit_descriptor
|
|||
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;
|
||||
|
@ -89,10 +86,19 @@ struct jit_objfile_data
|
|||
|
||||
/* 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;
|
||||
/* 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 for this objfile. */
|
||||
CORE_ADDR addr;
|
||||
};
|
||||
|
||||
/* Looks for the descriptor and registration symbols and breakpoints
|
||||
|
|
|
@ -699,8 +699,13 @@ public:
|
|||
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. */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue