/* Dump-to-file commands, for GDB, the GNU debugger.
- Copyright (C) 2002-2013 Free Software Foundation, Inc.
+ Copyright (C) 2002-2016 Free Software Foundation, Inc.
Contributed by Red Hat.
along with this program. If not, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
-#include "gdb_string.h"
#include "cli/cli-decode.h"
#include "cli/cli-cmds.h"
#include "value.h"
#include "completer.h"
-#include "gdb_assert.h"
#include <ctype.h>
#include "target.h"
#include "readline/readline.h"
#include "filestuff.h"
-static char *
-scan_expression_with_cleanup (char **cmd, const char *def)
+static const char *
+scan_expression_with_cleanup (const char **cmd, const char *def)
{
if ((*cmd) == NULL || (**cmd) == '\0')
{
else
{
char *exp;
- char *end;
+ const char *end;
end = (*cmd) + strcspn (*cmd, " \t");
exp = savestring ((*cmd), end - (*cmd));
make_cleanup (xfree, exp);
- (*cmd) = skip_spaces (end);
+ (*cmd) = skip_spaces_const (end);
return exp;
}
}
static char *
-scan_filename_with_cleanup (char **cmd, const char *defname)
+scan_filename_with_cleanup (const char **cmd, const char *defname)
{
char *filename;
char *fullname;
else
{
/* FIXME: should parse a possibly quoted string. */
- char *end;
+ const char *end;
- (*cmd) = skip_spaces (*cmd);
+ (*cmd) = skip_spaces_const (*cmd);
end = *cmd + strcspn (*cmd, " \t");
filename = savestring ((*cmd), end - (*cmd));
make_cleanup (xfree, filename);
- (*cmd) = skip_spaces (end);
+ (*cmd) = skip_spaces_const (end);
}
gdb_assert (filename != NULL);
static struct cmd_list_element *append_cmdlist;
static struct cmd_list_element *srec_cmdlist;
static struct cmd_list_element *ihex_cmdlist;
+static struct cmd_list_element *verilog_cmdlist;
static struct cmd_list_element *tekhex_cmdlist;
static struct cmd_list_element *binary_dump_cmdlist;
static struct cmd_list_element *binary_append_cmdlist;
dump_command (char *cmd, int from_tty)
{
printf_unfiltered (_("\"dump\" must be followed by a subcommand.\n\n"));
- help_list (dump_cmdlist, "dump ", -1, gdb_stdout);
+ 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 ", -1, gdb_stdout);
+ help_list (dump_cmdlist, "append ", all_commands, gdb_stdout);
}
static void
}
static void
-dump_memory_to_file (char *cmd, char *mode, char *file_format)
+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;
- char *filename;
- void *buf;
- char *lo_exp;
- char *hi_exp;
+ const char *filename;
+ const char *lo_exp;
+ const char *hi_exp;
/* Open the file. */
filename = scan_filename_with_cleanup (&cmd, NULL);
/* FIXME: Should use read_memory_partial() and a magic blocking
value. */
- buf = xmalloc (count);
- make_cleanup (xfree, buf);
- read_memory (lo, buf, count);
+ gdb::unique_ptr<gdb_byte[]> buf (new gdb_byte[count]);
+ read_memory (lo, buf.get (), count);
/* Have everything. Open/write the data. */
if (file_format == NULL || strcmp (file_format, "binary") == 0)
{
- dump_binary_file (filename, mode, buf, count);
+ dump_binary_file (filename, mode, buf.get (), count);
}
else
{
- dump_bfd_file (filename, mode, file_format, lo, buf, count);
+ dump_bfd_file (filename, mode, file_format, lo, buf.get (), count);
}
do_cleanups (old_cleanups);
}
static void
-dump_value_to_file (char *cmd, char *mode, char *file_format)
+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;
- char *filename;
+ const char *filename;
/* Open the file. */
filename = scan_filename_with_cleanup (&cmd, NULL);
dump_value_to_file (args, FOPEN_WB, "ihex");
}
+static void
+dump_verilog_memory (char *args, int from_tty)
+{
+ dump_memory_to_file (args, FOPEN_WB, "verilog");
+}
+
+static void
+dump_verilog_value (char *args, int from_tty)
+{
+ dump_value_to_file (args, FOPEN_WB, "verilog");
+}
+
static void
dump_tekhex_memory (char *args, int from_tty)
{
static void
call_dump_func (struct cmd_list_element *c, char *args, int from_tty)
{
- struct dump_context *d = get_cmd_context (c);
+ struct dump_context *d = (struct dump_context *) get_cmd_context (c);
d->func (args, d->mode);
}
c = add_cmd (name, all_commands, NULL, descr, &dump_cmdlist);
c->completer = filename_completer;
- d = XMALLOC (struct dump_context);
+ d = XNEW (struct dump_context);
d->func = func;
d->mode = FOPEN_WB;
set_cmd_context (c, d);
c = add_cmd (name, all_commands, NULL, descr, &append_cmdlist);
c->completer = filename_completer;
- d = XMALLOC (struct dump_context);
+ d = XNEW (struct dump_context);
d->func = func;
d->mode = FOPEN_AB;
set_cmd_context (c, d);
static void
restore_section_callback (bfd *ibfd, asection *isec, void *args)
{
- struct callback_data *data = 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_end = sec_start + size;
sec_load_count -= sec_end - data->load_end;
/* Get the data. */
- buf = xmalloc (size);
+ buf = (gdb_byte *) xmalloc (size);
old_chain = make_cleanup (xfree, buf);
if (!bfd_get_section_contents (ibfd, isec, buf, 0, size))
error (_("Failed to read bfd file %s: '%s'."), bfd_get_filename (ibfd),
}
static void
-restore_binary_file (char *filename, struct callback_data *data)
+restore_binary_file (const char *filename, struct callback_data *data)
{
struct cleanup *cleanup = make_cleanup (null_cleanup, NULL);
FILE *file = fopen_with_cleanup (filename, FOPEN_RB);
- gdb_byte *buf;
long len;
/* Get the file size for reading. */
perror_with_name (filename);
/* Now allocate a buffer and read the file contents. */
- buf = xmalloc (len);
- make_cleanup (xfree, buf);
- if (fread (buf, 1, len, file) != len)
+ gdb::unique_ptr<gdb_byte[]> buf (new gdb_byte[len]);
+ if (fread (buf.get (), 1, len, file) != len)
perror_with_name (filename);
/* Now write the buffer into target memory. */
- len = target_write_memory (data->load_start + data->load_offset, buf, len);
+ len = target_write_memory (data->load_start + data->load_offset,
+ buf.get (), len);
if (len != 0)
warning (_("restore: memory write failed (%s)."), safe_strerror (len));
do_cleanups (cleanup);
}
static void
-restore_command (char *args, int from_tty)
+restore_command (char *args_in, int from_tty)
{
char *filename;
struct callback_data data;
bfd *ibfd;
int binary_flag = 0;
+ const char *args = args_in;
if (!target_has_execution)
noprocess ();
char *binary_string = "binary";
/* Look for optional "binary" flag. */
- if (strncmp (args, binary_string, strlen (binary_string)) == 0)
+ if (startswith (args, binary_string))
{
binary_flag = 1;
args += strlen (binary_string);
- args = skip_spaces (args);
+ args = skip_spaces_const (args);
}
/* Parse offset (optional). */
if (args != NULL && *args != '\0')
- data.load_offset =
- parse_and_eval_address (scan_expression_with_cleanup (&args, NULL));
+ 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));
if (args != NULL && *args != '\0')
{
/* Parse start address (optional). */
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 ", -1, gdb_stdout);
+ 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 ", -1, gdb_stdout);
+ 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 ", -1, gdb_stdout);
+ 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 ", -1, gdb_stdout);
+ 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 ", -1, gdb_stdout);
+ 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 */
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 ",
to the specified FILE in intel hex format."),
&ihex_cmdlist);
+ add_cmd ("memory", all_commands, dump_verilog_memory, _("\
+Write contents of memory to a verilog hex file.\n\
+Arguments are FILE START STOP. Writes the contents of memory within\n\
+the range [START .. STOP) to the specified FILE in verilog hex format."),
+ &verilog_cmdlist);
+
+ add_cmd ("value", all_commands, dump_verilog_value, _("\
+Write the value of an expression to a verilog hex file.\n\
+Arguments are FILE EXPRESSION. Writes the value of EXPRESSION\n\
+to the specified FILE in verilog hex format."),
+ &verilog_cmdlist);
+
add_cmd ("memory", all_commands, dump_tekhex_memory, _("\
Write contents of memory to a tekhex file.\n\
Arguments are FILE START STOP. Writes the contents of memory\n\