Index: lldb/trunk/cmake/modules/LLDBConfig.cmake
===================================================================
--- lldb/trunk/cmake/modules/LLDBConfig.cmake
+++ lldb/trunk/cmake/modules/LLDBConfig.cmake
@@ -248,3 +248,27 @@
 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()
Index: lldb/trunk/include/lldb/Host/linux/Uio.h
===================================================================
--- lldb/trunk/include/lldb/Host/linux/Uio.h
+++ lldb/trunk/include/lldb/Host/linux/Uio.h
@@ -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,
Index: lldb/trunk/source/Host/CMakeLists.txt
===================================================================
--- lldb/trunk/source/Host/CMakeLists.txt
+++ lldb/trunk/source/Host/CMakeLists.txt
@@ -110,6 +110,7 @@
         linux/Host.cpp
         linux/HostInfoLinux.cpp
         linux/HostThreadLinux.cpp
+        linux/LibcGlue.cpp
         linux/ThisThread.cpp
         )
     else()
@@ -117,6 +118,7 @@
         linux/Host.cpp
         linux/HostInfoLinux.cpp
         linux/HostThreadLinux.cpp
+        linux/LibcGlue.cpp
         linux/ThisThread.cpp
         )
     endif()
Index: lldb/trunk/source/Host/android/LibcGlue.cpp
===================================================================
--- lldb/trunk/source/Host/android/LibcGlue.cpp
+++ lldb/trunk/source/Host/android/LibcGlue.cpp
@@ -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 @@
 }
 
 #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);
-}
Index: lldb/trunk/source/Host/linux/LibcGlue.cpp
===================================================================
--- lldb/trunk/source/Host/linux/LibcGlue.cpp
+++ lldb/trunk/source/Host/linux/LibcGlue.cpp
@@ -0,0 +1,29 @@
+//===-- LibcGlue.cpp --------------------------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// 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>
+
+#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