/* Definitions for BFD wrappers used by GDB.
- Copyright (C) 2011-2015 Free Software Foundation, Inc.
+ Copyright (C) 2011-2016 Free Software Foundation, Inc.
This file is part of GDB.
fprintf_filtered (file, _("BFD sharing is %s.\n"), value);
}
+/* When non-zero debugging of the bfd caches is enabled. */
+
+static unsigned int debug_bfd_cache;
+static void
+show_bfd_cache_debug (struct ui_file *file, int from_tty,
+ struct cmd_list_element *c, const char *value)
+{
+ fprintf_filtered (file, _("BFD cache debugging is %s.\n"), value);
+}
+
/* The type of an object being looked up in gdb_bfd_cache. We use
htab's capability of storing one kind of object (BFD in this case)
and using a different sort of object for searching. */
static hashval_t
hash_bfd (const void *b)
{
- const bfd *abfd = b;
+ const bfd *abfd = (const struct bfd *) b;
/* It is simplest to just hash the filename. */
return htab_hash_string (bfd_get_filename (abfd));
static int
eq_bfd (const void *a, const void *b)
{
- const bfd *abfd = a;
- const struct gdb_bfd_cache_search *s = b;
- struct gdb_bfd_data *gdata = bfd_usrdata (abfd);
+ const bfd *abfd = (const struct bfd *) a;
+ const struct gdb_bfd_cache_search *s
+ = (const struct gdb_bfd_cache_search *) b;
+ struct gdb_bfd_data *gdata = (struct gdb_bfd_data *) bfd_usrdata (abfd);
return (gdata->mtime == s->mtime
&& gdata->size == s->size
gdb_assert (is_target_filename (filename));
- fd = target_fileio_open ((struct inferior *) inferior,
- filename + strlen (TARGET_SYSROOT_PREFIX),
- FILEIO_O_RDONLY, 0,
- &target_errno);
+ fd = target_fileio_open_warn_if_slow ((struct inferior *) inferior,
+ filename
+ + strlen (TARGET_SYSROOT_PREFIX),
+ FILEIO_O_RDONLY, 0,
+ &target_errno);
if (fd == -1)
{
errno = fileio_errno_to_host (target_errno);
pos = 0;
while (nbytes > pos)
{
+ QUIT;
+
bytes = target_fileio_pread (fd, (gdb_byte *) buf + pos,
nbytes - pos, offset + pos,
&target_errno);
/* Note that we cannot use htab_find_slot_with_hash here, because
opening the BFD may fail; and this would violate hashtab
invariants. */
- abfd = htab_find_with_hash (gdb_bfd_cache, &search, hash);
+ abfd = (struct bfd *) htab_find_with_hash (gdb_bfd_cache, &search, hash);
if (bfd_sharing && abfd != NULL)
{
+ if (debug_bfd_cache)
+ fprintf_unfiltered (gdb_stdlog,
+ "Reusing cached bfd %s for %s\n",
+ host_address_to_string (abfd),
+ bfd_get_filename (abfd));
close (fd);
gdb_bfd_ref (abfd);
return abfd;
if (abfd == NULL)
return NULL;
+ if (debug_bfd_cache)
+ fprintf_unfiltered (gdb_stdlog,
+ "Creating new bfd %s for %s\n",
+ host_address_to_string (abfd),
+ bfd_get_filename (abfd));
+
if (bfd_sharing)
{
slot = htab_find_slot_with_hash (gdb_bfd_cache, &search, hash, INSERT);
static void
free_one_bfd_section (bfd *abfd, asection *sectp, void *ignore)
{
- struct gdb_bfd_section_data *sect = bfd_get_section_userdata (abfd, sectp);
+ struct gdb_bfd_section_data *sect
+ = (struct gdb_bfd_section_data *) bfd_get_section_userdata (abfd, sectp);
if (sect != NULL && sect->data != NULL)
{
if (abfd == NULL)
return;
- gdata = bfd_usrdata (abfd);
+ gdata = (struct gdb_bfd_data *) bfd_usrdata (abfd);
+
+ if (debug_bfd_cache)
+ fprintf_unfiltered (gdb_stdlog,
+ "Increase reference count on bfd %s (%s)\n",
+ host_address_to_string (abfd),
+ bfd_get_filename (abfd));
if (gdata != NULL)
{
/* Ask BFD to decompress sections in bfd_get_full_section_contents. */
abfd->flags |= BFD_DECOMPRESS;
- gdata = bfd_zalloc (abfd, sizeof (struct gdb_bfd_data));
+ gdata
+ = (struct gdb_bfd_data *) bfd_zalloc (abfd, sizeof (struct gdb_bfd_data));
gdata->refc = 1;
gdata->mtime = bfd_get_mtime (abfd);
gdata->size = bfd_get_size (abfd);
if (abfd == NULL)
return;
- gdata = bfd_usrdata (abfd);
+ gdata = (struct gdb_bfd_data *) bfd_usrdata (abfd);
gdb_assert (gdata->refc >= 1);
gdata->refc -= 1;
if (gdata->refc > 0)
- return;
+ {
+ if (debug_bfd_cache)
+ fprintf_unfiltered (gdb_stdlog,
+ "Decrease reference count on bfd %s (%s)\n",
+ host_address_to_string (abfd),
+ bfd_get_filename (abfd));
+ return;
+ }
+
+ if (debug_bfd_cache)
+ fprintf_unfiltered (gdb_stdlog,
+ "Delete final reference count on bfd %s (%s)\n",
+ host_address_to_string (abfd),
+ bfd_get_filename (abfd));
archive_bfd = gdata->archive_bfd;
search.filename = bfd_get_filename (abfd);
{
struct gdb_bfd_section_data *result;
- result = bfd_get_section_userdata (section->owner, section);
+ result = ((struct gdb_bfd_section_data *)
+ bfd_get_section_userdata (section->owner, section));
if (result == NULL)
{
- result = bfd_zalloc (section->owner, sizeof (*result));
+ result = ((struct gdb_bfd_section_data *)
+ bfd_zalloc (section->owner, sizeof (*result)));
bfd_set_section_userdata (section->owner, section, result);
}
done:
gdb_assert (descriptor->data != NULL);
*size = descriptor->size;
- return descriptor->data;
+ return (const gdb_byte *) descriptor->data;
}
/* Return 32-bit CRC for ABFD. If successful store it to *FILE_CRC_RETURN and
int
gdb_bfd_crc (struct bfd *abfd, unsigned long *crc_out)
{
- struct gdb_bfd_data *gdata = bfd_usrdata (abfd);
+ struct gdb_bfd_data *gdata = (struct gdb_bfd_data *) bfd_usrdata (abfd);
if (!gdata->crc_computed)
gdata->crc_computed = get_file_crc (abfd, &gdata->crc);
/* No need to stash the filename here, because we also keep a
reference on the parent archive. */
- gdata = bfd_usrdata (child);
+ gdata = (struct gdb_bfd_data *) bfd_usrdata (child);
if (gdata->archive_bfd == NULL)
{
gdata->archive_bfd = parent;
struct gdb_bfd_data *gdata;
gdb_bfd_ref (includee);
- gdata = bfd_usrdata (includer);
+ gdata = (struct gdb_bfd_data *) bfd_usrdata (includer);
VEC_safe_push (bfdp, gdata->included_bfds, includee);
}
int
gdb_bfd_requires_relocations (bfd *abfd)
{
- struct gdb_bfd_data *gdata = bfd_usrdata (abfd);
+ struct gdb_bfd_data *gdata = (struct gdb_bfd_data *) bfd_usrdata (abfd);
if (gdata->relocation_computed == 0)
{
static int
print_one_bfd (void **slot, void *data)
{
- bfd *abfd = *slot;
- struct gdb_bfd_data *gdata = bfd_usrdata (abfd);
- struct ui_out *uiout = data;
+ bfd *abfd = (struct bfd *) *slot;
+ struct gdb_bfd_data *gdata = (struct gdb_bfd_data *) bfd_usrdata (abfd);
+ struct ui_out *uiout = (struct ui_out *) data;
struct cleanup *inner;
inner = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
&show_bfd_sharing,
&maintenance_set_cmdlist,
&maintenance_show_cmdlist);
+
+ add_setshow_zuinteger_cmd ("bfd-cache", class_maintenance,
+ &debug_bfd_cache, _("\
+Set bfd cache debugging."), _("\
+Show bfd cache debugging."), _("\
+When non-zero, bfd cache specific debugging is enabled."),
+ NULL,
+ &show_bfd_cache_debug,
+ &setdebuglist, &showdebuglist);
}