forked from OSchip/llvm-project
[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 llvm-svn: 240927
This commit is contained in:
parent
a7a8e9a018
commit
33b51e87e1
|
@ -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()
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
Loading…
Reference in New Issue