<div dir="ltr">Don't we already get behavior like this when we invoke a missing syscall?</div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Jun 29, 2015 at 2:18 AM, Pavel Labath <span dir="ltr"><<a href="mailto:labath@google.com" target="_blank">labath@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: labath<br>
Date: Mon Jun 29 04:18:17 2015<br>
New Revision: 240927<br>
<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D240927-26view-3Drev&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=MEqT8U_n7oNfuDW5NRbY3ZV384ZquXIYFPWmprwUdKM&m=P2DqPYjy1W9Hn-8Xo1NCsih1epPB7CKs2WgL2CZ1pCo&s=WN4Umjs7GN3OzfAsa5z5K8H9EX7hITK7nvFhUCNxReQ&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=240927&view=rev</a><br>
Log:<br>
[linux] Use cmake to detect support process_vm_readv (bug #23918)<br>
<br>
Summary:<br>
Some old linux versions do not have process_vm_readv function defined. Even older versions do not<br>
have even the __NR_process_vm_readv syscall number. We use cmake to detect these situations and<br>
fallback appropriately: in the first case, we can issue the syscall manually, while it the latter<br>
case, we need to drop fast memory read support completely.<br>
<br>
Test Plan: linux test suite passes<br>
<br>
Reviewers: ovyalov, Eugene.Zelenko<br>
<br>
Subscribers: tberghammer, lldb-commits<br>
<br>
Differential Revision: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__reviews.llvm.org_D10727&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=MEqT8U_n7oNfuDW5NRbY3ZV384ZquXIYFPWmprwUdKM&m=P2DqPYjy1W9Hn-8Xo1NCsih1epPB7CKs2WgL2CZ1pCo&s=n4K-r9t6CVzcpzMI7EwBtQ_TjtDpiD_vBwj6JjWbi90&e=" rel="noreferrer" target="_blank">http://reviews.llvm.org/D10727</a><br>
<br>
Added:<br>
    lldb/trunk/source/Host/linux/LibcGlue.cpp<br>
      - copied, changed from r240895, lldb/trunk/source/Host/android/LibcGlue.cpp<br>
Modified:<br>
    lldb/trunk/cmake/modules/LLDBConfig.cmake<br>
    lldb/trunk/include/lldb/Host/linux/Uio.h<br>
    lldb/trunk/source/Host/CMakeLists.txt<br>
    lldb/trunk/source/Host/android/LibcGlue.cpp<br>
<br>
Modified: lldb/trunk/cmake/modules/LLDBConfig.cmake<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lldb_trunk_cmake_modules_LLDBConfig.cmake-3Frev-3D240927-26r1-3D240926-26r2-3D240927-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=MEqT8U_n7oNfuDW5NRbY3ZV384ZquXIYFPWmprwUdKM&m=P2DqPYjy1W9Hn-8Xo1NCsih1epPB7CKs2WgL2CZ1pCo&s=KCA9SHQYtXB9YpCaPuslcugm2EhooTAAady5oFonh_I&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lldb/trunk/cmake/modules/LLDBConfig.cmake?rev=240927&r1=240926&r2=240927&view=diff</a><br>
==============================================================================<br>
--- lldb/trunk/cmake/modules/LLDBConfig.cmake (original)<br>
+++ lldb/trunk/cmake/modules/LLDBConfig.cmake Mon Jun 29 04:18:17 2015<br>
@@ -248,3 +248,27 @@ if(NOT LLDB_REQUIRES_RTTI)<br>
 endif()<br>
<br>
 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${LLDB_COMPILE_FLAGS}")<br>
+<br>
+if (CMAKE_SYSTEM_NAME MATCHES "Linux")<br>
+    # Check for syscall used by lldb-server on linux.<br>
+    # If these are not found, it will fall back to ptrace (slow) for memory reads.<br>
+    check_cxx_source_compiles("<br>
+        #include <sys/uio.h><br>
+        int main() { process_vm_readv(0, nullptr, 0, nullptr, 0, 0); return 0; }"<br>
+        HAVE_PROCESS_VM_READV)<br>
+<br>
+    if (HAVE_PROCESS_VM_READV)<br>
+        add_definitions(-DHAVE_PROCESS_VM_READV)<br>
+    else()<br>
+        # If we don't have the syscall wrapper function, but we know the syscall number, we can<br>
+        # still issue the syscall manually<br>
+        check_cxx_source_compiles("<br>
+            #include <sys/syscall.h><br>
+            int main() { return __NR_process_vm_readv; }"<br>
+            HAVE_NR_PROCESS_VM_READV)<br>
+<br>
+        if (HAVE_NR_PROCESS_VM_READV)<br>
+            add_definitions(-DHAVE_NR_PROCESS_VM_READV)<br>
+        endif()<br>
+    endif()<br>
+endif()<br>
<br>
Modified: lldb/trunk/include/lldb/Host/linux/Uio.h<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lldb_trunk_include_lldb_Host_linux_Uio.h-3Frev-3D240927-26r1-3D240926-26r2-3D240927-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=MEqT8U_n7oNfuDW5NRbY3ZV384ZquXIYFPWmprwUdKM&m=P2DqPYjy1W9Hn-8Xo1NCsih1epPB7CKs2WgL2CZ1pCo&s=0-sKfdNozqdu-YWBRTbEUtto68XZYjmEYr2qs1r8juY&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Host/linux/Uio.h?rev=240927&r1=240926&r2=240927&view=diff</a><br>
==============================================================================<br>
--- lldb/trunk/include/lldb/Host/linux/Uio.h (original)<br>
+++ lldb/trunk/include/lldb/Host/linux/Uio.h Mon Jun 29 04:18:17 2015<br>
@@ -12,8 +12,8 @@<br>
<br>
 #include <sys/uio.h><br>
<br>
-// Android does not define the process_vm_readv wrapper<br>
-#ifdef __ANDROID_NDK__<br>
+// We shall provide our own implementation of process_vm_readv if it is not present<br>
+#ifndef HAVE_PROCESS_VM_READV<br>
 ssize_t process_vm_readv(::pid_t pid,<br>
                         const struct iovec *local_iov, unsigned long liovcnt,<br>
                         const struct iovec *remote_iov, unsigned long riovcnt,<br>
<br>
Modified: lldb/trunk/source/Host/CMakeLists.txt<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lldb_trunk_source_Host_CMakeLists.txt-3Frev-3D240927-26r1-3D240926-26r2-3D240927-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=MEqT8U_n7oNfuDW5NRbY3ZV384ZquXIYFPWmprwUdKM&m=P2DqPYjy1W9Hn-8Xo1NCsih1epPB7CKs2WgL2CZ1pCo&s=9WJjhJaaKtK4OaN8FjwKgz3owZ6CArYe5eJeTCLrN5w&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/CMakeLists.txt?rev=240927&r1=240926&r2=240927&view=diff</a><br>
==============================================================================<br>
--- lldb/trunk/source/Host/CMakeLists.txt (original)<br>
+++ lldb/trunk/source/Host/CMakeLists.txt Mon Jun 29 04:18:17 2015<br>
@@ -110,6 +110,7 @@ else()<br>
         linux/Host.cpp<br>
         linux/HostInfoLinux.cpp<br>
         linux/HostThreadLinux.cpp<br>
+        linux/LibcGlue.cpp<br>
         linux/ThisThread.cpp<br>
         )<br>
     else()<br>
@@ -117,6 +118,7 @@ else()<br>
         linux/Host.cpp<br>
         linux/HostInfoLinux.cpp<br>
         linux/HostThreadLinux.cpp<br>
+        linux/LibcGlue.cpp<br>
         linux/ThisThread.cpp<br>
         )<br>
     endif()<br>
<br>
Modified: lldb/trunk/source/Host/android/LibcGlue.cpp<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lldb_trunk_source_Host_android_LibcGlue.cpp-3Frev-3D240927-26r1-3D240926-26r2-3D240927-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=MEqT8U_n7oNfuDW5NRbY3ZV384ZquXIYFPWmprwUdKM&m=P2DqPYjy1W9Hn-8Xo1NCsih1epPB7CKs2WgL2CZ1pCo&s=psysygSBh_bydrn_jxkFG0AkUl6hlAiAWWjo_nohc1s&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/android/LibcGlue.cpp?rev=240927&r1=240926&r2=240927&view=diff</a><br>
==============================================================================<br>
--- lldb/trunk/source/Host/android/LibcGlue.cpp (original)<br>
+++ lldb/trunk/source/Host/android/LibcGlue.cpp Mon Jun 29 04:18:17 2015<br>
@@ -12,7 +12,6 @@<br>
 #include <android/api-level.h><br>
<br>
 #include <sys/syscall.h><br>
-#include <lldb/Host/linux/Uio.h><br>
<br>
 #if __ANDROID_API__ < 21<br>
<br>
@@ -39,11 +38,3 @@ int posix_openpt(int flags)<br>
 }<br>
<br>
 #endif<br>
-<br>
-ssize_t process_vm_readv(::pid_t pid,<br>
-                        const struct iovec *local_iov, unsigned long liovcnt,<br>
-                        const struct iovec *remote_iov, unsigned long riovcnt,<br>
-                        unsigned long flags)<br>
-{<br>
-    return syscall(__NR_process_vm_readv, pid, local_iov, liovcnt, remote_iov, riovcnt, flags);<br>
-}<br>
<br>
Copied: lldb/trunk/source/Host/linux/LibcGlue.cpp (from r240895, lldb/trunk/source/Host/android/LibcGlue.cpp)<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lldb_trunk_source_Host_linux_LibcGlue.cpp-3Fp2-3Dlldb_trunk_source_Host_linux_LibcGlue.cpp-26p1-3Dlldb_trunk_source_Host_android_LibcGlue.cpp-26r1-3D240895-26r2-3D240927-26rev-3D240927-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=MEqT8U_n7oNfuDW5NRbY3ZV384ZquXIYFPWmprwUdKM&m=P2DqPYjy1W9Hn-8Xo1NCsih1epPB7CKs2WgL2CZ1pCo&s=WsrqAERd-3884e8ratrPB39N7Os43Y8aG8Z04lx3uRk&e=" rel="noreferrer" target="_blank">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</a><br>
==============================================================================<br>
--- lldb/trunk/source/Host/android/LibcGlue.cpp (original)<br>
+++ lldb/trunk/source/Host/linux/LibcGlue.cpp Mon Jun 29 04:18:17 2015<br>
@@ -7,43 +7,23 @@<br>
 //<br>
 //===----------------------------------------------------------------------===//<br>
<br>
-// This files adds functions missing from libc on earlier versions of Android<br>
-<br>
-#include <android/api-level.h><br>
+// This file adds functions missing from libc on older versions of linux<br>
<br>
+#include <unistd.h><br>
 #include <sys/syscall.h><br>
 #include <lldb/Host/linux/Uio.h><br>
<br>
-#if __ANDROID_API__ < 21<br>
-<br>
-#include <sys/types.h><br>
-#include <sys/stat.h><br>
-#include <fcntl.h><br>
-#include <signal.h><br>
-<br>
-#include "lldb/Host/Time.h"<br>
-<br>
-time_t timegm(struct tm* t)<br>
-{<br>
-    return (time_t) timegm64(t);<br>
-}<br>
-<br>
-int signalfd (int fd, const sigset_t *mask, int flags)<br>
-{<br>
-    return syscall(__NR_signalfd4, fd, mask, _NSIG / 8, flags);<br>
-}<br>
-<br>
-int posix_openpt(int flags)<br>
-{<br>
-    return open("/dev/ptmx", flags);<br>
-}<br>
-<br>
-#endif<br>
-<br>
+#ifndef HAVE_PROCESS_VM_READV // If the syscall wrapper is not available, provide one.<br>
 ssize_t process_vm_readv(::pid_t pid,<br>
                         const struct iovec *local_iov, unsigned long liovcnt,<br>
                         const struct iovec *remote_iov, unsigned long riovcnt,<br>
                         unsigned long flags)<br>
 {<br>
+#ifdef HAVE_NR_PROCESS_VM_READV // If we have the syscall number, we can issue the syscall ourselves.<br>
     return syscall(__NR_process_vm_readv, pid, local_iov, liovcnt, remote_iov, riovcnt, flags);<br>
+#else // If not, let's pretend the syscall is not present.<br>
+    errno = ENOSYS;<br>
+    return -1;<br>
+#endif<br>
 }<br>
+#endif<br>
<br>
<br>
_______________________________________________<br>
lldb-commits mailing list<br>
<a href="mailto:lldb-commits@cs.uiuc.edu">lldb-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits" rel="noreferrer" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits</a><br>
</blockquote></div><br></div>