[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
This commit is contained in:
parent
ddfec8cb55
commit
beb155b4fa
|
@ -626,7 +626,9 @@ int internal_sigaction_norestorer(int signum, const void *act, void *oldact) {
|
|||
// rt_sigaction, so we need to do the same (we'll need to reimplement the
|
||||
// restorers; for x86_64 the restorer address can be obtained from
|
||||
// oldact->sa_restorer upon a call to sigaction(xxx, NULL, oldact).
|
||||
#if !SANITIZER_ANDROID || !SANITIZER_MIPS32
|
||||
k_act.sa_restorer = u_act->sa_restorer;
|
||||
#endif
|
||||
}
|
||||
|
||||
uptr result = internal_syscall(SYSCALL(rt_sigaction), (uptr)signum,
|
||||
|
@ -640,7 +642,9 @@ int internal_sigaction_norestorer(int signum, const void *act, void *oldact) {
|
|||
internal_memcpy(&u_oldact->sa_mask, &k_oldact.sa_mask,
|
||||
sizeof(__sanitizer_kernel_sigset_t));
|
||||
u_oldact->sa_flags = k_oldact.sa_flags;
|
||||
#if !SANITIZER_ANDROID || !SANITIZER_MIPS32
|
||||
u_oldact->sa_restorer = k_oldact.sa_restorer;
|
||||
#endif
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
|
|
@ -158,7 +158,6 @@ bool SanitizerGetThreadName(char *name, int max_len) {
|
|||
|
||||
#if !SANITIZER_FREEBSD && !SANITIZER_ANDROID && !SANITIZER_GO
|
||||
static uptr g_tls_size;
|
||||
#endif
|
||||
|
||||
#ifdef __i386__
|
||||
# define DL_INTERNAL_FUNCTION __attribute__((regparm(3), stdcall))
|
||||
|
@ -166,26 +165,7 @@ static uptr g_tls_size;
|
|||
# define DL_INTERNAL_FUNCTION
|
||||
#endif
|
||||
|
||||
#if defined(__mips__) || defined(__powerpc64__)
|
||||
// TlsPreTcbSize includes size of struct pthread_descr and size of tcb
|
||||
// head structure. It lies before the static tls blocks.
|
||||
static uptr TlsPreTcbSize() {
|
||||
# if defined(__mips__)
|
||||
const uptr kTcbHead = 16; // sizeof (tcbhead_t)
|
||||
# elif defined(__powerpc64__)
|
||||
const uptr kTcbHead = 88; // sizeof (tcbhead_t)
|
||||
# endif
|
||||
const uptr kTlsAlign = 16;
|
||||
const uptr kTlsPreTcbSize =
|
||||
(ThreadDescriptorSize() + kTcbHead + kTlsAlign - 1) & ~(kTlsAlign - 1);
|
||||
InitTlsSize();
|
||||
g_tls_size = (g_tls_size + kTlsPreTcbSize + kTlsAlign -1) & ~(kTlsAlign - 1);
|
||||
return kTlsPreTcbSize;
|
||||
}
|
||||
#endif
|
||||
|
||||
void InitTlsSize() {
|
||||
#if !SANITIZER_FREEBSD && !SANITIZER_ANDROID && !SANITIZER_GO
|
||||
// all current supported platforms have 16 bytes stack alignment
|
||||
const size_t kStackAlign = 16;
|
||||
typedef void (*get_tls_func)(size_t*, size_t*) DL_INTERNAL_FUNCTION;
|
||||
|
@ -201,8 +181,10 @@ void InitTlsSize() {
|
|||
if (tls_align < kStackAlign)
|
||||
tls_align = kStackAlign;
|
||||
g_tls_size = RoundUpTo(tls_size, tls_align);
|
||||
#endif // !SANITIZER_FREEBSD && !SANITIZER_ANDROID && !SANITIZER_GO
|
||||
}
|
||||
#else
|
||||
void InitTlsSize() { }
|
||||
#endif // !SANITIZER_FREEBSD && !SANITIZER_ANDROID && !SANITIZER_GO
|
||||
|
||||
#if (defined(__x86_64__) || defined(__i386__) || defined(__mips__) \
|
||||
|| defined(__aarch64__) || defined(__powerpc64__)) \
|
||||
|
@ -278,6 +260,24 @@ uptr ThreadSelfOffset() {
|
|||
return kThreadSelfOffset;
|
||||
}
|
||||
|
||||
#if defined(__mips__) || defined(__powerpc64__)
|
||||
// TlsPreTcbSize includes size of struct pthread_descr and size of tcb
|
||||
// head structure. It lies before the static tls blocks.
|
||||
static uptr TlsPreTcbSize() {
|
||||
# if defined(__mips__)
|
||||
const uptr kTcbHead = 16; // sizeof (tcbhead_t)
|
||||
# elif defined(__powerpc64__)
|
||||
const uptr kTcbHead = 88; // sizeof (tcbhead_t)
|
||||
# endif
|
||||
const uptr kTlsAlign = 16;
|
||||
const uptr kTlsPreTcbSize =
|
||||
(ThreadDescriptorSize() + kTcbHead + kTlsAlign - 1) & ~(kTlsAlign - 1);
|
||||
InitTlsSize();
|
||||
g_tls_size = (g_tls_size + kTlsPreTcbSize + kTlsAlign -1) & ~(kTlsAlign - 1);
|
||||
return kTlsPreTcbSize;
|
||||
}
|
||||
#endif
|
||||
|
||||
uptr ThreadSelf() {
|
||||
uptr descr_addr;
|
||||
# if defined(__i386__)
|
||||
|
|
|
@ -1056,7 +1056,7 @@ COMPILER_CHECK(sizeof(__sanitizer_sigaction) == sizeof(struct sigaction));
|
|||
// preprocessor macros.
|
||||
CHECK_STRUCT_SIZE_AND_OFFSET(sigaction, sa_mask);
|
||||
CHECK_STRUCT_SIZE_AND_OFFSET(sigaction, sa_flags);
|
||||
#if SANITIZER_LINUX
|
||||
#if SANITIZER_LINUX && (!SANITIZER_ANDROID || !SANITIZER_MIPS32)
|
||||
CHECK_STRUCT_SIZE_AND_OFFSET(sigaction, sa_restorer);
|
||||
#endif
|
||||
|
||||
|
|
|
@ -77,11 +77,9 @@ namespace __sanitizer {
|
|||
const unsigned struct_kernel_stat_sz = 144;
|
||||
const unsigned struct_kernel_stat64_sz = 104;
|
||||
#elif defined(__mips__)
|
||||
#if SANITIZER_WORDSIZE == 64
|
||||
const unsigned struct_kernel_stat_sz = 216;
|
||||
#else
|
||||
const unsigned struct_kernel_stat_sz = 144;
|
||||
#endif
|
||||
const unsigned struct_kernel_stat_sz =
|
||||
SANITIZER_ANDROID ? FIRST_32_SECOND_64(104, 128) :
|
||||
FIRST_32_SECOND_64(144, 216);
|
||||
const unsigned struct_kernel_stat64_sz = 104;
|
||||
#endif
|
||||
struct __sanitizer_perf_event_attr {
|
||||
|
@ -516,7 +514,11 @@ namespace __sanitizer {
|
|||
};
|
||||
|
||||
#if SANITIZER_ANDROID
|
||||
# if SANITIZER_MIPS
|
||||
typedef unsigned long __sanitizer_sigset_t[16/sizeof(unsigned long)];
|
||||
# else
|
||||
typedef unsigned long __sanitizer_sigset_t;
|
||||
# endif
|
||||
#elif SANITIZER_MAC
|
||||
typedef unsigned __sanitizer_sigset_t;
|
||||
#elif SANITIZER_LINUX
|
||||
|
@ -542,6 +544,15 @@ namespace __sanitizer {
|
|||
__sanitizer_sigset_t sa_mask;
|
||||
void (*sa_restorer)();
|
||||
};
|
||||
#elif SANITIZER_ANDROID && SANITIZER_MIPS32 // check this before WORDSIZE == 32
|
||||
struct __sanitizer_sigaction {
|
||||
unsigned sa_flags;
|
||||
union {
|
||||
void (*sigaction)(int sig, void *siginfo, void *uctx);
|
||||
void (*handler)(int sig);
|
||||
};
|
||||
__sanitizer_sigset_t sa_mask;
|
||||
};
|
||||
#elif SANITIZER_ANDROID && (SANITIZER_WORDSIZE == 32)
|
||||
struct __sanitizer_sigaction {
|
||||
union {
|
||||
|
|
|
@ -38,6 +38,9 @@
|
|||
# include <asm/ptrace.h>
|
||||
# endif
|
||||
# include <sys/user.h> // for user_regs_struct
|
||||
# if SANITIZER_ANDROID && SANITIZER_MIPS
|
||||
# include <asm/reg.h> // for mips SP register in sys/user.h
|
||||
# endif
|
||||
#endif
|
||||
#include <sys/wait.h> // for signal-related stuff
|
||||
|
||||
|
@ -467,7 +470,11 @@ typedef pt_regs regs_struct;
|
|||
|
||||
#elif defined(__mips__)
|
||||
typedef struct user regs_struct;
|
||||
#define REG_SP regs[EF_REG29]
|
||||
# if SANITIZER_ANDROID
|
||||
# define REG_SP regs[EF_R29]
|
||||
# else
|
||||
# define REG_SP regs[EF_REG29]
|
||||
# endif
|
||||
|
||||
#elif defined(__aarch64__)
|
||||
typedef struct user_pt_regs regs_struct;
|
||||
|
|
Loading…
Reference in New Issue