Skip to content

Commit beb155b

Browse files
committedMar 16, 2016
[ASAN] Add support for mips/mips64 android
Patch by Duane Sand Reviewers: samsonov Subscribers: duanesand, jaydeep, sagar, llvm-commits, filcab. Differential Revision: http://reviews.llvm.org/D17883 llvm-svn: 263621
1 parent ddfec8c commit beb155b

5 files changed

+50
-28
lines changed
 

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

+4
Original file line numberDiff line numberDiff line change
@@ -626,7 +626,9 @@ int internal_sigaction_norestorer(int signum, const void *act, void *oldact) {
626626
// rt_sigaction, so we need to do the same (we'll need to reimplement the
627627
// restorers; for x86_64 the restorer address can be obtained from
628628
// oldact->sa_restorer upon a call to sigaction(xxx, NULL, oldact).
629+
#if !SANITIZER_ANDROID || !SANITIZER_MIPS32
629630
k_act.sa_restorer = u_act->sa_restorer;
631+
#endif
630632
}
631633

632634
uptr result = internal_syscall(SYSCALL(rt_sigaction), (uptr)signum,
@@ -640,7 +642,9 @@ int internal_sigaction_norestorer(int signum, const void *act, void *oldact) {
640642
internal_memcpy(&u_oldact->sa_mask, &k_oldact.sa_mask,
641643
sizeof(__sanitizer_kernel_sigset_t));
642644
u_oldact->sa_flags = k_oldact.sa_flags;
645+
#if !SANITIZER_ANDROID || !SANITIZER_MIPS32
643646
u_oldact->sa_restorer = k_oldact.sa_restorer;
647+
#endif
644648
}
645649
return result;
646650
}

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

+21-21
Original file line numberDiff line numberDiff line change
@@ -158,34 +158,14 @@ bool SanitizerGetThreadName(char *name, int max_len) {
158158

159159
#if !SANITIZER_FREEBSD && !SANITIZER_ANDROID && !SANITIZER_GO
160160
static uptr g_tls_size;
161-
#endif
162161

163162
#ifdef __i386__
164163
# define DL_INTERNAL_FUNCTION __attribute__((regparm(3), stdcall))
165164
#else
166165
# define DL_INTERNAL_FUNCTION
167166
#endif
168167

169-
#if defined(__mips__) || defined(__powerpc64__)
170-
// TlsPreTcbSize includes size of struct pthread_descr and size of tcb
171-
// head structure. It lies before the static tls blocks.
172-
static uptr TlsPreTcbSize() {
173-
# if defined(__mips__)
174-
const uptr kTcbHead = 16; // sizeof (tcbhead_t)
175-
# elif defined(__powerpc64__)
176-
const uptr kTcbHead = 88; // sizeof (tcbhead_t)
177-
# endif
178-
const uptr kTlsAlign = 16;
179-
const uptr kTlsPreTcbSize =
180-
(ThreadDescriptorSize() + kTcbHead + kTlsAlign - 1) & ~(kTlsAlign - 1);
181-
InitTlsSize();
182-
g_tls_size = (g_tls_size + kTlsPreTcbSize + kTlsAlign -1) & ~(kTlsAlign - 1);
183-
return kTlsPreTcbSize;
184-
}
185-
#endif
186-
187168
void InitTlsSize() {
188-
#if !SANITIZER_FREEBSD && !SANITIZER_ANDROID && !SANITIZER_GO
189169
// all current supported platforms have 16 bytes stack alignment
190170
const size_t kStackAlign = 16;
191171
typedef void (*get_tls_func)(size_t*, size_t*) DL_INTERNAL_FUNCTION;
@@ -201,8 +181,10 @@ void InitTlsSize() {
201181
if (tls_align < kStackAlign)
202182
tls_align = kStackAlign;
203183
g_tls_size = RoundUpTo(tls_size, tls_align);
204-
#endif // !SANITIZER_FREEBSD && !SANITIZER_ANDROID && !SANITIZER_GO
205184
}
185+
#else
186+
void InitTlsSize() { }
187+
#endif // !SANITIZER_FREEBSD && !SANITIZER_ANDROID && !SANITIZER_GO
206188

207189
#if (defined(__x86_64__) || defined(__i386__) || defined(__mips__) \
208190
|| defined(__aarch64__) || defined(__powerpc64__)) \
@@ -278,6 +260,24 @@ uptr ThreadSelfOffset() {
278260
return kThreadSelfOffset;
279261
}
280262

263+
#if defined(__mips__) || defined(__powerpc64__)
264+
// TlsPreTcbSize includes size of struct pthread_descr and size of tcb
265+
// head structure. It lies before the static tls blocks.
266+
static uptr TlsPreTcbSize() {
267+
# if defined(__mips__)
268+
const uptr kTcbHead = 16; // sizeof (tcbhead_t)
269+
# elif defined(__powerpc64__)
270+
const uptr kTcbHead = 88; // sizeof (tcbhead_t)
271+
# endif
272+
const uptr kTlsAlign = 16;
273+
const uptr kTlsPreTcbSize =
274+
(ThreadDescriptorSize() + kTcbHead + kTlsAlign - 1) & ~(kTlsAlign - 1);
275+
InitTlsSize();
276+
g_tls_size = (g_tls_size + kTlsPreTcbSize + kTlsAlign -1) & ~(kTlsAlign - 1);
277+
return kTlsPreTcbSize;
278+
}
279+
#endif
280+
281281
uptr ThreadSelf() {
282282
uptr descr_addr;
283283
# if defined(__i386__)

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -1056,7 +1056,7 @@ COMPILER_CHECK(sizeof(__sanitizer_sigaction) == sizeof(struct sigaction));
10561056
// preprocessor macros.
10571057
CHECK_STRUCT_SIZE_AND_OFFSET(sigaction, sa_mask);
10581058
CHECK_STRUCT_SIZE_AND_OFFSET(sigaction, sa_flags);
1059-
#if SANITIZER_LINUX
1059+
#if SANITIZER_LINUX && (!SANITIZER_ANDROID || !SANITIZER_MIPS32)
10601060
CHECK_STRUCT_SIZE_AND_OFFSET(sigaction, sa_restorer);
10611061
#endif
10621062

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

+16-5
Original file line numberDiff line numberDiff line change
@@ -77,11 +77,9 @@ namespace __sanitizer {
7777
const unsigned struct_kernel_stat_sz = 144;
7878
const unsigned struct_kernel_stat64_sz = 104;
7979
#elif defined(__mips__)
80-
#if SANITIZER_WORDSIZE == 64
81-
const unsigned struct_kernel_stat_sz = 216;
82-
#else
83-
const unsigned struct_kernel_stat_sz = 144;
84-
#endif
80+
const unsigned struct_kernel_stat_sz =
81+
SANITIZER_ANDROID ? FIRST_32_SECOND_64(104, 128) :
82+
FIRST_32_SECOND_64(144, 216);
8583
const unsigned struct_kernel_stat64_sz = 104;
8684
#endif
8785
struct __sanitizer_perf_event_attr {
@@ -516,7 +514,11 @@ namespace __sanitizer {
516514
};
517515

518516
#if SANITIZER_ANDROID
517+
# if SANITIZER_MIPS
518+
typedef unsigned long __sanitizer_sigset_t[16/sizeof(unsigned long)];
519+
# else
519520
typedef unsigned long __sanitizer_sigset_t;
521+
# endif
520522
#elif SANITIZER_MAC
521523
typedef unsigned __sanitizer_sigset_t;
522524
#elif SANITIZER_LINUX
@@ -542,6 +544,15 @@ namespace __sanitizer {
542544
__sanitizer_sigset_t sa_mask;
543545
void (*sa_restorer)();
544546
};
547+
#elif SANITIZER_ANDROID && SANITIZER_MIPS32 // check this before WORDSIZE == 32
548+
struct __sanitizer_sigaction {
549+
unsigned sa_flags;
550+
union {
551+
void (*sigaction)(int sig, void *siginfo, void *uctx);
552+
void (*handler)(int sig);
553+
};
554+
__sanitizer_sigset_t sa_mask;
555+
};
545556
#elif SANITIZER_ANDROID && (SANITIZER_WORDSIZE == 32)
546557
struct __sanitizer_sigaction {
547558
union {

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

+8-1
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@
3838
# include <asm/ptrace.h>
3939
# endif
4040
# include <sys/user.h> // for user_regs_struct
41+
# if SANITIZER_ANDROID && SANITIZER_MIPS
42+
# include <asm/reg.h> // for mips SP register in sys/user.h
43+
# endif
4144
#endif
4245
#include <sys/wait.h> // for signal-related stuff
4346

@@ -467,7 +470,11 @@ typedef pt_regs regs_struct;
467470

468471
#elif defined(__mips__)
469472
typedef struct user regs_struct;
470-
#define REG_SP regs[EF_REG29]
473+
# if SANITIZER_ANDROID
474+
# define REG_SP regs[EF_R29]
475+
# else
476+
# define REG_SP regs[EF_REG29]
477+
# endif
471478

472479
#elif defined(__aarch64__)
473480
typedef struct user_pt_regs regs_struct;

0 commit comments

Comments
 (0)
Please sign in to comment.