* 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:
Tom Tromey 2013-01-31 19:55:15 +00:00
parent f25c01353c
commit 8eacb19765
2 changed files with 77 additions and 66 deletions

View File

@ -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
View File

@ -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 ())
{ {