aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/auto-load.c48
-rw-r--r--gdb/breakpoint.c22
-rw-r--r--gdb/build-id.c4
-rw-r--r--gdb/cli/cli-cmds.c49
-rw-r--r--gdb/cli/cli-decode.c38
-rw-r--r--gdb/cli/cli-logging.c23
-rw-r--r--gdb/cli/cli-option.c9
-rw-r--r--gdb/cli/cli-option.h4
-rw-r--r--gdb/cli/cli-setshow.c59
-rw-r--r--gdb/command.h23
-rw-r--r--gdb/compile/compile.c46
-rw-r--r--gdb/corefile.c17
-rw-r--r--gdb/defs.h4
-rw-r--r--gdb/disasm.c11
-rw-r--r--gdb/disasm.h2
-rw-r--r--gdb/dwarf2/dwz.c2
-rw-r--r--gdb/dwarf2/index-cache.c10
-rw-r--r--gdb/dwarf2/read.c10
-rw-r--r--gdb/event-top.c12
-rw-r--r--gdb/fork-child.c7
-rw-r--r--gdb/guile/scm-param.c62
-rw-r--r--gdb/infcmd.c14
-rw-r--r--gdb/linux-thread-db.c17
-rw-r--r--gdb/main.c17
-rw-r--r--gdb/maint-test-options.c11
-rw-r--r--gdb/maint-test-settings.c8
-rw-r--r--gdb/mi/mi-cmd-env.c18
-rw-r--r--gdb/proc-api.c5
-rw-r--r--gdb/python/py-param.c45
-rw-r--r--gdb/python/python.c10
-rw-r--r--gdb/remote-sim.c7
-rw-r--r--gdb/remote.c10
-rw-r--r--gdb/serial.c8
-rw-r--r--gdb/solib.c20
-rw-r--r--gdb/source.c66
-rw-r--r--gdb/source.h5
-rw-r--r--gdb/stack.c22
-rw-r--r--gdb/symfile.c49
-rw-r--r--gdb/symtab.c46
-rw-r--r--gdb/target-descriptions.c2
-rw-r--r--gdb/top.c112
-rw-r--r--gdb/top.h2
-rw-r--r--gdb/tracepoint.c29
-rw-r--r--gdb/tracepoint.h2
44 files changed, 477 insertions, 510 deletions
diff --git a/gdb/auto-load.c b/gdb/auto-load.c
index 7f0bb74..36d8725 100644
--- a/gdb/auto-load.c
+++ b/gdb/auto-load.c
@@ -137,7 +137,7 @@ show_auto_load_local_gdbinit (struct ui_file *file, int from_tty,
/* 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. */
@@ -145,11 +145,8 @@ static void
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. */
@@ -166,7 +163,7 @@ show_auto_load_dir (struct ui_file *file, int from_tty,
/* 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
@@ -181,7 +178,7 @@ auto_load_expand_dir_vars (const char *string)
{
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);
@@ -199,9 +196,10 @@ static void
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
@@ -253,11 +251,8 @@ set_auto_load_safe_path (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_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 ();
}
@@ -291,17 +286,14 @@ show_auto_load_safe_path (struct ui_file *file, int from_tty,
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 ();
}
@@ -312,14 +304,11 @@ Use 'set auto-load safe-path /' for disabling the auto-load safe-path security.\
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
@@ -459,7 +448,7 @@ file_is_auto_load_safe (const char *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)
{
@@ -749,11 +738,11 @@ auto_load_objfile_script_1 (struct objfile *objfile, const char *realname,
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))
@@ -1542,8 +1531,6 @@ This option has security implications for untrusted inferiors."),
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 (_("\
@@ -1595,7 +1582,6 @@ Show the list of directories from which to load auto-loaded scripts."),
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, _("\
diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
index 3b626b8..e742a1e 100644
--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -276,7 +276,7 @@ static const char *dprintf_style = dprintf_style_gdb;
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
@@ -286,7 +286,7 @@ static char *dprintf_function;
"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. */
@@ -6658,7 +6658,7 @@ default_collect_info (void)
/* 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
@@ -8759,17 +8759,17 @@ update_dprintf_command_list (struct breakpoint *b)
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)
@@ -15102,8 +15102,8 @@ save_breakpoints (const char *filename, int from_tty,
}
}
- 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 ());
@@ -16014,7 +16014,6 @@ output stream by setting dprintf-function and dprintf-channel."),
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."), _("\
@@ -16022,7 +16021,6 @@ Show the function to use for dynamic printf."), NULL,
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."), _("\
diff --git a/gdb/build-id.c b/gdb/build-id.c
index d2f2576..553d6ce 100644
--- a/gdb/build-id.c
+++ b/gdb/build-id.c
@@ -130,7 +130,7 @@ build_id_to_bfd_suffix (size_t build_id_len, const bfd_byte *build_id,
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)
{
@@ -167,7 +167,7 @@ build_id_to_bfd_suffix (size_t build_id_len, const bfd_byte *build_id,
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);
diff --git a/gdb/cli/cli-cmds.c b/gdb/cli/cli-cmds.c
index ecbe5a4..f8f0133 100644
--- a/gdb/cli/cli-cmds.c
+++ b/gdb/cli/cli-cmds.c
@@ -650,7 +650,7 @@ find_and_open_script (const char *script_file, int search_path)
/* 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)
@@ -1042,12 +1042,7 @@ edit_command (const char *arg, int from_tty)
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[] = {
@@ -1084,8 +1079,8 @@ pipe_command (const char *arg, int from_tty)
(&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)
@@ -1148,8 +1143,8 @@ pipe_command_completer (struct cmd_list_element *ignore,
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]))
@@ -2152,13 +2147,21 @@ value_from_setting (const setting &var, struct gdbarch *gdbarch)
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,
@@ -2231,13 +2234,21 @@ str_value_from_setting (const setting &var, struct gdbarch *gdbarch)
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,
diff --git a/gdb/cli/cli-decode.c b/gdb/cli/cli-decode.c
index 56befc9..b3bf627 100644
--- a/gdb/cli/cli-decode.c
+++ b/gdb/cli/cli-decode.c
@@ -655,7 +655,7 @@ add_setshow_boolean_cmd (const char *name, enum command_class theclass, bool *va
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,
@@ -664,10 +664,10 @@ add_setshow_filename_cmd (const char *name, enum command_class theclass,
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);
@@ -679,7 +679,7 @@ add_setshow_filename_cmd (const char *name, enum command_class theclass,
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,
@@ -688,10 +688,10 @@ add_setshow_string_cmd (const char *name, enum command_class theclass,
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);
@@ -704,7 +704,7 @@ add_setshow_string_cmd (const char *name, enum command_class theclass,
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,
@@ -713,9 +713,10 @@ add_setshow_string_noescape_cmd (const char *name, enum command_class theclass,
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);
@@ -728,7 +729,7 @@ add_setshow_string_noescape_cmd (const char *name, enum command_class theclass,
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,
@@ -737,9 +738,10 @@ add_setshow_optional_filename_cmd (const char *name, enum command_class theclass
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);
diff --git a/gdb/cli/cli-logging.c b/gdb/cli/cli-logging.c
index dfedd75..c909352 100644
--- a/gdb/cli/cli-logging.c
+++ b/gdb/cli/cli-logging.c
@@ -25,7 +25,7 @@
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)
@@ -102,7 +102,7 @@ handle_redirections (int from_tty)
}
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. */
@@ -110,20 +110,20 @@ handle_redirections (int from_tty)
{
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,
@@ -145,10 +145,8 @@ set_logging_on (const char *args, int from_tty)
const char *rest = args;
if (rest && *rest)
- {
- xfree (logging_filename);
- logging_filename = xstrdup (rest);
- }
+ logging_filename = rest;
+
handle_redirections (from_tty);
}
@@ -201,6 +199,7 @@ If debug redirect is on, debug will go only to the log file."),
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."), _("\
@@ -212,6 +211,4 @@ The logfile is used when directing GDB's output."),
_("Enable logging."), &set_logging_cmdlist);
add_cmd ("off", class_support, set_logging_off,
_("Disable logging."), &set_logging_cmdlist);
-
- logging_filename = xstrdup ("gdb.txt");
}
diff --git a/gdb/cli/cli-option.c b/gdb/cli/cli-option.c
index ab76f19..846b819 100644
--- a/gdb/cli/cli-option.c
+++ b/gdb/cli/cli-option.c
@@ -45,7 +45,7 @@ union option_value
const char *enumeration;
/* For var_string options. This is malloc-allocated. */
- char *string;
+ std::string *string;
};
/* Holds an options definition and its value. */
@@ -87,7 +87,7 @@ struct option_def_and_value
if (value.has_value ())
{
if (option.type == var_string)
- xfree (value->string);
+ delete value->string;
}
}
@@ -439,7 +439,7 @@ parse_option (gdb::array_view<const option_def_group> options_group,
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};
}
@@ -603,8 +603,7 @@ save_option_value_in_ctx (gdb::optional<option_def_and_value> &ov)
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");
diff --git a/gdb/cli/cli-option.h b/gdb/cli/cli-option.h
index aa2ccbe..b7ede45 100644
--- a/gdb/cli/cli-option.h
+++ b/gdb/cli/cli-option.h
@@ -86,7 +86,7 @@ public:
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;
@@ -268,7 +268,7 @@ template<typename Context>
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,
diff --git a/gdb/cli/cli-setshow.c b/gdb/cli/cli-setshow.c
index 86ab553..8d29c0c 100644
--- a/gdb/cli/cli-setshow.c
+++ b/gdb/cli/cli-setshow.c
@@ -360,27 +360,22 @@ do_set_command (const char *arg, int from_tty, struct cmd_list_element *c)
*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;
}
@@ -410,17 +405,14 @@ do_set_command (const char *arg, int from_tty, struct cmd_list_element *c)
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:
@@ -598,15 +590,12 @@ do_set_command (const char *arg, int from_tty, struct cmd_list_element *c)
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:
{
@@ -658,23 +647,19 @@ get_setshow_command_value_string (const setting &var)
{
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);
}
diff --git a/gdb/command.h b/gdb/command.h
index e7b8110..e6e6ec8 100644
--- a/gdb/command.h
+++ b/gdb/command.h
@@ -97,16 +97,15 @@ typedef enum var_types
/* 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. */
@@ -166,9 +165,9 @@ inline bool var_type_uses<int> (var_types t)
|| 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);
@@ -562,25 +561,25 @@ extern set_show_commands add_setshow_boolean_cmd
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);
diff --git a/gdb/compile/compile.c b/gdb/compile/compile.c
index e815348..25cfd28 100644
--- a/gdb/compile/compile.c
+++ b/gdb/compile/compile.c
@@ -495,7 +495,22 @@ get_expr_block_and_pc (CORE_ADDR *pc)
}
/* 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;
@@ -505,7 +520,7 @@ 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'. */
@@ -520,7 +535,7 @@ show_compile_args (struct ui_file *file, int from_tty,
}
/* String for 'set compile-gcc' and 'show compile-gcc'. */
-static char *compile_gcc;
+static std::string compile_gcc;
/* Implement 'show compile-gcc'. */
@@ -696,13 +711,13 @@ compile_to_object (struct command_line *cmd, const char *cmd_string,
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
{
@@ -1029,23 +1044,9 @@ String quoting is parsed like in shell, for example:\n\
-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,
@@ -1058,5 +1059,4 @@ It should be absolute filename of the gcc executable.\n\
If empty the default target triplet will be searched in $PATH."),
NULL, show_compile_gcc, &setlist,
&showlist);
- compile_gcc = xstrdup ("");
}
diff --git a/gdb/corefile.c b/gdb/corefile.c
index ff24947..4b14514 100644
--- a/gdb/corefile.c
+++ b/gdb/corefile.c
@@ -395,7 +395,7 @@ write_memory_signed_integer (CORE_ADDR addr, int len,
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,
@@ -409,15 +409,15 @@ static void
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". */
@@ -449,8 +449,7 @@ complete_set_gnutarget (struct cmd_list_element *cmd,
void
set_gnutarget (const char *newtarget)
{
- xfree (gnutarget_string);
- gnutarget_string = xstrdup (newtarget);
+ gnutarget_string = newtarget;
set_gnutarget_command (NULL, 0, NULL);
}
diff --git a/gdb/defs.h b/gdb/defs.h
index 6dea409..f7e09ec 100644
--- a/gdb/defs.h
+++ b/gdb/defs.h
@@ -121,7 +121,7 @@ using RequireLongest = gdb::Requires<gdb::Or<std::is_same<T, LONGEST>,
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;
@@ -131,7 +131,7 @@ 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
diff --git a/gdb/disasm.c b/gdb/disasm.c
index 7f730f6..c788f5b 100644
--- a/gdb/disasm.c
+++ b/gdb/disasm.c
@@ -39,7 +39,7 @@
/* 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.
@@ -928,13 +928,16 @@ get_disassembler_options (struct gdbarch *gdbarch)
}
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',
@@ -1003,7 +1006,7 @@ static void
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
diff --git a/gdb/disasm.h b/gdb/disasm.h
index eb82bc3..6cbfdcd 100644
--- a/gdb/disasm.h
+++ b/gdb/disasm.h
@@ -164,6 +164,6 @@ extern char *get_disassembler_options (struct gdbarch *gdbarch);
/* 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
diff --git a/gdb/dwarf2/dwz.c b/gdb/dwarf2/dwz.c
index f9d5db6..5e963d5 100644
--- a/gdb/dwarf2/dwz.c
+++ b/gdb/dwarf2/dwz.c
@@ -118,7 +118,7 @@ dwz_search_other_debugdirs (std::string &filename, bfd_byte *buildid,
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)
{
diff --git a/gdb/dwarf2/index-cache.c b/gdb/dwarf2/index-cache.c
index c3decf1..f439b37 100644
--- a/gdb/dwarf2/index-cache.c
+++ b/gdb/dwarf2/index-cache.c
@@ -37,7 +37,7 @@
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;
@@ -290,9 +290,9 @@ set_index_cache_directory_command (const char *arg, int from_tty,
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);
}
@@ -325,7 +325,7 @@ _initialize_index_cache ()
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
diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
index 2d4ca08..214810d 100644
--- a/gdb/dwarf2/read.c
+++ b/gdb/dwarf2/read.c
@@ -12134,10 +12134,10 @@ try_open_dwop_file (dwarf2_per_objfile *per_objfile,
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 ();
}
@@ -12145,7 +12145,7 @@ try_open_dwop_file (dwarf2_per_objfile *per_objfile,
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));
@@ -12216,7 +12216,7 @@ open_dwo_file (dwarf2_per_objfile *per_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,
@@ -12545,7 +12545,7 @@ open_dwp_file (dwarf2_per_objfile *per_objfile, const char *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,
diff --git a/gdb/event-top.c b/gdb/event-top.c
index 64c624c..530ea29 100644
--- a/gdb/event-top.c
+++ b/gdb/event-top.c
@@ -439,13 +439,11 @@ display_gdb_prompt (const char *new_prompt)
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)
{
@@ -456,7 +454,7 @@ top_level_prompt (void)
beginning. */
const char suffix[] = "\n\032\032prompt\n";
- return std::string (prefix) + prompt + suffix;
+ return std::string (prefix) + prompt.c_str () + suffix;
}
return prompt;
@@ -1253,13 +1251,13 @@ handle_sigtstp (int sig)
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
diff --git a/gdb/fork-child.c b/gdb/fork-child.c
index 3ce7d64..3e995ed 100644
--- a/gdb/fork-child.c
+++ b/gdb/fork-child.c
@@ -33,14 +33,14 @@
/* 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. */
@@ -139,8 +139,7 @@ gdb_startup_inferior (pid_t pid, int num_traps)
static void
unset_exec_wrapper_command (const char *args, int from_tty)
{
- xfree (exec_wrapper);
- exec_wrapper = NULL;
+ exec_wrapper.clear ();
}
static void
diff --git a/gdb/guile/scm-param.c b/gdb/guile/scm-param.c
index 0ae368a..17746da 100644
--- a/gdb/guile/scm-param.c
+++ b/gdb/guile/scm-param.c
@@ -44,7 +44,7 @@ union pascm_variable
unsigned int uintval;
/* Hold a string, for the various string types. */
- char *stringval;
+ std::string *stringval;
/* Hold a string, for enums. */
const char *cstringval;
@@ -57,10 +57,7 @@ union pascm_variable
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
{
@@ -120,7 +117,6 @@ 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))
@@ -129,8 +125,8 @@ make_setting (param_smob *s)
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
@@ -432,14 +428,14 @@ add_setshow_generic (enum var_types param_type, enum command_class cmd_class,
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);
@@ -448,7 +444,7 @@ add_setshow_generic (enum var_types param_type, enum command_class cmd_class,
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);
@@ -456,7 +452,7 @@ add_setshow_generic (enum var_types param_type, enum command_class cmd_class,
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;
@@ -602,14 +598,14 @@ pascm_param_value (const setting &var, int arg_pos, const char *func_name)
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));
@@ -682,13 +678,7 @@ pascm_set_param_value_x (param_smob *p_smob,
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;
@@ -697,8 +687,7 @@ pascm_set_param_value_x (param_smob *p_smob,
= 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;
@@ -798,6 +787,21 @@ pascm_set_param_value_x (param_smob *p_smob,
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;
+}
/* Parameter Scheme functions. */
@@ -954,6 +958,10 @@ gdbscm_make_parameter (SCM name_scm, SCM rest)
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))
diff --git a/gdb/infcmd.c b/gdb/infcmd.c
index d948f4b..b55a56c 100644
--- a/gdb/infcmd.c
+++ b/gdb/infcmd.c
@@ -71,16 +71,16 @@ static void step_1 (int, int, const char *);
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
@@ -2021,7 +2021,6 @@ path_info (const char *args, int from_tty)
static void
path_command (const char *dirname, int from_tty)
{
- char *exec_path;
const char *env;
dont_repeat ();
@@ -2029,10 +2028,9 @@ path_command (const char *dirname, int from_tty)
/* 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);
}
diff --git a/gdb/linux-thread-db.c b/gdb/linux-thread-db.c
index ac85ea3..54e68cc 100644
--- a/gdb/linux-thread-db.c
+++ b/gdb/linux-thread-db.c
@@ -110,7 +110,7 @@ public:
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. */
@@ -135,11 +135,8 @@ static void
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. */
@@ -941,7 +938,7 @@ try_thread_db_load_1 (struct thread_db_info *info)
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;
@@ -954,7 +951,7 @@ try_thread_db_load_1 (struct thread_db_info *info)
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));
@@ -1142,7 +1139,7 @@ thread_db_load_search (void)
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)
{
@@ -2005,8 +2002,6 @@ _initialize_thread_db ()
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, _("\
diff --git a/gdb/main.c b/gdb/main.c
index 5761ce2..ca4ccc3 100644
--- a/gdb/main.c
+++ b/gdb/main.c
@@ -65,7 +65,7 @@ char *interpreter_p;
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;
@@ -710,19 +710,14 @@ captured_main_1 (struct captured_main_args *context)
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);
diff --git a/gdb/maint-test-options.c b/gdb/maint-test-options.c
index b773e75..77a013d 100644
--- a/gdb/maint-test-options.c
+++ b/gdb/maint-test-options.c
@@ -133,17 +133,12 @@ struct test_options_opts
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
@@ -162,9 +157,7 @@ struct test_options_opts
(zuint_unl_opt == -1
? "unlimited"
: plongest (zuint_unl_opt)),
- (string_opt != nullptr
- ? string_opt
- : ""),
+ string_opt.c_str (),
args);
}
};
diff --git a/gdb/maint-test-settings.c b/gdb/maint-test-settings.c
index 0ce8890..eea3ea9 100644
--- a/gdb/maint-test-settings.c
+++ b/gdb/maint-test-settings.c
@@ -44,13 +44,13 @@ static unsigned int maintenance_test_settings_zuinteger;
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. */
diff --git a/gdb/mi/mi-cmd-env.c b/gdb/mi/mi-cmd-env.c
index 703c632..f9685a5 100644
--- a/gdb/mi/mi-cmd-env.c
+++ b/gdb/mi/mi-cmd-env.c
@@ -93,7 +93,7 @@ mi_cmd_env_cd (const char *command, char **argv, int argc)
}
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;
@@ -109,7 +109,6 @@ void
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;
@@ -152,11 +151,11 @@ mi_cmd_env_path (const char *command, char **argv, int argc)
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
{
@@ -166,14 +165,14 @@ mi_cmd_env_path (const char *command, char **argv, int argc)
/* 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);
}
@@ -228,12 +227,11 @@ mi_cmd_env_dir (const char *command, char **argv, int argc)
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 ();
diff --git a/gdb/proc-api.c b/gdb/proc-api.c
index 5f60eee..40bde78 100644
--- a/gdb/proc-api.c
+++ b/gdb/proc-api.c
@@ -50,14 +50,14 @@ struct trans {
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
@@ -425,7 +425,6 @@ Show tracing for /proc api calls."), NULL,
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,
diff --git a/gdb/python/py-param.c b/gdb/python/py-param.c
index 1dd716b..407db04 100644
--- a/gdb/python/py-param.c
+++ b/gdb/python/py-param.c
@@ -64,8 +64,9 @@ union parmpy_variable
/* 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;
@@ -95,7 +96,6 @@ struct parmpy_object
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))
@@ -104,8 +104,8 @@ make_setting (parmpy_object *s)
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
@@ -163,13 +163,7 @@ set_parameter_value (parmpy_object *self, PyObject *value)
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>
@@ -177,8 +171,7 @@ set_parameter_value (parmpy_object *self, PyObject *value)
if (string == NULL)
return -1;
- xfree (self->value.stringval);
- self->value.stringval = string.release ();
+ *self->value.stringval = string.get ();
}
break;
@@ -525,14 +518,14 @@ add_setshow_generic (int parmclass, enum command_class cmdclass,
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);
@@ -540,7 +533,7 @@ add_setshow_generic (int parmclass, enum command_class cmdclass,
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,
@@ -549,7 +542,7 @@ add_setshow_generic (int parmclass, enum command_class cmdclass,
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;
@@ -732,6 +725,9 @@ parmpy_init (PyObject *self, PyObject *args, PyObject *kwds)
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)
@@ -764,7 +760,16 @@ parmpy_init (PyObject *self, PyObject *args, PyObject *kwds)
return 0;
}
-
+/* 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
@@ -803,7 +808,7 @@ PyTypeObject parmpy_object_type =
"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*/
diff --git a/gdb/python/python.c b/gdb/python/python.c
index a26c373..fcd367f 100644
--- a/gdb/python/python.c
+++ b/gdb/python/python.c
@@ -460,13 +460,11 @@ gdbpy_parameter_value (const setting &var)
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 ();
}
diff --git a/gdb/remote-sim.c b/gdb/remote-sim.c
index 5bedc04..5bfce2a 100644
--- a/gdb/remote-sim.c
+++ b/gdb/remote-sim.c
@@ -680,10 +680,9 @@ gdbsim_target_open (const char *args, int from_tty)
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);
@@ -704,7 +703,7 @@ gdbsim_target_open (const char *args, int from_tty)
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);
@@ -731,7 +730,7 @@ gdbsim_target_open (const char *args, int from_tty)
}
/* 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)
{
diff --git a/gdb/remote.c b/gdb/remote.c
index 29b18c9..d5eb40c 100644
--- a/gdb/remote.c
+++ b/gdb/remote.c
@@ -1004,7 +1004,7 @@ static const struct program_space_key<char, gdb::xfree_deleter<char>>
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
@@ -1355,8 +1355,8 @@ static void
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. */
@@ -12628,7 +12628,7 @@ remote_target::filesystem_is_local ()
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);
@@ -13256,7 +13256,7 @@ remote_target::download_tracepoint (struct bp_location *loc)
"ignoring tp %d cond"), b->number);
}
- if (b->commands || *default_collect)
+ if (b->commands || !default_collect.empty ())
{
size_left = buf.size () - strlen (buf.data ());
diff --git a/gdb/serial.c b/gdb/serial.c
index 7d1bc53..5ec79a1 100644
--- a/gdb/serial.c
+++ b/gdb/serial.c
@@ -38,7 +38,7 @@ static struct serial *scb_base;
/* 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 *);
@@ -251,12 +251,12 @@ serial_open_ops_1 (const struct serial_ops *ops, const char *open_name)
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 ();
}
diff --git a/gdb/solib.c b/gdb/solib.c
index dba3d84..3947c2d 100644
--- a/gdb/solib.c
+++ b/gdb/solib.c
@@ -98,7 +98,7 @@ struct target_so_ops *current_target_so_ops;
/* 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)
@@ -157,7 +157,7 @@ solib_find_1 (const char *in_pathname, int *fd, bool is_solib)
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
@@ -322,8 +322,8 @@ solib_find_1 (const char *in_pathname, int *fd, bool is_solib)
/* 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);
@@ -331,8 +331,8 @@ solib_find_1 (const char *in_pathname, int *fd, bool is_solib)
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);
@@ -381,7 +381,7 @@ exec_file_find (const char *in_pathname, int *fd)
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);
@@ -1397,18 +1397,18 @@ gdb_sysroot_changed (const char *ignored, int from_tty,
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;
}
diff --git a/gdb/source.c b/gdb/source.c
index 3559eea..3810af8 100644
--- a/gdb/source.c
+++ b/gdb/source.c
@@ -57,7 +57,7 @@
/* 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. */
@@ -379,17 +379,15 @@ set_directories_command (const char *args,
{
/* 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.
@@ -400,7 +398,7 @@ static void
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");
}
@@ -451,10 +449,7 @@ forget_cached_source_info (void)
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 ();
}
@@ -470,20 +465,20 @@ directory_command (const char *dirname, int from_tty)
{
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);
}
@@ -495,13 +490,13 @@ directory_command (const char *dirname, int 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);
}
@@ -689,6 +684,17 @@ add_path (const char *dirname, char **which_path, int parse_separators)
}
}
+/* 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)
@@ -967,7 +973,7 @@ source_full_path_of (const char *filename,
{
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)
@@ -1058,7 +1064,8 @@ find_and_open_source (const char *filename,
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
@@ -1104,19 +1111,22 @@ find_and_open_source (const char *filename,
/* 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 ();
}
}
diff --git a/gdb/source.h b/gdb/source.h
index 6c383ef..2b9e8f3 100644
--- a/gdb/source.h
+++ b/gdb/source.h
@@ -39,13 +39,14 @@ extern int openp (const char *, openp_flags, const char *, int,
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);
diff --git a/gdb/stack.c b/gdb/stack.c
index 7c4cf94..8b29ab5 100644
--- a/gdb/stack.c
+++ b/gdb/stack.c
@@ -2426,12 +2426,7 @@ print_frame_local_vars (struct frame_info *frame,
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. */
@@ -2490,9 +2485,11 @@ info_locals_command (const char *args, int from_tty)
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. */
@@ -2601,8 +2598,11 @@ info_args_command (const char *args, int from_tty)
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);
}
/* Return the symbol-block in which the selected frame is executing.
diff --git a/gdb/symfile.c b/gdb/symfile.c
index 0eb48d0..9e5c2d4 100644
--- a/gdb/symfile.c
+++ b/gdb/symfile.c
@@ -1349,7 +1349,7 @@ separate_debug_file_exists (const std::string &name, unsigned long crc,
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)
@@ -1406,8 +1406,9 @@ find_separate_debug_file (const char *dir,
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
@@ -1448,7 +1449,7 @@ find_separate_debug_file (const char *dir,
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)
{
@@ -2654,7 +2655,7 @@ add_filename_language (const char *ext, enum language lang)
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)
@@ -2669,48 +2670,48 @@ static void
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
{
@@ -3784,8 +3785,7 @@ test_set_ext_lang_command ()
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");
@@ -3793,8 +3793,7 @@ test_set_ext_lang_command ()
/* 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 ();
diff --git a/gdb/symtab.c b/gdb/symtab.c
index 6ec5d95..e6851c3 100644
--- a/gdb/symtab.c
+++ b/gdb/symtab.c
@@ -5170,12 +5170,7 @@ struct info_vars_funcs_options
{
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'
@@ -5198,8 +5193,7 @@ static const gdb::option::option_def info_vars_funcs_options_defs[] = {
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 */
}
@@ -5243,8 +5237,10 @@ info_variables_command (const char *args, int from_tty)
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. */
@@ -5260,8 +5256,10 @@ info_functions_command (const char *args, int from_tty)
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. */
@@ -6773,14 +6771,8 @@ info_module_subcommand (bool quiet, const char *module_regexp,
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'
@@ -6830,8 +6822,11 @@ info_module_functions_command (const char *args, int from_tty)
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. */
@@ -6846,8 +6841,11 @@ info_module_variables_command (const char *args, int from_tty)
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. */
diff --git a/gdb/target-descriptions.c b/gdb/target-descriptions.c
index f94ace7..f5ec617 100644
--- a/gdb/target-descriptions.c
+++ b/gdb/target-descriptions.c
@@ -510,7 +510,7 @@ target_desc_info_free (struct target_desc_info *tdesc_info)
/* 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. */
diff --git a/gdb/top.c b/gdb/top.c
index bca007e..75692d3 100644
--- a/gdb/top.c
+++ b/gdb/top.c
@@ -84,8 +84,6 @@
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
@@ -921,12 +919,16 @@ static bool command_editing_p;
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
@@ -960,24 +962,12 @@ show_history_remove_duplicates (struct ui_file *file, int from_tty,
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));
@@ -1244,14 +1234,15 @@ gdb_safe_append_history (void)
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));
@@ -1279,11 +1270,11 @@ gdb_safe_append_history (void)
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));
}
}
@@ -1656,12 +1647,12 @@ tree, and GDB will still find it.)\n\
/* 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;
}
@@ -1671,10 +1662,7 @@ get_prompt (void)
void
set_prompt (const char *s)
{
- char *p = xstrdup (s);
-
- xfree (top_prompt);
- top_prompt = p;
+ top_prompt = s;
}
@@ -1814,7 +1802,7 @@ quit_force (int *exit_arg, int from_tty)
/* 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;
@@ -2062,27 +2050,8 @@ init_history (void)
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
@@ -2132,21 +2101,20 @@ show_exec_done_display_p (struct ui_file *file, int from_tty,
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 ();
}
@@ -2171,12 +2139,13 @@ set_history_filename (const char *args,
/* 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 ();
}
}
@@ -2342,7 +2311,7 @@ When set, GDB uses the specified path to search for data files."),
&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, _("\
@@ -2428,3 +2397,28 @@ gdb_init ()
/* 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 ();
+ }
+}
diff --git a/gdb/top.h b/gdb/top.h
index ef88ca0..f8a5c39 100644
--- a/gdb/top.h
+++ b/gdb/top.h
@@ -261,7 +261,7 @@ extern scoped_value_mark prepare_execute_command (void);
/* 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. */
diff --git a/gdb/tracepoint.c b/gdb/tracepoint.c
index 06cf9ca..3997d21 100644
--- a/gdb/tracepoint.c
+++ b/gdb/tracepoint.c
@@ -130,7 +130,7 @@ static traceframe_info_up current_traceframe_info;
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;
@@ -146,15 +146,15 @@ static int trace_buffer_size = -1;
/* 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 */
@@ -1688,10 +1688,11 @@ start_tracing (const char *notes)
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. */
@@ -1764,7 +1765,8 @@ stop_tracing (const char *note)
}
if (!note)
- note = trace_stop_notes;
+ note = trace_stop_notes.c_str ();
+
ret = target_set_trace_notes (NULL, NULL, note);
if (!ret && note)
@@ -2804,10 +2806,10 @@ all_tracepoint_actions (struct breakpoint *t)
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,
@@ -2896,7 +2898,7 @@ set_trace_user (const char *args, int from_tty,
{
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"));
@@ -2908,7 +2910,7 @@ set_trace_notes (const char *args, int from_tty,
{
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"));
@@ -2920,7 +2922,7 @@ set_trace_stop_notes (const char *args, int from_tty,
{
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"));
@@ -4137,7 +4139,6 @@ Tracepoint actions may include collecting of specified data,\n\
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."), _("\
diff --git a/gdb/tracepoint.h b/gdb/tracepoint.h
index b32dd61..a66226f 100644
--- a/gdb/tracepoint.h
+++ b/gdb/tracepoint.h
@@ -159,7 +159,7 @@ struct trace_status
struct trace_status *current_trace_status (void);
-extern char *default_collect;
+extern std::string default_collect;
extern int trace_regblock_size;