Move vgdb special case into remote_filesystem_is_local

Valgrind GDB (vgdb) presents itself as a remote target but works on
the local filesystem.  gdb_bfd_open contained a special case to make
vgdb work with "target:" sysroots, but the implementation meant that
GDB would fall back to the local filesystem if *any* to_fileio_open
method failed with ENOSYS for *any* reason.  This commit moves the
vgdb special case to remote_filesystem_is_local to allow the fallback
to be restricted only to the specific case that remote file transfer
is unsupported.  This commit also adds a warning which is displayed
the first time the fallback is used.

gdb/ChangeLog:

	* gdb_bfd.c (gdb_bfd_open): Move vgdb special case to...
	* remote.c (remote_filesystem_is_local): ...here.
This commit is contained in:
Gary Benson 2015-06-05 16:08:05 +01:00
parent f8b447819b
commit e3dd7556ad
3 changed files with 59 additions and 24 deletions

View File

@ -1,3 +1,8 @@
2015-06-05 Gary Benson <gbenson@redhat.com>
* gdb_bfd.c (gdb_bfd_open): Move vgdb special case to...
* remote.c (remote_filesystem_is_local): ...here.
2015-06-04 Yao Qi <yao.qi@linaro.org>
* gdbarch.c: Regenerate it.

View File

@ -326,25 +326,11 @@ gdb_bfd_open (const char *name, const char *target, int fd)
{
gdb_assert (fd == -1);
abfd = gdb_bfd_openr_iovec (name, target,
return gdb_bfd_openr_iovec (name, target,
gdb_bfd_iovec_fileio_open, NULL,
gdb_bfd_iovec_fileio_pread,
gdb_bfd_iovec_fileio_close,
gdb_bfd_iovec_fileio_fstat);
if (abfd != NULL || errno != ENOSYS)
return abfd;
/* gdb_bfd_iovec_fileio_open failed with ENOSYS. This can
happen, for example, with vgdb (Valgrind GDB), which
presents itself as a remote target but works on the local
filesystem: it does not implement remote get and users
are not expected to set gdb_sysroot. To handle this case
we fall back to trying the local filesystem iff
gdb_sysroot is exactly TARGET_SYSROOT_PREFIX. */
if (gdb_sysroot == NULL
|| strcmp (gdb_sysroot, TARGET_SYSROOT_PREFIX) != 0)
return NULL;
}
name += strlen (TARGET_SYSROOT_PREFIX);

View File

@ -10213,15 +10213,6 @@ remote_hostio_send_command (int command_bytes, int which_packet,
return ret;
}
/* Return nonzero if the filesystem accessed by the target_fileio_*
methods is the local filesystem, zero otherwise. */
static int
remote_filesystem_is_local (struct target_ops *self)
{
return 0;
}
/* Open FILENAME on the remote target, using FLAGS and MODE. Return a
remote file descriptor, or -1 if an error occurs (and set
*REMOTE_ERRNO). */
@ -10459,6 +10450,59 @@ remote_hostio_fstat (struct target_ops *self,
return 0;
}
/* Return nonzero if the filesystem accessed by the target_fileio_*
methods is the local filesystem, zero otherwise. */
static int
remote_filesystem_is_local (struct target_ops *self)
{
/* Valgrind GDB presents itself as a remote target but works
on the local filesystem: it does not implement remote get
and users are not expected to set a sysroot. To handle
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 (gdb_sysroot != NULL
&& strcmp (gdb_sysroot, TARGET_SYSROOT_PREFIX) == 0)
{
enum packet_support ps = packet_support (PACKET_vFile_open);
if (ps == PACKET_SUPPORT_UNKNOWN)
{
int fd, remote_errno;
/* Try opening a file to probe support. The supplied
filename is irrelevant, we only care about whether
the stub recognizes the packet or not. */
fd = remote_hostio_open (self, "just probing",
FILEIO_O_RDONLY, 0700,
&remote_errno);
if (fd >= 0)
remote_hostio_close (self, fd, &remote_errno);
ps = packet_support (PACKET_vFile_open);
}
if (ps == PACKET_DISABLE)
{
static int warning_issued = 0;
if (!warning_issued)
{
warning (_("remote target does not support file"
" transfer, attempting to access files"
" from local filesystem."));
warning_issued = 1;
}
return 1;
}
}
return 0;
}
static int
remote_fileio_errno_to_host (int errnum)
{