Return unique_xmalloc_ptr from some solib.c functions
This changes a couple of solib.c functions -- exec_file_find and solib_find -- to return a unique_xmalloc_ptr, and then fixes up the users. This allows the removal of some cleanups. This also changes solib_bfd_open to not take ownership of its argument. I think this change is somewhat cleaner. gdb/ChangeLog 2018-02-14 Tom Tromey <tom@tromey.com> * solist.h (exec_file_find, solib_find): Return unique_xmalloc_ptr. (solib_bfd_fopen): Take a const char *. * solib.c (solib_find_1): Return unique_xmalloc_ptr. (exec_file_find, solib_find): Likewise. (solib_bfd_fopen): Do not take ownership of "pathname". (solib_bfd_open): Use unique_xmalloc_ptr. * solib-darwin.c (darwin_bfd_open): Use unique_xmalloc_ptr. * solib-aix.c (solib_aix_bfd_open): Use unique_xmalloc_ptr. * infrun.c (follow_exec): Use unique_xmalloc_ptr. * exec.c (exec_file_locate_attach): Use unique_xmalloc_ptr.
This commit is contained in:
parent
12ef3f5a7c
commit
797bc1cb25
7 changed files with 56 additions and 51 deletions
|
@ -1,3 +1,17 @@
|
||||||
|
2018-02-14 Tom Tromey <tom@tromey.com>
|
||||||
|
|
||||||
|
* solist.h (exec_file_find, solib_find): Return
|
||||||
|
unique_xmalloc_ptr.
|
||||||
|
(solib_bfd_fopen): Take a const char *.
|
||||||
|
* solib.c (solib_find_1): Return unique_xmalloc_ptr.
|
||||||
|
(exec_file_find, solib_find): Likewise.
|
||||||
|
(solib_bfd_fopen): Do not take ownership of "pathname".
|
||||||
|
(solib_bfd_open): Use unique_xmalloc_ptr.
|
||||||
|
* solib-darwin.c (darwin_bfd_open): Use unique_xmalloc_ptr.
|
||||||
|
* solib-aix.c (solib_aix_bfd_open): Use unique_xmalloc_ptr.
|
||||||
|
* infrun.c (follow_exec): Use unique_xmalloc_ptr.
|
||||||
|
* exec.c (exec_file_locate_attach): Use unique_xmalloc_ptr.
|
||||||
|
|
||||||
2018-02-14 Joel Brobecker <brobecker@adacore.com>
|
2018-02-14 Joel Brobecker <brobecker@adacore.com>
|
||||||
|
|
||||||
* ada-lang.c (name_match_type_from_name): Remove reference to
|
* ada-lang.c (name_match_type_from_name): Remove reference to
|
||||||
|
|
10
gdb/exec.c
10
gdb/exec.c
|
@ -190,8 +190,7 @@ try_open_exec_file (const char *exec_file_host, struct inferior *inf,
|
||||||
void
|
void
|
||||||
exec_file_locate_attach (int pid, int defer_bp_reset, int from_tty)
|
exec_file_locate_attach (int pid, int defer_bp_reset, int from_tty)
|
||||||
{
|
{
|
||||||
char *exec_file_target, *exec_file_host;
|
char *exec_file_target;
|
||||||
struct cleanup *old_chain;
|
|
||||||
symfile_add_flags add_flags = 0;
|
symfile_add_flags add_flags = 0;
|
||||||
|
|
||||||
/* Do nothing if we already have an executable filename. */
|
/* Do nothing if we already have an executable filename. */
|
||||||
|
@ -209,8 +208,8 @@ exec_file_locate_attach (int pid, int defer_bp_reset, int from_tty)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
exec_file_host = exec_file_find (exec_file_target, NULL);
|
gdb::unique_xmalloc_ptr<char> exec_file_host
|
||||||
old_chain = make_cleanup (xfree, exec_file_host);
|
= exec_file_find (exec_file_target, NULL);
|
||||||
|
|
||||||
if (defer_bp_reset)
|
if (defer_bp_reset)
|
||||||
add_flags |= SYMFILE_DEFER_BP_RESET;
|
add_flags |= SYMFILE_DEFER_BP_RESET;
|
||||||
|
@ -219,8 +218,7 @@ exec_file_locate_attach (int pid, int defer_bp_reset, int from_tty)
|
||||||
add_flags |= SYMFILE_VERBOSE;
|
add_flags |= SYMFILE_VERBOSE;
|
||||||
|
|
||||||
/* Attempt to open the exec file. */
|
/* Attempt to open the exec file. */
|
||||||
try_open_exec_file (exec_file_host, current_inferior (), add_flags);
|
try_open_exec_file (exec_file_host.get (), current_inferior (), add_flags);
|
||||||
do_cleanups (old_chain);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set FILENAME as the new exec file.
|
/* Set FILENAME as the new exec file.
|
||||||
|
|
10
gdb/infrun.c
10
gdb/infrun.c
|
@ -1081,8 +1081,6 @@ follow_exec (ptid_t ptid, char *exec_file_target)
|
||||||
struct inferior *inf = current_inferior ();
|
struct inferior *inf = current_inferior ();
|
||||||
int pid = ptid_get_pid (ptid);
|
int pid = ptid_get_pid (ptid);
|
||||||
ptid_t process_ptid;
|
ptid_t process_ptid;
|
||||||
char *exec_file_host;
|
|
||||||
struct cleanup *old_chain;
|
|
||||||
|
|
||||||
/* This is an exec event that we actually wish to pay attention to.
|
/* This is an exec event that we actually wish to pay attention to.
|
||||||
Refresh our symbol table to the newly exec'd program, remove any
|
Refresh our symbol table to the newly exec'd program, remove any
|
||||||
|
@ -1161,8 +1159,8 @@ follow_exec (ptid_t ptid, char *exec_file_target)
|
||||||
|
|
||||||
breakpoint_init_inferior (inf_execd);
|
breakpoint_init_inferior (inf_execd);
|
||||||
|
|
||||||
exec_file_host = exec_file_find (exec_file_target, NULL);
|
gdb::unique_xmalloc_ptr<char> exec_file_host
|
||||||
old_chain = make_cleanup (xfree, exec_file_host);
|
= exec_file_find (exec_file_target, NULL);
|
||||||
|
|
||||||
/* If we were unable to map the executable target pathname onto a host
|
/* If we were unable to map the executable target pathname onto a host
|
||||||
pathname, tell the user that. Otherwise GDB's subsequent behavior
|
pathname, tell the user that. Otherwise GDB's subsequent behavior
|
||||||
|
@ -1216,9 +1214,7 @@ follow_exec (ptid_t ptid, char *exec_file_target)
|
||||||
Executable) main symbol file will only be computed by
|
Executable) main symbol file will only be computed by
|
||||||
solib_create_inferior_hook below. breakpoint_re_set would fail
|
solib_create_inferior_hook below. breakpoint_re_set would fail
|
||||||
to insert the breakpoints with the zero displacement. */
|
to insert the breakpoints with the zero displacement. */
|
||||||
try_open_exec_file (exec_file_host, inf, SYMFILE_DEFER_BP_RESET);
|
try_open_exec_file (exec_file_host.get (), inf, SYMFILE_DEFER_BP_RESET);
|
||||||
|
|
||||||
do_cleanups (old_chain);
|
|
||||||
|
|
||||||
/* If the target can specify a description, read it. Must do this
|
/* If the target can specify a description, read it. Must do this
|
||||||
after flipping to the new executable (because the target supplied
|
after flipping to the new executable (because the target supplied
|
||||||
|
|
|
@ -614,7 +614,6 @@ solib_aix_bfd_open (char *pathname)
|
||||||
char *sep;
|
char *sep;
|
||||||
int filename_len;
|
int filename_len;
|
||||||
int found_file;
|
int found_file;
|
||||||
char *found_pathname;
|
|
||||||
|
|
||||||
if (pathname[path_len - 1] != ')')
|
if (pathname[path_len - 1] != ')')
|
||||||
return solib_bfd_open (pathname);
|
return solib_bfd_open (pathname);
|
||||||
|
@ -638,10 +637,12 @@ solib_aix_bfd_open (char *pathname)
|
||||||
/* Calling solib_find makes certain that sysroot path is set properly
|
/* Calling solib_find makes certain that sysroot path is set properly
|
||||||
if program has a dependency on .a archive and sysroot is set via
|
if program has a dependency on .a archive and sysroot is set via
|
||||||
set sysroot command. */
|
set sysroot command. */
|
||||||
found_pathname = solib_find (filename.c_str (), &found_file);
|
gdb::unique_xmalloc_ptr<char> found_pathname
|
||||||
|
= solib_find (filename.c_str (), &found_file);
|
||||||
if (found_pathname == NULL)
|
if (found_pathname == NULL)
|
||||||
perror_with_name (pathname);
|
perror_with_name (pathname);
|
||||||
gdb_bfd_ref_ptr archive_bfd (solib_bfd_fopen (found_pathname, found_file));
|
gdb_bfd_ref_ptr archive_bfd (solib_bfd_fopen (found_pathname.get (),
|
||||||
|
found_file));
|
||||||
if (archive_bfd == NULL)
|
if (archive_bfd == NULL)
|
||||||
{
|
{
|
||||||
warning (_("Could not open `%s' as an executable file: %s"),
|
warning (_("Could not open `%s' as an executable file: %s"),
|
||||||
|
|
|
@ -619,16 +619,16 @@ darwin_lookup_lib_symbol (struct objfile *objfile,
|
||||||
static gdb_bfd_ref_ptr
|
static gdb_bfd_ref_ptr
|
||||||
darwin_bfd_open (char *pathname)
|
darwin_bfd_open (char *pathname)
|
||||||
{
|
{
|
||||||
char *found_pathname;
|
|
||||||
int found_file;
|
int found_file;
|
||||||
|
|
||||||
/* Search for shared library file. */
|
/* Search for shared library file. */
|
||||||
found_pathname = solib_find (pathname, &found_file);
|
gdb::unique_xmalloc_ptr<char> found_pathname
|
||||||
|
= solib_find (pathname, &found_file);
|
||||||
if (found_pathname == NULL)
|
if (found_pathname == NULL)
|
||||||
perror_with_name (pathname);
|
perror_with_name (pathname);
|
||||||
|
|
||||||
/* Open bfd for shared library. */
|
/* Open bfd for shared library. */
|
||||||
gdb_bfd_ref_ptr abfd (solib_bfd_fopen (found_pathname, found_file));
|
gdb_bfd_ref_ptr abfd (solib_bfd_fopen (found_pathname.get (), found_file));
|
||||||
|
|
||||||
gdb_bfd_ref_ptr res
|
gdb_bfd_ref_ptr res
|
||||||
(gdb_bfd_mach_o_fat_extract (abfd.get (), bfd_object,
|
(gdb_bfd_mach_o_fat_extract (abfd.get (), bfd_object,
|
||||||
|
|
52
gdb/solib.c
52
gdb/solib.c
|
@ -111,11 +111,9 @@ show_solib_search_path (struct ui_file *file, int from_tty,
|
||||||
# define DOS_BASED_FILE_SYSTEM 0
|
# define DOS_BASED_FILE_SYSTEM 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Return the full pathname of a binary file (the main executable
|
/* Return the full pathname of a binary file (the main executable or a
|
||||||
or a shared library file), or NULL if not found. The returned
|
shared library file), or NULL if not found. If FD is non-NULL, *FD
|
||||||
pathname is malloc'ed and must be freed by the caller. If FD
|
is set to either -1 or an open file handle for the binary file.
|
||||||
is non-NULL, *FD is set to either -1 or an open file handle for
|
|
||||||
the binary file.
|
|
||||||
|
|
||||||
Global variable GDB_SYSROOT is used as a prefix directory
|
Global variable GDB_SYSROOT is used as a prefix directory
|
||||||
to search for binary files if they have an absolute path.
|
to search for binary files if they have an absolute path.
|
||||||
|
@ -148,7 +146,7 @@ show_solib_search_path (struct ui_file *file, int from_tty,
|
||||||
* machines since a sysroot will almost always be set.
|
* machines since a sysroot will almost always be set.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static char *
|
static gdb::unique_xmalloc_ptr<char>
|
||||||
solib_find_1 (const char *in_pathname, int *fd, int is_solib)
|
solib_find_1 (const char *in_pathname, int *fd, int is_solib)
|
||||||
{
|
{
|
||||||
const struct target_so_ops *ops = solib_ops (target_gdbarch ());
|
const struct target_so_ops *ops = solib_ops (target_gdbarch ());
|
||||||
|
@ -251,7 +249,7 @@ solib_find_1 (const char *in_pathname, int *fd, int is_solib)
|
||||||
{
|
{
|
||||||
if (fd != NULL)
|
if (fd != NULL)
|
||||||
*fd = -1;
|
*fd = -1;
|
||||||
return temp_pathname;
|
return gdb::unique_xmalloc_ptr<char> (temp_pathname);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Now see if we can open it. */
|
/* Now see if we can open it. */
|
||||||
|
@ -367,18 +365,17 @@ solib_find_1 (const char *in_pathname, int *fd, int is_solib)
|
||||||
else
|
else
|
||||||
*fd = found_file;
|
*fd = found_file;
|
||||||
|
|
||||||
return temp_pathname;
|
return gdb::unique_xmalloc_ptr<char> (temp_pathname);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return the full pathname of the main executable, or NULL if not
|
/* Return the full pathname of the main executable, or NULL if not
|
||||||
found. The returned pathname is malloc'ed and must be freed by
|
found. If FD is non-NULL, *FD is set to either -1 or an open file
|
||||||
the caller. If FD is non-NULL, *FD is set to either -1 or an open
|
handle for the main executable. */
|
||||||
file handle for the main executable. */
|
|
||||||
|
|
||||||
char *
|
gdb::unique_xmalloc_ptr<char>
|
||||||
exec_file_find (const char *in_pathname, int *fd)
|
exec_file_find (const char *in_pathname, int *fd)
|
||||||
{
|
{
|
||||||
char *result;
|
gdb::unique_xmalloc_ptr<char> result;
|
||||||
const char *fskind = effective_target_file_system_kind ();
|
const char *fskind = effective_target_file_system_kind ();
|
||||||
|
|
||||||
if (in_pathname == NULL)
|
if (in_pathname == NULL)
|
||||||
|
@ -409,8 +406,11 @@ exec_file_find (const char *in_pathname, int *fd)
|
||||||
(If that fails, we'll just fall back on the original
|
(If that fails, we'll just fall back on the original
|
||||||
filename. Not much more we can do...) */
|
filename. Not much more we can do...) */
|
||||||
|
|
||||||
if (!source_full_path_of (in_pathname, &result))
|
char *full_path = NULL;
|
||||||
result = xstrdup (in_pathname);
|
if (source_full_path_of (in_pathname, &full_path))
|
||||||
|
result.reset (full_path);
|
||||||
|
else
|
||||||
|
result.reset (xstrdup (in_pathname));
|
||||||
if (fd != NULL)
|
if (fd != NULL)
|
||||||
*fd = -1;
|
*fd = -1;
|
||||||
}
|
}
|
||||||
|
@ -419,14 +419,13 @@ exec_file_find (const char *in_pathname, int *fd)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return the full pathname of a shared library file, or NULL if not
|
/* Return the full pathname of a shared library file, or NULL if not
|
||||||
found. The returned pathname is malloc'ed and must be freed by
|
found. If FD is non-NULL, *FD is set to either -1 or an open file
|
||||||
the caller. If FD is non-NULL, *FD is set to either -1 or an open
|
handle for the shared library.
|
||||||
file handle for the shared library.
|
|
||||||
|
|
||||||
The search algorithm used is described in solib_find_1's comment
|
The search algorithm used is described in solib_find_1's comment
|
||||||
above. */
|
above. */
|
||||||
|
|
||||||
char *
|
gdb::unique_xmalloc_ptr<char>
|
||||||
solib_find (const char *in_pathname, int *fd)
|
solib_find (const char *in_pathname, int *fd)
|
||||||
{
|
{
|
||||||
const char *solib_symbols_extension
|
const char *solib_symbols_extension
|
||||||
|
@ -463,12 +462,10 @@ solib_find (const char *in_pathname, int *fd)
|
||||||
it is used as file handle to open the file. Throws an error if the file
|
it is used as file handle to open the file. Throws an error if the file
|
||||||
could not be opened. Handles both local and remote file access.
|
could not be opened. Handles both local and remote file access.
|
||||||
|
|
||||||
PATHNAME must be malloc'ed by the caller. It will be freed by this
|
If unsuccessful, the FD will be closed (unless FD was -1). */
|
||||||
function. If unsuccessful, the FD will be closed (unless FD was
|
|
||||||
-1). */
|
|
||||||
|
|
||||||
gdb_bfd_ref_ptr
|
gdb_bfd_ref_ptr
|
||||||
solib_bfd_fopen (char *pathname, int fd)
|
solib_bfd_fopen (const char *pathname, int fd)
|
||||||
{
|
{
|
||||||
gdb_bfd_ref_ptr abfd (gdb_bfd_open (pathname, gnutarget, fd));
|
gdb_bfd_ref_ptr abfd (gdb_bfd_open (pathname, gnutarget, fd));
|
||||||
|
|
||||||
|
@ -478,13 +475,10 @@ solib_bfd_fopen (char *pathname, int fd)
|
||||||
if (abfd == NULL)
|
if (abfd == NULL)
|
||||||
{
|
{
|
||||||
/* Arrange to free PATHNAME when the error is thrown. */
|
/* Arrange to free PATHNAME when the error is thrown. */
|
||||||
gdb::unique_xmalloc_ptr<char> free_pathname (pathname);
|
|
||||||
error (_("Could not open `%s' as an executable file: %s"),
|
error (_("Could not open `%s' as an executable file: %s"),
|
||||||
pathname, bfd_errmsg (bfd_get_error ()));
|
pathname, bfd_errmsg (bfd_get_error ()));
|
||||||
}
|
}
|
||||||
|
|
||||||
xfree (pathname);
|
|
||||||
|
|
||||||
return abfd;
|
return abfd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -493,12 +487,12 @@ solib_bfd_fopen (char *pathname, int fd)
|
||||||
gdb_bfd_ref_ptr
|
gdb_bfd_ref_ptr
|
||||||
solib_bfd_open (char *pathname)
|
solib_bfd_open (char *pathname)
|
||||||
{
|
{
|
||||||
char *found_pathname;
|
|
||||||
int found_file;
|
int found_file;
|
||||||
const struct bfd_arch_info *b;
|
const struct bfd_arch_info *b;
|
||||||
|
|
||||||
/* Search for shared library file. */
|
/* Search for shared library file. */
|
||||||
found_pathname = solib_find (pathname, &found_file);
|
gdb::unique_xmalloc_ptr<char> found_pathname
|
||||||
|
= solib_find (pathname, &found_file);
|
||||||
if (found_pathname == NULL)
|
if (found_pathname == NULL)
|
||||||
{
|
{
|
||||||
/* Return failure if the file could not be found, so that we can
|
/* Return failure if the file could not be found, so that we can
|
||||||
|
@ -510,7 +504,7 @@ solib_bfd_open (char *pathname)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Open bfd for shared library. */
|
/* Open bfd for shared library. */
|
||||||
gdb_bfd_ref_ptr abfd (solib_bfd_fopen (found_pathname, found_file));
|
gdb_bfd_ref_ptr abfd (solib_bfd_fopen (found_pathname.get (), found_file));
|
||||||
|
|
||||||
/* Check bfd format. */
|
/* Check bfd format. */
|
||||||
if (!bfd_check_format (abfd.get (), bfd_object))
|
if (!bfd_check_format (abfd.get (), bfd_object))
|
||||||
|
|
|
@ -192,13 +192,15 @@ typedef std::unique_ptr<so_list, so_deleter> so_list_up;
|
||||||
struct so_list *master_so_list (void);
|
struct so_list *master_so_list (void);
|
||||||
|
|
||||||
/* Find main executable binary file. */
|
/* Find main executable binary file. */
|
||||||
extern char *exec_file_find (const char *in_pathname, int *fd);
|
extern gdb::unique_xmalloc_ptr<char> exec_file_find (const char *in_pathname,
|
||||||
|
int *fd);
|
||||||
|
|
||||||
/* Find shared library binary file. */
|
/* Find shared library binary file. */
|
||||||
extern char *solib_find (const char *in_pathname, int *fd);
|
extern gdb::unique_xmalloc_ptr<char> solib_find (const char *in_pathname,
|
||||||
|
int *fd);
|
||||||
|
|
||||||
/* Open BFD for shared library file. */
|
/* Open BFD for shared library file. */
|
||||||
extern gdb_bfd_ref_ptr solib_bfd_fopen (char *pathname, int fd);
|
extern gdb_bfd_ref_ptr solib_bfd_fopen (const char *pathname, int fd);
|
||||||
|
|
||||||
/* Find solib binary file and open it. */
|
/* Find solib binary file and open it. */
|
||||||
extern gdb_bfd_ref_ptr solib_bfd_open (char *in_pathname);
|
extern gdb_bfd_ref_ptr solib_bfd_open (char *in_pathname);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue