Re: RFC: don't set the pspace on ordinary breakpoints

Tom Tromey
2011-11-08T20:23:37Z

>>>>> "Tom" == Tom Tromey <tromey@redhat.com> writes:

Tom> I think I will change linespec to ignore program spaces in this state.

The appended has two parts: the linespec.c change, relative to the big
patch I posted, and the breakpoint.c change I think is needed too. Only
the latter makes sense in the context of this thread.

I *think* the should_be_inserted change is all that was really needed,
after re-reading all the messages in this thread. Let me know what you
think.

The addr_string_to_sals change is there to handle the case where a
breakpoint has hits in just the program space that is in the
executing_startup state. In this situation, linespec can throw an
exception, and if we do not take the "not_found_and_ok" branch, then we
will proceed to disable the breakpoint... which is wrong, we want to
re-set again when the program space is done with startup.

Tom

diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
index 610aece..dd1f935 100644
--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -1578,7 +1578,7 @@ should_be_inserted (struct bp_location *bl)
if (!bl->enabled || bl->shlib_disabled || bl->duplicate)
return 0;

- if (bl->pspace->executing_startup)
+ if (user_breakpoint_p (bl->owner) && bl->pspace->executing_startup)
return 0;

/* This is set for example, when we're attached to the parent of a
@@ -11725,6 +11725,7 @@ addr_string_to_sals (struct breakpoint *b, char *addr_string, int *found)
if (e.error == NOT_FOUND_ERROR
&& (b->condition_not_parsed
|| (b->loc && b->loc->shlib_disabled)
+ || (b->loc && b->loc->pspace->executing_startup)
|| b->enable_state == bp_disabled))
not_found_and_ok = 1;

diff --git a/gdb/linespec.c b/gdb/linespec.c
index 21189d3..c24a7a0 100644
--- a/gdb/linespec.c
+++ b/gdb/linespec.c
@@ -351,6 +351,8 @@ iterate_over_all_matching_symtabs (const char *name,
{
if (search_pspace != NULL && search_pspace != pspace)
continue;
+ if (pspace->executing_startup)
+ continue;

set_current_program_space (pspace);

@@ -1327,6 +1329,12 @@ decode_indirect (struct linespec_state *self, char **argptr)
CORE_ADDR pc;
char *initial = *argptr;

+ if (current_program_space->executing_startup)
+ /* The error message doesn't really matter, because this case
+ should only hit during breakpoint reset. */
+ throw_error (NOT_FOUND_ERROR, _("cannot evaluate expressions while "
+ "program space is in startup"));
+
(*argptr)++;
pc = value_as_address (parse_to_comma_and_eval (argptr));

@@ -1872,6 +1880,9 @@ lookup_prefix_sym (char **argptr, char *p, VEC (symtab_p) *file_symtabs,
{
struct block *search_block;

+ /* Program spaces that are executing startup should have
+ been filtered out earlier. */
+ gdb_assert (!SYMTAB_PSPACE (elt)->executing_startup);
set_current_program_space (SYMTAB_PSPACE (elt));
search_block = get_search_block (elt);
iterate_over_symbols (search_block, copy, STRUCT_DOMAIN,
@@ -2020,6 +2031,9 @@ find_method (struct linespec_state *self, char *saved_arg,
struct type *t;
struct program_space *pspace;

+ /* Program spaces that are executing startup should have
+ been filtered out earlier. */
+ gdb_assert (!SYMTAB_PSPACE (SYMBOL_SYMTAB (sym))->executing_startup);
pspace = SYMTAB_PSPACE (SYMBOL_SYMTAB (sym));
set_current_program_space (pspace);
t = check_typedef (SYMBOL_TYPE (sym));
@@ -2122,6 +2136,9 @@ collect_symtabs_from_filename (const char *file)
/* Find that file's data. */
ALL_PSPACES (pspace)
{
+ if (pspace->executing_startup)
+ continue;
+
set_current_program_space (pspace);
iterate_over_symtabs (file, add_symtabs_to_list, &collector);
}
@@ -2698,6 +2715,8 @@ search_minsyms_for_name (struct collect_info *info, const char *name,
{
if (search_pspace != NULL && search_pspace != pspace)
continue;
+ if (pspace->executing_startup)
+ continue;

set_current_program_space (pspace);

@@ -2734,6 +2753,9 @@ add_matching_symbols_to_info (const char *name,
}
else if (pspace == NULL || pspace == SYMTAB_PSPACE (elt))
{
+ /* Program spaces that are executing startup should have
+ been filtered out earlier. */
+ gdb_assert (!SYMTAB_PSPACE (elt)->executing_startup);
set_current_program_space (SYMTAB_PSPACE (elt));
iterate_over_symbols (get_search_block (elt), name,
VAR_DOMAIN, collect_symbols,