make "file" use the BFD cache better

Right now the "file" command will discard the exec_bfd and then
possibly open a new one.

If this ends up reopening the same file, it can cause needless work by
gdb -- destroying all the per-BFD data just to re-read it again.

This patch changes the code to hold a reference to the old exec_bfd
while opening the new one.

The possible downside of this is a higher peak memory use.

2014-02-26  Tom Tromey  <tromey@redhat.com>

	* exec.c (exec_file_attach): Hold a reference to exec_bfd.
This commit is contained in:
Tom Tromey 2013-10-17 12:03:06 -06:00
parent 5f6cac4085
commit 9b333ba340
2 changed files with 16 additions and 4 deletions

View File

@ -1,3 +1,7 @@
2014-02-26 Tom Tromey <tromey@redhat.com>
* exec.c (exec_file_attach): Hold a reference to exec_bfd.
2014-02-26 Tom Tromey <tromey@redhat.com>
* elfread.c (elf_read_minimal_symbols): Return early if

View File

@ -168,6 +168,14 @@ exec_file_clear (int from_tty)
void
exec_file_attach (char *filename, int from_tty)
{
struct cleanup *cleanups;
/* First, acquire a reference to the current exec_bfd. We release
this at the end of the function; but acquiring it now lets the
BFD cache return it if this call refers to the same file. */
gdb_bfd_ref (exec_bfd);
cleanups = make_cleanup_bfd_unref (exec_bfd);
/* Remove any previous exec file. */
exec_close ();
@ -182,7 +190,6 @@ exec_file_attach (char *filename, int from_tty)
}
else
{
struct cleanup *cleanups;
char *scratch_pathname, *canonical_pathname;
int scratch_chan;
struct target_section *sections = NULL, *sections_end = NULL;
@ -205,7 +212,7 @@ exec_file_attach (char *filename, int from_tty)
if (scratch_chan < 0)
perror_with_name (filename);
cleanups = make_cleanup (xfree, scratch_pathname);
make_cleanup (xfree, scratch_pathname);
/* gdb_bfd_open (and its variants) prefers canonicalized pathname for
better BFD caching. */
@ -261,9 +268,10 @@ exec_file_attach (char *filename, int from_tty)
/* Tell display code (if any) about the changed file name. */
if (deprecated_exec_file_display_hook)
(*deprecated_exec_file_display_hook) (filename);
do_cleanups (cleanups);
}
do_cleanups (cleanups);
bfd_cache_close_all ();
observer_notify_executable_changed ();
}