aboutsummaryrefslogtreecommitdiff
path: root/gdb/solib-aix.c
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2016-11-21 11:12:23 -0700
committerTom Tromey <tom@tromey.com>2017-01-10 19:14:10 -0700
commit192b62ce0b4bb5c61188f570e127a26d2c32f716 (patch)
tree01958d715eef682e22197d91a593659282792e23 /gdb/solib-aix.c
parent50315b21779d71c172eb98a786a9b8281622e407 (diff)
downloadgdb-192b62ce0b4bb5c61188f570e127a26d2c32f716.zip
gdb-192b62ce0b4bb5c61188f570e127a26d2c32f716.tar.gz
gdb-192b62ce0b4bb5c61188f570e127a26d2c32f716.tar.bz2
Use class to manage BFD reference counts
This introduces a new specialization of gdb::ref_ptr that can be used to manage BFD reference counts. Then it changes most places in gdb to use this new class, rather than explicit reference-counting or cleanups. This patch removes make_cleanup_bfd_unref. If you look you will see a couple of spots using "release" where a use of gdb_bfd_ref_ptr would be cleaner. These will be fixed in the next patch. I think this patch fixes some latent bugs. For example, it seems to me that previously objfpy_add_separate_debug_file leaked a BFD. I'm not 100% certain that the macho_symfile_read_all_oso change is correct. The existing code here is hard for me to follow. One goal of this sort of automated reference counting, though, is to make it more difficult to make logic errors; so hopefully the code is clear now. 2017-01-10 Tom Tromey <tom@tromey.com> * windows-tdep.c (windows_xfer_shared_library): Update. * windows-nat.c (windows_make_so): Update. * utils.h (make_cleanup_bfd_unref): Remove. * utils.c (do_bfd_close_cleanup, make_cleanup_bfd_unref): Remove. * symfile.h (symfile_bfd_open) (find_separate_debug_file_in_section): Return gdb_bfd_ref_ptr. * symfile.c (read_symbols, symbol_file_add) (separate_debug_file_exists): Update. (symfile_bfd_open): Return gdb_bfd_ref_ptr. (generic_load, reread_symbols): Update. * symfile-mem.c (symbol_file_add_from_memory): Update. * spu-linux-nat.c (spu_bfd_open): Return gdb_bfd_ref_ptr. (spu_symbol_file_add_from_memory): Update. * solist.h (struct target_so_ops) <bfd_open>: Return gdb_bfd_ref_ptr. (solib_bfd_fopen, solib_bfd_open): Return gdb_bfd_ref_ptr. * solib.c (solib_bfd_fopen, solib_bfd_open): Return gdb_bfd_ref_ptr. (solib_map_sections, reload_shared_libraries_1): Update. * solib-svr4.c (enable_break): Update. * solib-spu.c (spu_bfd_fopen): Return gdb_bfd_ref_ptr. * solib-frv.c (enable_break2): Update. * solib-dsbt.c (enable_break): Update. * solib-darwin.c (gdb_bfd_mach_o_fat_extract): Return gdb_bfd_ref_ptr. (darwin_solib_get_all_image_info_addr_at_init): Update. (darwin_bfd_open): Return gdb_bfd_ref_ptr. * solib-aix.c (solib_aix_bfd_open): Return gdb_bfd_ref_ptr. * record-full.c (record_full_save): Update. * python/py-objfile.c (objfpy_add_separate_debug_file): Update. * procfs.c (insert_dbx_link_bpt_in_file): Update. * minidebug.c (find_separate_debug_file_in_section): Return gdb_bfd_ref_ptr. * machoread.c (macho_add_oso_symfile): Change abfd to gdb_bfd_ref_ptr. (macho_symfile_read_all_oso): Update. (macho_check_dsym): Return gdb_bfd_ref_ptr. (macho_symfile_read): Update. * jit.c (bfd_open_from_target_memory): Return gdb_bfd_ref_ptr. (jit_bfd_try_read_symtab): Update. * gdb_bfd.h (gdb_bfd_open, gdb_bfd_fopen, gdb_bfd_openr) (gdb_bfd_openw, gdb_bfd_openr_iovec) (gdb_bfd_openr_next_archived_file, gdb_bfd_fdopenr): Return gdb_bfd_ref_ptr. (gdb_bfd_ref_policy): New struct. (gdb_bfd_ref_ptr): New typedef. * gdb_bfd.c (gdb_bfd_open, gdb_bfd_fopen, gdb_bfd_openr) (gdb_bfd_openw, gdb_bfd_openr_iovec) (gdb_bfd_openr_next_archived_file, gdb_bfd_fdopenr): Return gdb_bfd_ref_ptr. * gcore.h (create_gcore_bfd): Return gdb_bfd_ref_ptr. * gcore.c (create_gcore_bfd): Return gdb_bfd_ref_ptr. (gcore_command): Update. * exec.c (exec_file_attach): Update. * elfread.c (elf_symfile_read): Update. * dwarf2read.c (dwarf2_get_dwz_file): Update. (try_open_dwop_file, open_dwo_file): Return gdb_bfd_ref_ptr. (open_and_init_dwo_file): Update. (open_dwp_file): Return gdb_bfd_ref_ptr. (open_and_init_dwp_file): Update. * corelow.c (core_open): Update. * compile/compile-object-load.c (compile_object_load): Update. * common/gdb_ref_ptr.h (ref_ptr::operator->): New operator. * coffread.c (coff_symfile_read): Update. * cli/cli-dump.c (bfd_openr_or_error, bfd_openw_or_error): Return gdb_bfd_ref_ptr. Rename. (dump_bfd_file, restore_command): Update. * build-id.h (build_id_to_debug_bfd): Return gdb_bfd_ref_ptr. * build-id.c (build_id_to_debug_bfd): Return gdb_bfd_ref_ptr. (find_separate_debug_file_by_buildid): Update.
Diffstat (limited to 'gdb/solib-aix.c')
-rw-r--r--gdb/solib-aix.c65
1 files changed, 24 insertions, 41 deletions
diff --git a/gdb/solib-aix.c b/gdb/solib-aix.c
index 332d1e4..66add03 100644
--- a/gdb/solib-aix.c
+++ b/gdb/solib-aix.c
@@ -624,7 +624,7 @@ solib_aix_in_dynsym_resolve_code (CORE_ADDR pc)
/* Implement the "bfd_open" target_so_ops method. */
-static bfd *
+static gdb_bfd_ref_ptr
solib_aix_bfd_open (char *pathname)
{
/* The pathname is actually a synthetic filename with the following
@@ -635,11 +635,7 @@ solib_aix_bfd_open (char *pathname)
to the solib's lm_info here? */
const int path_len = strlen (pathname);
char *sep;
- char *filename;
int filename_len;
- char *member_name;
- bfd *archive_bfd, *object_bfd;
- struct cleanup *cleanup;
int found_file;
char *found_pathname;
@@ -658,69 +654,57 @@ solib_aix_bfd_open (char *pathname)
}
filename_len = sep - pathname;
- filename = xstrprintf ("%.*s", filename_len, pathname);
- cleanup = make_cleanup (xfree, filename);
- member_name = xstrprintf ("%.*s", path_len - filename_len - 2, sep + 1);
- make_cleanup (xfree, member_name);
+ std::string filename (string_printf ("%.*s", filename_len, pathname));
+ std::string member_name (string_printf ("%.*s", path_len - filename_len - 2,
+ sep + 1));
/* Calling solib_find makes certain that sysroot path is set properly
if program has a dependency on .a archive and sysroot is set via
set sysroot command. */
- found_pathname = solib_find (filename, &found_file);
+ found_pathname = solib_find (filename.c_str (), &found_file);
if (found_pathname == NULL)
perror_with_name (pathname);
- archive_bfd = solib_bfd_fopen (found_pathname, found_file);
+ gdb_bfd_ref_ptr archive_bfd (solib_bfd_fopen (found_pathname, found_file));
if (archive_bfd == NULL)
{
warning (_("Could not open `%s' as an executable file: %s"),
- filename, bfd_errmsg (bfd_get_error ()));
- do_cleanups (cleanup);
+ filename.c_str (), bfd_errmsg (bfd_get_error ()));
return NULL;
}
- if (bfd_check_format (archive_bfd, bfd_object))
- {
- do_cleanups (cleanup);
- return archive_bfd;
- }
+ if (bfd_check_format (archive_bfd.get (), bfd_object))
+ return archive_bfd;
- if (! bfd_check_format (archive_bfd, bfd_archive))
+ if (! bfd_check_format (archive_bfd.get (), bfd_archive))
{
warning (_("\"%s\": not in executable format: %s."),
- filename, bfd_errmsg (bfd_get_error ()));
- gdb_bfd_unref (archive_bfd);
- do_cleanups (cleanup);
+ filename.c_str (), bfd_errmsg (bfd_get_error ()));
return NULL;
}
- object_bfd = gdb_bfd_openr_next_archived_file (archive_bfd, NULL);
+ gdb_bfd_ref_ptr object_bfd
+ (gdb_bfd_openr_next_archived_file (archive_bfd.get (), NULL));
while (object_bfd != NULL)
{
- bfd *next;
-
- if (strcmp (member_name, object_bfd->filename) == 0)
+ if (member_name == object_bfd->filename)
break;
- next = gdb_bfd_openr_next_archived_file (archive_bfd, object_bfd);
- gdb_bfd_unref (object_bfd);
- object_bfd = next;
+ object_bfd = gdb_bfd_openr_next_archived_file (archive_bfd.get (),
+ object_bfd.get ());
}
if (object_bfd == NULL)
{
- warning (_("\"%s\": member \"%s\" missing."), filename, member_name);
- gdb_bfd_unref (archive_bfd);
- do_cleanups (cleanup);
+ warning (_("\"%s\": member \"%s\" missing."), filename.c_str (),
+ member_name.c_str ());
return NULL;
}
- if (! bfd_check_format (object_bfd, bfd_object))
+ if (! bfd_check_format (object_bfd.get (), bfd_object))
{
warning (_("%s(%s): not in object format: %s."),
- filename, member_name, bfd_errmsg (bfd_get_error ()));
- gdb_bfd_unref (archive_bfd);
- gdb_bfd_unref (object_bfd);
- do_cleanups (cleanup);
+ filename.c_str (), member_name.c_str (),
+ bfd_errmsg (bfd_get_error ()));
return NULL;
}
@@ -728,12 +712,11 @@ solib_aix_bfd_open (char *pathname)
along with appended parenthesized member name in order to allow commands
listing all shared libraries to display. Otherwise, we would only be
displaying the name of the archive member object. */
- xfree (bfd_get_filename (object_bfd));
+ xfree (bfd_get_filename (object_bfd.get ()));
object_bfd->filename = xstrprintf ("%s%s",
- bfd_get_filename (archive_bfd), sep);
+ bfd_get_filename (archive_bfd.get ()),
+ sep);
- gdb_bfd_unref (archive_bfd);
- do_cleanups (cleanup);
return object_bfd;
}