exec_close_1 (struct target_ops *self)
{
struct program_space *ss;
- struct cleanup *old_chain;
+ scoped_restore_current_program_space restore_pspace;
- old_chain = save_current_program_space ();
ALL_PSPACES (ss)
- {
- set_current_program_space (ss);
- clear_section_table (current_target_sections);
- exec_close ();
- }
-
- do_cleanups (old_chain);
+ {
+ set_current_program_space (ss);
+ clear_section_table (current_target_sections);
+ exec_close ();
+ }
}
void
void
exec_file_attach (const 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);
gdb_bfd_ref_ptr exec_bfd_holder (exec_bfd);
- cleanups = make_cleanup (null_cleanup, NULL);
-
/* Remove any previous exec file. */
exec_close ();
else
{
int load_via_target = 0;
- char *scratch_pathname, *canonical_pathname;
+ const char *scratch_pathname, *canonical_pathname;
int scratch_chan;
struct target_section *sections = NULL, *sections_end = NULL;
char **matching;
load_via_target = 1;
}
+ gdb::unique_xmalloc_ptr<char> canonical_storage, scratch_storage;
if (load_via_target)
{
/* gdb_bfd_fopen does not support "target:" filenames. */
"not supported for %s sysroots"),
TARGET_SYSROOT_PREFIX);
- scratch_pathname = xstrdup (filename);
- make_cleanup (xfree, scratch_pathname);
-
+ scratch_pathname = filename;
scratch_chan = -1;
-
canonical_pathname = scratch_pathname;
}
else
{
+ char *temp_pathname;
+
scratch_chan = openp (getenv ("PATH"), OPF_TRY_CWD_FIRST,
filename, write_files ?
O_RDWR | O_BINARY : O_RDONLY | O_BINARY,
- &scratch_pathname);
+ &temp_pathname);
#if defined(__GO32__) || defined(_WIN32) || defined(__CYGWIN__)
if (scratch_chan < 0)
{
exename, write_files ?
O_RDWR | O_BINARY
: O_RDONLY | O_BINARY,
- &scratch_pathname);
+ &temp_pathname);
}
#endif
if (scratch_chan < 0)
perror_with_name (filename);
- make_cleanup (xfree, scratch_pathname);
+ scratch_storage.reset (temp_pathname);
+ scratch_pathname = temp_pathname;
/* gdb_bfd_open (and its variants) prefers canonicalized
pathname for better BFD caching. */
- canonical_pathname = gdb_realpath (scratch_pathname);
- make_cleanup (xfree, canonical_pathname);
+ canonical_storage = gdb_realpath (scratch_pathname);
+ canonical_pathname = canonical_storage.get ();
}
gdb_bfd_ref_ptr temp;
if (load_via_target)
exec_filename = xstrdup (bfd_get_filename (exec_bfd));
else
- exec_filename = gdb_realpath_keepfile (scratch_pathname);
+ exec_filename = gdb_realpath_keepfile (scratch_pathname).release ();
if (!bfd_check_format_matches (exec_bfd, bfd_object, &matching))
{
(*deprecated_exec_file_display_hook) (filename);
}
- do_cleanups (cleanups);
-
bfd_cache_close_all ();
observer_notify_executable_changed ();
}
static void
exec_file_command (char *args, int from_tty)
{
- char **argv;
char *filename;
if (from_tty && target_has_execution
if (args)
{
- struct cleanup *cleanups;
-
/* Scan through the args and pick up the first non option arg
as the filename. */
- argv = gdb_buildargv (args);
- cleanups = make_cleanup_freeargv (argv);
+ gdb_argv built_argv (args);
+ char **argv = built_argv.get ();
for (; (*argv != NULL) && (**argv == '-'); argv++)
{;
if (*argv == NULL)
error (_("No executable file name was specified"));
- filename = tilde_expand (*argv);
- make_cleanup (xfree, filename);
- exec_file_attach (filename, from_tty);
-
- do_cleanups (cleanups);
+ gdb::unique_xmalloc_ptr<char> filename (tilde_expand (*argv));
+ exec_file_attach (filename.get (), from_tty);
}
else
exec_file_attach (NULL, from_tty);