[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