/* Directory list from which to load auto-loaded scripts. It is not checked
for absolute paths but they are strongly recommended. It is initialized by
_initialize_auto_load. */
-static char *auto_load_dir;
+static std::string auto_load_dir = AUTO_LOAD_DIR;
/* "set" command for the auto_load_dir configuration variable. */
set_auto_load_dir (const char *args, int from_tty, struct cmd_list_element *c)
{
/* Setting the variable to "" resets it to the compile time defaults. */
- if (auto_load_dir[0] == '\0')
- {
- xfree (auto_load_dir);
- auto_load_dir = xstrdup (AUTO_LOAD_DIR);
- }
+ if (auto_load_dir.empty ())
+ auto_load_dir = AUTO_LOAD_DIR;
}
/* "show" command for the auto_load_dir configuration variable. */
/* Directory list safe to hold auto-loaded files. It is not checked for
absolute paths but they are strongly recommended. It is initialized by
_initialize_auto_load. */
-static char *auto_load_safe_path;
+static std::string auto_load_safe_path = AUTO_LOAD_SAFE_PATH;
/* Vector of directory elements of AUTO_LOAD_SAFE_PATH with each one normalized
by tilde_expand and possibly each entries has added its gdb_realpath
{
char *s = xstrdup (string);
substitute_path_component (&s, "$datadir", gdb_datadir.c_str ());
- substitute_path_component (&s, "$debugdir", debug_file_directory);
+ substitute_path_component (&s, "$debugdir", debug_file_directory.c_str ());
if (debug_auto_load && strcmp (s, string) != 0)
auto_load_debug_printf ("Expanded $-variables to \"%s\".", s);
auto_load_safe_path_vec_update (void)
{
auto_load_debug_printf ("Updating directories of \"%s\".",
- auto_load_safe_path);
+ auto_load_safe_path.c_str ());
- auto_load_safe_path_vec = auto_load_expand_dir_vars (auto_load_safe_path);
+ auto_load_safe_path_vec
+ = auto_load_expand_dir_vars (auto_load_safe_path.c_str ());
size_t len = auto_load_safe_path_vec.size ();
/* Apply tilde_expand and gdb_realpath to each AUTO_LOAD_SAFE_PATH_VEC
int from_tty, struct cmd_list_element *c)
{
/* Setting the variable to "" resets it to the compile time defaults. */
- if (auto_load_safe_path[0] == '\0')
- {
- xfree (auto_load_safe_path);
- auto_load_safe_path = xstrdup (AUTO_LOAD_SAFE_PATH);
- }
+ if (auto_load_safe_path.empty ())
+ auto_load_safe_path = AUTO_LOAD_SAFE_PATH;
auto_load_safe_path_vec_update ();
}
static void
add_auto_load_safe_path (const char *args, int from_tty)
{
- char *s;
-
if (args == NULL || *args == 0)
error (_("\
Directory argument required.\n\
Use 'set auto-load safe-path /' for disabling the auto-load safe-path security.\
"));
- s = xstrprintf ("%s%c%s", auto_load_safe_path, DIRNAME_SEPARATOR, args);
- xfree (auto_load_safe_path);
- auto_load_safe_path = s;
+ auto_load_safe_path = string_printf ("%s%c%s", auto_load_safe_path.c_str (),
+ DIRNAME_SEPARATOR, args);
auto_load_safe_path_vec_update ();
}
static void
add_auto_load_dir (const char *args, int from_tty)
{
- char *s;
-
if (args == NULL || *args == 0)
error (_("Directory argument required."));
- s = xstrprintf ("%s%c%s", auto_load_dir, DIRNAME_SEPARATOR, args);
- xfree (auto_load_dir);
- auto_load_dir = s;
+ auto_load_dir = string_printf ("%s%c%s", auto_load_dir.c_str (),
+ DIRNAME_SEPARATOR, args);
}
/* Implementation for filename_is_in_pattern overwriting the caller's FILENAME
warning (_("File \"%ps\" auto-loading has been declined by your "
"`auto-load safe-path' set to \"%s\"."),
styled_string (file_name_style.style (), filename_real.get ()),
- auto_load_safe_path);
+ auto_load_safe_path.c_str ());
if (!advice_printed)
{
directory. */
std::vector<gdb::unique_xmalloc_ptr<char>> vec
- = auto_load_expand_dir_vars (auto_load_dir);
+ = auto_load_expand_dir_vars (auto_load_dir.c_str ());
auto_load_debug_printf
("Searching 'set auto-load scripts-directory' path \"%s\".",
- auto_load_dir);
+ auto_load_dir.c_str ());
/* Convert Windows file name from c:/dir/file to /c/dir/file. */
if (HAS_DRIVE_SPEC (debugfile))
Usage: info auto-load local-gdbinit"),
auto_load_info_cmdlist_get ());
- auto_load_dir = xstrdup (AUTO_LOAD_DIR);
-
suffix = ext_lang_auto_load_suffix (get_ext_lang_defn (EXT_LANG_GDB));
gdb_name_help
= xstrprintf (_("\
xfree (gdb_name_help);
xfree (guile_name_help);
- auto_load_safe_path = xstrdup (AUTO_LOAD_SAFE_PATH);
auto_load_safe_path_vec_update ();
add_setshow_optional_filename_cmd ("safe-path", class_support,
&auto_load_safe_path, _("\
copied into the command, so it can be anything that GDB can
evaluate to a callable address, not necessarily a function name. */
-static char *dprintf_function;
+static std::string dprintf_function = "printf";
/* The channel to use for dynamic printf if the preferred style is to
call into the inferior; if a nonempty string, it will be passed to
"stderr", this could be an app-specific expression like
"mystreams[curlogger]". */
-static char *dprintf_channel;
+static std::string dprintf_channel;
/* True if dprintf commands should continue to operate even if GDB
has disconnected. */
/* If it has no value (which is frequently the case), say nothing; a
message like "No default-collect." gets in user's face when it's
not wanted. */
- if (!*default_collect)
+ if (default_collect.empty ())
return;
/* The following phrase lines up nicely with per-tracepoint collect
printf_line = xstrprintf ("printf %s", dprintf_args);
else if (strcmp (dprintf_style, dprintf_style_call) == 0)
{
- if (!dprintf_function)
+ if (dprintf_function.empty ())
error (_("No function supplied for dprintf call"));
- if (dprintf_channel && strlen (dprintf_channel) > 0)
+ if (!dprintf_channel.empty ())
printf_line = xstrprintf ("call (void) %s (%s,%s)",
- dprintf_function,
- dprintf_channel,
+ dprintf_function.c_str (),
+ dprintf_channel.c_str (),
dprintf_args);
else
printf_line = xstrprintf ("call (void) %s (%s)",
- dprintf_function,
+ dprintf_function.c_str (),
dprintf_args);
}
else if (strcmp (dprintf_style, dprintf_style_agent) == 0)
}
}
- if (extra_trace_bits && *default_collect)
- fp.printf ("set default-collect %s\n", default_collect);
+ if (extra_trace_bits && !default_collect.empty ())
+ fp.printf ("set default-collect %s\n", default_collect.c_str ());
if (from_tty)
printf_filtered (_("Saved to file '%s'.\n"), expanded_filename.get ());
update_dprintf_commands, NULL,
&setlist, &showlist);
- dprintf_function = xstrdup ("printf");
add_setshow_string_cmd ("dprintf-function", class_support,
&dprintf_function, _("\
Set the function to use for dynamic printf."), _("\
update_dprintf_commands, NULL,
&setlist, &showlist);
- dprintf_channel = xstrdup ("");
add_setshow_string_cmd ("dprintf-channel", class_support,
&dprintf_channel, _("\
Set the channel to use for dynamic printf."), _("\
cause "/.build-id/..." lookups. */
std::vector<gdb::unique_xmalloc_ptr<char>> debugdir_vec
- = dirnames_to_char_ptr_vec (debug_file_directory);
+ = dirnames_to_char_ptr_vec (debug_file_directory.c_str ());
for (const gdb::unique_xmalloc_ptr<char> &debugdir : debugdir_vec)
{
Don't do it if the sysroot is the target system ("target:"). It
could work in theory, but the lrealpath in build_id_to_debug_bfd_1
only works with local paths. */
- if (strcmp (gdb_sysroot, TARGET_SYSROOT_PREFIX) != 0)
+ if (gdb_sysroot != TARGET_SYSROOT_PREFIX)
{
link = gdb_sysroot + link;
debug_bfd = build_id_to_debug_bfd_1 (link, build_id_len, build_id);
/* Search for and open 'file' on the search path used for source
files. Put the full location in *FULL_PATHP. */
gdb::unique_xmalloc_ptr<char> full_path;
- fd = openp (source_path, search_flags,
+ fd = openp (source_path.c_str (), search_flags,
file.get (), O_RDONLY, &full_path);
if (fd == -1)
struct pipe_cmd_opts
{
/* For "-d". */
- char *delimiter = nullptr;
-
- ~pipe_cmd_opts ()
- {
- xfree (delimiter);
- }
+ std::string delimiter;
};
static const gdb::option::option_def pipe_cmd_option_defs[] = {
(&arg, gdb::option::PROCESS_OPTIONS_UNKNOWN_IS_OPERAND, grp);
const char *delim = "|";
- if (opts.delimiter != nullptr)
- delim = opts.delimiter;
+ if (!opts.delimiter.empty ())
+ delim = opts.delimiter.c_str ();
const char *command = arg;
if (command == nullptr)
return;
const char *delimiter = "|";
- if (opts.delimiter != nullptr)
- delimiter = opts.delimiter;
+ if (!opts.delimiter.empty ())
+ delimiter = opts.delimiter.c_str ();
/* Check if we're past option values already. */
if (text > org_text && !isspace (text[-1]))
case var_enum:
{
const char *value;
+ size_t len;
if (var.type () == var_enum)
- value = var.get<const char *> ();
+ {
+ value = var.get<const char *> ();
+ len = strlen (value);
+ }
else
- value = var.get<char *> ();
+ {
+ const std::string &st = var.get<std::string> ();
+ value = st.c_str ();
+ len = st.length ();
+ }
- if (value != nullptr)
- return value_cstring (value, strlen (value),
+ if (len > 0)
+ return value_cstring (value, len,
builtin_type (gdbarch)->builtin_char);
else
return value_cstring ("", 1,
similarly to the value_from_setting code for these casevar. */
{
const char *value;
+ size_t len;
if (var.type () == var_enum)
- value = var.get<const char *> ();
+ {
+ value = var.get<const char *> ();
+ len = strlen (value);
+ }
else
- value = var.get<char *> ();
+ {
+ const std::string &st = var.get<std::string> ();
+ value = st.c_str ();
+ len = st.length ();
+ }
- if (value != nullptr)
- return value_cstring (value, strlen (value),
+ if (len > 0)
+ return value_cstring (value, len,
builtin_type (gdbarch)->builtin_char);
else
return value_cstring ("", 1,
set_show_commands
add_setshow_filename_cmd (const char *name, enum command_class theclass,
- char **var,
+ std::string *var,
const char *set_doc, const char *show_doc,
const char *help_doc,
cmd_func_ftype *set_func,
struct cmd_list_element **show_list)
{
set_show_commands commands
- = add_setshow_cmd_full<char *> (name, theclass, var_filename, var,
- set_doc, show_doc, help_doc,
- set_func, show_func,
- set_list, show_list);
+ = add_setshow_cmd_full<std::string> (name, theclass, var_filename, var,
+ set_doc, show_doc, help_doc,
+ set_func, show_func,
+ set_list, show_list);
set_cmd_completer (commands.set, filename_completer);
set_show_commands
add_setshow_string_cmd (const char *name, enum command_class theclass,
- char **var,
+ std::string *var,
const char *set_doc, const char *show_doc,
const char *help_doc,
cmd_func_ftype *set_func,
struct cmd_list_element **show_list)
{
set_show_commands commands
- = add_setshow_cmd_full<char *> (name, theclass, var_string, var,
- set_doc, show_doc, help_doc,
- set_func, show_func,
- set_list, show_list);
+ = add_setshow_cmd_full<std::string> (name, theclass, var_string, var,
+ set_doc, show_doc, help_doc,
+ set_func, show_func,
+ set_list, show_list);
/* Disable the default symbol completer. */
set_cmd_completer (commands.set, nullptr);
set_show_commands
add_setshow_string_noescape_cmd (const char *name, enum command_class theclass,
- char **var,
+ std::string *var,
const char *set_doc, const char *show_doc,
const char *help_doc,
cmd_func_ftype *set_func,
struct cmd_list_element **show_list)
{
set_show_commands commands
- = add_setshow_cmd_full<char *> (name, theclass, var_string_noescape, var,
- set_doc, show_doc, help_doc, set_func,
- show_func, set_list, show_list);
+ = add_setshow_cmd_full<std::string> (name, theclass, var_string_noescape,
+ var, set_doc, show_doc, help_doc,
+ set_func, show_func, set_list,
+ show_list);
/* Disable the default symbol completer. */
set_cmd_completer (commands.set, nullptr);
set_show_commands
add_setshow_optional_filename_cmd (const char *name, enum command_class theclass,
- char **var,
+ std::string *var,
const char *set_doc, const char *show_doc,
const char *help_doc,
cmd_func_ftype *set_func,
struct cmd_list_element **show_list)
{
set_show_commands commands
- = add_setshow_cmd_full<char *> (name, theclass, var_optional_filename,
- var, set_doc, show_doc, help_doc,
- set_func, show_func, set_list, show_list);
+ = add_setshow_cmd_full<std::string> (name, theclass, var_optional_filename,
+ var, set_doc, show_doc, help_doc,
+ set_func, show_func, set_list,
+ show_list);
set_cmd_completer (commands.set, filename_completer);
static char *saved_filename;
-static char *logging_filename;
+static std::string logging_filename = "gdb.txt";
static void
show_logging_filename (struct ui_file *file, int from_tty,
struct cmd_list_element *c, const char *value)
}
stdio_file_up log (new no_terminal_escape_file ());
- if (!log->open (logging_filename, logging_overwrite ? "w" : "a"))
+ if (!log->open (logging_filename.c_str (), logging_overwrite ? "w" : "a"))
perror_with_name (_("set logging"));
/* Redirects everything to gdb_stdout while this is running. */
{
if (!logging_redirect)
fprintf_unfiltered (gdb_stdout, "Copying output to %s.\n",
- logging_filename);
+ logging_filename.c_str ());
else
fprintf_unfiltered (gdb_stdout, "Redirecting output to %s.\n",
- logging_filename);
+ logging_filename.c_str ());
if (!debug_redirect)
fprintf_unfiltered (gdb_stdout, "Copying debug output to %s.\n",
- logging_filename);
+ logging_filename.c_str ());
else
fprintf_unfiltered (gdb_stdout, "Redirecting debug output to %s.\n",
- logging_filename);
+ logging_filename.c_str ());
}
- saved_filename = xstrdup (logging_filename);
+ saved_filename = xstrdup (logging_filename.c_str ());
/* Let the interpreter do anything it needs. */
current_interp_set_logging (std::move (log), logging_redirect,
const char *rest = args;
if (rest && *rest)
- {
- xfree (logging_filename);
- logging_filename = xstrdup (rest);
- }
+ logging_filename = rest;
+
handle_redirections (from_tty);
}
set_logging_redirect,
show_logging_redirect,
&set_logging_cmdlist, &show_logging_cmdlist);
+
add_setshow_filename_cmd ("file", class_support, &logging_filename, _("\
Set the current logfile."), _("\
Show the current logfile."), _("\
_("Enable logging."), &set_logging_cmdlist);
add_cmd ("off", class_support, set_logging_off,
_("Disable logging."), &set_logging_cmdlist);
-
- logging_filename = xstrdup ("gdb.txt");
}
const char *enumeration;
/* For var_string options. This is malloc-allocated. */
- char *string;
+ std::string *string;
};
/* Holds an options definition and its value. */
if (value.has_value ())
{
if (option.type == var_string)
- xfree (value->string);
+ delete value->string;
}
}
error (_("-%s requires an argument"), match->name);
option_value val;
- val.string = xstrdup (str.c_str ());
+ val.string = new std::string (std::move (str));
return option_def_and_value {*match, match_ctx, val};
}
break;
case var_string:
*ov->option.var_address.string (ov->option, ov->ctx)
- = ov->value->string;
- ov->value->string = nullptr;
+ = std::move (*ov->value->string);
break;
default:
gdb_assert_not_reached ("unhandled option type");
unsigned int *(*uinteger) (const option_def &, void *ctx);
int *(*integer) (const option_def &, void *ctx);
const char **(*enumeration) (const option_def &, void *ctx);
- char **(*string) (const option_def &, void *ctx);
+ std::string *(*string) (const option_def &, void *ctx);
}
var_address;
struct string_option_def : option_def
{
string_option_def (const char *long_option_,
- char **(*get_var_address_cb_) (Context *),
+ std::string *(*get_var_address_cb_) (Context *),
show_value_ftype *show_cmd_cb_,
const char *set_doc_,
const char *show_doc_ = nullptr,
*q++ = '\0';
newobj = (char *) xrealloc (newobj, q - newobj);
- char * const var = c->var->get<char *> ();
- if (var == nullptr
- || strcmp (var, newobj) != 0)
+ const std::string &cur_val = c->var->get<std::string> ();
+ if (strcmp (cur_val.c_str(), newobj) != 0)
{
- xfree (var);
- c->var->set<char *> (newobj);
+ c->var->set<std::string> (std::string (newobj));
option_changed = true;
}
- else
- xfree (newobj);
+ xfree (newobj);
}
break;
case var_string_noescape:
{
- char * const var = c->var->get<char *> ();
- if (var == nullptr
- || strcmp (var, arg) != 0)
+ const std::string &cur_val = c->var->get<std::string> ();
+ if (strcmp (cur_val.c_str (), arg) != 0)
{
- xfree (var);
- c->var->set<char *> (xstrdup (arg));
+ c->var->set<std::string> (std::string (arg));
option_changed = true;
}
else
val = xstrdup ("");
- char * const var = c->var->get<char *> ();
- if (var == nullptr
- || strcmp (var, val) != 0)
+ const std::string &cur_val = c->var->get<std::string> ();
+ if (strcmp (cur_val.c_str (), val) != 0)
{
- xfree (var);
- c->var->set<char *> (val);
+ c->var->set<std::string> (std::string (val));
option_changed = true;
}
- else
- xfree (val);
+ xfree (val);
}
break;
case var_boolean:
case var_string_noescape:
case var_filename:
case var_optional_filename:
+ gdb::observers::command_param_changed.notify
+ (name, c->var->get<std::string> ().c_str ());
+ break;
case var_enum:
- {
- const char *var;
- if (c->var->type () == var_enum)
- var = c->var->get<const char *> ();
- else
- var = c->var->get<char *> ();
- gdb::observers::command_param_changed.notify (name, var);
- }
+ gdb::observers::command_param_changed.notify
+ (name, c->var->get<const char *> ());
break;
case var_boolean:
{
{
case var_string:
{
- char *value = var.get<char *> ();
-
- if (value != nullptr)
- stb.putstr (value, '"');
+ std::string value = var.get<std::string> ();
+ if (!value.empty ())
+ stb.putstr (value.c_str (), '"');
}
break;
case var_string_noescape:
case var_optional_filename:
case var_filename:
+ stb.puts (var.get<std::string> ().c_str ());
+ break;
case var_enum:
{
- const char *value;
- if (var.type () == var_enum)
- value = var.get<const char *> ();
- else
- value = var.get<char *> ();
-
+ const char *value = var.get<const char *> ();
if (value != nullptr)
stb.puts (value);
}
/* String which the user enters with escapes (e.g. the user types
\n and it is a real newline in the stored string).
- *VAR is a malloc'd string, or NULL if the string is empty. */
+ *VAR is a std::string, "" if the string is empty. */
var_string,
/* String which stores what the user types verbatim.
- *VAR is a malloc'd string, or NULL if the string is empty. */
+ *VAR is std::string, "" if the string is empty. */
var_string_noescape,
- /* String which stores a filename. (*VAR) is a malloc'd string,
- or "" if the string was empty. */
+ /* String which stores a filename. (*VAR) is a std::string,
+ "" if the string was empty. */
var_optional_filename,
- /* String which stores a filename. (*VAR) is a malloc'd
- string. */
+ /* String which stores a filename. (*VAR) is a std::string. */
var_filename,
/* ZeroableInteger. *VAR is an int. Like var_integer except
that zero really means zero. */
|| t == var_zuinteger_unlimited);
}
-/* Return true if a setting of type T is backed by a char * variable. */
+/* Return true if a setting of type T is backed by a std::string variable. */
template<>
-inline bool var_type_uses<char *> (var_types t)
+inline bool var_type_uses<std::string> (var_types t)
{
return (t == var_string || t == var_string_noescape
|| t == var_optional_filename || t == var_filename);
cmd_list_element **show_list);
extern set_show_commands add_setshow_filename_cmd
- (const char *name, command_class theclass, char **var, const char *set_doc,
+ (const char *name, command_class theclass, std::string *var, const char *set_doc,
const char *show_doc, const char *help_doc, cmd_func_ftype *set_func,
show_value_ftype *show_func, cmd_list_element **set_list,
cmd_list_element **show_list);
extern set_show_commands add_setshow_string_cmd
- (const char *name, command_class theclass, char **var, const char *set_doc,
+ (const char *name, command_class theclass, std::string *var, const char *set_doc,
const char *show_doc, const char *help_doc, cmd_func_ftype *set_func,
show_value_ftype *show_func, cmd_list_element **set_list,
cmd_list_element **show_list);
extern set_show_commands add_setshow_string_noescape_cmd
- (const char *name, command_class theclass, char **var, const char *set_doc,
+ (const char *name, command_class theclass, std::string *var, const char *set_doc,
const char *show_doc, const char *help_doc, cmd_func_ftype *set_func,
show_value_ftype *show_func, cmd_list_element **set_list,
cmd_list_element **show_list);
extern set_show_commands add_setshow_optional_filename_cmd
- (const char *name, command_class theclass, char **var, const char *set_doc,
+ (const char *name, command_class theclass, std::string *var, const char *set_doc,
const char *show_doc, const char *help_doc, cmd_func_ftype *set_func,
show_value_ftype *show_func, cmd_list_element **set_list,
cmd_list_element **show_list);
}
/* String for 'set compile-args' and 'show compile-args'. */
-static char *compile_args;
+static std::string compile_args =
+ /* Override flags possibly coming from DW_AT_producer. */
+ "-O0 -gdwarf-4"
+ /* We use -fPIE Otherwise GDB would need to reserve space large enough for
+ any object file in the inferior in advance to get the final address when
+ to link the object file to and additionally the default system linker
+ script would need to be modified so that one can specify there the
+ absolute target address.
+ -fPIC is not used at is would require from GDB to generate .got. */
+ " -fPIE"
+ /* We want warnings, except for some commonly happening for GDB commands. */
+ " -Wall "
+ " -Wno-unused-but-set-variable"
+ " -Wno-unused-variable"
+ /* Override CU's possible -fstack-protector-strong. */
+ " -fno-stack-protector";
/* Parsed form of COMPILE_ARGS. */
static gdb_argv compile_args_argv;
static void
set_compile_args (const char *args, int from_tty, struct cmd_list_element *c)
{
- compile_args_argv = gdb_argv (compile_args);
+ compile_args_argv = gdb_argv (compile_args.c_str ());
}
/* Implement 'show compile-args'. */
}
/* String for 'set compile-gcc' and 'show compile-gcc'. */
-static char *compile_gcc;
+static std::string compile_gcc;
/* Implement 'show compile-gcc'. */
compiler->set_verbose (compile_debug);
- if (compile_gcc[0] != 0)
+ if (!compile_gcc.empty ())
{
if (compiler->version () < GCC_FE_VERSION_1)
error (_("Command 'set compile-gcc' requires GCC version 6 or higher "
"(libcc1 interface version 1 or higher)"));
- compiler->set_driver_filename (compile_gcc);
+ compiler->set_driver_filename (compile_gcc.c_str ());
}
else
{
-mno-align-double \"-I/dir with a space/include\""),
set_compile_args, show_compile_args, &setlist, &showlist);
- /* Override flags possibly coming from DW_AT_producer. */
- compile_args = xstrdup ("-O0 -gdwarf-4"
- /* We use -fPIE Otherwise GDB would need to reserve space large enough for
- any object file in the inferior in advance to get the final address when
- to link the object file to and additionally the default system linker
- script would need to be modified so that one can specify there the
- absolute target address.
- -fPIC is not used at is would require from GDB to generate .got. */
- " -fPIE"
- /* We want warnings, except for some commonly happening for GDB commands. */
- " -Wall "
- " -Wno-unused-but-set-variable"
- " -Wno-unused-variable"
- /* Override CU's possible -fstack-protector-strong. */
- " -fno-stack-protector"
- );
- set_compile_args (compile_args, 0, NULL);
+
+ /* Initialize compile_args_argv. */
+ set_compile_args (compile_args.c_str (), 0, NULL);
add_setshow_optional_filename_cmd ("compile-gcc", class_support,
&compile_gcc,
If empty the default target triplet will be searched in $PATH."),
NULL, show_compile_gcc, &setlist,
&showlist);
- compile_gcc = xstrdup ("");
}
const char *gnutarget;
/* Same thing, except it is "auto" not NULL for the default case. */
-static char *gnutarget_string;
+static std::string gnutarget_string;
static void
show_gnutarget_string (struct ui_file *file, int from_tty,
struct cmd_list_element *c,
set_gnutarget_command (const char *ignore, int from_tty,
struct cmd_list_element *c)
{
- char *gend = gnutarget_string + strlen (gnutarget_string);
+ const char *gend = gnutarget_string.c_str () + gnutarget_string.size ();
+ gend = remove_trailing_whitespace (gnutarget_string.c_str (), gend);
+ gnutarget_string
+ = gnutarget_string.substr (0, gend - gnutarget_string.data ());
- gend = remove_trailing_whitespace (gnutarget_string, gend);
- *gend = '\0';
-
- if (strcmp (gnutarget_string, "auto") == 0)
+ if (gnutarget_string == "auto")
gnutarget = NULL;
else
- gnutarget = gnutarget_string;
+ gnutarget = gnutarget_string.c_str ();
}
/* A completion function for "set gnutarget". */
void
set_gnutarget (const char *newtarget)
{
- xfree (gnutarget_string);
- gnutarget_string = xstrdup (newtarget);
+ gnutarget_string = newtarget;
set_gnutarget_command (NULL, 0, NULL);
}
extern int dbx_commands;
/* * System root path, used to find libraries etc. */
-extern char *gdb_sysroot;
+extern std::string gdb_sysroot;
/* * GDB datadir, used to store data files. */
extern std::string gdb_datadir;
extern std::string python_libdir;
/* * Search path for separate debug files. */
-extern char *debug_file_directory;
+extern std::string debug_file_directory;
/* GDB's SIGINT handler basically sets a flag; code that might take a
long time before it gets back to the event loop, and which ought to
/* This variable is used to hold the prospective disassembler_options value
which is set by the "set disassembler_options" command. */
-static char *prospective_options = NULL;
+static std::string prospective_options;
/* This structure is used to store line number information for the
deprecated /m option.
}
void
-set_disassembler_options (char *prospective_options)
+set_disassembler_options (const char *prospective_options)
{
struct gdbarch *gdbarch = get_current_arch ();
char **disassembler_options = gdbarch_disassembler_options (gdbarch);
const disasm_options_and_args_t *valid_options_and_args;
const disasm_options_t *valid_options;
- char *options = remove_whitespace_and_extra_commas (prospective_options);
+ gdb::unique_xmalloc_ptr<char> prospective_options_local
+ = make_unique_xstrdup (prospective_options);
+ char *options = remove_whitespace_and_extra_commas
+ (prospective_options_local.get ());
const char *opt;
/* Allow all architectures, even ones that do not support 'set disassembler',
set_disassembler_options_sfunc (const char *args, int from_tty,
struct cmd_list_element *c)
{
- set_disassembler_options (prospective_options);
+ set_disassembler_options (prospective_options.c_str ());
}
static void
/* Sets the active gdbarch's disassembler options to OPTIONS. */
-extern void set_disassembler_options (char *options);
+extern void set_disassembler_options (const char *options);
#endif
gdb_bfd_ref_ptr dwz_bfd;
std::vector<gdb::unique_xmalloc_ptr<char>> debugdir_vec
- = dirnames_to_char_ptr_vec (debug_file_directory);
+ = dirnames_to_char_ptr_vec (debug_file_directory.c_str ());
for (const gdb::unique_xmalloc_ptr<char> &debugdir : debugdir_vec)
{
static bool debug_index_cache = false;
/* The index cache directory, used for "set/show index-cache directory". */
-static char *index_cache_directory = NULL;
+static std::string index_cache_directory;
/* See dwarf-index.cache.h. */
index_cache global_index_cache;
cmd_list_element *element)
{
/* Make sure the index cache directory is absolute and tilde-expanded. */
- gdb::unique_xmalloc_ptr<char> abs (gdb_abspath (index_cache_directory));
- xfree (index_cache_directory);
- index_cache_directory = abs.release ();
+ gdb::unique_xmalloc_ptr<char> abs
+ = gdb_abspath (index_cache_directory.c_str ());
+ index_cache_directory = abs.get ();
global_index_cache.set_directory (index_cache_directory);
}
std::string cache_dir = get_standard_cache_dir ();
if (!cache_dir.empty ())
{
- index_cache_directory = xstrdup (cache_dir.c_str ());
+ index_cache_directory = cache_dir;
global_index_cache.set_directory (std::move (cache_dir));
}
else
gdb::unique_xmalloc_ptr<char> search_path_holder;
if (search_cwd)
{
- if (*debug_file_directory != '\0')
+ if (!debug_file_directory.empty ())
{
search_path_holder.reset (concat (".", dirname_separator_string,
- debug_file_directory,
+ debug_file_directory.c_str (),
(char *) NULL));
search_path = search_path_holder.get ();
}
search_path = ".";
}
else
- search_path = debug_file_directory;
+ search_path = debug_file_directory.c_str ();
/* Add the path for the executable binary to the list of search paths. */
std::string objfile_dir = ldirname (objfile_name (per_objfile->objfile));
/* That didn't work, try debug-file-directory, which, despite its name,
is a list of paths. */
- if (*debug_file_directory == '\0')
+ if (debug_file_directory.empty ())
return NULL;
return try_open_dwop_file (per_objfile, file_name,
[IWBN if the dwp file name was recorded in the executable, akin to
.gnu_debuglink, but that doesn't exist yet.]
Strip the directory from FILE_NAME and search again. */
- if (*debug_file_directory != '\0')
+ if (!debug_file_directory.empty ())
{
/* Don't implicitly search the current directory here.
If the user wants to search "." to handle this case,
static std::string
top_level_prompt (void)
{
- char *prompt;
-
/* Give observers a chance of changing the prompt. E.g., the python
`gdb.prompt_hook' is installed as an observer. */
- gdb::observers::before_prompt.notify (get_prompt ());
+ gdb::observers::before_prompt.notify (get_prompt ().c_str ());
- prompt = get_prompt ();
+ const std::string &prompt = get_prompt ();
if (annotation_level >= 2)
{
beginning. */
const char suffix[] = "\n\032\032prompt\n";
- return std::string (prefix) + prompt + suffix;
+ return std::string (prefix) + prompt.c_str () + suffix;
}
return prompt;
static void
async_sigtstp_handler (gdb_client_data arg)
{
- char *prompt = get_prompt ();
+ const std::string &prompt = get_prompt ();
signal (SIGTSTP, SIG_DFL);
unblock_signal (SIGTSTP);
raise (SIGTSTP);
signal (SIGTSTP, handle_sigtstp);
- printf_unfiltered ("%s", prompt);
+ printf_unfiltered ("%s", prompt.c_str ());
gdb_flush (gdb_stdout);
/* Forget about any previous command -- null line now will do
/* The exec-wrapper, if any, that will be used when starting the
inferior. */
-static char *exec_wrapper = NULL;
+static std::string exec_wrapper;
/* See gdbsupport/common-inferior.h. */
const char *
get_exec_wrapper ()
{
- return exec_wrapper;
+ return !exec_wrapper.empty () ? exec_wrapper.c_str () : nullptr;
}
/* See nat/fork-inferior.h. */
static void
unset_exec_wrapper_command (const char *args, int from_tty)
{
- xfree (exec_wrapper);
- exec_wrapper = NULL;
+ exec_wrapper.clear ();
}
static void
unsigned int uintval;
/* Hold a string, for the various string types. */
- char *stringval;
+ std::string *stringval;
/* Hold a string, for enums. */
const char *cstringval;
2) Call register-parameter! to add the parameter to gdb.
It is done this way so that the constructor, make-parameter, doesn't have
any side-effects. This means that the smob needs to store everything
- that was passed to make-parameter.
-
- N.B. There is no free function for this smob.
- All objects pointed to by this smob must live in GC space. */
+ that was passed to make-parameter. */
struct param_smob
{
static setting
make_setting (param_smob *s)
{
-
if (var_type_uses<bool> (s->type))
return setting (s->type, &s->value.boolval);
else if (var_type_uses<int> (s->type))
return setting (s->type, &s->value.autoboolval);
else if (var_type_uses<unsigned int> (s->type))
return setting (s->type, &s->value.uintval);
- else if (var_type_uses<char *> (s->type))
- return setting (s->type, &s->value.stringval);
+ else if (var_type_uses<std::string> (s->type))
+ return setting (s->type, s->value.stringval);
else if (var_type_uses<const char *> (s->type))
return setting (s->type, &s->value.cstringval);
else
case var_string:
commands = add_setshow_string_cmd (cmd_name, cmd_class,
- &self->value.stringval, set_doc,
+ self->value.stringval, set_doc,
show_doc, help_doc, set_func,
show_func, set_list, show_list);
break;
case var_string_noescape:
commands = add_setshow_string_noescape_cmd (cmd_name, cmd_class,
- &self->value.stringval,
+ self->value.stringval,
set_doc, show_doc, help_doc,
set_func, show_func, set_list,
show_list);
case var_optional_filename:
commands = add_setshow_optional_filename_cmd (cmd_name, cmd_class,
- &self->value.stringval,
+ self->value.stringval,
set_doc, show_doc, help_doc,
set_func, show_func,
set_list, show_list);
case var_filename:
commands = add_setshow_filename_cmd (cmd_name, cmd_class,
- &self->value.stringval, set_doc,
+ self->value.stringval, set_doc,
show_doc, help_doc, set_func,
show_func, set_list, show_list);
break;
case var_string_noescape:
case var_optional_filename:
case var_filename:
- case var_enum:
{
- const char *str;
- if (var.type () == var_enum)
- str = var.get<const char *> ();
- else
- str = var.get<char *> ();
+ const std::string &str = var.get<std::string> ();
+ return gdbscm_scm_from_host_string (str.c_str (), str.length ());
+ }
+ case var_enum:
+ {
+ const char *str = var.get<const char *> ();
if (str == nullptr)
str = "";
return gdbscm_scm_from_host_string (str, strlen (str));
value, arg_pos, func_name,
_("string or #f for non-PARAM_FILENAME parameters"));
if (gdbscm_is_false (value))
- {
- xfree (var.get<char *> ());
- if (var.type () == var_optional_filename)
- var.set<char *> (xstrdup (""));
- else
- var.set<char *> (nullptr);
- }
+ var.set<std::string> ("");
else
{
SCM exception;
= gdbscm_scm_to_host_string (value, nullptr, &exception);
if (string == nullptr)
gdbscm_throw (exception);
- xfree (var.get<char *> ());
- var.set<char *> (string.release ());
+ var.set<std::string> (string.release ());
}
break;
gdb_assert_not_reached ("bad parameter type");
}
}
+
+/* Free function for a param_smob. */
+static size_t
+pascm_free_parameter_smob (SCM self)
+{
+ param_smob *p_smob = (param_smob *) SCM_SMOB_DATA (self);
+
+ if (var_type_uses<std::string> (p_smob->type))
+ {
+ delete p_smob->value.stringval;
+ p_smob->value.stringval = nullptr;
+ }
+
+ return 0;
+}
\f
/* Parameter Scheme functions. */
p_smob->set_func = set_func;
p_smob->show_func = show_func;
+ scm_set_smob_free (parameter_smob_tag, pascm_free_parameter_smob);
+ if (var_type_uses<std::string> (p_smob->type))
+ p_smob->value.stringval = new std::string;
+
if (initial_value_arg_pos > 0)
{
if (gdbscm_is_procedure (initial_value_scm))
Arguments are separated by spaces. Empty string (pointer to '\0')
means no args. */
-static char *inferior_args_scratch;
+static std::string inferior_args_scratch;
/* Scratch area where the new cwd will be stored by 'set cwd'. */
-static char *inferior_cwd_scratch;
+static std::string inferior_cwd_scratch;
/* Scratch area where 'set inferior-tty' will store user-provided value.
We'll immediate copy it into per-inferior storage. */
-static char *inferior_io_terminal_scratch;
+static std::string inferior_io_terminal_scratch;
/* Pid of our debugged inferior, or 0 if no inferior now.
Since various parts of infrun.c test this to see whether there is a program
static void
path_command (const char *dirname, int from_tty)
{
- char *exec_path;
const char *env;
dont_repeat ();
/* Can be null if path is not set. */
if (!env)
env = "";
- exec_path = xstrdup (env);
- mod_path (dirname, &exec_path);
- current_inferior ()->environment.set (path_var_name, exec_path);
- xfree (exec_path);
+ std::string exec_path = env;
+ mod_path (dirname, exec_path);
+ current_inferior ()->environment.set (path_var_name, exec_path.c_str ());
if (from_tty)
path_info (NULL, from_tty);
}
gdb::byte_vector thread_info_to_thread_handle (struct thread_info *) override;
};
-static char *libthread_db_search_path;
+static std::string libthread_db_search_path = LIBTHREAD_DB_SEARCH_PATH;
/* Set to true if thread_db auto-loading is enabled
by the "set auto-load libthread-db" command. */
set_libthread_db_search_path (const char *ignored, int from_tty,
struct cmd_list_element *c)
{
- if (*libthread_db_search_path == '\0')
- {
- xfree (libthread_db_search_path);
- libthread_db_search_path = xstrdup (LIBTHREAD_DB_SEARCH_PATH);
- }
+ if (libthread_db_search_path.empty ())
+ libthread_db_search_path = LIBTHREAD_DB_SEARCH_PATH;
}
/* If non-zero, print details of libthread_db processing. */
printf_unfiltered (_("[Thread debugging using libthread_db enabled]\n"));
- if (*libthread_db_search_path || libthread_db_debug)
+ if (!libthread_db_search_path.empty () || libthread_db_debug)
{
struct ui_file *file;
const char *library;
disabled, still print it to gdb_stdout if debug output is
enabled. User visible output should not depend on debug
settings. */
- file = *libthread_db_search_path != '\0' ? gdb_stdout : gdb_stdlog;
+ file = !libthread_db_search_path.empty () ? gdb_stdout : gdb_stdlog;
fprintf_unfiltered (file,
_("Using host libthread_db library \"%ps\".\n"),
styled_string (file_name_style.style (), library));
bool rc = false;
std::vector<gdb::unique_xmalloc_ptr<char>> dir_vec
- = dirnames_to_char_ptr_vec (libthread_db_search_path);
+ = dirnames_to_char_ptr_vec (libthread_db_search_path.c_str ());
for (const gdb::unique_xmalloc_ptr<char> &this_dir_up : dir_vec)
{
and until there is a running inferior, we can't tell which
libthread_db is the correct one to load. */
- libthread_db_search_path = xstrdup (LIBTHREAD_DB_SEARCH_PATH);
-
add_setshow_optional_filename_cmd ("libthread-db-search-path",
class_support,
&libthread_db_search_path, _("\
int dbx_commands = 0;
/* System root path, used to find libraries etc. */
-char *gdb_sysroot = 0;
+std::string gdb_sysroot;
/* GDB datadir, used to store data files. */
std::string gdb_datadir;
perror_warning_with_name (_("error finding working directory"));
/* Set the sysroot path. */
- gdb_sysroot
- = xstrdup (relocate_gdb_directory (TARGET_SYSTEM_ROOT,
- TARGET_SYSTEM_ROOT_RELOCATABLE).c_str ());
+ gdb_sysroot = relocate_gdb_directory (TARGET_SYSTEM_ROOT,
+ TARGET_SYSTEM_ROOT_RELOCATABLE);
- if (*gdb_sysroot == '\0')
- {
- xfree (gdb_sysroot);
- gdb_sysroot = xstrdup (TARGET_SYSROOT_PREFIX);
- }
+ if (gdb_sysroot.empty ())
+ gdb_sysroot = TARGET_SYSROOT_PREFIX;
debug_file_directory
- = xstrdup (relocate_gdb_directory (DEBUGDIR,
- DEBUGDIR_RELOCATABLE).c_str ());
+ = relocate_gdb_directory (DEBUGDIR, DEBUGDIR_RELOCATABLE);
gdb_datadir = relocate_gdb_directory (GDB_DATADIR,
GDB_DATADIR_RELOCATABLE);
const char *enum_opt = test_options_enum_values_xxx;
unsigned int uint_opt = 0;
int zuint_unl_opt = 0;
- char *string_opt = nullptr;
+ std::string string_opt;
test_options_opts () = default;
DISABLE_COPY_AND_ASSIGN (test_options_opts);
- ~test_options_opts ()
- {
- xfree (string_opt);
- }
-
/* Dump the options to FILE. ARGS is the remainder unprocessed
arguments. */
void dump (ui_file *file, const char *args) const
(zuint_unl_opt == -1
? "unlimited"
: plongest (zuint_unl_opt)),
- (string_opt != nullptr
- ? string_opt
- : ""),
+ string_opt.c_str (),
args);
}
};
static int maintenance_test_settings_zuinteger_unlimited;
-static char *maintenance_test_settings_string;
+static std::string maintenance_test_settings_string;
-static char *maintenance_test_settings_string_noescape;
+static std::string maintenance_test_settings_string_noescape;
-static char *maintenance_test_settings_optional_filename;
+static std::string maintenance_test_settings_optional_filename;
-static char *maintenance_test_settings_filename;
+static std::string maintenance_test_settings_filename;
/* Enum values for the "maintenance set/show test-settings boolean"
commands. */
}
static void
-env_mod_path (const char *dirname, char **which_path)
+env_mod_path (const char *dirname, std::string &which_path)
{
if (dirname == 0 || dirname[0] == '\0')
return;
mi_cmd_env_path (const char *command, char **argv, int argc)
{
struct ui_out *uiout = current_uiout;
- char *exec_path;
const char *env;
int reset = 0;
int oind = 0;
argv += oind;
argc -= oind;
-
+ std::string exec_path;
if (reset)
{
/* Reset implies resetting to original path first. */
- exec_path = xstrdup (orig_path);
+ exec_path = orig_path;
}
else
{
/* Can be null if path is not set. */
if (!env)
env = "";
- exec_path = xstrdup (env);
+
+ exec_path = env;
}
for (i = argc - 1; i >= 0; --i)
- env_mod_path (argv[i], &exec_path);
+ env_mod_path (argv[i], exec_path);
- current_inferior ()->environment.set (path_var_name, exec_path);
- xfree (exec_path);
+ current_inferior ()->environment.set (path_var_name, exec_path.c_str ());
env = current_inferior ()->environment.get (path_var_name);
uiout->field_string ("path", env);
}
if (reset)
{
/* Reset means setting to default path first. */
- xfree (source_path);
init_source_path ();
}
for (i = argc - 1; i >= 0; --i)
- env_mod_path (argv[i], &source_path);
+ env_mod_path (argv[i], source_path);
uiout->field_string ("source-path", source_path);
forget_cached_source_info ();
static bool procfs_trace = false;
static FILE *procfs_file = NULL;
-static char *procfs_filename;
+static std::string procfs_filename = "procfs_trace";
static void
prepare_to_trace (void)
{
if (procfs_trace) /* if procfs tracing turned on */
if (procfs_file == NULL) /* if output file not yet open */
- procfs_file = fopen (procfs_filename, "a"); /* open output file */
+ procfs_file = fopen (procfs_filename.c_str (), "a"); /* open output file */
}
static void
NULL, /* FIXME: i18n: */
&setlist, &showlist);
- procfs_filename = xstrdup ("procfs_trace");
add_setshow_filename_cmd ("procfs-file", no_class, &procfs_filename, _("\
Set filename for /proc tracefile."), _("\
Show filename for /proc tracefile."), NULL,
/* Hold an unsigned integer value, for uinteger. */
unsigned int uintval;
- /* Hold a string, for the various string types. */
- char *stringval;
+ /* Hold a string, for the various string types. The std::string is
+ new-ed. */
+ std::string *stringval;
/* Hold a string, for enums. */
const char *cstringval;
static setting
make_setting (parmpy_object *s)
{
-
if (var_type_uses<bool> (s->type))
return setting (s->type, &s->value.boolval);
else if (var_type_uses<int> (s->type))
return setting (s->type, &s->value.autoboolval);
else if (var_type_uses<unsigned int> (s->type))
return setting (s->type, &s->value.uintval);
- else if (var_type_uses<char *> (s->type))
- return setting (s->type, &s->value.stringval);
+ else if (var_type_uses<std::string> (s->type))
+ return setting (s->type, s->value.stringval);
else if (var_type_uses<const char *> (s->type))
return setting (s->type, &s->value.cstringval);
else
return -1;
}
if (value == Py_None)
- {
- xfree (self->value.stringval);
- if (self->type == var_optional_filename)
- self->value.stringval = xstrdup ("");
- else
- self->value.stringval = NULL;
- }
+ self->value.stringval->clear ();
else
{
gdb::unique_xmalloc_ptr<char>
if (string == NULL)
return -1;
- xfree (self->value.stringval);
- self->value.stringval = string.release ();
+ *self->value.stringval = string.get ();
}
break;
case var_string:
commands = add_setshow_string_cmd (cmd_name.get (), cmdclass,
- &self->value.stringval, set_doc,
+ self->value.stringval, set_doc,
show_doc, help_doc, get_set_value,
get_show_value, set_list, show_list);
break;
case var_string_noescape:
commands = add_setshow_string_noescape_cmd (cmd_name.get (), cmdclass,
- &self->value.stringval,
+ self->value.stringval,
set_doc, show_doc, help_doc,
get_set_value, get_show_value,
set_list, show_list);
case var_optional_filename:
commands = add_setshow_optional_filename_cmd (cmd_name.get (), cmdclass,
- &self->value.stringval,
+ self->value.stringval,
set_doc, show_doc, help_doc,
get_set_value,
get_show_value, set_list,
case var_filename:
commands = add_setshow_filename_cmd (cmd_name.get (), cmdclass,
- &self->value.stringval, set_doc,
+ self->value.stringval, set_doc,
show_doc, help_doc, get_set_value,
get_show_value, set_list, show_list);
break;
obj->type = (enum var_types) parmclass;
memset (&obj->value, 0, sizeof (obj->value));
+ if (var_type_uses<std::string> (obj->type))
+ obj->value.stringval = new std::string;
+
gdb::unique_xmalloc_ptr<char> cmd_name
= gdbpy_parse_command_name (name, &set_list, &setlist);
if (cmd_name == nullptr)
return 0;
}
-\f
+/* Deallocate function for a gdb.Parameter. */
+
+static void
+parmpy_dealloc (PyObject *obj)
+{
+ parmpy_object *parm_obj = (parmpy_object *) obj;
+
+ if (var_type_uses<std::string> (parm_obj->type))
+ delete parm_obj->value.stringval;
+}
/* Initialize the 'parameters' module. */
int
"gdb.Parameter", /*tp_name*/
sizeof (parmpy_object), /*tp_basicsize*/
0, /*tp_itemsize*/
- 0, /*tp_dealloc*/
+ parmpy_dealloc, /*tp_dealloc*/
0, /*tp_print*/
0, /*tp_getattr*/
0, /*tp_setattr*/
case var_enum:
{
const char *str;
- if (var.type () == var_enum)
- str = var.get<const char *> ();
- else
- str = var.get<char *> ();
+ if (var.type () == var_enum)
+ str = var.get<const char *> ();
+ else
+ str = var.get<std::string> ().c_str ();
- if (str == nullptr)
- str = "";
return host_string_to_python_string (str).release ();
}
int len;
char *arg_buf;
struct sim_inferior_data *sim_data;
- const char *sysroot;
SIM_DESC gdbsim_desc;
- sysroot = gdb_sysroot;
+ const std::string &sysroot = gdb_sysroot;
if (is_target_filename (sysroot))
sysroot += strlen (TARGET_SYSROOT_PREFIX);
len = (7 + 1 /* gdbsim */
+ strlen (" -E little")
+ strlen (" --architecture=xxxxxxxxxx")
- + strlen (" --sysroot=") + strlen (sysroot) +
+ + strlen (" --sysroot=") + sysroot.length () +
+ (args ? strlen (args) : 0)
+ 50) /* slack */ ;
arg_buf = (char *) alloca (len);
}
/* Pass along gdb's concept of the sysroot. */
strcat (arg_buf, " --sysroot=");
- strcat (arg_buf, sysroot);
+ strcat (arg_buf, sysroot.c_str ());
/* finally, any explicit args */
if (args)
{
remote exec-file commands. While the remote exec-file setting is
per-program-space, the set/show machinery uses this as the
location of the remote exec-file value. */
-static char *remote_exec_file_var;
+static std::string remote_exec_file_var;
/* The size to align memory write packets, when practical. The protocol
does not guarantee any alignment, and gdb will generate short
set_remote_exec_file (const char *ignored, int from_tty,
struct cmd_list_element *c)
{
- gdb_assert (remote_exec_file_var != NULL);
- set_pspace_remote_exec_file (current_program_space, remote_exec_file_var);
+ set_pspace_remote_exec_file (current_program_space,
+ remote_exec_file_var.c_str ());
}
/* The "set/show remote exec-file" show command hook. */
this case we treat the remote filesystem as local if the
sysroot is exactly TARGET_SYSROOT_PREFIX and if the stub
does not support vFile:open. */
- if (strcmp (gdb_sysroot, TARGET_SYSROOT_PREFIX) == 0)
+ if (gdb_sysroot == TARGET_SYSROOT_PREFIX)
{
enum packet_support ps = packet_support (PACKET_vFile_open);
"ignoring tp %d cond"), b->number);
}
- if (b->commands || *default_collect)
+ if (b->commands || !default_collect.empty ())
{
size_left = buf.size () - strlen (buf.data ());
/* Non-NULL gives filename which contains a recording of the remote session,
suitable for playback by gdbserver. */
-static char *serial_logfile = NULL;
+static std::string serial_logfile;
static struct ui_file *serial_logfp = NULL;
static const struct serial_ops *serial_interface_lookup (const char *);
scb->next = scb_base;
scb_base = scb;
- if (serial_logfile != NULL)
+ if (!serial_logfile.empty ())
{
stdio_file_up file (new stdio_file ());
- if (!file->open (serial_logfile, "w"))
- perror_with_name (serial_logfile);
+ if (!file->open (serial_logfile.c_str (), "w"))
+ perror_with_name (serial_logfile.c_str ());
serial_logfp = file.release ();
}
/* If non-empty, this is a search path for loading non-absolute shared library
symbol files. This takes precedence over the environment variables PATH
and LD_LIBRARY_PATH. */
-static char *solib_search_path = NULL;
+static std::string solib_search_path;
static void
show_solib_search_path (struct ui_file *file, int from_tty,
struct cmd_list_element *c, const char *value)
int found_file = -1;
gdb::unique_xmalloc_ptr<char> temp_pathname;
const char *fskind = effective_target_file_system_kind ();
- const char *sysroot = gdb_sysroot;
+ const char *sysroot = gdb_sysroot.c_str ();
int prefix_len, orig_prefix_len;
/* If the absolute prefix starts with "target:" but the filesystem
/* If not found, and we're looking for a solib, search the
solib_search_path (if any). */
- if (is_solib && found_file < 0 && solib_search_path != NULL)
- found_file = openp (solib_search_path,
+ if (is_solib && found_file < 0 && !solib_search_path.empty ())
+ found_file = openp (solib_search_path.c_str (),
OPF_TRY_CWD_FIRST | OPF_RETURN_REALPATH,
in_pathname, O_RDONLY | O_BINARY, &temp_pathname);
solib_search_path (if any) for the basename only (ignoring the
path). This is to allow reading solibs from a path that differs
from the opened path. */
- if (is_solib && found_file < 0 && solib_search_path != NULL)
- found_file = openp (solib_search_path,
+ if (is_solib && found_file < 0 && !solib_search_path.empty ())
+ found_file = openp (solib_search_path.c_str (),
OPF_TRY_CWD_FIRST | OPF_RETURN_REALPATH,
target_lbasename (fskind, in_pathname),
O_RDONLY | O_BINARY, &temp_pathname);
if (in_pathname == NULL)
return NULL;
- if (*gdb_sysroot != '\0' && IS_TARGET_ABSOLUTE_PATH (fskind, in_pathname))
+ if (!gdb_sysroot.empty () && IS_TARGET_ABSOLUTE_PATH (fskind, in_pathname))
{
result = solib_find_1 (in_pathname, fd, false);
const char *old_prefix = "remote:";
const char *new_prefix = TARGET_SYSROOT_PREFIX;
- if (startswith (gdb_sysroot, old_prefix))
+ if (startswith (gdb_sysroot.c_str (), old_prefix))
{
static bool warning_issued = false;
gdb_assert (strlen (old_prefix) == strlen (new_prefix));
- memcpy (gdb_sysroot, new_prefix, strlen (new_prefix));
+ gdb_sysroot = new_prefix + gdb_sysroot.substr (strlen (old_prefix));
if (!warning_issued)
{
warning (_("\"%s\" is deprecated, use \"%s\" instead."),
old_prefix, new_prefix);
- warning (_("sysroot set to \"%s\"."), gdb_sysroot);
+ warning (_("sysroot set to \"%s\"."), gdb_sysroot.c_str ());
warning_issued = true;
}
/* Path of directories to search for source files.
Same format as the PATH environment variable's value. */
-char *source_path;
+std::string source_path;
/* Support for source path substitution commands. */
{
/* This is the value that was set.
It needs to be processed to maintain $cdir:$cwd and remove dups. */
- char *set_path = source_path;
+ std::string set_path = source_path;
/* We preserve the invariant that $cdir:$cwd begins life at the end of
the list by calling init_source_path. If they appear earlier in
SET_PATH then mod_path will move them appropriately.
mod_path will also remove duplicates. */
init_source_path ();
- if (*set_path != '\0')
- mod_path (set_path, &source_path);
-
- xfree (set_path);
+ if (!set_path.empty ())
+ mod_path (set_path.c_str (), source_path);
}
/* Print the list of source directories.
show_directories_1 (char *ignore, int from_tty)
{
puts_filtered ("Source directories searched: ");
- puts_filtered (source_path);
+ puts_filtered (source_path.c_str ());
puts_filtered ("\n");
}
void
init_source_path (void)
{
- char buf[20];
-
- xsnprintf (buf, sizeof (buf), "$cdir%c$cwd", DIRNAME_SEPARATOR);
- source_path = xstrdup (buf);
+ source_path = string_printf ("$cdir%c$cwd", DIRNAME_SEPARATOR);
forget_cached_source_info ();
}
{
if (!from_tty || query (_("Reinitialize source path to empty? ")))
{
- xfree (source_path);
init_source_path ();
value_changed = true;
}
}
else
{
- mod_path (dirname, &source_path);
+ mod_path (dirname, source_path);
forget_cached_source_info ();
value_changed = true;
}
if (value_changed)
{
- gdb::observers::command_param_changed.notify ("directories", source_path);
+ gdb::observers::command_param_changed.notify ("directories",
+ source_path.c_str ());
if (from_tty)
show_directories_1 ((char *) 0, from_tty);
}
void
directory_switch (const char *dirname, int from_tty)
{
- add_path (dirname, &source_path, 0);
+ add_path (dirname, source_path, 0);
}
/* Add zero or more directories to the front of an arbitrary path. */
void
-mod_path (const char *dirname, char **which_path)
+mod_path (const char *dirname, std::string &which_path)
{
add_path (dirname, which_path, 1);
}
}
}
+/* add_path would need to be re-written to work on an std::string, but this is
+ not trivial. Hence this overload which copies to a `char *` and back. */
+
+void
+add_path (const char *dirname, std::string &which_path, int parse_separators)
+{
+ char *which_path_copy = xstrdup (which_path.data ());
+ add_path (dirname, &which_path_copy, parse_separators);
+ which_path = which_path_copy;
+ xfree (which_path_copy);
+}
static void
info_source_command (const char *ignore, int from_tty)
{
int fd;
- fd = openp (source_path,
+ fd = openp (source_path.c_str (),
OPF_TRY_CWD_FIRST | OPF_SEARCH_IN_PATH | OPF_RETURN_REALPATH,
filename, O_RDONLY, full_pathname);
if (fd < 0)
const char *dirname,
gdb::unique_xmalloc_ptr<char> *fullname)
{
- char *path = source_path;
+ const char *path = source_path.c_str ();
+ std::string expanded_path_holder;
const char *p;
/* If reading of source files is disabled then return a result indicating
/* Replace a path entry of $cdir with the compilation directory
name. */
#define cdir_len 5
- p = strstr (source_path, "$cdir");
+ p = strstr (source_path.c_str (), "$cdir");
if (p && (p == path || p[-1] == DIRNAME_SEPARATOR)
&& (p[cdir_len] == DIRNAME_SEPARATOR || p[cdir_len] == '\0'))
{
- int len;
-
- path = (char *)
- alloca (strlen (source_path) + 1 + strlen (dirname) + 1);
- len = p - source_path;
- strncpy (path, source_path, len); /* Before $cdir */
- strcpy (path + len, dirname); /* new stuff */
- strcat (path + len, source_path + len + cdir_len); /* After
- $cdir */
+ int len = p - source_path.c_str ();
+
+ /* Before $cdir */
+ expanded_path_holder = source_path.substr (0, len);
+
+ /* new stuff */
+ expanded_path_holder += dirname;
+
+ /* After $cdir */
+ expanded_path_holder += source_path.c_str () + len + cdir_len;
+
+ path = expanded_path_holder.c_str ();
}
}
extern int source_full_path_of (const char *, gdb::unique_xmalloc_ptr<char> *);
-extern void mod_path (const char *, char **);
+extern void mod_path (const char *, std::string &);
extern void add_path (const char *, char **, int);
+extern void add_path (const char *, std::string &, int);
extern void directory_switch (const char *, int);
-extern char *source_path;
+extern std::string source_path;
extern void init_source_path (void);
struct info_print_options
{
bool quiet = false;
- char *type_regexp = nullptr;
-
- ~info_print_options ()
- {
- xfree (type_regexp);
- }
+ std::string type_regexp;
};
/* The options used by the 'info locals' and 'info args' commands. */
if (args != nullptr && *args == '\0')
args = nullptr;
- print_frame_local_vars (get_selected_frame (_("No frame selected.")),
- opts.quiet, args, opts.type_regexp,
- 0, gdb_stdout);
+ print_frame_local_vars
+ (get_selected_frame (_("No frame selected.")),
+ opts.quiet, args,
+ opts.type_regexp.empty () ? nullptr : opts.type_regexp.c_str (),
+ 0, gdb_stdout);
}
/* Iterate over all the argument variables in block B. */
if (args != nullptr && *args == '\0')
args = nullptr;
- print_frame_arg_vars (get_selected_frame (_("No frame selected.")),
- opts.quiet, args, opts.type_regexp, gdb_stdout);
+ print_frame_arg_vars
+ (get_selected_frame (_("No frame selected.")),
+ opts.quiet, args,
+ opts.type_regexp.empty () ? nullptr : opts.type_regexp.c_str (),
+ gdb_stdout);
}
\f
/* Return the symbol-block in which the selected frame is executing.
return 1;
}
-char *debug_file_directory = NULL;
+std::string debug_file_directory;
static void
show_debug_file_directory (struct ui_file *file, int from_tty,
struct cmd_list_element *c, const char *value)
bool target_prefix = startswith (dir, "target:");
const char *dir_notarget = target_prefix ? dir + strlen ("target:") : dir;
std::vector<gdb::unique_xmalloc_ptr<char>> debugdir_vec
- = dirnames_to_char_ptr_vec (debug_file_directory);
- gdb::unique_xmalloc_ptr<char> canon_sysroot = gdb_realpath (gdb_sysroot);
+ = dirnames_to_char_ptr_vec (debug_file_directory.c_str ());
+ gdb::unique_xmalloc_ptr<char> canon_sysroot
+ = gdb_realpath (gdb_sysroot.c_str ());
/* MS-Windows/MS-DOS don't allow colons in file names; we must
convert the drive letter into a one-letter directory, so that the
if (canon_sysroot.get () != NULL)
base_path = child_path (canon_sysroot.get (), canon_dir);
else
- base_path = child_path (gdb_sysroot, canon_dir);
+ base_path = child_path (gdb_sysroot.c_str (), canon_dir);
}
if (base_path != NULL)
{
filename_language_table.emplace_back (ext, lang);
}
-static char *ext_args;
+static std::string ext_args;
static void
show_ext_args (struct ui_file *file, int from_tty,
struct cmd_list_element *c, const char *value)
set_ext_lang_command (const char *args,
int from_tty, struct cmd_list_element *e)
{
- char *cp = ext_args;
- enum language lang;
+ const char *begin = ext_args.c_str ();
+ const char *end = ext_args.c_str ();
/* First arg is filename extension, starting with '.' */
- if (*cp != '.')
- error (_("'%s': Filename extension must begin with '.'"), ext_args);
+ if (*end != '.')
+ error (_("'%s': Filename extension must begin with '.'"), ext_args.c_str ());
/* Find end of first arg. */
- while (*cp && !isspace (*cp))
- cp++;
+ while (*end != '\0' && !isspace (*end))
+ end++;
- if (*cp == '\0')
+ if (*end == '\0')
error (_("'%s': two arguments required -- "
"filename extension and language"),
- ext_args);
+ ext_args.c_str ());
- /* Null-terminate first arg. */
- *cp++ = '\0';
+ /* Extract first arg, the extension. */
+ std::string extension = ext_args.substr (0, end - begin);
/* Find beginning of second arg, which should be a source language. */
- cp = skip_spaces (cp);
+ begin = skip_spaces (end);
- if (*cp == '\0')
+ if (*begin == '\0')
error (_("'%s': two arguments required -- "
"filename extension and language"),
- ext_args);
+ ext_args.c_str ());
/* Lookup the language from among those we know. */
- lang = language_enum (cp);
+ language lang = language_enum (begin);
auto it = filename_language_table.begin ();
/* Now lookup the filename extension: do we already know it? */
for (; it != filename_language_table.end (); it++)
{
- if (it->ext == ext_args)
+ if (it->ext == extension)
break;
}
if (it == filename_language_table.end ())
{
/* New file extension. */
- add_filename_language (ext_args, lang);
+ add_filename_language (extension.data (), lang);
}
else
{
SELF_CHECK (lang == language_unknown);
/* Test adding a new extension using the CLI command. */
- auto args_holder = make_unique_xstrdup (".hello rust");
- ext_args = args_holder.get ();
+ ext_args = ".hello rust";
set_ext_lang_command (NULL, 1, NULL);
lang = deduce_language_from_filename ("cake.hello");
/* Test overriding an existing extension using the CLI command. */
int size_before = filename_language_table.size ();
- args_holder.reset (xstrdup (".hello pascal"));
- ext_args = args_holder.get ();
+ ext_args = ".hello pascal";
set_ext_lang_command (NULL, 1, NULL);
int size_after = filename_language_table.size ();
{
bool quiet = false;
bool exclude_minsyms = false;
- char *type_regexp = nullptr;
-
- ~info_vars_funcs_options ()
- {
- xfree (type_regexp);
- }
+ std::string type_regexp;
};
/* The options used by the 'info variables' and 'info functions'
gdb::option::string_option_def<info_vars_funcs_options> {
"t",
- [] (info_vars_funcs_options *opt) { return &opt->type_regexp;
- },
+ [] (info_vars_funcs_options *opt) { return &opt->type_regexp; },
nullptr, /* show_cmd_cb */
nullptr /* set_doc */
}
if (args != nullptr && *args == '\0')
args = nullptr;
- symtab_symbol_info (opts.quiet, opts.exclude_minsyms, args, VARIABLES_DOMAIN,
- opts.type_regexp, from_tty);
+ symtab_symbol_info
+ (opts.quiet, opts.exclude_minsyms, args, VARIABLES_DOMAIN,
+ opts.type_regexp.empty () ? nullptr : opts.type_regexp.c_str (),
+ from_tty);
}
/* Implement the 'info functions' command. */
if (args != nullptr && *args == '\0')
args = nullptr;
- symtab_symbol_info (opts.quiet, opts.exclude_minsyms, args,
- FUNCTIONS_DOMAIN, opts.type_regexp, from_tty);
+ symtab_symbol_info
+ (opts.quiet, opts.exclude_minsyms, args, FUNCTIONS_DOMAIN,
+ opts.type_regexp.empty () ? nullptr : opts.type_regexp.c_str (),
+ from_tty);
}
/* Holds the -q option for the 'info types' command. */
struct info_modules_var_func_options
{
bool quiet = false;
- char *type_regexp = nullptr;
- char *module_regexp = nullptr;
-
- ~info_modules_var_func_options ()
- {
- xfree (type_regexp);
- xfree (module_regexp);
- }
+ std::string type_regexp;
+ std::string module_regexp;
};
/* The options used by 'info module variables' and 'info module functions'
if (args != nullptr && *args == '\0')
args = nullptr;
- info_module_subcommand (opts.quiet, opts.module_regexp, args,
- opts.type_regexp, FUNCTIONS_DOMAIN);
+ info_module_subcommand
+ (opts.quiet,
+ opts.module_regexp.empty () ? nullptr : opts.module_regexp.c_str (), args,
+ opts.type_regexp.empty () ? nullptr : opts.type_regexp.c_str (),
+ FUNCTIONS_DOMAIN);
}
/* Implements the 'info module variables' command. */
if (args != nullptr && *args == '\0')
args = nullptr;
- info_module_subcommand (opts.quiet, opts.module_regexp, args,
- opts.type_regexp, VARIABLES_DOMAIN);
+ info_module_subcommand
+ (opts.quiet,
+ opts.module_regexp.empty () ? nullptr : opts.module_regexp.c_str (), args,
+ opts.type_regexp.empty () ? nullptr : opts.type_regexp.c_str (),
+ VARIABLES_DOMAIN);
}
/* Command completer for 'info module ...' sub-commands. */
/* The string manipulated by the "set tdesc filename ..." command. */
-static char *tdesc_filename_cmd_string;
+static std::string tdesc_filename_cmd_string;
/* Fetch the current target's description, and switch the current
architecture to one which incorporates that description. */
extern void initialize_all_files (void);
-static bool history_filename_empty (void);
-
#define PROMPT(X) the_prompts.prompt_stack[the_prompts.top + X].prompt
#define PREFIX(X) the_prompts.prompt_stack[the_prompts.top + X].prefix
#define SUFFIX(X) the_prompts.prompt_stack[the_prompts.top + X].suffix
variable must be set to something sensible. */
static bool write_history_p;
+/* The name of the file in which GDB history will be written. If this is
+ set to NULL, of the empty string then history will not be written. */
+static std::string history_filename;
+
/* Implement 'show history save'. */
static void
show_write_history_p (struct ui_file *file, int from_tty,
struct cmd_list_element *c, const char *value)
{
- if (!write_history_p || !history_filename_empty ())
+ if (!write_history_p || !history_filename.empty ())
fprintf_filtered (file, _("Saving of the history record on exit is %s.\n"),
value);
else
value);
}
-/* The name of the file in which GDB history will be written. If this is
- set to NULL, of the empty string then history will not be written. */
-static char *history_filename;
-
-/* Return true if the history_filename is either NULL or the empty string,
- indicating that we should not try to read, nor write out the history. */
-static bool
-history_filename_empty (void)
-{
- return (history_filename == nullptr || *history_filename == '\0');
-}
-
/* Implement 'show history filename'. */
static void
show_history_filename (struct ui_file *file, int from_tty,
struct cmd_list_element *c, const char *value)
{
- if (!history_filename_empty ())
+ if (!history_filename.empty ())
fprintf_filtered (file, _("The filename in which to record "
"the command history is \"%ps\".\n"),
styled_string (file_name_style.style (), value));
int ret, saved_errno;
std::string local_history_filename
- = string_printf ("%s-gdb%ld~", history_filename, (long) getpid ());
+ = string_printf ("%s-gdb%ld~", history_filename.c_str (), (long) getpid ());
- ret = rename (history_filename, local_history_filename.c_str ());
+ ret = rename (history_filename.c_str (), local_history_filename.c_str ());
saved_errno = errno;
if (ret < 0 && saved_errno != ENOENT)
{
warning (_("Could not rename %ps to %ps: %s"),
- styled_string (file_name_style.style (), history_filename),
+ styled_string (file_name_style.style (),
+ history_filename.c_str ()),
styled_string (file_name_style.style (),
local_history_filename.c_str ()),
safe_strerror (saved_errno));
history_max_entries);
}
- ret = rename (local_history_filename.c_str (), history_filename);
+ ret = rename (local_history_filename.c_str (), history_filename.c_str ());
saved_errno = errno;
if (ret < 0 && saved_errno != EEXIST)
warning (_("Could not rename %s to %s: %s"),
- local_history_filename.c_str (), history_filename,
+ local_history_filename.c_str (), history_filename.c_str (),
safe_strerror (saved_errno));
}
}
/* The current top level prompt, settable with "set prompt", and/or
with the python `gdb.prompt_hook' hook. */
-static char *top_prompt;
+static std::string top_prompt;
/* Access method for the GDB prompt string. */
-char *
-get_prompt (void)
+const std::string &
+get_prompt ()
{
return top_prompt;
}
void
set_prompt (const char *s)
{
- char *p = xstrdup (s);
-
- xfree (top_prompt);
- top_prompt = p;
+ top_prompt = s;
}
\f
/* Save the history information if it is appropriate to do so. */
try
{
- if (write_history_p && history_filename)
+ if (write_history_p && !history_filename.empty ())
{
int save = 0;
set_readline_history_size (history_size_setshow_var);
- tmpenv = getenv ("GDBHISTFILE");
- if (tmpenv != nullptr)
- history_filename = xstrdup (tmpenv);
- else if (history_filename == nullptr)
- {
- /* We include the current directory so that if the user changes
- directories the file written will be the same as the one
- that was read. */
-#ifdef __MSDOS__
- /* No leading dots in file names are allowed on MSDOS. */
- const char *fname = "_gdb_history";
-#else
- const char *fname = ".gdb_history";
-#endif
-
- gdb::unique_xmalloc_ptr<char> temp (gdb_abspath (fname));
- history_filename = temp.release ();
- }
-
- if (!history_filename_empty ())
- read_history (history_filename);
+ if (!history_filename.empty ())
+ read_history (history_filename.c_str ());
}
static void
Extension languages, for example Python's gdb.parameter API, will read
the value directory from this variable, so we must ensure that this
always contains the correct value. */
-static char *staged_gdb_datadir;
+static std::string staged_gdb_datadir;
/* "set" command for the gdb_datadir configuration variable. */
static void
set_gdb_datadir (const char *args, int from_tty, struct cmd_list_element *c)
{
- set_gdb_data_directory (staged_gdb_datadir);
+ set_gdb_data_directory (staged_gdb_datadir.c_str ());
/* SET_GDB_DATA_DIRECTORY will resolve relative paths in
STAGED_GDB_DATADIR, so we now copy the value from GDB_DATADIR
back into STAGED_GDB_DATADIR so the extension languages can read the
correct value. */
- free (staged_gdb_datadir);
- staged_gdb_datadir = strdup (gdb_datadir.c_str ());
+ staged_gdb_datadir = gdb_datadir;
gdb::observers::gdb_datadir_changed.notify ();
}
/* We include the current directory so that if the user changes
directories the file written will be the same as the one
that was read. */
- if (!history_filename_empty () && !IS_ABSOLUTE_PATH (history_filename))
+ if (!history_filename.empty ()
+ && !IS_ABSOLUTE_PATH (history_filename.c_str ()))
{
- gdb::unique_xmalloc_ptr<char> temp (gdb_abspath (history_filename));
+ gdb::unique_xmalloc_ptr<char> temp
+ (gdb_abspath (history_filename.c_str ()));
- xfree (history_filename);
- history_filename = temp.release ();
+ history_filename = temp.get ();
}
}
&setlist,
&showlist);
/* Prime the initial value for data-directory. */
- staged_gdb_datadir = strdup (gdb_datadir.c_str ());
+ staged_gdb_datadir = gdb_datadir;
add_setshow_auto_boolean_cmd ("interactive-mode", class_support,
&interactive_mode, _("\
/* Create $_gdb_major and $_gdb_minor convenience variables. */
init_gdb_version_vars ();
}
+
+void _initialize_top ();
+void
+_initialize_top ()
+{
+ /* Determine a default value for the history filename. */
+ const char *tmpenv = getenv ("GDBHISTFILE");
+ if (tmpenv != nullptr)
+ history_filename = tmpenv;
+ else
+ {
+ /* We include the current directory so that if the user changes
+ directories the file written will be the same as the one
+ that was read. */
+#ifdef __MSDOS__
+ /* No leading dots in file names are allowed on MSDOS. */
+ const char *fname = "_gdb_history";
+#else
+ const char *fname = ".gdb_history";
+#endif
+
+ gdb::unique_xmalloc_ptr<char> temp (gdb_abspath (fname));
+ history_filename = temp.get ();
+ }
+}
/* This function returns a pointer to the string that is used
by gdb for its command prompt. */
-extern char *get_prompt (void);
+extern const std::string &get_prompt ();
/* This function returns a pointer to the string that is used
by gdb for its command prompt. */
static struct cmd_list_element *tfindlist;
/* List of expressions to collect by default at each tracepoint hit. */
-char *default_collect;
+std::string default_collect;
static bool disconnected_tracing;
/* Textual notes applying to the current and/or future trace runs. */
-static char *trace_user = NULL;
+static std::string trace_user;
/* Textual notes applying to the current and/or future trace runs. */
-static char *trace_notes = NULL;
+static std::string trace_notes;
/* Textual notes applying to the stopping of a trace. */
-static char *trace_stop_notes = NULL;
+static std::string trace_stop_notes;
/* support routines */
target_set_trace_buffer_size (trace_buffer_size);
if (!notes)
- notes = trace_notes;
- ret = target_set_trace_notes (trace_user, notes, NULL);
+ notes = trace_notes.c_str ();
- if (!ret && (trace_user || notes))
+ ret = target_set_trace_notes (trace_user.c_str (), notes, NULL);
+
+ if (!ret && (!trace_user.empty () || notes))
warning (_("Target does not support trace user/notes, info ignored"));
/* Now insert traps and begin collecting data. */
}
if (!note)
- note = trace_stop_notes;
+ note = trace_stop_notes.c_str ();
+
ret = target_set_trace_notes (NULL, NULL, note);
if (!ret && note)
validation is per-tracepoint (local var "xyz" might be valid for
one tracepoint and not another, etc), we make up the action on
the fly, and don't cache it. */
- if (*default_collect)
+ if (!default_collect.empty ())
{
gdb::unique_xmalloc_ptr<char> default_collect_line
- (xstrprintf ("collect %s", default_collect));
+ (xstrprintf ("collect %s", default_collect.c_str ()));
validate_actionline (default_collect_line.get (), t);
actions.reset (new struct command_line (simple_control,
{
int ret;
- ret = target_set_trace_notes (trace_user, NULL, NULL);
+ ret = target_set_trace_notes (trace_user.c_str (), NULL, NULL);
if (!ret)
warning (_("Target does not support trace notes, user ignored"));
{
int ret;
- ret = target_set_trace_notes (NULL, trace_notes, NULL);
+ ret = target_set_trace_notes (NULL, trace_notes.c_str (), NULL);
if (!ret)
warning (_("Target does not support trace notes, note ignored"));
{
int ret;
- ret = target_set_trace_notes (NULL, NULL, trace_stop_notes);
+ ret = target_set_trace_notes (NULL, NULL, trace_stop_notes.c_str ());
if (!ret)
warning (_("Target does not support trace notes, stop note ignored"));
single-stepping, or enabling/disabling other tracepoints,\n\
depending on target's capabilities."));
- default_collect = xstrdup ("");
add_setshow_string_cmd ("default-collect", class_trace,
&default_collect, _("\
Set the list of expressions to collect by default."), _("\
struct trace_status *current_trace_status (void);
-extern char *default_collect;
+extern std::string default_collect;
extern int trace_regblock_size;