[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