* jit.c (jit_program_space_data): Rename from jit_inferior_data;
change type. (struct jit_program_space_data): Rename from jit_inferior_data. Update comments. (get_jit_program_space_data): Rename from get_jit_inferior_data. Change return type. Attach data to program space. (jit_program_space_data_cleanup): Rename from jit_inferior_data_cleanup; change argument type. (jit_read_descriptor): Change 'inf_data' argument to 'ps_data', change type. (jit_register_code): Update. (jit_update_inferior_cache): Remove. (jit_breakpoint_deleted): Get jit data from the location's program space. (jit_breakpoint_re_set_internal): Rename 'inf_data' argument to 'ps_data', change type. (jit_inferior_init, jit_breakpoint_re_set_internal) (jit_event_handler): Update. (free_objfile_data): Get data from objfile's program space. (_initialize_jit): Update.
This commit is contained in:
parent
f25c01353c
commit
8eacb19765
@ -1,3 +1,26 @@
|
|||||||
|
2013-01-31 Tom Tromey <tromey@redhat.com>
|
||||||
|
|
||||||
|
* jit.c (jit_program_space_data): Rename from jit_inferior_data;
|
||||||
|
change type.
|
||||||
|
(struct jit_program_space_data): Rename from jit_inferior_data.
|
||||||
|
Update comments.
|
||||||
|
(get_jit_program_space_data): Rename from get_jit_inferior_data.
|
||||||
|
Change return type. Attach data to program space.
|
||||||
|
(jit_program_space_data_cleanup): Rename from
|
||||||
|
jit_inferior_data_cleanup; change argument type.
|
||||||
|
(jit_read_descriptor): Change 'inf_data' argument to 'ps_data',
|
||||||
|
change type.
|
||||||
|
(jit_register_code): Update.
|
||||||
|
(jit_update_inferior_cache): Remove.
|
||||||
|
(jit_breakpoint_deleted): Get jit data from the location's program
|
||||||
|
space.
|
||||||
|
(jit_breakpoint_re_set_internal): Rename 'inf_data' argument to
|
||||||
|
'ps_data', change type.
|
||||||
|
(jit_inferior_init, jit_breakpoint_re_set_internal)
|
||||||
|
(jit_event_handler): Update.
|
||||||
|
(free_objfile_data): Get data from objfile's program space.
|
||||||
|
(_initialize_jit): Update.
|
||||||
|
|
||||||
2013-01-31 Tom Tromey <tromey@redhat.com>
|
2013-01-31 Tom Tromey <tromey@redhat.com>
|
||||||
|
|
||||||
PR gdb/13987:
|
PR gdb/13987:
|
||||||
|
120
gdb/jit.c
120
gdb/jit.c
@ -49,7 +49,7 @@ static const char *const jit_break_name = "__jit_debug_register_code";
|
|||||||
|
|
||||||
static const char *const jit_descriptor_name = "__jit_debug_descriptor";
|
static const char *const jit_descriptor_name = "__jit_debug_descriptor";
|
||||||
|
|
||||||
static const struct inferior_data *jit_inferior_data = NULL;
|
static const struct program_space_data *jit_program_space_data = NULL;
|
||||||
|
|
||||||
static void jit_inferior_init (struct gdbarch *gdbarch);
|
static void jit_inferior_init (struct gdbarch *gdbarch);
|
||||||
|
|
||||||
@ -234,17 +234,17 @@ jit_reader_unload_command (char *args, int from_tty)
|
|||||||
loaded_jit_reader = NULL;
|
loaded_jit_reader = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Per-inferior structure recording which objfile has the JIT
|
/* Per-program space structure recording which objfile has the JIT
|
||||||
symbols. */
|
symbols. */
|
||||||
|
|
||||||
struct jit_inferior_data
|
struct jit_program_space_data
|
||||||
{
|
{
|
||||||
/* The objfile. This is NULL if no objfile holds the JIT
|
/* The objfile. This is NULL if no objfile holds the JIT
|
||||||
symbols. */
|
symbols. */
|
||||||
|
|
||||||
struct objfile *objfile;
|
struct objfile *objfile;
|
||||||
|
|
||||||
/* If this inferior has __jit_debug_register_code, this is the
|
/* If this program space has __jit_debug_register_code, this is the
|
||||||
cached address from the minimal symbol. This is used to detect
|
cached address from the minimal symbol. This is used to detect
|
||||||
relocations requiring the breakpoint to be re-created. */
|
relocations requiring the breakpoint to be re-created. */
|
||||||
|
|
||||||
@ -256,7 +256,7 @@ struct jit_inferior_data
|
|||||||
struct breakpoint *jit_breakpoint;
|
struct breakpoint *jit_breakpoint;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Per-objfile structure recording the addresses in the inferior.
|
/* Per-objfile structure recording the addresses in the program space.
|
||||||
This object serves two purposes: for ordinary objfiles, it may
|
This object serves two purposes: for ordinary objfiles, it may
|
||||||
cache some symbols related to the JIT interface; and for
|
cache some symbols related to the JIT interface; and for
|
||||||
JIT-created objfiles, it holds some information about the
|
JIT-created objfiles, it holds some information about the
|
||||||
@ -305,28 +305,27 @@ add_objfile_entry (struct objfile *objfile, CORE_ADDR entry)
|
|||||||
objf_data->addr = entry;
|
objf_data->addr = entry;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return jit_inferior_data for current inferior. Allocate if not already
|
/* Return jit_program_space_data for current program space. Allocate
|
||||||
present. */
|
if not already present. */
|
||||||
|
|
||||||
static struct jit_inferior_data *
|
static struct jit_program_space_data *
|
||||||
get_jit_inferior_data (void)
|
get_jit_program_space_data (void)
|
||||||
{
|
{
|
||||||
struct inferior *inf;
|
struct jit_program_space_data *ps_data;
|
||||||
struct jit_inferior_data *inf_data;
|
|
||||||
|
|
||||||
inf = current_inferior ();
|
ps_data = program_space_data (current_program_space, jit_program_space_data);
|
||||||
inf_data = inferior_data (inf, jit_inferior_data);
|
if (ps_data == NULL)
|
||||||
if (inf_data == NULL)
|
|
||||||
{
|
{
|
||||||
inf_data = XZALLOC (struct jit_inferior_data);
|
ps_data = XZALLOC (struct jit_program_space_data);
|
||||||
set_inferior_data (inf, jit_inferior_data, inf_data);
|
set_program_space_data (current_program_space, jit_program_space_data,
|
||||||
|
ps_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
return inf_data;
|
return ps_data;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
jit_inferior_data_cleanup (struct inferior *inf, void *arg)
|
jit_program_space_data_cleanup (struct program_space *ps, void *arg)
|
||||||
{
|
{
|
||||||
xfree (arg);
|
xfree (arg);
|
||||||
}
|
}
|
||||||
@ -337,7 +336,7 @@ jit_inferior_data_cleanup (struct inferior *inf, void *arg)
|
|||||||
static int
|
static int
|
||||||
jit_read_descriptor (struct gdbarch *gdbarch,
|
jit_read_descriptor (struct gdbarch *gdbarch,
|
||||||
struct jit_descriptor *descriptor,
|
struct jit_descriptor *descriptor,
|
||||||
struct jit_inferior_data *inf_data)
|
struct jit_program_space_data *ps_data)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
struct type *ptr_type;
|
struct type *ptr_type;
|
||||||
@ -347,9 +346,9 @@ jit_read_descriptor (struct gdbarch *gdbarch,
|
|||||||
enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
|
enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
|
||||||
struct jit_objfile_data *objf_data;
|
struct jit_objfile_data *objf_data;
|
||||||
|
|
||||||
if (inf_data->objfile == NULL)
|
if (ps_data->objfile == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
objf_data = get_jit_objfile_data (inf_data->objfile);
|
objf_data = get_jit_objfile_data (ps_data->objfile);
|
||||||
if (objf_data->descriptor == NULL)
|
if (objf_data->descriptor == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -984,29 +983,6 @@ jit_find_objf_with_entry_addr (CORE_ADDR entry_addr)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* A callback for iterate_over_inferiors that updates the inferior's
|
|
||||||
JIT breakpoint information, if necessary. */
|
|
||||||
|
|
||||||
static int
|
|
||||||
jit_update_inferior_cache (struct inferior *inf, void *data)
|
|
||||||
{
|
|
||||||
struct bp_location *loc = data;
|
|
||||||
|
|
||||||
if (inf->pspace == loc->pspace)
|
|
||||||
{
|
|
||||||
struct jit_inferior_data *inf_data;
|
|
||||||
|
|
||||||
inf_data = inferior_data (inf, jit_inferior_data);
|
|
||||||
if (inf_data != NULL && inf_data->jit_breakpoint == loc->owner)
|
|
||||||
{
|
|
||||||
inf_data->cached_code_address = 0;
|
|
||||||
inf_data->jit_breakpoint = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* This is called when a breakpoint is deleted. It updates the
|
/* This is called when a breakpoint is deleted. It updates the
|
||||||
inferior's cache, if needed. */
|
inferior's cache, if needed. */
|
||||||
|
|
||||||
@ -1019,7 +995,16 @@ jit_breakpoint_deleted (struct breakpoint *b)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
for (iter = b->loc; iter != NULL; iter = iter->next)
|
for (iter = b->loc; iter != NULL; iter = iter->next)
|
||||||
iterate_over_inferiors (jit_update_inferior_cache, iter);
|
{
|
||||||
|
struct jit_program_space_data *ps_data;
|
||||||
|
|
||||||
|
ps_data = program_space_data (iter->pspace, jit_program_space_data);
|
||||||
|
if (ps_data != NULL && ps_data->jit_breakpoint == iter->owner)
|
||||||
|
{
|
||||||
|
ps_data->cached_code_address = 0;
|
||||||
|
ps_data->jit_breakpoint = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (Re-)Initialize the jit breakpoint if necessary.
|
/* (Re-)Initialize the jit breakpoint if necessary.
|
||||||
@ -1027,14 +1012,14 @@ jit_breakpoint_deleted (struct breakpoint *b)
|
|||||||
|
|
||||||
static int
|
static int
|
||||||
jit_breakpoint_re_set_internal (struct gdbarch *gdbarch,
|
jit_breakpoint_re_set_internal (struct gdbarch *gdbarch,
|
||||||
struct jit_inferior_data *inf_data)
|
struct jit_program_space_data *ps_data)
|
||||||
{
|
{
|
||||||
struct minimal_symbol *reg_symbol, *desc_symbol;
|
struct minimal_symbol *reg_symbol, *desc_symbol;
|
||||||
struct objfile *objf;
|
struct objfile *objf;
|
||||||
struct jit_objfile_data *objf_data;
|
struct jit_objfile_data *objf_data;
|
||||||
CORE_ADDR addr;
|
CORE_ADDR addr;
|
||||||
|
|
||||||
if (inf_data->objfile == NULL)
|
if (ps_data->objfile == NULL)
|
||||||
{
|
{
|
||||||
/* Lookup the registration symbol. If it is missing, then we
|
/* Lookup the registration symbol. If it is missing, then we
|
||||||
assume we are not attached to a JIT. */
|
assume we are not attached to a JIT. */
|
||||||
@ -1050,10 +1035,10 @@ jit_breakpoint_re_set_internal (struct gdbarch *gdbarch,
|
|||||||
objf_data->register_code = reg_symbol;
|
objf_data->register_code = reg_symbol;
|
||||||
objf_data->descriptor = desc_symbol;
|
objf_data->descriptor = desc_symbol;
|
||||||
|
|
||||||
inf_data->objfile = objf;
|
ps_data->objfile = objf;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
objf_data = get_jit_objfile_data (inf_data->objfile);
|
objf_data = get_jit_objfile_data (ps_data->objfile);
|
||||||
|
|
||||||
addr = SYMBOL_VALUE_ADDRESS (objf_data->register_code);
|
addr = SYMBOL_VALUE_ADDRESS (objf_data->register_code);
|
||||||
|
|
||||||
@ -1063,16 +1048,16 @@ jit_breakpoint_re_set_internal (struct gdbarch *gdbarch,
|
|||||||
"breakpoint_addr = %s\n",
|
"breakpoint_addr = %s\n",
|
||||||
paddress (gdbarch, addr));
|
paddress (gdbarch, addr));
|
||||||
|
|
||||||
if (inf_data->cached_code_address == addr)
|
if (ps_data->cached_code_address == addr)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
/* Delete the old breakpoint. */
|
/* Delete the old breakpoint. */
|
||||||
if (inf_data->jit_breakpoint != NULL)
|
if (ps_data->jit_breakpoint != NULL)
|
||||||
delete_breakpoint (inf_data->jit_breakpoint);
|
delete_breakpoint (ps_data->jit_breakpoint);
|
||||||
|
|
||||||
/* Put a breakpoint in the registration symbol. */
|
/* Put a breakpoint in the registration symbol. */
|
||||||
inf_data->cached_code_address = addr;
|
ps_data->cached_code_address = addr;
|
||||||
inf_data->jit_breakpoint = create_jit_event_breakpoint (gdbarch, addr);
|
ps_data->jit_breakpoint = create_jit_event_breakpoint (gdbarch, addr);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1316,7 +1301,7 @@ jit_inferior_init (struct gdbarch *gdbarch)
|
|||||||
{
|
{
|
||||||
struct jit_descriptor descriptor;
|
struct jit_descriptor descriptor;
|
||||||
struct jit_code_entry cur_entry;
|
struct jit_code_entry cur_entry;
|
||||||
struct jit_inferior_data *inf_data;
|
struct jit_program_space_data *ps_data;
|
||||||
CORE_ADDR cur_entry_addr;
|
CORE_ADDR cur_entry_addr;
|
||||||
|
|
||||||
if (jit_debug)
|
if (jit_debug)
|
||||||
@ -1324,13 +1309,13 @@ jit_inferior_init (struct gdbarch *gdbarch)
|
|||||||
|
|
||||||
jit_prepend_unwinder (gdbarch);
|
jit_prepend_unwinder (gdbarch);
|
||||||
|
|
||||||
inf_data = get_jit_inferior_data ();
|
ps_data = get_jit_program_space_data ();
|
||||||
if (jit_breakpoint_re_set_internal (gdbarch, inf_data) != 0)
|
if (jit_breakpoint_re_set_internal (gdbarch, ps_data) != 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* Read the descriptor so we can check the version number and load
|
/* Read the descriptor so we can check the version number and load
|
||||||
any already JITed functions. */
|
any already JITed functions. */
|
||||||
if (!jit_read_descriptor (gdbarch, &descriptor, inf_data))
|
if (!jit_read_descriptor (gdbarch, &descriptor, ps_data))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* Check that the version number agrees with that we support. */
|
/* Check that the version number agrees with that we support. */
|
||||||
@ -1374,7 +1359,7 @@ void
|
|||||||
jit_breakpoint_re_set (void)
|
jit_breakpoint_re_set (void)
|
||||||
{
|
{
|
||||||
jit_breakpoint_re_set_internal (target_gdbarch (),
|
jit_breakpoint_re_set_internal (target_gdbarch (),
|
||||||
get_jit_inferior_data ());
|
get_jit_program_space_data ());
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This function cleans up any code entries left over when the
|
/* This function cleans up any code entries left over when the
|
||||||
@ -1406,7 +1391,8 @@ jit_event_handler (struct gdbarch *gdbarch)
|
|||||||
struct objfile *objf;
|
struct objfile *objf;
|
||||||
|
|
||||||
/* Read the descriptor from remote memory. */
|
/* Read the descriptor from remote memory. */
|
||||||
if (!jit_read_descriptor (gdbarch, &descriptor, get_jit_inferior_data ()))
|
if (!jit_read_descriptor (gdbarch, &descriptor,
|
||||||
|
get_jit_program_space_data ()))
|
||||||
return;
|
return;
|
||||||
entry_addr = descriptor.relevant_entry;
|
entry_addr = descriptor.relevant_entry;
|
||||||
|
|
||||||
@ -1435,7 +1421,7 @@ jit_event_handler (struct gdbarch *gdbarch)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Called to free the data allocated to the jit_inferior_data slot. */
|
/* Called to free the data allocated to the jit_program_space_data slot. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
free_objfile_data (struct objfile *objfile, void *data)
|
free_objfile_data (struct objfile *objfile, void *data)
|
||||||
@ -1444,10 +1430,11 @@ free_objfile_data (struct objfile *objfile, void *data)
|
|||||||
|
|
||||||
if (objf_data->register_code != NULL)
|
if (objf_data->register_code != NULL)
|
||||||
{
|
{
|
||||||
struct jit_inferior_data *inf_data = get_jit_inferior_data ();
|
struct jit_program_space_data *ps_data;
|
||||||
|
|
||||||
if (inf_data->objfile == objfile)
|
ps_data = program_space_data (objfile->pspace, jit_program_space_data);
|
||||||
inf_data->objfile = NULL;
|
if (ps_data != NULL && ps_data->objfile == objfile)
|
||||||
|
ps_data->objfile = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
xfree (data);
|
xfree (data);
|
||||||
@ -1488,8 +1475,9 @@ _initialize_jit (void)
|
|||||||
|
|
||||||
jit_objfile_data =
|
jit_objfile_data =
|
||||||
register_objfile_data_with_cleanup (NULL, free_objfile_data);
|
register_objfile_data_with_cleanup (NULL, free_objfile_data);
|
||||||
jit_inferior_data =
|
jit_program_space_data =
|
||||||
register_inferior_data_with_cleanup (NULL, jit_inferior_data_cleanup);
|
register_program_space_data_with_cleanup (NULL,
|
||||||
|
jit_program_space_data_cleanup);
|
||||||
jit_gdbarch_data = gdbarch_data_register_pre_init (jit_gdbarch_data_init);
|
jit_gdbarch_data = gdbarch_data_register_pre_init (jit_gdbarch_data_init);
|
||||||
if (is_dl_available ())
|
if (is_dl_available ())
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user