[Lldb-commits] [lldb] r240927 - [linux] Use cmake to detect support process_vm_readv (bug #23918)
Vince Harron
vince at nethacker.com
Mon Jun 29 12:17:21 PDT 2015
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 <labath at 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 at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20150629/c98c38e0/attachment.html>
More information about the lldb-commits
mailing list