Don't we already get behavior like this when we invoke a missing syscall? On Mon, Jun 29, 2015 at 2:18 AM, Pavel Labath <lab...@google.com> wrote:
> Author: labath > Date: Mon Jun 29 04:18:17 2015 > New Revision: 240927 > > URL: http://llvm.org/viewvc/llvm-project?rev=240927&view=rev > Log: > [linux] Use cmake to detect support process_vm_readv (bug #23918) > > Summary: > Some old linux versions do not have process_vm_readv function defined. > Even older versions do not > have even the __NR_process_vm_readv syscall number. We use cmake to detect > these situations and > fallback appropriately: in the first case, we can issue the syscall > manually, while it the latter > case, we need to drop fast memory read support completely. > > Test Plan: linux test suite passes > > Reviewers: ovyalov, Eugene.Zelenko > > Subscribers: tberghammer, lldb-commits > > Differential Revision: http://reviews.llvm.org/D10727 > > Added: > lldb/trunk/source/Host/linux/LibcGlue.cpp > - copied, changed from r240895, > lldb/trunk/source/Host/android/LibcGlue.cpp > Modified: > lldb/trunk/cmake/modules/LLDBConfig.cmake > lldb/trunk/include/lldb/Host/linux/Uio.h > lldb/trunk/source/Host/CMakeLists.txt > lldb/trunk/source/Host/android/LibcGlue.cpp > > Modified: lldb/trunk/cmake/modules/LLDBConfig.cmake > URL: > http://llvm.org/viewvc/llvm-project/lldb/trunk/cmake/modules/LLDBConfig.cmake?rev=240927&r1=240926&r2=240927&view=diff > > ============================================================================== > --- lldb/trunk/cmake/modules/LLDBConfig.cmake (original) > +++ lldb/trunk/cmake/modules/LLDBConfig.cmake Mon Jun 29 04:18:17 2015 > @@ -248,3 +248,27 @@ if(NOT LLDB_REQUIRES_RTTI) > endif() > > set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${LLDB_COMPILE_FLAGS}") > + > +if (CMAKE_SYSTEM_NAME MATCHES "Linux") > + # Check for syscall used by lldb-server on linux. > + # If these are not found, it will fall back to ptrace (slow) for > memory reads. > + check_cxx_source_compiles(" > + #include <sys/uio.h> > + int main() { process_vm_readv(0, nullptr, 0, nullptr, 0, 0); > return 0; }" > + HAVE_PROCESS_VM_READV) > + > + if (HAVE_PROCESS_VM_READV) > + add_definitions(-DHAVE_PROCESS_VM_READV) > + else() > + # If we don't have the syscall wrapper function, but we know the > syscall number, we can > + # still issue the syscall manually > + check_cxx_source_compiles(" > + #include <sys/syscall.h> > + int main() { return __NR_process_vm_readv; }" > + HAVE_NR_PROCESS_VM_READV) > + > + if (HAVE_NR_PROCESS_VM_READV) > + add_definitions(-DHAVE_NR_PROCESS_VM_READV) > + endif() > + endif() > +endif() > > Modified: lldb/trunk/include/lldb/Host/linux/Uio.h > URL: > http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Host/linux/Uio.h?rev=240927&r1=240926&r2=240927&view=diff > > ============================================================================== > --- lldb/trunk/include/lldb/Host/linux/Uio.h (original) > +++ lldb/trunk/include/lldb/Host/linux/Uio.h Mon Jun 29 04:18:17 2015 > @@ -12,8 +12,8 @@ > > #include <sys/uio.h> > > -// Android does not define the process_vm_readv wrapper > -#ifdef __ANDROID_NDK__ > +// We shall provide our own implementation of process_vm_readv if it is > not present > +#ifndef HAVE_PROCESS_VM_READV > ssize_t process_vm_readv(::pid_t pid, > const struct iovec *local_iov, unsigned long > liovcnt, > const struct iovec *remote_iov, unsigned long > riovcnt, > > Modified: lldb/trunk/source/Host/CMakeLists.txt > URL: > http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/CMakeLists.txt?rev=240927&r1=240926&r2=240927&view=diff > > ============================================================================== > --- lldb/trunk/source/Host/CMakeLists.txt (original) > +++ lldb/trunk/source/Host/CMakeLists.txt Mon Jun 29 04:18:17 2015 > @@ -110,6 +110,7 @@ else() > linux/Host.cpp > linux/HostInfoLinux.cpp > linux/HostThreadLinux.cpp > + linux/LibcGlue.cpp > linux/ThisThread.cpp > ) > else() > @@ -117,6 +118,7 @@ else() > linux/Host.cpp > linux/HostInfoLinux.cpp > linux/HostThreadLinux.cpp > + linux/LibcGlue.cpp > linux/ThisThread.cpp > ) > endif() > > Modified: lldb/trunk/source/Host/android/LibcGlue.cpp > URL: > http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/android/LibcGlue.cpp?rev=240927&r1=240926&r2=240927&view=diff > > ============================================================================== > --- lldb/trunk/source/Host/android/LibcGlue.cpp (original) > +++ lldb/trunk/source/Host/android/LibcGlue.cpp Mon Jun 29 04:18:17 2015 > @@ -12,7 +12,6 @@ > #include <android/api-level.h> > > #include <sys/syscall.h> > -#include <lldb/Host/linux/Uio.h> > > #if __ANDROID_API__ < 21 > > @@ -39,11 +38,3 @@ int posix_openpt(int flags) > } > > #endif > - > -ssize_t process_vm_readv(::pid_t pid, > - const struct iovec *local_iov, unsigned long > liovcnt, > - const struct iovec *remote_iov, unsigned long > riovcnt, > - unsigned long flags) > -{ > - return syscall(__NR_process_vm_readv, pid, local_iov, liovcnt, > remote_iov, riovcnt, flags); > -} > > Copied: lldb/trunk/source/Host/linux/LibcGlue.cpp (from r240895, > lldb/trunk/source/Host/android/LibcGlue.cpp) > URL: > http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/linux/LibcGlue.cpp?p2=lldb/trunk/source/Host/linux/LibcGlue.cpp&p1=lldb/trunk/source/Host/android/LibcGlue.cpp&r1=240895&r2=240927&rev=240927&view=diff > > ============================================================================== > --- lldb/trunk/source/Host/android/LibcGlue.cpp (original) > +++ lldb/trunk/source/Host/linux/LibcGlue.cpp Mon Jun 29 04:18:17 2015 > @@ -7,43 +7,23 @@ > // > > > //===----------------------------------------------------------------------===// > > -// This files adds functions missing from libc on earlier versions of > Android > - > -#include <android/api-level.h> > +// This file adds functions missing from libc on older versions of linux > > +#include <unistd.h> > #include <sys/syscall.h> > #include <lldb/Host/linux/Uio.h> > > -#if __ANDROID_API__ < 21 > - > -#include <sys/types.h> > -#include <sys/stat.h> > -#include <fcntl.h> > -#include <signal.h> > - > -#include "lldb/Host/Time.h" > - > -time_t timegm(struct tm* t) > -{ > - return (time_t) timegm64(t); > -} > - > -int signalfd (int fd, const sigset_t *mask, int flags) > -{ > - return syscall(__NR_signalfd4, fd, mask, _NSIG / 8, flags); > -} > - > -int posix_openpt(int flags) > -{ > - return open("/dev/ptmx", flags); > -} > - > -#endif > - > +#ifndef HAVE_PROCESS_VM_READV // If the syscall wrapper is not available, > provide one. > ssize_t process_vm_readv(::pid_t pid, > const struct iovec *local_iov, unsigned long > liovcnt, > const struct iovec *remote_iov, unsigned long > riovcnt, > unsigned long flags) > { > +#ifdef HAVE_NR_PROCESS_VM_READV // If we have the syscall number, we can > issue the syscall ourselves. > return syscall(__NR_process_vm_readv, pid, local_iov, liovcnt, > remote_iov, riovcnt, flags); > +#else // If not, let's pretend the syscall is not present. > + errno = ENOSYS; > + return -1; > +#endif > } > +#endif > > > _______________________________________________ > lldb-commits mailing list > lldb-commits@cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits >
_______________________________________________ lldb-commits mailing list lldb-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits