Make relocate_{path,gdb_directory} return std::string

This simplifies memory management. I've also changed some global variables
to std::string accordingly (which store the result of these functions),
but not all because some are used with add_setshow_optional_filename_cmd
which requires a char*.

gdb/ChangeLog:

2019-09-11  Christian Biesinger  <cbiesinger@google.com>

	* auto-load.c (auto_load_expand_dir_vars): Update.
	* defs.h (gdb_datadir): Change to std::string.
	(python_libdir): Likewise.
	(relocate_gdb_directory): Change return type to std::string.
	* guile/guile.c (gdbscm_data_directory): Update.
	(initialize_scheme_side): Update.
	* jit.c (jit_reader_dir): Change to std::string.
	(jit_reader_load_command): Update.
	* main.c (gdb_datadir): Change to std::string.
	(python_libdir): Likewise.
	(set_gdb_data_directory): Update.
	(relocate_path): Change to return std::string.
	(relocate_gdb_directory): Change to return std::string.
	(relocate_gdbinit_path_maybe_in_datadir): Update.
	(captured_main_1): Update.
	* python/python.c (do_start_initialization): Update.
	* top.c (show_gdb_datadir): Update.
	* xml-syscall.c (xml_init_syscalls_info): Update.
	(init_syscalls_info): Update.
This commit is contained in:
Christian Biesinger 2019-09-09 12:55:39 -05:00
parent 9224a01377
commit f2aec7f6d1
9 changed files with 81 additions and 60 deletions

View File

@ -1,3 +1,25 @@
2019-09-11 Christian Biesinger <cbiesinger@google.com>
* auto-load.c (auto_load_expand_dir_vars): Update.
* defs.h (gdb_datadir): Change to std::string.
(python_libdir): Likewise.
(relocate_gdb_directory): Change return type to std::string.
* guile/guile.c (gdbscm_data_directory): Update.
(initialize_scheme_side): Update.
* jit.c (jit_reader_dir): Change to std::string.
(jit_reader_load_command): Update.
* main.c (gdb_datadir): Change to std::string.
(python_libdir): Likewise.
(set_gdb_data_directory): Update.
(relocate_path): Change to return std::string.
(relocate_gdb_directory): Change to return std::string.
(relocate_gdbinit_path_maybe_in_datadir): Update.
(captured_main_1): Update.
* python/python.c (do_start_initialization): Update.
* top.c (show_gdb_datadir): Update.
* xml-syscall.c (xml_init_syscalls_info): Update.
(init_syscalls_info): Update.
2019-09-11 Christian Biesinger <cbiesinger@google.com> 2019-09-11 Christian Biesinger <cbiesinger@google.com>
* main.c (relocate_gdbinit_path_maybe_in_datadir): Factor this code * main.c (relocate_gdbinit_path_maybe_in_datadir): Factor this code

View File

@ -178,7 +178,7 @@ static std::vector<gdb::unique_xmalloc_ptr<char>>
auto_load_expand_dir_vars (const char *string) auto_load_expand_dir_vars (const char *string)
{ {
char *s = xstrdup (string); char *s = xstrdup (string);
substitute_path_component (&s, "$datadir", gdb_datadir); 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);
if (debug_auto_load && strcmp (s, string) != 0) if (debug_auto_load && strcmp (s, string) != 0)

View File

@ -115,11 +115,11 @@ extern int dbx_commands;
extern char *gdb_sysroot; extern char *gdb_sysroot;
/* * GDB datadir, used to store data files. */ /* * GDB datadir, used to store data files. */
extern char *gdb_datadir; extern std::string gdb_datadir;
/* * If non-NULL, the possibly relocated path to python's "lib" directory /* * If not empty, the possibly relocated path to python's "lib" directory
specified with --with-python. */ specified with --with-python. */
extern char *python_libdir; extern std::string python_libdir;
/* * Search path for separate debug files. */ /* * Search path for separate debug files. */
extern char *debug_file_directory; extern char *debug_file_directory;
@ -282,7 +282,7 @@ struct value;
/* This really belong in utils.c (path-utils.c?), but it references some /* This really belong in utils.c (path-utils.c?), but it references some
globals that are currently only available to main.c. */ globals that are currently only available to main.c. */
extern char *relocate_gdb_directory (const char *initial, bool relocatable); extern std::string relocate_gdb_directory (const char *initial, bool relocatable);
/* Annotation stuff. */ /* Annotation stuff. */

View File

@ -325,7 +325,7 @@ gdbscm_execute_gdb_command (SCM command_scm, SCM rest)
static SCM static SCM
gdbscm_data_directory (void) gdbscm_data_directory (void)
{ {
return gdbscm_scm_from_c_string (gdb_datadir); return gdbscm_scm_from_c_string (gdb_datadir.c_str ());
} }
/* (guile-data-directory) -> string */ /* (guile-data-directory) -> string */
@ -582,7 +582,8 @@ initialize_scheme_side (void)
{ {
char *boot_scm_path; char *boot_scm_path;
guile_datadir = concat (gdb_datadir, SLASH_STRING, "guile", (char *) NULL); guile_datadir = concat (gdb_datadir.c_str (), SLASH_STRING, "guile",
(char *) NULL);
boot_scm_path = concat (guile_datadir, SLASH_STRING, "gdb", boot_scm_path = concat (guile_datadir, SLASH_STRING, "gdb",
SLASH_STRING, boot_scm_filename, (char *) NULL); SLASH_STRING, boot_scm_filename, (char *) NULL);

View File

@ -42,7 +42,7 @@
#include "readline/tilde.h" #include "readline/tilde.h"
#include "completer.h" #include "completer.h"
static const char *jit_reader_dir = NULL; static std::string jit_reader_dir;
static const struct objfile_data *jit_objfile_data; static const struct objfile_data *jit_objfile_data;
@ -216,7 +216,7 @@ jit_reader_load_command (const char *args, int from_tty)
error (_("JIT reader already loaded. Run jit-reader-unload first.")); error (_("JIT reader already loaded. Run jit-reader-unload first."));
if (!IS_ABSOLUTE_PATH (file.get ())) if (!IS_ABSOLUTE_PATH (file.get ()))
file.reset (xstrprintf ("%s%s%s", jit_reader_dir, SLASH_STRING, file.reset (xstrprintf ("%s%s%s", jit_reader_dir.c_str (), SLASH_STRING,
file.get ())); file.get ()));
loaded_jit_reader = jit_reader_load (file.get ()); loaded_jit_reader = jit_reader_load (file.get ());

View File

@ -61,7 +61,7 @@ int dbx_commands = 0;
char *gdb_sysroot = 0; char *gdb_sysroot = 0;
/* GDB datadir, used to store data files. */ /* GDB datadir, used to store data files. */
char *gdb_datadir = 0; std::string gdb_datadir;
/* Non-zero if GDB_DATADIR was provided on the command line. /* Non-zero if GDB_DATADIR was provided on the command line.
This doesn't track whether data-directory is set later from the This doesn't track whether data-directory is set later from the
@ -70,7 +70,7 @@ static int gdb_datadir_provided = 0;
/* If gdb was configured with --with-python=/path, /* If gdb was configured with --with-python=/path,
the possibly relocated path to python's lib directory. */ the possibly relocated path to python's lib directory. */
char *python_libdir = 0; std::string python_libdir;
/* Target IO streams. */ /* Target IO streams. */
struct ui_file *gdb_stdtargin; struct ui_file *gdb_stdtargin;
@ -121,71 +121,70 @@ set_gdb_data_directory (const char *new_datadir)
else if (!S_ISDIR (st.st_mode)) else if (!S_ISDIR (st.st_mode))
warning (_("%s is not a directory."), new_datadir); warning (_("%s is not a directory."), new_datadir);
xfree (gdb_datadir); gdb_datadir = gdb_realpath (new_datadir).get ();
gdb_datadir = gdb_realpath (new_datadir).release ();
/* gdb_realpath won't return an absolute path if the path doesn't exist, /* gdb_realpath won't return an absolute path if the path doesn't exist,
but we still want to record an absolute path here. If the user entered but we still want to record an absolute path here. If the user entered
"../foo" and "../foo" doesn't exist then we'll record $(pwd)/../foo which "../foo" and "../foo" doesn't exist then we'll record $(pwd)/../foo which
isn't canonical, but that's ok. */ isn't canonical, but that's ok. */
if (!IS_ABSOLUTE_PATH (gdb_datadir)) if (!IS_ABSOLUTE_PATH (gdb_datadir.c_str ()))
{ {
gdb::unique_xmalloc_ptr<char> abs_datadir = gdb_abspath (gdb_datadir); gdb::unique_xmalloc_ptr<char> abs_datadir
= gdb_abspath (gdb_datadir.c_str ());
xfree (gdb_datadir); gdb_datadir = abs_datadir.get ();
gdb_datadir = abs_datadir.release ();
} }
} }
/* Relocate a file or directory. PROGNAME is the name by which gdb /* Relocate a file or directory. PROGNAME is the name by which gdb
was invoked (i.e., argv[0]). INITIAL is the default value for the was invoked (i.e., argv[0]). INITIAL is the default value for the
file or directory. RELOCATABLE is true if the value is relocatable, file or directory. RELOCATABLE is true if the value is relocatable,
false otherwise. Returns a newly allocated string; this may return false otherwise. This may return an empty string under the same
NULL under the same conditions as make_relative_prefix. */ conditions as make_relative_prefix returning NULL. */
static char * static std::string
relocate_path (const char *progname, const char *initial, bool relocatable) relocate_path (const char *progname, const char *initial, bool relocatable)
{ {
if (relocatable) if (relocatable)
return make_relative_prefix (progname, BINDIR, initial); {
return xstrdup (initial); gdb::unique_xmalloc_ptr<char> str (make_relative_prefix (progname,
BINDIR,
initial));
if (str != nullptr)
return str.get ();
return std::string ();
}
return initial;
} }
/* Like relocate_path, but specifically checks for a directory. /* Like relocate_path, but specifically checks for a directory.
INITIAL is relocated according to the rules of relocate_path. If INITIAL is relocated according to the rules of relocate_path. If
the result is a directory, it is used; otherwise, INITIAL is used. the result is a directory, it is used; otherwise, INITIAL is used.
The chosen directory is then canonicalized using lrealpath. This The chosen directory is then canonicalized using lrealpath. */
function always returns a newly-allocated string. */
char * std::string
relocate_gdb_directory (const char *initial, bool relocatable) relocate_gdb_directory (const char *initial, bool relocatable)
{ {
char *dir; std::string dir = relocate_path (gdb_program_name, initial, relocatable);
if (!dir.empty ())
dir = relocate_path (gdb_program_name, initial, relocatable);
if (dir)
{ {
struct stat s; struct stat s;
if (*dir == '\0' || stat (dir, &s) != 0 || !S_ISDIR (s.st_mode)) if (stat (dir.c_str (), &s) != 0 || !S_ISDIR (s.st_mode))
{ {
xfree (dir); dir.clear ();
dir = NULL;
} }
} }
if (!dir) if (dir.empty ())
dir = xstrdup (initial); dir = initial;
/* Canonicalize the directory. */ /* Canonicalize the directory. */
if (*dir) if (!dir.empty ())
{ {
char *canon_sysroot = lrealpath (dir); gdb::unique_xmalloc_ptr<char> canon_sysroot (lrealpath (dir.c_str ()));
if (canon_sysroot) if (canon_sysroot)
{ dir = canon_sysroot.get ();
xfree (dir);
dir = canon_sysroot;
}
} }
return dir; return dir;
@ -220,14 +219,9 @@ relocate_gdbinit_path_maybe_in_datadir (const std::string& file)
} }
else else
{ {
char *relocated = relocate_path (gdb_program_name, relocated_path = relocate_path (gdb_program_name,
file.c_str (), file.c_str (),
SYSTEM_GDBINIT_RELOCATABLE); SYSTEM_GDBINIT_RELOCATABLE);
if (relocated != nullptr)
{
relocated_path = relocated;
xfree (relocated);
}
} }
return relocated_path; return relocated_path;
} }
@ -541,20 +535,23 @@ captured_main_1 (struct captured_main_args *context)
perror_warning_with_name (_("error finding working directory")); perror_warning_with_name (_("error finding working directory"));
/* Set the sysroot path. */ /* Set the sysroot path. */
gdb_sysroot = relocate_gdb_directory (TARGET_SYSTEM_ROOT, gdb_sysroot
TARGET_SYSTEM_ROOT_RELOCATABLE); = xstrdup (relocate_gdb_directory (TARGET_SYSTEM_ROOT,
TARGET_SYSTEM_ROOT_RELOCATABLE).c_str ());
if (gdb_sysroot == NULL || *gdb_sysroot == '\0') if (*gdb_sysroot == '\0')
{ {
xfree (gdb_sysroot); xfree (gdb_sysroot);
gdb_sysroot = xstrdup (TARGET_SYSROOT_PREFIX); gdb_sysroot = xstrdup (TARGET_SYSROOT_PREFIX);
} }
debug_file_directory = relocate_gdb_directory (DEBUGDIR, debug_file_directory
DEBUGDIR_RELOCATABLE); = xstrdup (relocate_gdb_directory (DEBUGDIR,
DEBUGDIR_RELOCATABLE).c_str ());
gdb_datadir = relocate_gdb_directory (GDB_DATADIR, gdb_datadir
GDB_DATADIR_RELOCATABLE); = xstrdup (relocate_gdb_directory (GDB_DATADIR,
GDB_DATADIR_RELOCATABLE).c_str ());
#ifdef WITH_PYTHON_PATH #ifdef WITH_PYTHON_PATH
{ {

View File

@ -1608,7 +1608,7 @@ do_start_initialization ()
/foo/lib/pythonX.Y/... /foo/lib/pythonX.Y/...
This must be done before calling Py_Initialize. */ This must be done before calling Py_Initialize. */
gdb::unique_xmalloc_ptr<char> progname gdb::unique_xmalloc_ptr<char> progname
(concat (ldirname (python_libdir).c_str (), SLASH_STRING, "bin", (concat (ldirname (python_libdir.c_str ()).c_str (), SLASH_STRING, "bin",
SLASH_STRING, "python", (char *) NULL)); SLASH_STRING, "python", (char *) NULL));
#ifdef IS_PY3K #ifdef IS_PY3K
std::string oldloc = setlocale (LC_ALL, NULL); std::string oldloc = setlocale (LC_ALL, NULL);

View File

@ -2038,7 +2038,7 @@ show_gdb_datadir (struct ui_file *file, int from_tty,
struct cmd_list_element *c, const char *value) struct cmd_list_element *c, const char *value)
{ {
fprintf_filtered (file, _("GDB's data directory is \"%s\".\n"), fprintf_filtered (file, _("GDB's data directory is \"%s\".\n"),
gdb_datadir); gdb_datadir.c_str ());
} }
static void static void

View File

@ -316,7 +316,8 @@ static struct syscalls_info *
xml_init_syscalls_info (const char *filename) xml_init_syscalls_info (const char *filename)
{ {
gdb::optional<gdb::char_vector> full_file gdb::optional<gdb::char_vector> full_file
= xml_fetch_content_from_file (filename, gdb_datadir); = xml_fetch_content_from_file (filename,
const_cast<char *>(gdb_datadir.c_str ()));
if (!full_file) if (!full_file)
return NULL; return NULL;
@ -336,7 +337,7 @@ init_syscalls_info (struct gdbarch *gdbarch)
/* Should we re-read the XML info for this target? */ /* Should we re-read the XML info for this target? */
if (syscalls_info != NULL && !syscalls_info->my_gdb_datadir.empty () if (syscalls_info != NULL && !syscalls_info->my_gdb_datadir.empty ()
&& filename_cmp (syscalls_info->my_gdb_datadir.c_str (), && filename_cmp (syscalls_info->my_gdb_datadir.c_str (),
gdb_datadir) != 0) gdb_datadir.c_str ()) != 0)
{ {
/* The data-directory changed from the last time we used it. /* The data-directory changed from the last time we used it.
It means that we have to re-read the XML info. */ It means that we have to re-read the XML info. */
@ -361,7 +362,7 @@ init_syscalls_info (struct gdbarch *gdbarch)
{ {
if (xml_syscall_file != NULL) if (xml_syscall_file != NULL)
warning (_("Could not load the syscall XML file `%s/%s'."), warning (_("Could not load the syscall XML file `%s/%s'."),
gdb_datadir, xml_syscall_file); gdb_datadir.c_str (), xml_syscall_file);
else else
warning (_("There is no XML file to open.")); warning (_("There is no XML file to open."));