forked from OSchip/llvm-project
parent
c7d4035e70
commit
c77a080bdb
|
@ -64,7 +64,7 @@ function(darwin_test_archs os valid_archs)
|
|||
# The simple program will build for x86_64h on the simulator because it is
|
||||
# compatible with x86_64 libraries (mostly), but since x86_64h isn't actually
|
||||
# a valid or useful architecture for the iOS simulator we should drop it.
|
||||
if(${os} STREQUAL "iossim")
|
||||
if(${os} MATCHES "^(iossim|tvossim|watchossim)$")
|
||||
list(REMOVE_ITEM archs "x86_64h")
|
||||
endif()
|
||||
|
||||
|
|
|
@ -275,7 +275,7 @@ set(WASM64 wasm64)
|
|||
|
||||
if(APPLE)
|
||||
set(ARM64 arm64)
|
||||
set(ARM32 armv7 armv7s)
|
||||
set(ARM32 armv7 armv7s armv7k)
|
||||
set(X86_64 x86_64 x86_64h)
|
||||
endif()
|
||||
|
||||
|
@ -310,7 +310,7 @@ if(APPLE)
|
|||
set(OSX_SYSROOT_FLAG "-isysroot${OSX_SYSROOT}")
|
||||
endif()
|
||||
|
||||
option(COMPILER_RT_ENABLE_IOS "Enable building for iOS - Experimental" Off)
|
||||
option(COMPILER_RT_ENABLE_IOS "Enable building for iOS" Off)
|
||||
option(COMPILER_RT_ENABLE_WATCHOS "Enable building for watchOS - Experimental" Off)
|
||||
option(COMPILER_RT_ENABLE_TVOS "Enable building for tvOS - Experimental" Off)
|
||||
|
||||
|
|
|
@ -282,7 +282,8 @@ DEFINE_REAL_PTHREAD_FUNCTIONS
|
|||
|
||||
#if SANITIZER_ANDROID
|
||||
INTERCEPTOR(void*, bsd_signal, int signum, void *handler) {
|
||||
if (!IsDeadlySignal(signum) || common_flags()->allow_user_segv_handler) {
|
||||
if (!IsHandledDeadlySignal(signum) ||
|
||||
common_flags()->allow_user_segv_handler) {
|
||||
return REAL(bsd_signal)(signum, handler);
|
||||
}
|
||||
return 0;
|
||||
|
@ -290,7 +291,8 @@ INTERCEPTOR(void*, bsd_signal, int signum, void *handler) {
|
|||
#endif
|
||||
|
||||
INTERCEPTOR(void*, signal, int signum, void *handler) {
|
||||
if (!IsDeadlySignal(signum) || common_flags()->allow_user_segv_handler) {
|
||||
if (!IsHandledDeadlySignal(signum) ||
|
||||
common_flags()->allow_user_segv_handler) {
|
||||
return REAL(signal)(signum, handler);
|
||||
}
|
||||
return nullptr;
|
||||
|
@ -298,7 +300,8 @@ INTERCEPTOR(void*, signal, int signum, void *handler) {
|
|||
|
||||
INTERCEPTOR(int, sigaction, int signum, const struct sigaction *act,
|
||||
struct sigaction *oldact) {
|
||||
if (!IsDeadlySignal(signum) || common_flags()->allow_user_segv_handler) {
|
||||
if (!IsHandledDeadlySignal(signum) ||
|
||||
common_flags()->allow_user_segv_handler) {
|
||||
return REAL(sigaction)(signum, act, oldact);
|
||||
}
|
||||
return 0;
|
||||
|
|
|
@ -36,9 +36,9 @@
|
|||
// If set, values like allocator chunk size, as well as defaults for some flags
|
||||
// will be changed towards less memory overhead.
|
||||
#ifndef ASAN_LOW_MEMORY
|
||||
#if SANITIZER_WORDSIZE == 32
|
||||
# if SANITIZER_IOS || (SANITIZER_WORDSIZE == 32)
|
||||
# define ASAN_LOW_MEMORY 1
|
||||
#else
|
||||
# else
|
||||
# define ASAN_LOW_MEMORY 0
|
||||
# endif
|
||||
#endif
|
||||
|
|
|
@ -36,6 +36,12 @@
|
|||
#include <sys/ucontext.h>
|
||||
#include <unistd.h>
|
||||
|
||||
// from <crt_externs.h>, but we don't have that file on iOS
|
||||
extern "C" {
|
||||
extern char ***_NSGetArgv(void);
|
||||
extern char ***_NSGetEnviron(void);
|
||||
}
|
||||
|
||||
namespace __asan {
|
||||
|
||||
void InitializePlatformInterceptors() {}
|
||||
|
|
|
@ -115,7 +115,7 @@ static const u64 kDefaultShadowOffset32 = 1ULL << 29; // 0x20000000
|
|||
static const u64 kDefaultShadowOffset64 = 1ULL << 44;
|
||||
static const u64 kDefaultShort64bitShadowOffset = 0x7FFF8000; // < 2G.
|
||||
static const u64 kIosShadowOffset32 = 1ULL << 30; // 0x40000000
|
||||
static const u64 kIosShadowOffset64 = 0x130000000;
|
||||
static const u64 kIosShadowOffset64 = 0x120200000;
|
||||
static const u64 kIosSimShadowOffset32 = 1ULL << 30;
|
||||
static const u64 kIosSimShadowOffset64 = kDefaultShadowOffset64;
|
||||
static const u64 kAArch64_ShadowOffset64 = 1ULL << 36;
|
||||
|
@ -141,12 +141,22 @@ static const u64 kWindowsShadowOffset32 = 3ULL << 28; // 0x30000000
|
|||
# elif SANITIZER_IOSSIM
|
||||
# define SHADOW_OFFSET kIosSimShadowOffset32
|
||||
# elif SANITIZER_IOS
|
||||
# define SHADOW_OFFSET kIosShadowOffset32
|
||||
# if SANITIZER_IOSSIM
|
||||
# define SHADOW_OFFSET kIosSimShadowOffset32
|
||||
# else
|
||||
# define SHADOW_OFFSET kIosShadowOffset32
|
||||
# endif
|
||||
# else
|
||||
# define SHADOW_OFFSET kDefaultShadowOffset32
|
||||
# endif
|
||||
#else
|
||||
# if defined(__aarch64__)
|
||||
# if SANITIZER_IOS
|
||||
# if SANITIZER_IOSSIM
|
||||
# define SHADOW_OFFSET kIosSimShadowOffset64
|
||||
# else
|
||||
# define SHADOW_OFFSET kIosShadowOffset64
|
||||
# endif
|
||||
# elif defined(__aarch64__)
|
||||
# define SHADOW_OFFSET kAArch64_ShadowOffset64
|
||||
# elif defined(__powerpc64__)
|
||||
# define SHADOW_OFFSET kPPC64_ShadowOffset64
|
||||
|
@ -156,10 +166,6 @@ static const u64 kWindowsShadowOffset32 = 3ULL << 28; // 0x30000000
|
|||
# define SHADOW_OFFSET kDefaultShadowOffset64
|
||||
# elif defined(__mips64)
|
||||
# define SHADOW_OFFSET kMIPS64_ShadowOffset64
|
||||
# elif SANITIZER_IOSSIM
|
||||
# define SHADOW_OFFSET kIosSimShadowOffset64
|
||||
# elif SANITIZER_IOS
|
||||
# define SHADOW_OFFSET kIosShadowOffset64
|
||||
# else
|
||||
# define SHADOW_OFFSET kDefaultShort64bitShadowOffset
|
||||
# endif
|
||||
|
|
|
@ -341,6 +341,7 @@ set(aarch64_SOURCES
|
|||
set(armhf_SOURCES ${arm_SOURCES})
|
||||
set(armv7_SOURCES ${arm_SOURCES})
|
||||
set(armv7s_SOURCES ${arm_SOURCES})
|
||||
set(armv7k_SOURCES ${arm_SOURCES})
|
||||
set(arm64_SOURCES ${aarch64_SOURCES})
|
||||
|
||||
# macho_embedded archs
|
||||
|
|
|
@ -367,7 +367,7 @@ void SetSoftRssLimitExceededCallback(void (*Callback)(bool exceeded));
|
|||
|
||||
// Functions related to signal handling.
|
||||
typedef void (*SignalHandlerType)(int, void *, void *);
|
||||
bool IsDeadlySignal(int signum);
|
||||
bool IsHandledDeadlySignal(int signum);
|
||||
void InstallDeadlySignalHandlers(SignalHandlerType handler);
|
||||
// Alternative signal stack (POSIX-only).
|
||||
void SetAlternateSignalStack();
|
||||
|
|
|
@ -53,25 +53,9 @@ static void ioctl_table_fill() {
|
|||
_(FIONBIO, READ, sizeof(int));
|
||||
_(FIONCLEX, NONE, 0);
|
||||
_(FIOSETOWN, READ, sizeof(int));
|
||||
_(SIOCADDMULTI, READ, struct_ifreq_sz);
|
||||
_(SIOCATMARK, WRITE, sizeof(int));
|
||||
_(SIOCDELMULTI, READ, struct_ifreq_sz);
|
||||
_(SIOCGIFADDR, WRITE, struct_ifreq_sz);
|
||||
_(SIOCGIFBRDADDR, WRITE, struct_ifreq_sz);
|
||||
_(SIOCGIFCONF, CUSTOM, 0);
|
||||
_(SIOCGIFDSTADDR, WRITE, struct_ifreq_sz);
|
||||
_(SIOCGIFFLAGS, WRITE, struct_ifreq_sz);
|
||||
_(SIOCGIFMETRIC, WRITE, struct_ifreq_sz);
|
||||
_(SIOCGIFMTU, WRITE, struct_ifreq_sz);
|
||||
_(SIOCGIFNETMASK, WRITE, struct_ifreq_sz);
|
||||
_(SIOCGPGRP, WRITE, sizeof(int));
|
||||
_(SIOCSIFADDR, READ, struct_ifreq_sz);
|
||||
_(SIOCSIFBRDADDR, READ, struct_ifreq_sz);
|
||||
_(SIOCSIFDSTADDR, READ, struct_ifreq_sz);
|
||||
_(SIOCSIFFLAGS, READ, struct_ifreq_sz);
|
||||
_(SIOCSIFMETRIC, READ, struct_ifreq_sz);
|
||||
_(SIOCSIFMTU, READ, struct_ifreq_sz);
|
||||
_(SIOCSIFNETMASK, READ, struct_ifreq_sz);
|
||||
_(SIOCSPGRP, READ, sizeof(int));
|
||||
_(TIOCCONS, NONE, 0);
|
||||
_(TIOCEXCL, NONE, 0);
|
||||
|
@ -92,6 +76,25 @@ static void ioctl_table_fill() {
|
|||
_(TIOCSTI, READ, sizeof(char));
|
||||
_(TIOCSWINSZ, READ, struct_winsize_sz);
|
||||
|
||||
#if !SANITIZER_IOS
|
||||
_(SIOCADDMULTI, READ, struct_ifreq_sz);
|
||||
_(SIOCDELMULTI, READ, struct_ifreq_sz);
|
||||
_(SIOCGIFADDR, WRITE, struct_ifreq_sz);
|
||||
_(SIOCGIFBRDADDR, WRITE, struct_ifreq_sz);
|
||||
_(SIOCGIFDSTADDR, WRITE, struct_ifreq_sz);
|
||||
_(SIOCGIFFLAGS, WRITE, struct_ifreq_sz);
|
||||
_(SIOCGIFMETRIC, WRITE, struct_ifreq_sz);
|
||||
_(SIOCGIFMTU, WRITE, struct_ifreq_sz);
|
||||
_(SIOCGIFNETMASK, WRITE, struct_ifreq_sz);
|
||||
_(SIOCSIFADDR, READ, struct_ifreq_sz);
|
||||
_(SIOCSIFBRDADDR, READ, struct_ifreq_sz);
|
||||
_(SIOCSIFDSTADDR, READ, struct_ifreq_sz);
|
||||
_(SIOCSIFFLAGS, READ, struct_ifreq_sz);
|
||||
_(SIOCSIFMETRIC, READ, struct_ifreq_sz);
|
||||
_(SIOCSIFMTU, READ, struct_ifreq_sz);
|
||||
_(SIOCSIFNETMASK, READ, struct_ifreq_sz);
|
||||
#endif
|
||||
|
||||
#if (SANITIZER_LINUX && !SANITIZER_ANDROID)
|
||||
_(SIOCGETSGCNT, WRITE, struct_sioc_sg_req_sz);
|
||||
_(SIOCGETVIFCNT, WRITE, struct_sioc_vif_req_sz);
|
||||
|
|
|
@ -1119,7 +1119,7 @@ AndroidApiLevel AndroidGetApiLevel() {
|
|||
|
||||
#endif
|
||||
|
||||
bool IsDeadlySignal(int signum) {
|
||||
bool IsHandledDeadlySignal(int signum) {
|
||||
if (common_flags()->handle_abort && signum == SIGABRT)
|
||||
return true;
|
||||
if (common_flags()->handle_sigill && signum == SIGILL)
|
||||
|
|
|
@ -72,6 +72,12 @@ extern "C" {
|
|||
#include <unistd.h>
|
||||
#include <util.h>
|
||||
|
||||
// from <crt_externs.h>, but we don't have that file on iOS
|
||||
extern "C" {
|
||||
extern char ***_NSGetArgv(void);
|
||||
extern char ***_NSGetEnviron(void);
|
||||
}
|
||||
|
||||
namespace __sanitizer {
|
||||
|
||||
#include "sanitizer_syscall_generic.inc"
|
||||
|
@ -361,7 +367,10 @@ uptr GetListOfModules(LoadedModule *modules, uptr max_modules,
|
|||
return memory_mapping.DumpListOfModules(modules, max_modules, filter);
|
||||
}
|
||||
|
||||
bool IsDeadlySignal(int signum) {
|
||||
bool IsHandledDeadlySignal(int signum) {
|
||||
if ((SANITIZER_WATCHOS || SANITIZER_TVOS) && !(SANITIZER_IOSSIM))
|
||||
// Handling fatal signals on watchOS and tvOS devices is disallowed.
|
||||
return false;
|
||||
return (signum == SIGSEGV || signum == SIGBUS) && common_flags()->handle_segv;
|
||||
}
|
||||
|
||||
|
|
|
@ -49,6 +49,18 @@
|
|||
# define SANITIZER_IOSSIM 0
|
||||
#endif
|
||||
|
||||
#if defined(__APPLE__) && TARGET_OS_IPHONE && TARGET_OS_WATCH
|
||||
# define SANITIZER_WATCHOS 1
|
||||
#else
|
||||
# define SANITIZER_WATCHOS 0
|
||||
#endif
|
||||
|
||||
#if defined(__APPLE__) && TARGET_OS_IPHONE && TARGET_OS_TV
|
||||
# define SANITIZER_TVOS 1
|
||||
#else
|
||||
# define SANITIZER_TVOS 0
|
||||
#endif
|
||||
|
||||
#if defined(_WIN32)
|
||||
# define SANITIZER_WINDOWS 1
|
||||
#else
|
||||
|
|
|
@ -89,7 +89,11 @@ static uptr GetKernelAreaSize() {
|
|||
|
||||
uptr GetMaxVirtualAddress() {
|
||||
#if SANITIZER_WORDSIZE == 64
|
||||
# if defined(__powerpc64__) || defined(__aarch64__)
|
||||
# if defined(__aarch64__) && SANITIZER_IOS && !SANITIZER_IOSSIM
|
||||
// Ideally, we would derive the upper bound from MACH_VM_MAX_ADDRESS. The
|
||||
// upper bound can change depending on the device.
|
||||
return 0x200000000 - 1;
|
||||
# elif defined(__powerpc64__) || defined(__aarch64__)
|
||||
// On PowerPC64 we have two different address space layouts: 44- and 46-bit.
|
||||
// We somehow need to figure out which one we are using now and choose
|
||||
// one of 0x00000fffffffffffUL and 0x00003fffffffffffUL.
|
||||
|
|
|
@ -169,7 +169,7 @@ void UnsetAlternateSignalStack() {
|
|||
typedef void (*sa_sigaction_t)(int, siginfo_t *, void *);
|
||||
static void MaybeInstallSigaction(int signum,
|
||||
SignalHandlerType handler) {
|
||||
if (!IsDeadlySignal(signum))
|
||||
if (!IsHandledDeadlySignal(signum))
|
||||
return;
|
||||
struct sigaction sigact;
|
||||
internal_memset(&sigact, 0, sizeof(sigact));
|
||||
|
|
|
@ -209,6 +209,10 @@ class LLVMSymbolizerProcess : public SymbolizerProcess {
|
|||
const char* const kSymbolizerArch = "--default-arch=x86_64";
|
||||
#elif defined(__i386__)
|
||||
const char* const kSymbolizerArch = "--default-arch=i386";
|
||||
#elif defined(__aarch64__)
|
||||
const char* const kSymbolizerArch = "--default-arch=arm64";
|
||||
#elif defined(__arm__)
|
||||
const char* const kSymbolizerArch = "--default-arch=arm";
|
||||
#elif defined(__powerpc64__) && defined(__BIG_ENDIAN__)
|
||||
const char* const kSymbolizerArch = "--default-arch=powerpc64";
|
||||
#elif defined(__powerpc64__) && defined(__LITTLE_ENDIAN__)
|
||||
|
|
|
@ -700,7 +700,7 @@ void InstallDeadlySignalHandlers(SignalHandlerType handler) {
|
|||
// FIXME: Decide what to do on Windows.
|
||||
}
|
||||
|
||||
bool IsDeadlySignal(int signum) {
|
||||
bool IsHandledDeadlySignal(int signum) {
|
||||
// FIXME: Decide what to do on Windows.
|
||||
return false;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue