/* Dump-to-file commands, for GDB, the GNU debugger.
- Copyright (C) 2002-2017 Free Software Foundation, Inc.
+ Copyright (C) 2002-2020 Free Software Foundation, Inc.
Contributed by Red Hat.
#include "completer.h"
#include <ctype.h>
#include "target.h"
-#include "readline/readline.h"
+#include "readline/tilde.h"
#include "gdbcore.h"
#include "cli/cli-utils.h"
#include "gdb_bfd.h"
-#include "filestuff.h"
-#include "common/byte-vector.h"
+#include "gdbsupport/filestuff.h"
+#include "gdbsupport/byte-vector.h"
+#include "gdbarch.h"
static gdb::unique_xmalloc_ptr<char>
scan_expression (const char **cmd, const char *def)
{
if ((*cmd) == NULL || (**cmd) == '\0')
- return gdb::unique_xmalloc_ptr<char> (xstrdup (def));
+ return make_unique_xstrdup (def);
else
{
char *exp;
end = (*cmd) + strcspn (*cmd, " \t");
exp = savestring ((*cmd), end - (*cmd));
- (*cmd) = skip_spaces_const (end);
+ (*cmd) = skip_spaces (end);
return gdb::unique_xmalloc_ptr<char> (exp);
}
}
scan_filename (const char **cmd, const char *defname)
{
gdb::unique_xmalloc_ptr<char> filename;
- char *fullname;
/* FIXME: Need to get the ``/a(ppend)'' flag from somewhere. */
/* FIXME: should parse a possibly quoted string. */
const char *end;
- (*cmd) = skip_spaces_const (*cmd);
+ (*cmd) = skip_spaces (*cmd);
end = *cmd + strcspn (*cmd, " \t");
filename.reset (savestring ((*cmd), end - (*cmd)));
- (*cmd) = skip_spaces_const (end);
+ (*cmd) = skip_spaces (end);
}
gdb_assert (filename != NULL);
static struct cmd_list_element *binary_dump_cmdlist;
static struct cmd_list_element *binary_append_cmdlist;
-static void
-dump_command (char *cmd, int from_tty)
-{
- printf_unfiltered (_("\"dump\" must be followed by a subcommand.\n\n"));
- help_list (dump_cmdlist, "dump ", all_commands, gdb_stdout);
-}
-
-static void
-append_command (char *cmd, int from_tty)
-{
- printf_unfiltered (_("\"append\" must be followed by a subcommand.\n\n"));
- help_list (dump_cmdlist, "append ", all_commands, gdb_stdout);
-}
-
static void
dump_binary_file (const char *filename, const char *mode,
const bfd_byte *buf, ULONGEST len)
gdb_bfd_ref_ptr obfd (bfd_openw_or_error (filename, target, mode));
osection = bfd_make_section_anyway (obfd.get (), ".newsec");
- bfd_set_section_size (obfd.get (), osection, len);
- bfd_set_section_vma (obfd.get (), osection, vaddr);
- bfd_set_section_alignment (obfd.get (), osection, 0);
- bfd_set_section_flags (obfd.get (), osection, (SEC_HAS_CONTENTS
- | SEC_ALLOC
- | SEC_LOAD));
+ bfd_set_section_size (osection, len);
+ bfd_set_section_vma (osection, vaddr);
+ bfd_set_section_alignment (osection, 0);
+ bfd_set_section_flags (osection, (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD));
osection->entsize = 0;
if (!bfd_set_section_contents (obfd.get (), osection, buf, 0, len))
warning (_("writing dump file '%s' (%s)"), filename,
}
static void
-dump_memory_command (char *cmd, const char *mode)
+dump_memory_command (const char *cmd, const char *mode)
{
dump_memory_to_file (cmd, mode, "binary");
}
}
static void
-dump_value_command (char *cmd, const char *mode)
+dump_value_command (const char *cmd, const char *mode)
{
dump_value_to_file (cmd, mode, "binary");
}
static void
-dump_srec_memory (char *args, int from_tty)
+dump_srec_memory (const char *args, int from_tty)
{
dump_memory_to_file (args, FOPEN_WB, "srec");
}
static void
-dump_srec_value (char *args, int from_tty)
+dump_srec_value (const char *args, int from_tty)
{
dump_value_to_file (args, FOPEN_WB, "srec");
}
static void
-dump_ihex_memory (char *args, int from_tty)
+dump_ihex_memory (const char *args, int from_tty)
{
dump_memory_to_file (args, FOPEN_WB, "ihex");
}
static void
-dump_ihex_value (char *args, int from_tty)
+dump_ihex_value (const char *args, int from_tty)
{
dump_value_to_file (args, FOPEN_WB, "ihex");
}
static void
-dump_verilog_memory (char *args, int from_tty)
+dump_verilog_memory (const char *args, int from_tty)
{
dump_memory_to_file (args, FOPEN_WB, "verilog");
}
static void
-dump_verilog_value (char *args, int from_tty)
+dump_verilog_value (const char *args, int from_tty)
{
dump_value_to_file (args, FOPEN_WB, "verilog");
}
static void
-dump_tekhex_memory (char *args, int from_tty)
+dump_tekhex_memory (const char *args, int from_tty)
{
dump_memory_to_file (args, FOPEN_WB, "tekhex");
}
static void
-dump_tekhex_value (char *args, int from_tty)
+dump_tekhex_value (const char *args, int from_tty)
{
dump_value_to_file (args, FOPEN_WB, "tekhex");
}
static void
-dump_binary_memory (char *args, int from_tty)
+dump_binary_memory (const char *args, int from_tty)
{
dump_memory_to_file (args, FOPEN_WB, "binary");
}
static void
-dump_binary_value (char *args, int from_tty)
+dump_binary_value (const char *args, int from_tty)
{
dump_value_to_file (args, FOPEN_WB, "binary");
}
static void
-append_binary_memory (char *args, int from_tty)
+append_binary_memory (const char *args, int from_tty)
{
dump_memory_to_file (args, FOPEN_AB, "binary");
}
static void
-append_binary_value (char *args, int from_tty)
+append_binary_value (const char *args, int from_tty)
{
dump_value_to_file (args, FOPEN_AB, "binary");
}
struct dump_context
{
- void (*func) (char *cmd, const char *mode);
+ void (*func) (const char *cmd, const char *mode);
const char *mode;
};
static void
-call_dump_func (struct cmd_list_element *c, char *args, int from_tty)
+call_dump_func (struct cmd_list_element *c, const char *args, int from_tty)
{
struct dump_context *d = (struct dump_context *) get_cmd_context (c);
static void
add_dump_command (const char *name,
- void (*func) (char *args, const char *mode),
+ void (*func) (const char *args, const char *mode),
const char *descr)
{
struct cmd_list_element *c;
struct dump_context *d;
- c = add_cmd (name, all_commands, NULL, descr, &dump_cmdlist);
+ c = add_cmd (name, all_commands, descr, &dump_cmdlist);
c->completer = filename_completer;
d = XNEW (struct dump_context);
d->func = func;
set_cmd_context (c, d);
c->func = call_dump_func;
- c = add_cmd (name, all_commands, NULL, descr, &append_cmdlist);
+ c = add_cmd (name, all_commands, descr, &append_cmdlist);
c->completer = filename_completer;
d = XNEW (struct dump_context);
d->func = func;
restore_section_callback (bfd *ibfd, asection *isec, void *args)
{
struct callback_data *data = (struct callback_data *) args;
- bfd_vma sec_start = bfd_section_vma (ibfd, isec);
- bfd_size_type size = bfd_section_size (ibfd, isec);
+ bfd_vma sec_start = bfd_section_vma (isec);
+ bfd_size_type size = bfd_section_size (isec);
bfd_vma sec_end = sec_start + size;
bfd_size_type sec_offset = 0;
bfd_size_type sec_load_count = size;
int ret;
/* Ignore non-loadable sections, eg. from elf files. */
- if (!(bfd_get_section_flags (ibfd, isec) & SEC_LOAD))
+ if (!(bfd_section_flags (isec) & SEC_LOAD))
return;
/* Does the section overlap with the desired restore range? */
{
/* No, no useable data in this section. */
printf_filtered (_("skipping section %s...\n"),
- bfd_section_name (ibfd, isec));
+ bfd_section_name (isec));
return;
}
bfd_errmsg (bfd_get_error ()));
printf_filtered ("Restoring section %s (0x%lx to 0x%lx)",
- bfd_section_name (ibfd, isec),
+ bfd_section_name (isec),
(unsigned long) sec_start,
(unsigned long) sec_end);
gdb_file_up file = gdb_fopen_cloexec (filename, FOPEN_RB);
long len;
+ if (file == NULL)
+ error (_("Failed to open %s: %s"), filename, safe_strerror (errno));
+
/* Get the file size for reading. */
if (fseek (file.get (), 0, SEEK_END) == 0)
{
}
static void
-restore_command (char *args_in, int from_tty)
+restore_command (const char *args, int from_tty)
{
struct callback_data data;
- bfd *ibfd;
int binary_flag = 0;
- const char *args = args_in;
if (!target_has_execution)
noprocess ();
{
binary_flag = 1;
args += strlen (binary_string);
- args = skip_spaces_const (args);
+ args = skip_spaces (args);
}
/* Parse offset (optional). */
if (args != NULL && *args != '\0')
}
}
-static void
-srec_dump_command (char *cmd, int from_tty)
-{
- printf_unfiltered (_("\"dump srec\" must be followed by a subcommand.\n"));
- help_list (srec_cmdlist, "dump srec ", all_commands, gdb_stdout);
-}
-
-static void
-ihex_dump_command (char *cmd, int from_tty)
-{
- printf_unfiltered (_("\"dump ihex\" must be followed by a subcommand.\n"));
- help_list (ihex_cmdlist, "dump ihex ", all_commands, gdb_stdout);
-}
-
-static void
-verilog_dump_command (char *cmd, int from_tty)
-{
- printf_unfiltered (_("\"dump verilog\" must be followed by a subcommand.\n"));
- help_list (verilog_cmdlist, "dump verilog ", all_commands, gdb_stdout);
-}
-
-static void
-tekhex_dump_command (char *cmd, int from_tty)
-{
- printf_unfiltered (_("\"dump tekhex\" must be followed by a subcommand.\n"));
- help_list (tekhex_cmdlist, "dump tekhex ", all_commands, gdb_stdout);
-}
-
-static void
-binary_dump_command (char *cmd, int from_tty)
-{
- printf_unfiltered (_("\"dump binary\" must be followed by a subcommand.\n"));
- help_list (binary_dump_cmdlist, "dump binary ", all_commands, gdb_stdout);
-}
-
-static void
-binary_append_command (char *cmd, int from_tty)
-{
- printf_unfiltered (_("\"append binary\" must be followed by a subcommand.\n"));
- help_list (binary_append_cmdlist, "append binary ", all_commands,
- gdb_stdout);
-}
-
-extern initialize_file_ftype _initialize_cli_dump; /* -Wmissing-prototypes */
-
+void _initialize_cli_dump ();
void
-_initialize_cli_dump (void)
+_initialize_cli_dump ()
{
struct cmd_list_element *c;
- add_prefix_cmd ("dump", class_vars, dump_command,
- _("Dump target code/data to a local file."),
- &dump_cmdlist, "dump ",
- 0/*allow-unknown*/,
- &cmdlist);
- add_prefix_cmd ("append", class_vars, append_command,
- _("Append target code/data to a local file."),
- &append_cmdlist, "append ",
- 0/*allow-unknown*/,
- &cmdlist);
+ add_basic_prefix_cmd ("dump", class_vars,
+ _("Dump target code/data to a local file."),
+ &dump_cmdlist, "dump ",
+ 0/*allow-unknown*/,
+ &cmdlist);
+ add_basic_prefix_cmd ("append", class_vars,
+ _("Append target code/data to a local file."),
+ &append_cmdlist, "append ",
+ 0/*allow-unknown*/,
+ &cmdlist);
add_dump_command ("memory", dump_memory_command, "\
Write contents of memory to a raw binary file.\n\
Arguments are FILE EXPRESSION. Writes the value of EXPRESSION to\n\
the specified FILE in raw target ordered bytes.");
- add_prefix_cmd ("srec", all_commands, srec_dump_command,
- _("Write target code/data to an srec file."),
- &srec_cmdlist, "dump srec ",
- 0 /*allow-unknown*/,
- &dump_cmdlist);
-
- add_prefix_cmd ("ihex", all_commands, ihex_dump_command,
- _("Write target code/data to an intel hex file."),
- &ihex_cmdlist, "dump ihex ",
- 0 /*allow-unknown*/,
- &dump_cmdlist);
-
- add_prefix_cmd ("verilog", all_commands, verilog_dump_command,
- _("Write target code/data to a verilog hex file."),
- &verilog_cmdlist, "dump verilog ",
- 0 /*allow-unknown*/,
- &dump_cmdlist);
-
- add_prefix_cmd ("tekhex", all_commands, tekhex_dump_command,
- _("Write target code/data to a tekhex file."),
- &tekhex_cmdlist, "dump tekhex ",
- 0 /*allow-unknown*/,
- &dump_cmdlist);
-
- add_prefix_cmd ("binary", all_commands, binary_dump_command,
- _("Write target code/data to a raw binary file."),
- &binary_dump_cmdlist, "dump binary ",
- 0 /*allow-unknown*/,
- &dump_cmdlist);
-
- add_prefix_cmd ("binary", all_commands, binary_append_command,
- _("Append target code/data to a raw binary file."),
- &binary_append_cmdlist, "append binary ",
- 0 /*allow-unknown*/,
- &append_cmdlist);
+ add_basic_prefix_cmd ("srec", all_commands,
+ _("Write target code/data to an srec file."),
+ &srec_cmdlist, "dump srec ",
+ 0 /*allow-unknown*/,
+ &dump_cmdlist);
+
+ add_basic_prefix_cmd ("ihex", all_commands,
+ _("Write target code/data to an intel hex file."),
+ &ihex_cmdlist, "dump ihex ",
+ 0 /*allow-unknown*/,
+ &dump_cmdlist);
+
+ add_basic_prefix_cmd ("verilog", all_commands,
+ _("Write target code/data to a verilog hex file."),
+ &verilog_cmdlist, "dump verilog ",
+ 0 /*allow-unknown*/,
+ &dump_cmdlist);
+
+ add_basic_prefix_cmd ("tekhex", all_commands,
+ _("Write target code/data to a tekhex file."),
+ &tekhex_cmdlist, "dump tekhex ",
+ 0 /*allow-unknown*/,
+ &dump_cmdlist);
+
+ add_basic_prefix_cmd ("binary", all_commands,
+ _("Write target code/data to a raw binary file."),
+ &binary_dump_cmdlist, "dump binary ",
+ 0 /*allow-unknown*/,
+ &dump_cmdlist);
+
+ add_basic_prefix_cmd ("binary", all_commands,
+ _("Append target code/data to a raw binary file."),
+ &binary_append_cmdlist, "append binary ",
+ 0 /*allow-unknown*/,
+ &append_cmdlist);
add_cmd ("memory", all_commands, dump_srec_memory, _("\
Write contents of memory to an srec file.\n\