X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fgdb_bfd.c;h=df00f87c8a7555eea4af5d8fb76dd28694927b0c;hb=c5ac15402a894e87a118526a066880f596b3c78d;hp=847177524c2932e40b67707cd6742c903a94e144;hpb=18989b3c5642e2ba533e02737797dcf06134229b;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/gdb_bfd.c b/gdb/gdb_bfd.c index 847177524c..df00f87c8a 100644 --- a/gdb/gdb_bfd.c +++ b/gdb/gdb_bfd.c @@ -1,6 +1,6 @@ /* 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. @@ -122,6 +122,16 @@ show_bfd_sharing (struct ui_file *file, int from_tty, 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. */ @@ -145,7 +155,7 @@ struct gdb_bfd_cache_search 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)); @@ -157,9 +167,10 @@ hash_bfd (const void *b) 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 @@ -251,10 +262,11 @@ gdb_bfd_iovec_fileio_open (struct bfd *abfd, void *inferior) 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); @@ -281,6 +293,8 @@ gdb_bfd_iovec_fileio_pread (struct bfd *abfd, void *stream, void *buf, pos = 0; while (nbytes > pos) { + QUIT; + bytes = target_fileio_pread (fd, (gdb_byte *) buf + pos, nbytes - pos, offset + pos, &target_errno); @@ -404,9 +418,14 @@ gdb_bfd_open (const char *name, const char *target, int fd) /* 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; @@ -416,6 +435,12 @@ gdb_bfd_open (const char *name, const char *target, int fd) 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); @@ -433,7 +458,8 @@ gdb_bfd_open (const char *name, const char *target, int fd) 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) { @@ -482,7 +508,13 @@ gdb_bfd_ref (struct bfd *abfd) 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) { @@ -493,7 +525,8 @@ gdb_bfd_ref (struct bfd *abfd) /* 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); @@ -532,12 +565,25 @@ gdb_bfd_unref (struct bfd *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); @@ -583,11 +629,13 @@ get_section_descriptor (asection *section) { 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); } @@ -665,7 +713,7 @@ gdb_bfd_map_section (asection *sectp, bfd_size_type *size) 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 @@ -710,7 +758,7 @@ get_file_crc (bfd *abfd, unsigned long *file_crc_return) 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); @@ -801,7 +849,7 @@ gdb_bfd_mark_parent (bfd *child, bfd *parent) /* 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; @@ -832,7 +880,7 @@ gdb_bfd_record_inclusion (bfd *includer, bfd *includee) 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); } @@ -884,7 +932,7 @@ gdb_bfd_count_sections (bfd *abfd) 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) { @@ -910,9 +958,9 @@ gdb_bfd_requires_relocations (bfd *abfd) 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); @@ -968,4 +1016,13 @@ filename, file size, file modification time, and file inode."), &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); }