From ee0c32930c355b73172b2bef987e2a48ea909b12 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Mon, 31 Jul 2017 15:49:21 -0600 Subject: Use gdb::unique_xmalloc_ptr when calling tilde_expand This patch changes most sites calling tilde_expand to use gdb::unique_xmalloc_ptr, rather than a cleanup. It also changes scan_expression_with_cleanup to return a unique pointer, because the patch was already touching code in that area. Regression tested on the buildbot. ChangeLog 2017-08-05 Tom Tromey * compile/compile-object-load.c (compile_object_load): Use gdb::unique_xmalloc_ptr. * cli/cli-dump.c (scan_filename): Rename from scan_filename_with_cleanup. Change return type. (scan_expression): Rename from scan_expression_with_cleanup. Change return type. (dump_memory_to_file, dump_value_to_file, restore_command): Use gdb::unique_xmalloc_ptr. Update. * cli/cli-cmds.c (find_and_open_script): Use gdb::unique_xmalloc_ptr. * tracefile-tfile.c (tfile_open): Use gdb::unique_xmalloc_ptr. * symmisc.c (maintenance_print_symbols) (maintenance_print_msymbols): Use gdb::unique_xmalloc_ptr. * symfile.c (symfile_bfd_open, generic_load) (add_symbol_file_command, remove_symbol_file_command): Use gdb::unique_xmalloc_ptr. * source.c (openp): Use gdb::unique_xmalloc_ptr. * psymtab.c (maintenance_print_psymbols): Use gdb::unique_xmalloc_ptr. * corelow.c (core_open): Use gdb::unique_xmalloc_ptr. * breakpoint.c (save_breakpoints): Use gdb::unique_xmalloc_ptr. * solib.c (solib_map_sections): Use gdb::unique_xmalloc_ptr. (reload_shared_libraries_1): Likewise. --- gdb/cli/cli-cmds.c | 16 +++-------- gdb/cli/cli-dump.c | 79 ++++++++++++++++++------------------------------------ 2 files changed, 29 insertions(+), 66 deletions(-) (limited to 'gdb/cli') diff --git a/gdb/cli/cli-cmds.c b/gdb/cli/cli-cmds.c index 036a2f0..d3ec4ae 100644 --- a/gdb/cli/cli-cmds.c +++ b/gdb/cli/cli-cmds.c @@ -516,14 +516,11 @@ show_script_ext_mode (struct ui_file *file, int from_tty, gdb::optional find_and_open_script (const char *script_file, int search_path) { - char *file; int fd; - struct cleanup *old_cleanups; int search_flags = OPF_TRY_CWD_FIRST | OPF_RETURN_REALPATH; gdb::optional opened; - file = tilde_expand (script_file); - old_cleanups = make_cleanup (xfree, file); + gdb::unique_xmalloc_ptr file (tilde_expand (script_file)); if (search_path) search_flags |= OPF_SEARCH_IN_PATH; @@ -532,18 +529,11 @@ find_and_open_script (const char *script_file, int search_path) files. Put the full location in *FULL_PATHP. */ char *temp_path; fd = openp (source_path, search_flags, - file, O_RDONLY, &temp_path); + file.get (), O_RDONLY, &temp_path); gdb::unique_xmalloc_ptr full_path (temp_path); if (fd == -1) - { - int save_errno = errno; - do_cleanups (old_cleanups); - errno = save_errno; - return opened; - } - - do_cleanups (old_cleanups); + return opened; FILE *result = fdopen (fd, FOPEN_RT); if (result == NULL) diff --git a/gdb/cli/cli-dump.c b/gdb/cli/cli-dump.c index 6d55a02..30897d8 100644 --- a/gdb/cli/cli-dump.c +++ b/gdb/cli/cli-dump.c @@ -33,16 +33,11 @@ #include "filestuff.h" #include "common/byte-vector.h" -static const char * -scan_expression_with_cleanup (const char **cmd, const char *def) +static gdb::unique_xmalloc_ptr +scan_expression (const char **cmd, const char *def) { if ((*cmd) == NULL || (**cmd) == '\0') - { - char *exp = xstrdup (def); - - make_cleanup (xfree, exp); - return exp; - } + return gdb::unique_xmalloc_ptr (xstrdup (def)); else { char *exp; @@ -50,17 +45,16 @@ scan_expression_with_cleanup (const char **cmd, const char *def) end = (*cmd) + strcspn (*cmd, " \t"); exp = savestring ((*cmd), end - (*cmd)); - make_cleanup (xfree, exp); (*cmd) = skip_spaces_const (end); - return exp; + return gdb::unique_xmalloc_ptr (exp); } } -static char * -scan_filename_with_cleanup (const char **cmd, const char *defname) +static gdb::unique_xmalloc_ptr +scan_filename (const char **cmd, const char *defname) { - char *filename; + gdb::unique_xmalloc_ptr filename; char *fullname; /* FIXME: Need to get the ``/a(ppend)'' flag from somewhere. */ @@ -70,8 +64,7 @@ scan_filename_with_cleanup (const char **cmd, const char *defname) { if (defname == NULL) error (_("Missing filename.")); - filename = xstrdup (defname); - make_cleanup (xfree, filename); + filename.reset (xstrdup (defname)); } else { @@ -80,16 +73,12 @@ scan_filename_with_cleanup (const char **cmd, const char *defname) (*cmd) = skip_spaces_const (*cmd); end = *cmd + strcspn (*cmd, " \t"); - filename = savestring ((*cmd), end - (*cmd)); - make_cleanup (xfree, filename); + filename.reset (savestring ((*cmd), end - (*cmd))); (*cmd) = skip_spaces_const (end); } gdb_assert (filename != NULL); - fullname = tilde_expand (filename); - make_cleanup (xfree, fullname); - - return fullname; + return gdb::unique_xmalloc_ptr (tilde_expand (filename.get ())); } static gdb_bfd_ref_ptr @@ -189,28 +178,25 @@ dump_bfd_file (const char *filename, const char *mode, static void dump_memory_to_file (const char *cmd, const char *mode, const char *file_format) { - struct cleanup *old_cleanups = make_cleanup (null_cleanup, NULL); CORE_ADDR lo; CORE_ADDR hi; ULONGEST count; - const char *filename; - const char *lo_exp; const char *hi_exp; /* Open the file. */ - filename = scan_filename_with_cleanup (&cmd, NULL); + gdb::unique_xmalloc_ptr filename = scan_filename (&cmd, NULL); /* Find the low address. */ if (cmd == NULL || *cmd == '\0') error (_("Missing start address.")); - lo_exp = scan_expression_with_cleanup (&cmd, NULL); + gdb::unique_xmalloc_ptr lo_exp = scan_expression (&cmd, NULL); /* Find the second address - rest of line. */ if (cmd == NULL || *cmd == '\0') error (_("Missing stop address.")); hi_exp = cmd; - lo = parse_and_eval_address (lo_exp); + lo = parse_and_eval_address (lo_exp.get ()); hi = parse_and_eval_address (hi_exp); if (hi <= lo) error (_("Invalid memory address range (start >= end).")); @@ -223,15 +209,9 @@ dump_memory_to_file (const char *cmd, const char *mode, const char *file_format) /* Have everything. Open/write the data. */ if (file_format == NULL || strcmp (file_format, "binary") == 0) - { - dump_binary_file (filename, mode, buf.data (), count); - } + dump_binary_file (filename.get (), mode, buf.data (), count); else - { - dump_bfd_file (filename, mode, file_format, lo, buf.data (), count); - } - - do_cleanups (old_cleanups); + dump_bfd_file (filename.get (), mode, file_format, lo, buf.data (), count); } static void @@ -243,12 +223,10 @@ dump_memory_command (char *cmd, const char *mode) static void dump_value_to_file (const char *cmd, const char *mode, const char *file_format) { - struct cleanup *old_cleanups = make_cleanup (null_cleanup, NULL); struct value *val; - const char *filename; /* Open the file. */ - filename = scan_filename_with_cleanup (&cmd, NULL); + gdb::unique_xmalloc_ptr filename = scan_filename (&cmd, NULL); /* Find the value. */ if (cmd == NULL || *cmd == '\0') @@ -259,10 +237,8 @@ dump_value_to_file (const char *cmd, const char *mode, const char *file_format) /* Have everything. Open/write the data. */ if (file_format == NULL || strcmp (file_format, "binary") == 0) - { - dump_binary_file (filename, mode, value_contents (val), - TYPE_LENGTH (value_type (val))); - } + dump_binary_file (filename.get (), mode, value_contents (val), + TYPE_LENGTH (value_type (val))); else { CORE_ADDR vaddr; @@ -277,12 +253,10 @@ dump_value_to_file (const char *cmd, const char *mode, const char *file_format) warning (_("value is not an lval: address assumed to be zero")); } - dump_bfd_file (filename, mode, file_format, vaddr, + dump_bfd_file (filename.get (), mode, file_format, vaddr, value_contents (val), TYPE_LENGTH (value_type (val))); } - - do_cleanups (old_cleanups); } static void @@ -541,7 +515,6 @@ restore_binary_file (const char *filename, struct callback_data *data) static void restore_command (char *args_in, int from_tty) { - char *filename; struct callback_data data; bfd *ibfd; int binary_flag = 0; @@ -555,7 +528,7 @@ restore_command (char *args_in, int from_tty) data.load_end = 0; /* Parse the input arguments. First is filename (required). */ - filename = scan_filename_with_cleanup (&args, NULL); + gdb::unique_xmalloc_ptr filename = scan_filename (&args, NULL); if (args != NULL && *args != '\0') { static const char binary_string[] = "binary"; @@ -570,13 +543,13 @@ restore_command (char *args_in, int from_tty) /* Parse offset (optional). */ if (args != NULL && *args != '\0') data.load_offset = binary_flag ? - parse_and_eval_address (scan_expression_with_cleanup (&args, NULL)) : - parse_and_eval_long (scan_expression_with_cleanup (&args, NULL)); + parse_and_eval_address (scan_expression (&args, NULL).get ()) : + parse_and_eval_long (scan_expression (&args, NULL).get ()); if (args != NULL && *args != '\0') { /* Parse start address (optional). */ data.load_start = - parse_and_eval_long (scan_expression_with_cleanup (&args, NULL)); + parse_and_eval_long (scan_expression (&args, NULL).get ()); if (args != NULL && *args != '\0') { /* Parse end address (optional). */ @@ -589,18 +562,18 @@ restore_command (char *args_in, int from_tty) if (info_verbose) printf_filtered ("Restore file %s offset 0x%lx start 0x%lx end 0x%lx\n", - filename, (unsigned long) data.load_offset, + filename.get (), (unsigned long) data.load_offset, (unsigned long) data.load_start, (unsigned long) data.load_end); if (binary_flag) { - restore_binary_file (filename, &data); + restore_binary_file (filename.get (), &data); } else { /* Open the file for loading. */ - gdb_bfd_ref_ptr ibfd (bfd_openr_or_error (filename, NULL)); + gdb_bfd_ref_ptr ibfd (bfd_openr_or_error (filename.get (), NULL)); /* Process the sections. */ bfd_map_over_sections (ibfd.get (), restore_section_callback, &data); -- cgit v1.1