diff options
-rw-r--r-- | gdb/ax-gdb.c | 2 | ||||
-rw-r--r-- | gdb/break-catch-throw.c | 8 | ||||
-rw-r--r-- | gdb/breakpoint.c | 127 | ||||
-rw-r--r-- | gdb/breakpoint.h | 9 | ||||
-rw-r--r-- | gdb/cli/cli-cmds.c | 8 | ||||
-rw-r--r-- | gdb/elfread.c | 2 | ||||
-rw-r--r-- | gdb/linespec.c | 82 | ||||
-rw-r--r-- | gdb/linespec.h | 5 | ||||
-rw-r--r-- | gdb/probe.c | 120 | ||||
-rw-r--r-- | gdb/probe.h | 1 | ||||
-rw-r--r-- | gdb/python/python.c | 2 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 63 | ||||
-rw-r--r-- | gdb/tracepoint.c | 2 |
13 files changed, 310 insertions, 121 deletions
diff --git a/gdb/ax-gdb.c b/gdb/ax-gdb.c index 7f250e9..dd6eee6 100644 --- a/gdb/ax-gdb.c +++ b/gdb/ax-gdb.c @@ -2649,7 +2649,7 @@ agent_command_1 (char *exp, int eval) init_linespec_result (&canonical); location = new_linespec_location (&exp); old_chain = make_cleanup_delete_event_location (location); - decode_line_full (location, DECODE_LINE_FUNFIRSTLINE, + decode_line_full (location, DECODE_LINE_FUNFIRSTLINE, NULL, (struct symtab *) NULL, 0, &canonical, NULL, NULL); make_cleanup_destroy_linespec_result (&canonical); diff --git a/gdb/break-catch-throw.c b/gdb/break-catch-throw.c index 3a48205..1fbdcc5 100644 --- a/gdb/break-catch-throw.c +++ b/gdb/break-catch-throw.c @@ -212,6 +212,7 @@ re_set_exception_catchpoint (struct breakpoint *self) struct cleanup *cleanup; enum exception_event_kind kind = classify_exception_breakpoint (self); struct event_location *location; + struct program_space *filter_pspace = current_program_space; /* We first try to use the probe interface. */ TRY @@ -219,10 +220,9 @@ re_set_exception_catchpoint (struct breakpoint *self) location = new_probe_location (exception_functions[kind].probe); cleanup = make_cleanup_delete_event_location (location); - sals = parse_probes (location, NULL); + sals = parse_probes (location, filter_pspace, NULL); do_cleanups (cleanup); } - CATCH (e, RETURN_MASK_ERROR) { /* Using the probe interface failed. Let's fallback to the normal @@ -236,7 +236,7 @@ re_set_exception_catchpoint (struct breakpoint *self) = ASTRDUP (exception_functions[kind].function); location = new_explicit_location (&explicit_loc); cleanup = make_cleanup_delete_event_location (location); - self->ops->decode_location (self, location, &sals); + self->ops->decode_location (self, location, filter_pspace, &sals); do_cleanups (cleanup); } CATCH (ex, RETURN_MASK_ERROR) @@ -251,7 +251,7 @@ re_set_exception_catchpoint (struct breakpoint *self) END_CATCH cleanup = make_cleanup (xfree, sals.sals); - update_breakpoint_locations (self, sals, sals_end); + update_breakpoint_locations (self, filter_pspace, sals, sals_end); do_cleanups (cleanup); } diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index 83d3979..077ab5a 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -126,6 +126,7 @@ static void create_breakpoints_sal_default (struct gdbarch *, static void decode_location_default (struct breakpoint *b, const struct event_location *location, + struct program_space *search_pspace, struct symtabs_and_lines *sals); static void clear_command (char *, int); @@ -9545,7 +9546,7 @@ parse_breakpoint_sals (const struct event_location *location, && strchr ("+-", address[0]) != NULL && address[1] != '[')) { - decode_line_full (location, DECODE_LINE_FUNFIRSTLINE, + decode_line_full (location, DECODE_LINE_FUNFIRSTLINE, NULL, get_last_displayed_symtab (), get_last_displayed_line (), canonical, NULL, NULL); @@ -9553,7 +9554,7 @@ parse_breakpoint_sals (const struct event_location *location, } } - decode_line_full (location, DECODE_LINE_FUNFIRSTLINE, + decode_line_full (location, DECODE_LINE_FUNFIRSTLINE, NULL, cursal.symtab, cursal.line, canonical, NULL, NULL); } @@ -10447,7 +10448,7 @@ break_range_command (char *arg, int from_tty) where +14 means 14 lines from the start location. */ end_location = string_to_event_location (&arg, current_language); make_cleanup_delete_event_location (end_location); - decode_line_full (end_location, DECODE_LINE_FUNFIRSTLINE, + decode_line_full (end_location, DECODE_LINE_FUNFIRSTLINE, NULL, sal_start.symtab, sal_start.line, &canonical_end, NULL, NULL); @@ -11712,12 +11713,12 @@ until_break_command (char *arg, int from_tty, int anywhere) cleanup = make_cleanup_delete_event_location (location); if (last_displayed_sal_is_valid ()) - sals = decode_line_1 (location, DECODE_LINE_FUNFIRSTLINE, + sals = decode_line_1 (location, DECODE_LINE_FUNFIRSTLINE, NULL, get_last_displayed_symtab (), get_last_displayed_line ()); else sals = decode_line_1 (location, DECODE_LINE_FUNFIRSTLINE, - (struct symtab *) NULL, 0); + NULL, (struct symtab *) NULL, 0); if (sals.nelts != 1) error (_("Couldn't get information on specified line.")); @@ -13018,6 +13019,7 @@ base_breakpoint_create_breakpoints_sal (struct gdbarch *gdbarch, static void base_breakpoint_decode_location (struct breakpoint *b, const struct event_location *location, + struct program_space *search_pspace, struct symtabs_and_lines *sals) { internal_error_pure_virtual_called (); @@ -13267,9 +13269,10 @@ bkpt_create_breakpoints_sal (struct gdbarch *gdbarch, static void bkpt_decode_location (struct breakpoint *b, const struct event_location *location, + struct program_space *search_pspace, struct symtabs_and_lines *sals) { - decode_location_default (b, location, sals); + decode_location_default (b, location, search_pspace, sals); } /* Virtual table for internal breakpoints. */ @@ -13453,7 +13456,7 @@ bkpt_probe_create_sals_from_location (const struct event_location *location, { struct linespec_sals lsal; - lsal.sals = parse_probes (location, canonical); + lsal.sals = parse_probes (location, NULL, canonical); lsal.canonical = xstrdup (event_location_to_string (canonical->location)); VEC_safe_push (linespec_sals, canonical->sals, &lsal); } @@ -13461,9 +13464,10 @@ bkpt_probe_create_sals_from_location (const struct event_location *location, static void bkpt_probe_decode_location (struct breakpoint *b, const struct event_location *location, + struct program_space *search_pspace, struct symtabs_and_lines *sals) { - *sals = parse_probes (location, NULL); + *sals = parse_probes (location, search_pspace, NULL); if (!sals->sals) error (_("probe not found")); } @@ -13585,9 +13589,10 @@ tracepoint_create_breakpoints_sal (struct gdbarch *gdbarch, static void tracepoint_decode_location (struct breakpoint *b, const struct event_location *location, + struct program_space *search_pspace, struct symtabs_and_lines *sals) { - decode_location_default (b, location, sals); + decode_location_default (b, location, search_pspace, sals); } struct breakpoint_ops tracepoint_breakpoint_ops; @@ -13608,10 +13613,11 @@ tracepoint_probe_create_sals_from_location static void tracepoint_probe_decode_location (struct breakpoint *b, const struct event_location *location, + struct program_space *search_pspace, struct symtabs_and_lines *sals) { /* We use the same method for breakpoint on probes. */ - bkpt_probe_decode_location (b, location, sals); + bkpt_probe_decode_location (b, location, search_pspace, sals); } static struct breakpoint_ops tracepoint_probe_breakpoint_ops; @@ -13776,6 +13782,7 @@ strace_marker_create_breakpoints_sal (struct gdbarch *gdbarch, static void strace_marker_decode_location (struct breakpoint *b, const struct event_location *location, + struct program_space *search_pspace, struct symtabs_and_lines *sals) { struct tracepoint *tp = (struct tracepoint *) b; @@ -13993,11 +14000,19 @@ delete_command (char *arg, int from_tty) map_breakpoint_numbers (arg, do_map_delete_breakpoint, NULL); } +/* Return true if all locations of B bound to PSPACE are pending. If + PSPACE is NULL, all locations of all program spaces are + considered. */ + static int -all_locations_are_pending (struct bp_location *loc) +all_locations_are_pending (struct breakpoint *b, struct program_space *pspace) { - for (; loc; loc = loc->next) - if (!loc->shlib_disabled + struct bp_location *loc; + + for (loc = b->loc; loc != NULL; loc = loc->next) + if ((pspace == NULL + || loc->pspace == pspace) + && !loc->shlib_disabled && !loc->pspace->executing_startup) return 0; return 1; @@ -14202,17 +14217,58 @@ locations_are_equal (struct bp_location *a, struct bp_location *b) return 1; } -/* Create new breakpoint locations for B (a hardware or software breakpoint) - based on SALS and SALS_END. If SALS_END.NELTS is not zero, then B is - a ranged breakpoint. */ +/* Split all locations of B that are bound to PSPACE out of B's + location list to a separate list and return that list's head. If + PSPACE is NULL, hoist out all locations of B. */ + +static struct bp_location * +hoist_existing_locations (struct breakpoint *b, struct program_space *pspace) +{ + struct bp_location head; + struct bp_location *i = b->loc; + struct bp_location **i_link = &b->loc; + struct bp_location *hoisted = &head; + + if (pspace == NULL) + { + i = b->loc; + b->loc = NULL; + return i; + } + + head.next = NULL; + + while (i != NULL) + { + if (i->pspace == pspace) + { + *i_link = i->next; + i->next = NULL; + hoisted->next = i; + hoisted = i; + } + else + i_link = &i->next; + i = *i_link; + } + + return head.next; +} + +/* Create new breakpoint locations for B (a hardware or software + breakpoint) based on SALS and SALS_END. If SALS_END.NELTS is not + zero, then B is a ranged breakpoint. Only recreates locations for + FILTER_PSPACE. Locations of other program spaces are left + untouched. */ void update_breakpoint_locations (struct breakpoint *b, + struct program_space *filter_pspace, struct symtabs_and_lines sals, struct symtabs_and_lines sals_end) { int i; - struct bp_location *existing_locations = b->loc; + struct bp_location *existing_locations; if (sals_end.nelts != 0 && (sals.nelts != 1 || sals_end.nelts != 1)) { @@ -14232,10 +14288,10 @@ update_breakpoint_locations (struct breakpoint *b, We'd like to retain the location, so that when the library is loaded again, we don't loose the enabled/disabled status of the individual locations. */ - if (all_locations_are_pending (existing_locations) && sals.nelts == 0) + if (all_locations_are_pending (b, filter_pspace) && sals.nelts == 0) return; - b->loc = NULL; + existing_locations = hoist_existing_locations (b, filter_pspace); for (i = 0; i < sals.nelts; ++i) { @@ -14326,7 +14382,7 @@ update_breakpoint_locations (struct breakpoint *b, static struct symtabs_and_lines location_to_sals (struct breakpoint *b, struct event_location *location, - int *found) + struct program_space *search_pspace, int *found) { struct symtabs_and_lines sals = {0}; struct gdb_exception exception = exception_none; @@ -14335,7 +14391,7 @@ location_to_sals (struct breakpoint *b, struct event_location *location, TRY { - b->ops->decode_location (b, location, &sals); + b->ops->decode_location (b, location, search_pspace, &sals); } CATCH (e, RETURN_MASK_ERROR) { @@ -14351,7 +14407,10 @@ location_to_sals (struct breakpoint *b, struct event_location *location, breakpoint being disabled, and don't want to see more errors. */ if (e.error == NOT_FOUND_ERROR - && (b->condition_not_parsed + && (b->condition_not_parsed + || (b->loc != NULL + && search_pspace != NULL + && b->loc->pspace != search_pspace) || (b->loc && b->loc->shlib_disabled) || (b->loc && b->loc->pspace->executing_startup) || b->enable_state == bp_disabled)) @@ -14420,8 +14479,9 @@ breakpoint_re_set_default (struct breakpoint *b) struct symtabs_and_lines sals, sals_end; struct symtabs_and_lines expanded = {0}; struct symtabs_and_lines expanded_end = {0}; + struct program_space *filter_pspace = current_program_space; - sals = location_to_sals (b, b->location, &found); + sals = location_to_sals (b, b->location, filter_pspace, &found); if (found) { make_cleanup (xfree, sals.sals); @@ -14430,7 +14490,8 @@ breakpoint_re_set_default (struct breakpoint *b) if (b->location_range_end != NULL) { - sals_end = location_to_sals (b, b->location_range_end, &found); + sals_end = location_to_sals (b, b->location_range_end, + filter_pspace, &found); if (found) { make_cleanup (xfree, sals_end.sals); @@ -14438,7 +14499,7 @@ breakpoint_re_set_default (struct breakpoint *b) } } - update_breakpoint_locations (b, expanded, expanded_end); + update_breakpoint_locations (b, filter_pspace, expanded, expanded_end); } /* Default method for creating SALs from an address string. It basically @@ -14482,12 +14543,13 @@ create_breakpoints_sal_default (struct gdbarch *gdbarch, static void decode_location_default (struct breakpoint *b, const struct event_location *location, + struct program_space *search_pspace, struct symtabs_and_lines *sals) { struct linespec_result canonical; init_linespec_result (&canonical); - decode_line_full (location, DECODE_LINE_FUNFIRSTLINE, + decode_line_full (location, DECODE_LINE_FUNFIRSTLINE, search_pspace, (struct symtab *) NULL, 0, &canonical, multiple_symbols_all, b->filter); @@ -14514,15 +14576,10 @@ decode_location_default (struct breakpoint *b, static struct cleanup * prepare_re_set_context (struct breakpoint *b) { - struct cleanup *cleanups; - input_radix = b->input_radix; - cleanups = save_current_space_and_thread (); - if (b->pspace != NULL) - switch_to_program_space_and_thread (b->pspace); set_language (b->language); - return cleanups; + return make_cleanup (null_cleanup, NULL); } /* Reset a breakpoint given it's struct breakpoint * BINT. @@ -14542,7 +14599,9 @@ breakpoint_re_set_one (void *bint) return 0; } -/* Re-set all breakpoints after symbols have been re-loaded. */ +/* Re-set breakpoint locations for the current program space. + Locations bound to other program spaces are left untouched. */ + void breakpoint_re_set (void) { @@ -14553,7 +14612,7 @@ breakpoint_re_set (void) save_language = current_language->la_language; save_input_radix = input_radix; - old_chain = save_current_program_space (); + old_chain = save_current_space_and_thread (); ALL_BREAKPOINTS_SAFE (b, b_tmp) { diff --git a/gdb/breakpoint.h b/gdb/breakpoint.h index 68710e6..054eab4 100644 --- a/gdb/breakpoint.h +++ b/gdb/breakpoint.h @@ -599,13 +599,15 @@ struct breakpoint_ops int, const struct breakpoint_ops *, int, int, int, unsigned); - /* Given the location (second parameter), this method decodes it - and provides the SAL locations related to it. For ordinary breakpoints, - it calls `decode_line_full'. + /* Given the location (second parameter), this method decodes it and + provides the SAL locations related to it. For ordinary + breakpoints, it calls `decode_line_full'. If SEARCH_PSPACE is + not NULL, symbol search is restricted to just that program space. This function is called inside `location_to_sals'. */ void (*decode_location) (struct breakpoint *b, const struct event_location *location, + struct program_space *search_pspace, struct symtabs_and_lines *sals); /* Return true if this breakpoint explains a signal. See @@ -1200,6 +1202,7 @@ extern void init_bp_location (struct bp_location *loc, struct breakpoint *owner); extern void update_breakpoint_locations (struct breakpoint *b, + struct program_space *filter_pspace, struct symtabs_and_lines sals, struct symtabs_and_lines sals_end); diff --git a/gdb/cli/cli-cmds.c b/gdb/cli/cli-cmds.c index b871a88..ede4909 100644 --- a/gdb/cli/cli-cmds.c +++ b/gdb/cli/cli-cmds.c @@ -818,7 +818,7 @@ edit_command (char *arg, int from_tty) arg1 = arg; location = string_to_event_location (&arg1, current_language); cleanup = make_cleanup_delete_event_location (location); - sals = decode_line_1 (location, DECODE_LINE_LIST_MODE, 0, 0); + sals = decode_line_1 (location, DECODE_LINE_LIST_MODE, NULL, NULL, 0); filter_sals (&sals); if (! sals.nelts) @@ -971,7 +971,7 @@ list_command (char *arg, int from_tty) location = string_to_event_location (&arg1, current_language); make_cleanup_delete_event_location (location); - sals = decode_line_1 (location, DECODE_LINE_LIST_MODE, 0, 0); + sals = decode_line_1 (location, DECODE_LINE_LIST_MODE, NULL, NULL, 0); filter_sals (&sals); if (!sals.nelts) @@ -1015,10 +1015,10 @@ list_command (char *arg, int from_tty) make_cleanup_delete_event_location (location); if (dummy_beg) sals_end = decode_line_1 (location, - DECODE_LINE_LIST_MODE, 0, 0); + DECODE_LINE_LIST_MODE, NULL, NULL, 0); else sals_end = decode_line_1 (location, DECODE_LINE_LIST_MODE, - sal.symtab, sal.line); + NULL, sal.symtab, sal.line); filter_sals (&sals_end); if (sals_end.nelts == 0) diff --git a/gdb/elfread.c b/gdb/elfread.c index 55674f3..d4400bb 100644 --- a/gdb/elfread.c +++ b/gdb/elfread.c @@ -1006,7 +1006,7 @@ elf_gnu_ifunc_resolver_return_stop (struct breakpoint *b) sals_end.nelts = 0; b->type = bp_breakpoint; - update_breakpoint_locations (b, sals, sals_end); + update_breakpoint_locations (b, current_program_space, sals, sals_end); } /* A helper function for elf_symfile_read that reads the minimal diff --git a/gdb/linespec.c b/gdb/linespec.c index 50951bd..588ad83 100644 --- a/gdb/linespec.c +++ b/gdb/linespec.c @@ -123,6 +123,10 @@ struct linespec_state /* The program space as seen when the module was entered. */ struct program_space *program_space; + /* If not NULL, the search is restricted to just this program + space. */ + struct program_space *search_pspace; + /* The default symtab to use, if no other symtab is specified. */ struct symtab *default_symtab; @@ -274,7 +278,8 @@ static struct symtabs_and_lines decode_objc (struct linespec_state *self, linespec_p ls, const char *arg); -static VEC (symtab_ptr) *symtabs_from_filename (const char *); +static VEC (symtab_ptr) *symtabs_from_filename (const char *, + struct program_space *pspace); static VEC (symbolp) *find_label_symbols (struct linespec_state *self, VEC (symbolp) *function_symbols, @@ -302,7 +307,9 @@ static void add_all_symbol_names_from_pspace (struct collect_info *info, struct program_space *pspace, VEC (const_char_ptr) *names); -static VEC (symtab_ptr) *collect_symtabs_from_filename (const char *file); +static VEC (symtab_ptr) * + collect_symtabs_from_filename (const char *file, + struct program_space *pspace); static void decode_digits_ordinary (struct linespec_state *self, linespec_p ls, @@ -1842,7 +1849,8 @@ create_sals_line_offset (struct linespec_state *self, fullname = symtab_to_fullname (self->default_symtab); VEC_pop (symtab_ptr, ls->file_symtabs); VEC_free (symtab_ptr, ls->file_symtabs); - ls->file_symtabs = collect_symtabs_from_filename (fullname); + ls->file_symtabs = collect_symtabs_from_filename (fullname, + self->search_pspace); use_default = 1; } @@ -2094,7 +2102,8 @@ convert_explicit_location_to_sals (struct linespec_state *self, TRY { result->file_symtabs - = symtabs_from_filename (explicit_loc->source_filename); + = symtabs_from_filename (explicit_loc->source_filename, + self->search_pspace); } CATCH (except, RETURN_MASK_ERROR) { @@ -2285,7 +2294,8 @@ parse_linespec (linespec_parser *parser, const char *arg) TRY { PARSER_RESULT (parser)->file_symtabs - = symtabs_from_filename (user_filename); + = symtabs_from_filename (user_filename, + PARSER_STATE (parser)->search_pspace); } CATCH (ex, RETURN_MASK_ERROR) { @@ -2367,6 +2377,7 @@ parse_linespec (linespec_parser *parser, const char *arg) static void linespec_state_constructor (struct linespec_state *self, int flags, const struct language_defn *language, + struct program_space *search_pspace, struct symtab *default_symtab, int default_line, struct linespec_result *canonical) @@ -2375,6 +2386,7 @@ linespec_state_constructor (struct linespec_state *self, self->language = language; self->funfirstline = (flags & DECODE_LINE_FUNFIRSTLINE) ? 1 : 0; self->list_mode = (flags & DECODE_LINE_LIST_MODE) ? 1 : 0; + self->search_pspace = search_pspace; self->default_symtab = default_symtab; self->default_line = default_line; self->canonical = canonical; @@ -2389,6 +2401,7 @@ linespec_state_constructor (struct linespec_state *self, static void linespec_parser_new (linespec_parser *parser, int flags, const struct language_defn *language, + struct program_space *search_pspace, struct symtab *default_symtab, int default_line, struct linespec_result *canonical) @@ -2398,6 +2411,7 @@ linespec_parser_new (linespec_parser *parser, memset (PARSER_RESULT (parser), 0, sizeof (struct linespec)); PARSER_EXPLICIT (parser)->line_offset.sign = LINE_OFFSET_UNKNOWN; linespec_state_constructor (PARSER_STATE (parser), flags, language, + search_pspace, default_symtab, default_line, canonical); } @@ -2451,7 +2465,7 @@ linespec_lex_to_end (char **stringp) if (stringp == NULL || *stringp == NULL) return; - linespec_parser_new (&parser, 0, current_language, NULL, 0, NULL); + linespec_parser_new (&parser, 0, current_language, NULL, NULL, 0, NULL); cleanup = make_cleanup (linespec_parser_delete, &parser); parser.lexer.saved_arg = *stringp; PARSER_STREAM (&parser) = orig = *stringp; @@ -2530,6 +2544,7 @@ event_location_to_sals (linespec_parser *parser, void decode_line_full (const struct event_location *location, int flags, + struct program_space *search_pspace, struct symtab *default_symtab, int default_line, struct linespec_result *canonical, const char *select_mode, @@ -2550,7 +2565,8 @@ decode_line_full (const struct event_location *location, int flags, || select_mode == multiple_symbols_cancel); gdb_assert ((flags & DECODE_LINE_LIST_MODE) == 0); - linespec_parser_new (&parser, flags, current_language, default_symtab, + linespec_parser_new (&parser, flags, current_language, + search_pspace, default_symtab, default_line, canonical); cleanups = make_cleanup (linespec_parser_delete, &parser); save_current_program_space (); @@ -2603,6 +2619,7 @@ decode_line_full (const struct event_location *location, int flags, struct symtabs_and_lines decode_line_1 (const struct event_location *location, int flags, + struct program_space *search_pspace, struct symtab *default_symtab, int default_line) { @@ -2610,7 +2627,8 @@ decode_line_1 (const struct event_location *location, int flags, linespec_parser parser; struct cleanup *cleanups; - linespec_parser_new (&parser, flags, current_language, default_symtab, + linespec_parser_new (&parser, flags, current_language, + search_pspace, default_symtab, default_line, NULL); cleanups = make_cleanup (linespec_parser_delete, &parser); save_current_program_space (); @@ -2640,7 +2658,7 @@ decode_line_with_current_source (char *string, int flags) location = string_to_event_location (&string, current_language); cleanup = make_cleanup_delete_event_location (location); - sals = decode_line_1 (location, flags, + sals = decode_line_1 (location, flags, NULL, cursal.symtab, cursal.line); if (*string) @@ -2665,11 +2683,11 @@ decode_line_with_last_displayed (char *string, int flags) location = string_to_event_location (&string, current_language); cleanup = make_cleanup_delete_event_location (location); if (last_displayed_sal_is_valid ()) - sals = decode_line_1 (location, flags, + sals = decode_line_1 (location, flags, NULL, get_last_displayed_symtab (), get_last_displayed_line ()); else - sals = decode_line_1 (location, flags, (struct symtab *) NULL, 0); + sals = decode_line_1 (location, flags, NULL, (struct symtab *) NULL, 0); if (*string) error (_("Junk at end of line specification: %s"), string); @@ -3117,10 +3135,13 @@ add_symtabs_to_list (struct symtab *symtab, void *d) return 0; } -/* Given a file name, return a VEC of all matching symtabs. */ +/* Given a file name, return a VEC of all matching symtabs. If + SEARCH_PSPACE is not NULL, the search is restricted to just that + program space. */ static VEC (symtab_ptr) * -collect_symtabs_from_filename (const char *file) +collect_symtabs_from_filename (const char *file, + struct program_space *search_pspace) { struct symtab_collector collector; struct cleanup *cleanups; @@ -3132,27 +3153,37 @@ collect_symtabs_from_filename (const char *file) cleanups = make_cleanup_htab_delete (collector.symtab_table); /* Find that file's data. */ - ALL_PSPACES (pspace) - { - if (pspace->executing_startup) - continue; + if (search_pspace == NULL) + { + ALL_PSPACES (pspace) + { + if (pspace->executing_startup) + continue; - set_current_program_space (pspace); - iterate_over_symtabs (file, add_symtabs_to_list, &collector); - } + set_current_program_space (pspace); + iterate_over_symtabs (file, add_symtabs_to_list, &collector); + } + } + else + { + set_current_program_space (search_pspace); + iterate_over_symtabs (file, add_symtabs_to_list, &collector); + } do_cleanups (cleanups); return collector.symtabs; } -/* Return all the symtabs associated to the FILENAME. */ +/* Return all the symtabs associated to the FILENAME. If SEARCH_PSPACE is + not NULL, the search is restricted to just that program space. */ static VEC (symtab_ptr) * -symtabs_from_filename (const char *filename) +symtabs_from_filename (const char *filename, + struct program_space *search_pspace) { VEC (symtab_ptr) *result; - result = collect_symtabs_from_filename (filename); + result = collect_symtabs_from_filename (filename, search_pspace); if (VEC_empty (symtab_ptr, result)) { @@ -3189,9 +3220,10 @@ find_function_symbols (struct linespec_state *state, /* Try NAME as an Objective-C selector. */ find_imps (name, &symbol_names); if (!VEC_empty (const_char_ptr, symbol_names)) - add_all_symbol_names_from_pspace (&info, NULL, symbol_names); + add_all_symbol_names_from_pspace (&info, state->search_pspace, + symbol_names); else - add_matching_symbols_to_info (name, &info, NULL); + add_matching_symbols_to_info (name, &info, state->search_pspace); do_cleanups (cleanup); diff --git a/gdb/linespec.h b/gdb/linespec.h index 3255d15..b802612 100644 --- a/gdb/linespec.h +++ b/gdb/linespec.h @@ -97,6 +97,7 @@ extern struct cleanup * extern struct symtabs_and_lines decode_line_1 (const struct event_location *location, int flags, + struct program_space *search_pspace, struct symtab *default_symtab, int default_line); /* Parse LOCATION and return results. This is the "full" @@ -106,6 +107,9 @@ extern struct symtabs_and_lines For FLAGS, see decode_line_flags. DECODE_LINE_LIST_MODE is not valid for this function. + If SEARCH_PSPACE is not NULL, symbol search is restricted to just + that program space. + DEFAULT_SYMTAB and DEFAULT_LINE describe the default location. DEFAULT_SYMTAB can be NULL, in which case the current symtab and line are used. @@ -136,6 +140,7 @@ extern struct symtabs_and_lines filtered out. */ extern void decode_line_full (const struct event_location *location, int flags, + struct program_space *search_pspace, struct symtab *default_symtab, int default_line, struct linespec_result *canonical, const char *select_mode, diff --git a/gdb/probe.c b/gdb/probe.c index 374e7a7..56f93da 100644 --- a/gdb/probe.c +++ b/gdb/probe.c @@ -41,18 +41,77 @@ DEF_VEC_O (bound_probe_s); +/* A helper for parse_probes that decodes a probe specification in + SEARCH_PSPACE. It appends matching SALs to RESULT. */ + +static void +parse_probes_in_pspace (const struct probe_ops *probe_ops, + struct program_space *search_pspace, + const char *objfile_namestr, + const char *provider, + const char *name, + struct symtabs_and_lines *result) +{ + struct objfile *objfile; + + ALL_PSPACE_OBJFILES (search_pspace, objfile) + { + VEC (probe_p) *probes; + struct probe *probe; + int ix; + + if (!objfile->sf || !objfile->sf->sym_probe_fns) + continue; + + if (objfile_namestr + && FILENAME_CMP (objfile_name (objfile), objfile_namestr) != 0 + && FILENAME_CMP (lbasename (objfile_name (objfile)), + objfile_namestr) != 0) + continue; + + probes = objfile->sf->sym_probe_fns->sym_get_probes (objfile); + + for (ix = 0; VEC_iterate (probe_p, probes, ix, probe); ix++) + { + struct symtab_and_line *sal; + + if (probe_ops != &probe_ops_any && probe->pops != probe_ops) + continue; + + if (provider && strcmp (probe->provider, provider) != 0) + continue; + + if (strcmp (probe->name, name) != 0) + continue; + + ++result->nelts; + result->sals = XRESIZEVEC (struct symtab_and_line, result->sals, + result->nelts); + sal = &result->sals[result->nelts - 1]; + + init_sal (sal); + + sal->pc = get_probe_address (probe, objfile); + sal->explicit_pc = 1; + sal->section = find_pc_overlay (sal->pc); + sal->pspace = search_pspace; + sal->probe = probe; + sal->objfile = objfile; + } + } +} + /* See definition in probe.h. */ struct symtabs_and_lines parse_probes (const struct event_location *location, + struct program_space *search_pspace, struct linespec_result *canonical) { char *arg_end, *arg; char *objfile_namestr = NULL, *provider = NULL, *name, *p; struct cleanup *cleanup; struct symtabs_and_lines result; - struct objfile *objfile; - struct program_space *pspace; const struct probe_ops *probe_ops; const char *arg_start, *cs; @@ -114,52 +173,19 @@ parse_probes (const struct event_location *location, if (objfile_namestr && *objfile_namestr == '\0') error (_("invalid objfile name")); - ALL_PSPACES (pspace) - ALL_PSPACE_OBJFILES (pspace, objfile) - { - VEC (probe_p) *probes; - struct probe *probe; - int ix; - - if (!objfile->sf || !objfile->sf->sym_probe_fns) - continue; - - if (objfile_namestr - && FILENAME_CMP (objfile_name (objfile), objfile_namestr) != 0 - && FILENAME_CMP (lbasename (objfile_name (objfile)), - objfile_namestr) != 0) - continue; - - probes = objfile->sf->sym_probe_fns->sym_get_probes (objfile); - - for (ix = 0; VEC_iterate (probe_p, probes, ix, probe); ix++) - { - struct symtab_and_line *sal; - - if (probe_ops != &probe_ops_any && probe->pops != probe_ops) - continue; - - if (provider && strcmp (probe->provider, provider) != 0) - continue; - - if (strcmp (probe->name, name) != 0) - continue; - - ++result.nelts; - result.sals = XRESIZEVEC (struct symtab_and_line, result.sals, - result.nelts); - sal = &result.sals[result.nelts - 1]; - - init_sal (sal); + if (search_pspace != NULL) + { + parse_probes_in_pspace (probe_ops, search_pspace, objfile_namestr, + provider, name, &result); + } + else + { + struct program_space *pspace; - sal->pc = get_probe_address (probe, objfile); - sal->explicit_pc = 1; - sal->section = find_pc_overlay (sal->pc); - sal->pspace = pspace; - sal->probe = probe; - sal->objfile = objfile; - } - } + ALL_PSPACES (pspace) + parse_probes_in_pspace (probe_ops, pspace, objfile_namestr, + provider, name, &result); + } if (result.nelts == 0) { diff --git a/gdb/probe.h b/gdb/probe.h index 444b239..1e15328 100644 --- a/gdb/probe.h +++ b/gdb/probe.h @@ -228,6 +228,7 @@ struct bound_probe symtabs_and_lines object and updates LOC or throws an error. */ extern struct symtabs_and_lines parse_probes (const struct event_location *loc, + struct program_space *pspace, struct linespec_result *canon); /* Helper function to register the proper probe_ops to a newly created probe. diff --git a/gdb/python/python.c b/gdb/python/python.c index 69d8b0d..7202105 100644 --- a/gdb/python/python.c +++ b/gdb/python/python.c @@ -748,7 +748,7 @@ gdbpy_decode_line (PyObject *self, PyObject *args) TRY { if (location != NULL) - sals = decode_line_1 (location, 0, 0, 0); + sals = decode_line_1 (location, 0, NULL, NULL, 0); else { set_default_source_symtab_and_line (); diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index d4a8819..c2939f6 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,66 @@ +2016-01-19 Pedro Alves <palves@redhat.com> + + * ax-gdb.c (agent_command_1): Adjust call to decode_line_full. + * break-catch-throw.c (re_set_exception_catchpoint): Pass the + current program space down to linespec decoding and breakpoint + location updating. + * breakpoint.c (parse_breakpoint_sals): Adjust calls to + decode_line_full. + (until_break_command): Adjust calls to decode_line_1. + (base_breakpoint_decode_location, bkpt_decode_location): Add + 'search_pspace' parameter. Pass it along. + (bkpt_probe_create_sals_from_location): Adjust calls to + parse_probes. + (tracepoint_decode_location, tracepoint_probe_decode_location) + (strace_marker_decode_location): Add 'search_pspace' parameter. + Pass it along. + (all_locations_are_pending): Rewrite to take a breakpoint and + program space as arguments instead. + (hoist_existing_locations): New function. + (update_breakpoint_locations): Add 'filter_pspace' parameter. Use + hoist_existing_locations instead of always removing all locations, + and adjust to all_locations_are_pending change. + (location_to_sals): Add 'search_pspace' parameter. Pass it along. + Don't disable the breakpoint if there are other locations in + another program space. + (breakpoint_re_set_default): Adjust to pass down the current + program space as filter program space. + (decode_location_default): Add 'search_pspace' parameter and pass + it along. + (prepare_re_set_context): Don't switch program space here. + (breakpoint_re_set): Use save_current_space_and_thread instead of + save_current_program_space. + * breakpoint.h (struct breakpoint_ops) <decode_location>: Add + 'search_pspace' parameter. + (update_breakpoint_locations): Add 'filter_pspace' parameter. + * cli/cli-cmds.c (edit_command, list_command): Adjust calls to + decode_line_1. + * elfread.c (elf_gnu_ifunc_resolver_return_stop): Pass the current + program space as filter program space. + * linespec.c (struct linespec_state) <search_pspace>: New field. + (create_sals_line_offset, convert_explicit_location_to_sals) + (parse_linespec): Pass the search program space down. + (linespec_state_constructor): Add 'search_pspace' parameter. + Store it. + (linespec_parser_new): Add 'search_pspace' parameter and pass it + along. + (linespec_lex_to_end): Adjust. + (decode_line_full, decode_line_1): Add 'search_pspace' parameter + and pass it along. + (decode_line_with_last_displayed): Adjust. + (collect_symtabs_from_filename, symtabs_from_filename): New + 'search_pspace' parameter. Use it. + (find_function_symbols): Pass the search program space down. + * linespec.h (decode_line_1, decode_line_full): Add + 'search_pspace' parameter. + * probe.c (parse_probes_in_pspace): New function, factored out + from ... + (parse_probes): ... this. Add 'search_pspace' parameter and use + it. + * probe.h (parse_probes): Add pspace' parameter. + * python/python.c (gdbpy_decode_line): Adjust. + * tracepoint.c (scope_info): Adjust. + 2016-01-19 Marcin KoĆcielnicki <koriakin@0x04.net> * gdb.trace/ftrace.exp: Fix expected message on continue. diff --git a/gdb/tracepoint.c b/gdb/tracepoint.c index 55b2e8e..bc45470 100644 --- a/gdb/tracepoint.c +++ b/gdb/tracepoint.c @@ -2720,7 +2720,7 @@ scope_info (char *args, int from_tty) location = string_to_event_location (&args, current_language); back_to = make_cleanup_delete_event_location (location); - sals = decode_line_1 (location, DECODE_LINE_FUNFIRSTLINE, NULL, 0); + sals = decode_line_1 (location, DECODE_LINE_FUNFIRSTLINE, NULL, NULL, 0); if (sals.nelts == 0) { /* Presumably decode_line_1 has already warned. */ |