Skip to content

Commit

Permalink
gdb: remove one user of the executable changed observer
Browse files Browse the repository at this point in the history
My goal for the next few commits is to expose the executable_changed
observable from the Python API.

However, there is call to the executable_changed observable in the
reread_symbols function (in symfile.c), and this doesn't actually
correspond to the executable changing.  My idea then, is to remove
this use of the executable_changed observable, but, before I can do
that, I need to check that nothing is going to break, and that
requires my to think about the current users of this observable.

One current user of executable_changed is in symtab.c.  We add an
executable_changed observer that calls:

  set_main_name (nullptr, language_unknown);

to discard all information about the main function when the executable
changes.

However, changing the executable doesn't actually change the debug
information.  The debug information changes when the symbol-file
changes, so I think this observer is in slightly the wrong place.

The new_objfile observable is (unfortunately) overloaded, it is called
when a new objfile is loaded, and also (when its argument is nullptr),
when all debug information should be discarded.

It turns out that there is already a new_objfile observer in
symtab.c.  I propose that, when the argument is nullptr (indicating
all debug info should be discarded), that we should call set_main_name
to discard the information about the main function.  We can then
remove the executable_changed observer from symtab.c.

All tests still pass, and, in my local world, I added some debug
printf calls, and I think we are still discarded the main information
everywhere we need to.

Approved-By: Tom Tromey <tom@tromey.com>
  • Loading branch information
T-J-Teru committed Sep 28, 2023
1 parent 4e02aca commit a0a031b
Showing 1 changed file with 7 additions and 11 deletions.
18 changes: 7 additions & 11 deletions gdb/symtab.c
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,8 @@ static struct block_symbol
enum block_enum block_index,
const char *name, const domain_enum domain);

static void set_main_name (const char *name, enum language lang);

/* Type of the data stored on the program space. */

struct main_info
Expand Down Expand Up @@ -1694,6 +1696,11 @@ symtab_new_objfile_observer (struct objfile *objfile)
{
/* Ideally we'd use OBJFILE->pspace, but OBJFILE may be NULL. */
symbol_cache_flush (current_program_space);

/* When all objfiles have been removed (OBJFILE is nullptr), then forget
everything we know about the main function. */
if (objfile == nullptr)
set_main_name (nullptr, language_unknown);
}

/* This module's 'free_objfile' observer. */
Expand Down Expand Up @@ -6329,15 +6336,6 @@ main_language (void)
return info->language_of_main;
}

/* Handle ``executable_changed'' events for the symtab module. */

static void
symtab_observer_executable_changed (void)
{
/* NAME_OF_MAIN may no longer be the same, so reset it for now. */
set_main_name (NULL, language_unknown);
}

/* Return 1 if the supplied producer string matches the ARM RealView
compiler (armcc). */

Expand Down Expand Up @@ -7020,8 +7018,6 @@ the use of prologue scanners."),
class_maintenance, 0, &maintenancelist);
deprecate_cmd (c, "maintenancelist flush symbol-cache");

gdb::observers::executable_changed.attach (symtab_observer_executable_changed,
"symtab");
gdb::observers::new_objfile.attach (symtab_new_objfile_observer, "symtab");
gdb::observers::free_objfile.attach (symtab_free_objfile_observer, "symtab");
}

0 comments on commit a0a031b

Please sign in to comment.