Skip to content

Commit c77a080

Browse files
committedFeb 2, 2016
[asan] Add iOS support.
llvm-svn: 259451
1 parent c7d4035 commit c77a080

16 files changed

+85
-37
lines changed
 

‎compiler-rt/cmake/Modules/CompilerRTDarwinUtils.cmake

+1-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ function(darwin_test_archs os valid_archs)
6464
# The simple program will build for x86_64h on the simulator because it is
6565
# compatible with x86_64 libraries (mostly), but since x86_64h isn't actually
6666
# a valid or useful architecture for the iOS simulator we should drop it.
67-
if(${os} STREQUAL "iossim")
67+
if(${os} MATCHES "^(iossim|tvossim|watchossim)$")
6868
list(REMOVE_ITEM archs "x86_64h")
6969
endif()
7070

‎compiler-rt/cmake/config-ix.cmake

+2-2
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,7 @@ set(WASM64 wasm64)
275275

276276
if(APPLE)
277277
set(ARM64 arm64)
278-
set(ARM32 armv7 armv7s)
278+
set(ARM32 armv7 armv7s armv7k)
279279
set(X86_64 x86_64 x86_64h)
280280
endif()
281281

@@ -310,7 +310,7 @@ if(APPLE)
310310
set(OSX_SYSROOT_FLAG "-isysroot${OSX_SYSROOT}")
311311
endif()
312312

313-
option(COMPILER_RT_ENABLE_IOS "Enable building for iOS - Experimental" Off)
313+
option(COMPILER_RT_ENABLE_IOS "Enable building for iOS" Off)
314314
option(COMPILER_RT_ENABLE_WATCHOS "Enable building for watchOS - Experimental" Off)
315315
option(COMPILER_RT_ENABLE_TVOS "Enable building for tvOS - Experimental" Off)
316316

‎compiler-rt/lib/asan/asan_interceptors.cc

+6-3
Original file line numberDiff line numberDiff line change
@@ -282,23 +282,26 @@ DEFINE_REAL_PTHREAD_FUNCTIONS
282282

283283
#if SANITIZER_ANDROID
284284
INTERCEPTOR(void*, bsd_signal, int signum, void *handler) {
285-
if (!IsDeadlySignal(signum) || common_flags()->allow_user_segv_handler) {
285+
if (!IsHandledDeadlySignal(signum) ||
286+
common_flags()->allow_user_segv_handler) {
286287
return REAL(bsd_signal)(signum, handler);
287288
}
288289
return 0;
289290
}
290291
#endif
291292

292293
INTERCEPTOR(void*, signal, int signum, void *handler) {
293-
if (!IsDeadlySignal(signum) || common_flags()->allow_user_segv_handler) {
294+
if (!IsHandledDeadlySignal(signum) ||
295+
common_flags()->allow_user_segv_handler) {
294296
return REAL(signal)(signum, handler);
295297
}
296298
return nullptr;
297299
}
298300

299301
INTERCEPTOR(int, sigaction, int signum, const struct sigaction *act,
300302
struct sigaction *oldact) {
301-
if (!IsDeadlySignal(signum) || common_flags()->allow_user_segv_handler) {
303+
if (!IsHandledDeadlySignal(signum) ||
304+
common_flags()->allow_user_segv_handler) {
302305
return REAL(sigaction)(signum, act, oldact);
303306
}
304307
return 0;

‎compiler-rt/lib/asan/asan_internal.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,9 @@
3636
// If set, values like allocator chunk size, as well as defaults for some flags
3737
// will be changed towards less memory overhead.
3838
#ifndef ASAN_LOW_MEMORY
39-
#if SANITIZER_WORDSIZE == 32
39+
# if SANITIZER_IOS || (SANITIZER_WORDSIZE == 32)
4040
# define ASAN_LOW_MEMORY 1
41-
#else
41+
# else
4242
# define ASAN_LOW_MEMORY 0
4343
# endif
4444
#endif

‎compiler-rt/lib/asan/asan_mac.cc

+6
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,12 @@
3636
#include <sys/ucontext.h>
3737
#include <unistd.h>
3838

39+
// from <crt_externs.h>, but we don't have that file on iOS
40+
extern "C" {
41+
extern char ***_NSGetArgv(void);
42+
extern char ***_NSGetEnviron(void);
43+
}
44+
3945
namespace __asan {
4046

4147
void InitializePlatformInterceptors() {}

‎compiler-rt/lib/asan/asan_mapping.h

+13-7
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ static const u64 kDefaultShadowOffset32 = 1ULL << 29; // 0x20000000
115115
static const u64 kDefaultShadowOffset64 = 1ULL << 44;
116116
static const u64 kDefaultShort64bitShadowOffset = 0x7FFF8000; // < 2G.
117117
static const u64 kIosShadowOffset32 = 1ULL << 30; // 0x40000000
118-
static const u64 kIosShadowOffset64 = 0x130000000;
118+
static const u64 kIosShadowOffset64 = 0x120200000;
119119
static const u64 kIosSimShadowOffset32 = 1ULL << 30;
120120
static const u64 kIosSimShadowOffset64 = kDefaultShadowOffset64;
121121
static const u64 kAArch64_ShadowOffset64 = 1ULL << 36;
@@ -141,12 +141,22 @@ static const u64 kWindowsShadowOffset32 = 3ULL << 28; // 0x30000000
141141
# elif SANITIZER_IOSSIM
142142
# define SHADOW_OFFSET kIosSimShadowOffset32
143143
# elif SANITIZER_IOS
144-
# define SHADOW_OFFSET kIosShadowOffset32
144+
# if SANITIZER_IOSSIM
145+
# define SHADOW_OFFSET kIosSimShadowOffset32
146+
# else
147+
# define SHADOW_OFFSET kIosShadowOffset32
148+
# endif
145149
# else
146150
# define SHADOW_OFFSET kDefaultShadowOffset32
147151
# endif
148152
#else
149-
# if defined(__aarch64__)
153+
# if SANITIZER_IOS
154+
# if SANITIZER_IOSSIM
155+
# define SHADOW_OFFSET kIosSimShadowOffset64
156+
# else
157+
# define SHADOW_OFFSET kIosShadowOffset64
158+
# endif
159+
# elif defined(__aarch64__)
150160
# define SHADOW_OFFSET kAArch64_ShadowOffset64
151161
# elif defined(__powerpc64__)
152162
# define SHADOW_OFFSET kPPC64_ShadowOffset64
@@ -156,10 +166,6 @@ static const u64 kWindowsShadowOffset32 = 3ULL << 28; // 0x30000000
156166
# define SHADOW_OFFSET kDefaultShadowOffset64
157167
# elif defined(__mips64)
158168
# define SHADOW_OFFSET kMIPS64_ShadowOffset64
159-
# elif SANITIZER_IOSSIM
160-
# define SHADOW_OFFSET kIosSimShadowOffset64
161-
# elif SANITIZER_IOS
162-
# define SHADOW_OFFSET kIosShadowOffset64
163169
# else
164170
# define SHADOW_OFFSET kDefaultShort64bitShadowOffset
165171
# endif

‎compiler-rt/lib/builtins/CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,7 @@ set(aarch64_SOURCES
341341
set(armhf_SOURCES ${arm_SOURCES})
342342
set(armv7_SOURCES ${arm_SOURCES})
343343
set(armv7s_SOURCES ${arm_SOURCES})
344+
set(armv7k_SOURCES ${arm_SOURCES})
344345
set(arm64_SOURCES ${aarch64_SOURCES})
345346

346347
# macho_embedded archs

‎compiler-rt/lib/sanitizer_common/sanitizer_common.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -367,7 +367,7 @@ void SetSoftRssLimitExceededCallback(void (*Callback)(bool exceeded));
367367

368368
// Functions related to signal handling.
369369
typedef void (*SignalHandlerType)(int, void *, void *);
370-
bool IsDeadlySignal(int signum);
370+
bool IsHandledDeadlySignal(int signum);
371371
void InstallDeadlySignalHandlers(SignalHandlerType handler);
372372
// Alternative signal stack (POSIX-only).
373373
void SetAlternateSignalStack();

‎compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors_ioctl.inc

+19-16
Original file line numberDiff line numberDiff line change
@@ -53,25 +53,9 @@ static void ioctl_table_fill() {
5353
_(FIONBIO, READ, sizeof(int));
5454
_(FIONCLEX, NONE, 0);
5555
_(FIOSETOWN, READ, sizeof(int));
56-
_(SIOCADDMULTI, READ, struct_ifreq_sz);
5756
_(SIOCATMARK, WRITE, sizeof(int));
58-
_(SIOCDELMULTI, READ, struct_ifreq_sz);
59-
_(SIOCGIFADDR, WRITE, struct_ifreq_sz);
60-
_(SIOCGIFBRDADDR, WRITE, struct_ifreq_sz);
6157
_(SIOCGIFCONF, CUSTOM, 0);
62-
_(SIOCGIFDSTADDR, WRITE, struct_ifreq_sz);
63-
_(SIOCGIFFLAGS, WRITE, struct_ifreq_sz);
64-
_(SIOCGIFMETRIC, WRITE, struct_ifreq_sz);
65-
_(SIOCGIFMTU, WRITE, struct_ifreq_sz);
66-
_(SIOCGIFNETMASK, WRITE, struct_ifreq_sz);
6758
_(SIOCGPGRP, WRITE, sizeof(int));
68-
_(SIOCSIFADDR, READ, struct_ifreq_sz);
69-
_(SIOCSIFBRDADDR, READ, struct_ifreq_sz);
70-
_(SIOCSIFDSTADDR, READ, struct_ifreq_sz);
71-
_(SIOCSIFFLAGS, READ, struct_ifreq_sz);
72-
_(SIOCSIFMETRIC, READ, struct_ifreq_sz);
73-
_(SIOCSIFMTU, READ, struct_ifreq_sz);
74-
_(SIOCSIFNETMASK, READ, struct_ifreq_sz);
7559
_(SIOCSPGRP, READ, sizeof(int));
7660
_(TIOCCONS, NONE, 0);
7761
_(TIOCEXCL, NONE, 0);
@@ -92,6 +76,25 @@ static void ioctl_table_fill() {
9276
_(TIOCSTI, READ, sizeof(char));
9377
_(TIOCSWINSZ, READ, struct_winsize_sz);
9478

79+
#if !SANITIZER_IOS
80+
_(SIOCADDMULTI, READ, struct_ifreq_sz);
81+
_(SIOCDELMULTI, READ, struct_ifreq_sz);
82+
_(SIOCGIFADDR, WRITE, struct_ifreq_sz);
83+
_(SIOCGIFBRDADDR, WRITE, struct_ifreq_sz);
84+
_(SIOCGIFDSTADDR, WRITE, struct_ifreq_sz);
85+
_(SIOCGIFFLAGS, WRITE, struct_ifreq_sz);
86+
_(SIOCGIFMETRIC, WRITE, struct_ifreq_sz);
87+
_(SIOCGIFMTU, WRITE, struct_ifreq_sz);
88+
_(SIOCGIFNETMASK, WRITE, struct_ifreq_sz);
89+
_(SIOCSIFADDR, READ, struct_ifreq_sz);
90+
_(SIOCSIFBRDADDR, READ, struct_ifreq_sz);
91+
_(SIOCSIFDSTADDR, READ, struct_ifreq_sz);
92+
_(SIOCSIFFLAGS, READ, struct_ifreq_sz);
93+
_(SIOCSIFMETRIC, READ, struct_ifreq_sz);
94+
_(SIOCSIFMTU, READ, struct_ifreq_sz);
95+
_(SIOCSIFNETMASK, READ, struct_ifreq_sz);
96+
#endif
97+
9598
#if (SANITIZER_LINUX && !SANITIZER_ANDROID)
9699
_(SIOCGETSGCNT, WRITE, struct_sioc_sg_req_sz);
97100
_(SIOCGETVIFCNT, WRITE, struct_sioc_vif_req_sz);

‎compiler-rt/lib/sanitizer_common/sanitizer_linux.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -1119,7 +1119,7 @@ AndroidApiLevel AndroidGetApiLevel() {
11191119

11201120
#endif
11211121

1122-
bool IsDeadlySignal(int signum) {
1122+
bool IsHandledDeadlySignal(int signum) {
11231123
if (common_flags()->handle_abort && signum == SIGABRT)
11241124
return true;
11251125
if (common_flags()->handle_sigill && signum == SIGILL)

‎compiler-rt/lib/sanitizer_common/sanitizer_mac.cc

+10-1
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,12 @@ extern "C" {
7272
#include <unistd.h>
7373
#include <util.h>
7474

75+
// from <crt_externs.h>, but we don't have that file on iOS
76+
extern "C" {
77+
extern char ***_NSGetArgv(void);
78+
extern char ***_NSGetEnviron(void);
79+
}
80+
7581
namespace __sanitizer {
7682

7783
#include "sanitizer_syscall_generic.inc"
@@ -361,7 +367,10 @@ uptr GetListOfModules(LoadedModule *modules, uptr max_modules,
361367
return memory_mapping.DumpListOfModules(modules, max_modules, filter);
362368
}
363369

364-
bool IsDeadlySignal(int signum) {
370+
bool IsHandledDeadlySignal(int signum) {
371+
if ((SANITIZER_WATCHOS || SANITIZER_TVOS) && !(SANITIZER_IOSSIM))
372+
// Handling fatal signals on watchOS and tvOS devices is disallowed.
373+
return false;
365374
return (signum == SIGSEGV || signum == SIGBUS) && common_flags()->handle_segv;
366375
}
367376

‎compiler-rt/lib/sanitizer_common/sanitizer_platform.h

+12
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,18 @@
4949
# define SANITIZER_IOSSIM 0
5050
#endif
5151

52+
#if defined(__APPLE__) && TARGET_OS_IPHONE && TARGET_OS_WATCH
53+
# define SANITIZER_WATCHOS 1
54+
#else
55+
# define SANITIZER_WATCHOS 0
56+
#endif
57+
58+
#if defined(__APPLE__) && TARGET_OS_IPHONE && TARGET_OS_TV
59+
# define SANITIZER_TVOS 1
60+
#else
61+
# define SANITIZER_TVOS 0
62+
#endif
63+
5264
#if defined(_WIN32)
5365
# define SANITIZER_WINDOWS 1
5466
#else

‎compiler-rt/lib/sanitizer_common/sanitizer_posix.cc

+5-1
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,11 @@ static uptr GetKernelAreaSize() {
8989

9090
uptr GetMaxVirtualAddress() {
9191
#if SANITIZER_WORDSIZE == 64
92-
# if defined(__powerpc64__) || defined(__aarch64__)
92+
# if defined(__aarch64__) && SANITIZER_IOS && !SANITIZER_IOSSIM
93+
// Ideally, we would derive the upper bound from MACH_VM_MAX_ADDRESS. The
94+
// upper bound can change depending on the device.
95+
return 0x200000000 - 1;
96+
# elif defined(__powerpc64__) || defined(__aarch64__)
9397
// On PowerPC64 we have two different address space layouts: 44- and 46-bit.
9498
// We somehow need to figure out which one we are using now and choose
9599
// one of 0x00000fffffffffffUL and 0x00003fffffffffffUL.

‎compiler-rt/lib/sanitizer_common/sanitizer_posix_libcdep.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ void UnsetAlternateSignalStack() {
169169
typedef void (*sa_sigaction_t)(int, siginfo_t *, void *);
170170
static void MaybeInstallSigaction(int signum,
171171
SignalHandlerType handler) {
172-
if (!IsDeadlySignal(signum))
172+
if (!IsHandledDeadlySignal(signum))
173173
return;
174174
struct sigaction sigact;
175175
internal_memset(&sigact, 0, sizeof(sigact));

‎compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_libcdep.cc

+4
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,10 @@ class LLVMSymbolizerProcess : public SymbolizerProcess {
209209
const char* const kSymbolizerArch = "--default-arch=x86_64";
210210
#elif defined(__i386__)
211211
const char* const kSymbolizerArch = "--default-arch=i386";
212+
#elif defined(__aarch64__)
213+
const char* const kSymbolizerArch = "--default-arch=arm64";
214+
#elif defined(__arm__)
215+
const char* const kSymbolizerArch = "--default-arch=arm";
212216
#elif defined(__powerpc64__) && defined(__BIG_ENDIAN__)
213217
const char* const kSymbolizerArch = "--default-arch=powerpc64";
214218
#elif defined(__powerpc64__) && defined(__LITTLE_ENDIAN__)

‎compiler-rt/lib/sanitizer_common/sanitizer_win.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -700,7 +700,7 @@ void InstallDeadlySignalHandlers(SignalHandlerType handler) {
700700
// FIXME: Decide what to do on Windows.
701701
}
702702

703-
bool IsDeadlySignal(int signum) {
703+
bool IsHandledDeadlySignal(int signum) {
704704
// FIXME: Decide what to do on Windows.
705705
return false;
706706
}

0 commit comments

Comments
 (0)
Please sign in to comment.