[Lldb-commits] [lldb] r240927 - [linux] Use cmake to detect support process_vm_readv (bug #23918)

Pavel Labath labath at google.com
Mon Jun 29 02:18:17 PDT 2015


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





More information about the lldb-commits mailing list