Change gdb_realpath to return a unique_xmalloc_ptr

This changes gdb_realpath to return a unique_xmalloc_ptr and fixes up
the callers.  This allows removing some cleanups.  This change by
itself caused xfullpath.exp to fail; and attempting to fix that ran
into various problems (like .get() being optimized out); so this patch
also rewrites xfullpath.exp to be a C++ selftest instead.

ChangeLog
2017-08-22  Tom Tromey  <tom@tromey.com>

	* exec.c (exec_file_attach): Update.
	* linux-thread-db.c (try_thread_db_load): Update.
	* guile/scm-safe-call.c (gdbscm_safe_source_script): Update.
	* utils.c (gdb_realpath): Change return type.
	(gdb_realpath_keepfile): Update.
	(gdb_realpath_check_trailer, gdb_realpath_tests): New functions.
	(_initialize_utils): Register the new self test.
	* source.c (openp): Update.
	(find_and_open_source): Update.
	* nto-tdep.c (nto_find_and_open_solib): Update.
	* main.c (set_gdb_data_directory): Update.
	(captured_main_1): Update.
	* dwarf2read.c (dwarf2_get_dwz_file): Update
	(dw2_map_symbol_filenames): Update.
	* auto-load.c (auto_load_safe_path_vec_update): Update.
	(filename_is_in_auto_load_safe_path_vec): Change type of
	"filename_realp".
	(auto_load_objfile_script): Update.
	(file_is_auto_load_safe): Update.  Use std::string.
	* utils.h (gdb_realpath): Return a gdb::unique_xmalloc_ptr.

testsuite/ChangeLog
2017-08-22  Tom Tromey  <tom@tromey.com>

	* gdb.gdb/xfullpath.exp: Remove.
This commit is contained in:
Tom Tromey
2017-08-03 16:53:22 -06:00
parent 4971c9a74b
commit 14278e1fdb
15 changed files with 130 additions and 145 deletions

View File

@ -66,6 +66,7 @@
#include "interps.h"
#include "gdb_regex.h"
#include "job-control.h"
#include "common/selftest.h"
#if !HAVE_DECL_MALLOC
extern PTR malloc (); /* ARI: PTR */
@ -2662,7 +2663,7 @@ string_to_core_addr (const char *my_string)
return addr;
}
char *
gdb::unique_xmalloc_ptr<char>
gdb_realpath (const char *filename)
{
/* On most hosts, we rely on canonicalize_file_name to compute
@ -2698,21 +2699,57 @@ gdb_realpath (const char *filename)
we might not be able to display the original casing in a given
path. */
if (len > 0 && len < MAX_PATH)
return xstrdup (buf);
return gdb::unique_xmalloc_ptr<char> (xstrdup (buf));
}
#else
{
char *rp = canonicalize_file_name (filename);
if (rp != NULL)
return rp;
return gdb::unique_xmalloc_ptr<char> (rp);
}
#endif
/* This system is a lost cause, just dup the buffer. */
return xstrdup (filename);
return gdb::unique_xmalloc_ptr<char> (xstrdup (filename));
}
#if GDB_SELF_TEST
static void
gdb_realpath_check_trailer (const char *input, const char *trailer)
{
gdb::unique_xmalloc_ptr<char> result = gdb_realpath (input);
size_t len = strlen (result.get ());
size_t trail_len = strlen (trailer);
SELF_CHECK (len >= trail_len
&& strcmp (result.get () + len - trail_len, trailer) == 0);
}
static void
gdb_realpath_tests ()
{
/* A file which contains a directory prefix. */
gdb_realpath_check_trailer ("./xfullpath.exp", "/xfullpath.exp");
/* A file which contains a directory prefix. */
gdb_realpath_check_trailer ("../../defs.h", "/defs.h");
/* A one-character filename. */
gdb_realpath_check_trailer ("./a", "/a");
/* A file in the root directory. */
gdb_realpath_check_trailer ("/root_file_which_should_exist",
"/root_file_which_should_exist");
/* A file which does not have a directory prefix. */
gdb_realpath_check_trailer ("xfullpath.exp", "xfullpath.exp");
/* A one-char filename without any directory prefix. */
gdb_realpath_check_trailer ("a", "a");
/* An empty filename. */
gdb_realpath_check_trailer ("", "");
}
#endif /* GDB_SELF_TEST */
/* Return a copy of FILENAME, with its directory prefix canonicalized
by gdb_realpath. */
@ -2721,7 +2758,6 @@ gdb_realpath_keepfile (const char *filename)
{
const char *base_name = lbasename (filename);
char *dir_name;
char *real_path;
char *result;
/* Extract the basename of filename, and return immediately
@ -2749,13 +2785,13 @@ gdb_realpath_keepfile (const char *filename)
/* Canonicalize the directory prefix, and build the resulting
filename. If the dirname realpath already contains an ending
directory separator, avoid doubling it. */
real_path = gdb_realpath (dir_name);
gdb::unique_xmalloc_ptr<char> path_storage = gdb_realpath (dir_name);
const char *real_path = path_storage.get ();
if (IS_DIR_SEPARATOR (real_path[strlen (real_path) - 1]))
result = concat (real_path, base_name, (char *) NULL);
else
result = concat (real_path, SLASH_STRING, base_name, (char *) NULL);
xfree (real_path);
return gdb::unique_xmalloc_ptr<char> (result);
}
@ -3283,4 +3319,8 @@ _initialize_utils (void)
add_internal_problem_command (&internal_error_problem);
add_internal_problem_command (&internal_warning_problem);
add_internal_problem_command (&demangler_warning_problem);
#if GDB_SELF_TEST
selftests::register_test (gdb_realpath_tests);
#endif
}