diff --git a/gdb/ChangeLog b/gdb/ChangeLog index cbcbf16b88..e4cbe05e36 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,26 @@ +2013-01-31 Tom Tromey + + * 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 PR gdb/13987: diff --git a/gdb/jit.c b/gdb/jit.c index a2a9b9e878..ecf7317a13 100644 --- a/gdb/jit.c +++ b/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 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); @@ -234,17 +234,17 @@ jit_reader_unload_command (char *args, int from_tty) loaded_jit_reader = NULL; } -/* Per-inferior structure recording which objfile has the JIT +/* Per-program space structure recording which objfile has the JIT symbols. */ -struct jit_inferior_data +struct jit_program_space_data { /* The objfile. This is NULL if no objfile holds the JIT symbols. */ 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 relocations requiring the breakpoint to be re-created. */ @@ -256,7 +256,7 @@ struct jit_inferior_data 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 cache some symbols related to the JIT interface; and for 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; } -/* Return jit_inferior_data for current inferior. Allocate if not already - present. */ +/* Return jit_program_space_data for current program space. Allocate + if not already present. */ -static struct jit_inferior_data * -get_jit_inferior_data (void) +static struct jit_program_space_data * +get_jit_program_space_data (void) { - struct inferior *inf; - struct jit_inferior_data *inf_data; + struct jit_program_space_data *ps_data; - inf = current_inferior (); - inf_data = inferior_data (inf, jit_inferior_data); - if (inf_data == NULL) + ps_data = program_space_data (current_program_space, jit_program_space_data); + if (ps_data == NULL) { - inf_data = XZALLOC (struct jit_inferior_data); - set_inferior_data (inf, jit_inferior_data, inf_data); + ps_data = XZALLOC (struct jit_program_space_data); + set_program_space_data (current_program_space, jit_program_space_data, + ps_data); } - return inf_data; + return ps_data; } static void -jit_inferior_data_cleanup (struct inferior *inf, void *arg) +jit_program_space_data_cleanup (struct program_space *ps, void *arg) { xfree (arg); } @@ -337,7 +336,7 @@ jit_inferior_data_cleanup (struct inferior *inf, void *arg) static int jit_read_descriptor (struct gdbarch *gdbarch, struct jit_descriptor *descriptor, - struct jit_inferior_data *inf_data) + struct jit_program_space_data *ps_data) { int err; struct type *ptr_type; @@ -347,9 +346,9 @@ jit_read_descriptor (struct gdbarch *gdbarch, enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); struct jit_objfile_data *objf_data; - if (inf_data->objfile == NULL) + if (ps_data->objfile == NULL) 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) return 0; @@ -984,29 +983,6 @@ jit_find_objf_with_entry_addr (CORE_ADDR entry_addr) 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 inferior's cache, if needed. */ @@ -1019,7 +995,16 @@ jit_breakpoint_deleted (struct breakpoint *b) return; 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. @@ -1027,14 +1012,14 @@ jit_breakpoint_deleted (struct breakpoint *b) static int 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 objfile *objf; struct jit_objfile_data *objf_data; CORE_ADDR addr; - if (inf_data->objfile == NULL) + if (ps_data->objfile == NULL) { /* Lookup the registration symbol. If it is missing, then we 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->descriptor = desc_symbol; - inf_data->objfile = objf; + ps_data->objfile = objf; } 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); @@ -1063,16 +1048,16 @@ jit_breakpoint_re_set_internal (struct gdbarch *gdbarch, "breakpoint_addr = %s\n", paddress (gdbarch, addr)); - if (inf_data->cached_code_address == addr) + if (ps_data->cached_code_address == addr) return 1; /* Delete the old breakpoint. */ - if (inf_data->jit_breakpoint != NULL) - delete_breakpoint (inf_data->jit_breakpoint); + if (ps_data->jit_breakpoint != NULL) + delete_breakpoint (ps_data->jit_breakpoint); /* Put a breakpoint in the registration symbol. */ - inf_data->cached_code_address = addr; - inf_data->jit_breakpoint = create_jit_event_breakpoint (gdbarch, addr); + ps_data->cached_code_address = addr; + ps_data->jit_breakpoint = create_jit_event_breakpoint (gdbarch, addr); return 0; } @@ -1316,7 +1301,7 @@ jit_inferior_init (struct gdbarch *gdbarch) { struct jit_descriptor descriptor; struct jit_code_entry cur_entry; - struct jit_inferior_data *inf_data; + struct jit_program_space_data *ps_data; CORE_ADDR cur_entry_addr; if (jit_debug) @@ -1324,13 +1309,13 @@ jit_inferior_init (struct gdbarch *gdbarch) jit_prepend_unwinder (gdbarch); - inf_data = get_jit_inferior_data (); - if (jit_breakpoint_re_set_internal (gdbarch, inf_data) != 0) + ps_data = get_jit_program_space_data (); + if (jit_breakpoint_re_set_internal (gdbarch, ps_data) != 0) return; /* Read the descriptor so we can check the version number and load any already JITed functions. */ - if (!jit_read_descriptor (gdbarch, &descriptor, inf_data)) + if (!jit_read_descriptor (gdbarch, &descriptor, ps_data)) return; /* Check that the version number agrees with that we support. */ @@ -1374,7 +1359,7 @@ void jit_breakpoint_re_set (void) { 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 @@ -1406,7 +1391,8 @@ jit_event_handler (struct gdbarch *gdbarch) struct objfile *objf; /* 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; 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 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) { - struct jit_inferior_data *inf_data = get_jit_inferior_data (); + struct jit_program_space_data *ps_data; - if (inf_data->objfile == objfile) - inf_data->objfile = NULL; + ps_data = program_space_data (objfile->pspace, jit_program_space_data); + if (ps_data != NULL && ps_data->objfile == objfile) + ps_data->objfile = NULL; } xfree (data); @@ -1488,8 +1475,9 @@ _initialize_jit (void) jit_objfile_data = register_objfile_data_with_cleanup (NULL, free_objfile_data); - jit_inferior_data = - register_inferior_data_with_cleanup (NULL, jit_inferior_data_cleanup); + jit_program_space_data = + register_program_space_data_with_cleanup (NULL, + jit_program_space_data_cleanup); jit_gdbarch_data = gdbarch_data_register_pre_init (jit_gdbarch_data_init); if (is_dl_available ()) {