This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[FYI v3 10/10] make "file" use the BFD cache better
- From: Tom Tromey <tromey at redhat dot com>
- To: gdb-patches at sourceware dot org
- Cc: Tom Tromey <tromey at redhat dot com>
- Date: Wed, 26 Feb 2014 12:01:13 -0700
- Subject: [FYI v3 10/10] make "file" use the BFD cache better
- Authentication-results: sourceware.org; auth=none
- References: <1393441273-32268-1-git-send-email-tromey at redhat dot com>
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.
---
gdb/ChangeLog | 4 ++++
gdb/exec.c | 16 ++++++++++++----
2 files changed, 16 insertions(+), 4 deletions(-)
diff --git a/gdb/exec.c b/gdb/exec.c
index 44dddc1..908858e 100644
--- a/gdb/exec.c
+++ b/gdb/exec.c
@@ -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 ();
}
--
1.8.1.4