mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-05-31 10:09:16 +08:00
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:
54
gdb/utils.c
54
gdb/utils.c
@ -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
|
||||
}
|
||||
|
Reference in New Issue
Block a user