-
-
Notifications
You must be signed in to change notification settings - Fork 12.7k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
2 changed files
with
369 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
368 changes: 368 additions & 0 deletions
368
pkgs/development/compilers/llvm/4/sanitizers-nongnu.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,368 @@ | ||
From dac4d3912378069b44340204e5fc6237aa1baf94 Mon Sep 17 00:00:00 2001 | ||
From: Matthias Maier <tamiko@43-1.org> | ||
Date: Fri, 5 May 2017 17:47:39 +0000 | ||
Subject: [PATCH] Musl patches | ||
|
||
Ported to compiler-rt-sanitizers-4.0.0. Taken from | ||
|
||
https://gist.githubusercontent.com/pwaller/2337f3290f12634cad3e3730cff0a6c1/raw/83c87a8585e2f9662494db5662e5361beb093c26/nongnu.patch | ||
--- | ||
lib/asan/asan_linux.cc | 4 +-- | ||
lib/interception/interception_linux.cc | 2 +- | ||
lib/interception/interception_linux.h | 2 +- | ||
lib/msan/msan_linux.cc | 2 +- | ||
.../sanitizer_common_interceptors_ioctl.inc | 4 +-- | ||
lib/sanitizer_common/sanitizer_common_syscalls.inc | 2 +- | ||
lib/sanitizer_common/sanitizer_linux_libcdep.cc | 12 +++---- | ||
lib/sanitizer_common/sanitizer_platform.h | 7 ++++ | ||
.../sanitizer_platform_interceptors.h | 2 +- | ||
.../sanitizer_platform_limits_posix.cc | 39 +++++++++++++--------- | ||
lib/tsan/rtl/tsan_platform_linux.cc | 2 +- | ||
11 files changed, 46 insertions(+), 32 deletions(-) | ||
|
||
diff --git a/lib/asan/asan_linux.cc b/lib/asan/asan_linux.cc | ||
index c051573dd..e295f6004 100644 | ||
--- a/lib/asan/asan_linux.cc | ||
+++ b/lib/asan/asan_linux.cc | ||
@@ -39,7 +39,7 @@ | ||
#include <sys/link_elf.h> | ||
#endif | ||
|
||
-#if SANITIZER_ANDROID || SANITIZER_FREEBSD | ||
+#if SANITIZER_ANDROID || SANITIZER_FREEBSD || SANITIZER_NONGNU | ||
#include <ucontext.h> | ||
extern "C" void* _DYNAMIC; | ||
#else | ||
@@ -80,7 +80,7 @@ void AsanApplyToGlobals(globals_op_fptr op, const void *needle) { | ||
UNIMPLEMENTED(); | ||
} | ||
|
||
-#if SANITIZER_ANDROID | ||
+#if SANITIZER_ANDROID || SANITIZER_NONGNU | ||
// FIXME: should we do anything for Android? | ||
void AsanCheckDynamicRTPrereqs() {} | ||
void AsanCheckIncompatibleRT() {} | ||
diff --git a/lib/interception/interception_linux.cc b/lib/interception/interception_linux.cc | ||
index 6e908ac01..8f23d9adc 100644 | ||
--- a/lib/interception/interception_linux.cc | ||
+++ b/lib/interception/interception_linux.cc | ||
@@ -24,7 +24,7 @@ bool GetRealFunctionAddress(const char *func_name, uptr *func_addr, | ||
return real == wrapper; | ||
} | ||
|
||
-#if !defined(__ANDROID__) // android does not have dlvsym | ||
+#if !defined(__ANDROID__) && !SANITIZER_NONGNU // android does not have dlvsym | ||
void *GetFuncAddrVer(const char *func_name, const char *ver) { | ||
return dlvsym(RTLD_NEXT, func_name, ver); | ||
} | ||
diff --git a/lib/interception/interception_linux.h b/lib/interception/interception_linux.h | ||
index 27a66c882..3b559a303 100644 | ||
--- a/lib/interception/interception_linux.h | ||
+++ b/lib/interception/interception_linux.h | ||
@@ -34,7 +34,7 @@ void *GetFuncAddrVer(const char *func_name, const char *ver); | ||
(::__interception::uptr) & (func), \ | ||
(::__interception::uptr) & WRAP(func)) | ||
|
||
-#if !defined(__ANDROID__) // android does not have dlvsym | ||
+#if !defined(__ANDROID__) && !SANITIZER_NONGNU // android does not have dlvsym | ||
#define INTERCEPT_FUNCTION_VER_LINUX_OR_FREEBSD(func, symver) \ | ||
(::__interception::real_##func = (func##_f)( \ | ||
unsigned long)::__interception::GetFuncAddrVer(#func, symver)) | ||
diff --git a/lib/msan/msan_linux.cc b/lib/msan/msan_linux.cc | ||
index 0a687f620..0852d97d7 100644 | ||
--- a/lib/msan/msan_linux.cc | ||
+++ b/lib/msan/msan_linux.cc | ||
@@ -13,7 +13,7 @@ | ||
//===----------------------------------------------------------------------===// | ||
|
||
#include "sanitizer_common/sanitizer_platform.h" | ||
-#if SANITIZER_FREEBSD || SANITIZER_LINUX | ||
+#if SANITIZER_FREEBSD || SANITIZER_LINUX && !SANITIZER_NONGNU | ||
|
||
#include "msan.h" | ||
#include "msan_thread.h" | ||
diff --git a/lib/sanitizer_common/sanitizer_common_interceptors_ioctl.inc b/lib/sanitizer_common/sanitizer_common_interceptors_ioctl.inc | ||
index 4ed9afedf..64f584e93 100644 | ||
--- a/lib/sanitizer_common/sanitizer_common_interceptors_ioctl.inc | ||
+++ b/lib/sanitizer_common/sanitizer_common_interceptors_ioctl.inc | ||
@@ -100,7 +100,7 @@ static void ioctl_table_fill() { | ||
_(SIOCGETVIFCNT, WRITE, struct_sioc_vif_req_sz); | ||
#endif | ||
|
||
-#if SANITIZER_LINUX | ||
+#if SANITIZER_LINUX && !SANITIZER_NONGNU | ||
// Conflicting request ids. | ||
// _(CDROMAUDIOBUFSIZ, NONE, 0); | ||
// _(SNDCTL_TMR_CONTINUE, NONE, 0); | ||
@@ -361,7 +361,7 @@ static void ioctl_table_fill() { | ||
_(VT_WAITACTIVE, NONE, 0); | ||
#endif | ||
|
||
-#if SANITIZER_LINUX && !SANITIZER_ANDROID | ||
+#if SANITIZER_LINUX && !SANITIZER_ANDROID && !SANITIZER_NONGNU | ||
// _(SIOCDEVPLIP, WRITE, struct_ifreq_sz); // the same as EQL_ENSLAVE | ||
_(CYGETDEFTHRESH, WRITE, sizeof(int)); | ||
_(CYGETDEFTIMEOUT, WRITE, sizeof(int)); | ||
diff --git a/lib/sanitizer_common/sanitizer_common_syscalls.inc b/lib/sanitizer_common/sanitizer_common_syscalls.inc | ||
index 469c8eb7e..24f87867d 100644 | ||
--- a/lib/sanitizer_common/sanitizer_common_syscalls.inc | ||
+++ b/lib/sanitizer_common/sanitizer_common_syscalls.inc | ||
@@ -2038,7 +2038,7 @@ POST_SYSCALL(setrlimit)(long res, long resource, void *rlim) { | ||
} | ||
} | ||
|
||
-#if !SANITIZER_ANDROID | ||
+#if !SANITIZER_ANDROID && !SANITIZER_NONGNU | ||
PRE_SYSCALL(prlimit64)(long pid, long resource, const void *new_rlim, | ||
void *old_rlim) { | ||
if (new_rlim) PRE_READ(new_rlim, struct_rlimit64_sz); | ||
diff --git a/lib/sanitizer_common/sanitizer_linux_libcdep.cc b/lib/sanitizer_common/sanitizer_linux_libcdep.cc | ||
index f99f0b594..3a773a94e 100644 | ||
--- a/lib/sanitizer_common/sanitizer_linux_libcdep.cc | ||
+++ b/lib/sanitizer_common/sanitizer_linux_libcdep.cc | ||
@@ -152,7 +152,7 @@ bool SanitizerGetThreadName(char *name, int max_len) { | ||
#endif | ||
} | ||
|
||
-#if !SANITIZER_FREEBSD && !SANITIZER_ANDROID && !SANITIZER_GO | ||
+#if !SANITIZER_FREEBSD && !SANITIZER_ANDROID && !SANITIZER_GO && !SANITIZER_NONGNU | ||
static uptr g_tls_size; | ||
|
||
#ifdef __i386__ | ||
@@ -180,11 +180,11 @@ void InitTlsSize() { | ||
} | ||
#else | ||
void InitTlsSize() { } | ||
-#endif // !SANITIZER_FREEBSD && !SANITIZER_ANDROID && !SANITIZER_GO | ||
+#endif // !SANITIZER_FREEBSD && !SANITIZER_ANDROID && !SANITIZER_GO && !SANITIZER_NONGNU | ||
|
||
#if (defined(__x86_64__) || defined(__i386__) || defined(__mips__) \ | ||
|| defined(__aarch64__) || defined(__powerpc64__) || defined(__s390__)) \ | ||
- && SANITIZER_LINUX && !SANITIZER_ANDROID | ||
+ && SANITIZER_LINUX && !SANITIZER_ANDROID && !SANITIZER_NONGNU | ||
// sizeof(struct pthread) from glibc. | ||
static atomic_uintptr_t kThreadDescriptorSize; | ||
|
||
@@ -338,7 +338,7 @@ uptr ThreadSelf() { | ||
|
||
#if !SANITIZER_GO | ||
static void GetTls(uptr *addr, uptr *size) { | ||
-#if SANITIZER_LINUX && !SANITIZER_ANDROID | ||
+#if SANITIZER_LINUX && !SANITIZER_ANDROID && !SANITIZER_NONGNU | ||
# if defined(__x86_64__) || defined(__i386__) || defined(__s390__) | ||
*addr = ThreadSelf(); | ||
*size = GetTlsSize(); | ||
@@ -364,7 +364,7 @@ static void GetTls(uptr *addr, uptr *size) { | ||
*addr = (uptr) dtv[2]; | ||
*size = (*addr == 0) ? 0 : ((uptr) segbase[0] - (uptr) dtv[2]); | ||
} | ||
-#elif SANITIZER_ANDROID | ||
+#elif SANITIZER_ANDROID || SANITIZER_NONGNU | ||
*addr = 0; | ||
*size = 0; | ||
#else | ||
@@ -375,7 +375,7 @@ static void GetTls(uptr *addr, uptr *size) { | ||
|
||
#if !SANITIZER_GO | ||
uptr GetTlsSize() { | ||
-#if SANITIZER_FREEBSD || SANITIZER_ANDROID | ||
+#if SANITIZER_FREEBSD || SANITIZER_ANDROID || SANITIZER_NONGNU | ||
uptr addr, size; | ||
GetTls(&addr, &size); | ||
return size; | ||
diff --git a/lib/sanitizer_common/sanitizer_platform.h b/lib/sanitizer_common/sanitizer_platform.h | ||
index d9a8e8df1..fe01c5744 100644 | ||
--- a/lib/sanitizer_common/sanitizer_platform.h | ||
+++ b/lib/sanitizer_common/sanitizer_platform.h | ||
@@ -162,6 +162,13 @@ | ||
# define SANITIZER_PPC64V2 0 | ||
#endif | ||
|
||
+ | ||
+#if defined(__linux__) && !defined(__GLIBC__) | ||
+# define SANITIZER_NONGNU 1 | ||
+#else | ||
+# define SANITIZER_NONGNU 0 | ||
+#endif | ||
+ | ||
// By default we allow to use SizeClassAllocator64 on 64-bit platform. | ||
// But in some cases (e.g. AArch64's 39-bit address space) SizeClassAllocator64 | ||
// does not work well and we need to fallback to SizeClassAllocator32. | ||
diff --git a/lib/sanitizer_common/sanitizer_platform_interceptors.h b/lib/sanitizer_common/sanitizer_platform_interceptors.h | ||
index 62875d11a..212e6e882 100644 | ||
--- a/lib/sanitizer_common/sanitizer_platform_interceptors.h | ||
+++ b/lib/sanitizer_common/sanitizer_platform_interceptors.h | ||
@@ -23,7 +23,7 @@ | ||
# define SI_NOT_WINDOWS 0 | ||
#endif | ||
|
||
-#if SANITIZER_LINUX && !SANITIZER_ANDROID | ||
+#if SANITIZER_LINUX && !SANITIZER_ANDROID && !SANITIZER_NONGNU | ||
# define SI_LINUX_NOT_ANDROID 1 | ||
#else | ||
# define SI_LINUX_NOT_ANDROID 0 | ||
diff --git a/lib/sanitizer_common/sanitizer_platform_limits_posix.cc b/lib/sanitizer_common/sanitizer_platform_limits_posix.cc | ||
index 683f019d7..fd4880962 100644 | ||
--- a/lib/sanitizer_common/sanitizer_platform_limits_posix.cc | ||
+++ b/lib/sanitizer_common/sanitizer_platform_limits_posix.cc | ||
@@ -14,6 +14,8 @@ | ||
|
||
#include "sanitizer_platform.h" | ||
|
||
+#define _LINUX_SYSINFO_H | ||
+ | ||
#if SANITIZER_LINUX || SANITIZER_FREEBSD || SANITIZER_MAC | ||
// Tests in this file assume that off_t-dependent data structures match the | ||
// libc ABI. For example, struct dirent here is what readdir() function (as | ||
@@ -139,12 +141,14 @@ typedef struct user_fpregs elf_fpregset_t; | ||
|
||
#if SANITIZER_LINUX && !SANITIZER_ANDROID | ||
#include <glob.h> | ||
-#include <obstack.h> | ||
+# if !SANITIZER_NONGNU | ||
+# include <obstack.h> | ||
+# endif | ||
#include <mqueue.h> | ||
-#include <net/if_ppp.h> | ||
-#include <netax25/ax25.h> | ||
-#include <netipx/ipx.h> | ||
-#include <netrom/netrom.h> | ||
+#include <linux/if_ppp.h> | ||
+#include <linux/ax25.h> | ||
+#include <linux/ipx.h> | ||
+#include <linux/netrom.h> | ||
#if HAVE_RPC_XDR_H | ||
# include <rpc/xdr.h> | ||
#elif HAVE_TIRPC_RPC_XDR_H | ||
@@ -160,7 +164,8 @@ typedef struct user_fpregs elf_fpregset_t; | ||
# include <sys/procfs.h> | ||
#endif | ||
#include <sys/user.h> | ||
-#include <sys/ustat.h> | ||
+// #include <sys/ustat.h> | ||
+#include <sys/statfs.h> | ||
#include <linux/cyclades.h> | ||
#include <linux/if_eql.h> | ||
#include <linux/if_plip.h> | ||
@@ -252,7 +257,7 @@ namespace __sanitizer { | ||
unsigned struct_itimerspec_sz = sizeof(struct itimerspec); | ||
#endif // SANITIZER_LINUX || SANITIZER_FREEBSD | ||
|
||
-#if SANITIZER_LINUX && !SANITIZER_ANDROID | ||
+#if SANITIZER_LINUX && !SANITIZER_ANDROID && !SANITIZER_NONGNU | ||
unsigned struct_ustat_sz = sizeof(struct ustat); | ||
unsigned struct_rlimit64_sz = sizeof(struct rlimit64); | ||
unsigned struct_statvfs64_sz = sizeof(struct statvfs64); | ||
@@ -310,7 +315,7 @@ unsigned struct_ElfW_Phdr_sz = sizeof(ElfW(Phdr)); | ||
unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr); | ||
#endif | ||
|
||
-#if (SANITIZER_LINUX || SANITIZER_FREEBSD) && !SANITIZER_ANDROID | ||
+#if (SANITIZER_LINUX || SANITIZER_FREEBSD) && !SANITIZER_ANDROID && !SANITIZER_NONGNU | ||
int glob_nomatch = GLOB_NOMATCH; | ||
int glob_altdirfunc = GLOB_ALTDIRFUNC; | ||
#endif | ||
@@ -404,7 +409,7 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr); | ||
unsigned struct_termios_sz = sizeof(struct termios); | ||
unsigned struct_winsize_sz = sizeof(struct winsize); | ||
|
||
-#if SANITIZER_LINUX | ||
+#if SANITIZER_LINUX && !SANITIZER_NONGNU | ||
unsigned struct_arpreq_sz = sizeof(struct arpreq); | ||
unsigned struct_cdrom_msf_sz = sizeof(struct cdrom_msf); | ||
unsigned struct_cdrom_multisession_sz = sizeof(struct cdrom_multisession); | ||
@@ -454,7 +459,7 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr); | ||
unsigned struct_vt_mode_sz = sizeof(struct vt_mode); | ||
#endif // SANITIZER_LINUX || SANITIZER_FREEBSD | ||
|
||
-#if SANITIZER_LINUX && !SANITIZER_ANDROID | ||
+#if SANITIZER_LINUX && !SANITIZER_ANDROID && !SANITIZER_NONGNU | ||
unsigned struct_ax25_parms_struct_sz = sizeof(struct ax25_parms_struct); | ||
unsigned struct_cyclades_monitor_sz = sizeof(struct cyclades_monitor); | ||
#if EV_VERSION > (0x010000) | ||
@@ -822,7 +827,7 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr); | ||
unsigned IOCTL_VT_WAITACTIVE = VT_WAITACTIVE; | ||
#endif // SANITIZER_LINUX || SANITIZER_FREEBSD | ||
|
||
-#if SANITIZER_LINUX && !SANITIZER_ANDROID | ||
+#if SANITIZER_LINUX && !SANITIZER_ANDROID && !SANITIZER_NONGNU | ||
unsigned IOCTL_CYGETDEFTHRESH = CYGETDEFTHRESH; | ||
unsigned IOCTL_CYGETDEFTIMEOUT = CYGETDEFTIMEOUT; | ||
unsigned IOCTL_CYGETMON = CYGETMON; | ||
@@ -985,7 +990,7 @@ CHECK_SIZE_AND_OFFSET(dl_phdr_info, dlpi_phdr); | ||
CHECK_SIZE_AND_OFFSET(dl_phdr_info, dlpi_phnum); | ||
#endif // SANITIZER_LINUX || SANITIZER_FREEBSD | ||
|
||
-#if (SANITIZER_LINUX || SANITIZER_FREEBSD) && !SANITIZER_ANDROID | ||
+#if (SANITIZER_LINUX || SANITIZER_FREEBSD) && !SANITIZER_ANDROID && !SANITIZER_NONGNU | ||
CHECK_TYPE_SIZE(glob_t); | ||
CHECK_SIZE_AND_OFFSET(glob_t, gl_pathc); | ||
CHECK_SIZE_AND_OFFSET(glob_t, gl_pathv); | ||
@@ -1019,6 +1024,7 @@ CHECK_TYPE_SIZE(iovec); | ||
CHECK_SIZE_AND_OFFSET(iovec, iov_base); | ||
CHECK_SIZE_AND_OFFSET(iovec, iov_len); | ||
|
||
+#if !SANITIZER_NONGNU | ||
CHECK_TYPE_SIZE(msghdr); | ||
CHECK_SIZE_AND_OFFSET(msghdr, msg_name); | ||
CHECK_SIZE_AND_OFFSET(msghdr, msg_namelen); | ||
@@ -1032,6 +1038,7 @@ CHECK_TYPE_SIZE(cmsghdr); | ||
CHECK_SIZE_AND_OFFSET(cmsghdr, cmsg_len); | ||
CHECK_SIZE_AND_OFFSET(cmsghdr, cmsg_level); | ||
CHECK_SIZE_AND_OFFSET(cmsghdr, cmsg_type); | ||
+#endif | ||
|
||
COMPILER_CHECK(sizeof(__sanitizer_dirent) <= sizeof(dirent)); | ||
CHECK_SIZE_AND_OFFSET(dirent, d_ino); | ||
@@ -1134,7 +1141,7 @@ CHECK_SIZE_AND_OFFSET(mntent, mnt_passno); | ||
|
||
CHECK_TYPE_SIZE(ether_addr); | ||
|
||
-#if (SANITIZER_LINUX || SANITIZER_FREEBSD) && !SANITIZER_ANDROID | ||
+#if (SANITIZER_LINUX || SANITIZER_FREEBSD) && !SANITIZER_ANDROID && !SANITIZER_NONGNU | ||
CHECK_TYPE_SIZE(ipc_perm); | ||
# if SANITIZER_FREEBSD | ||
CHECK_SIZE_AND_OFFSET(ipc_perm, key); | ||
@@ -1195,7 +1202,7 @@ CHECK_SIZE_AND_OFFSET(ifaddrs, ifa_dstaddr); | ||
CHECK_SIZE_AND_OFFSET(ifaddrs, ifa_data); | ||
#endif | ||
|
||
-#if SANITIZER_LINUX | ||
+#if SANITIZER_LINUX && !SANITIZER_NONGNU | ||
COMPILER_CHECK(sizeof(__sanitizer_mallinfo) == sizeof(struct mallinfo)); | ||
#endif | ||
|
||
@@ -1245,7 +1252,7 @@ COMPILER_CHECK(__sanitizer_XDR_DECODE == XDR_DECODE); | ||
COMPILER_CHECK(__sanitizer_XDR_FREE == XDR_FREE); | ||
#endif | ||
|
||
-#if SANITIZER_LINUX && !SANITIZER_ANDROID | ||
+#if SANITIZER_LINUX && !SANITIZER_ANDROID && !SANITIZER_NONGNU | ||
COMPILER_CHECK(sizeof(__sanitizer_FILE) <= sizeof(FILE)); | ||
CHECK_SIZE_AND_OFFSET(FILE, _flags); | ||
CHECK_SIZE_AND_OFFSET(FILE, _IO_read_ptr); | ||
@@ -1264,7 +1271,7 @@ CHECK_SIZE_AND_OFFSET(FILE, _chain); | ||
CHECK_SIZE_AND_OFFSET(FILE, _fileno); | ||
#endif | ||
|
||
-#if SANITIZER_LINUX && !SANITIZER_ANDROID | ||
+#if SANITIZER_LINUX && !SANITIZER_ANDROID && !SANITIZER_NONGNU | ||
COMPILER_CHECK(sizeof(__sanitizer__obstack_chunk) <= sizeof(_obstack_chunk)); | ||
CHECK_SIZE_AND_OFFSET(_obstack_chunk, limit); | ||
CHECK_SIZE_AND_OFFSET(_obstack_chunk, prev); | ||
diff --git a/lib/tsan/rtl/tsan_platform_linux.cc b/lib/tsan/rtl/tsan_platform_linux.cc | ||
index 3313288a7..103c7b6b9 100644 | ||
--- a/lib/tsan/rtl/tsan_platform_linux.cc | ||
+++ b/lib/tsan/rtl/tsan_platform_linux.cc | ||
@@ -287,7 +287,7 @@ void InitializePlatform() { | ||
// This is required to properly "close" the fds, because we do not see internal | ||
// closes within glibc. The code is a pure hack. | ||
int ExtractResolvFDs(void *state, int *fds, int nfd) { | ||
-#if SANITIZER_LINUX && !SANITIZER_ANDROID | ||
+#if SANITIZER_LINUX && !SANITIZER_ANDROID && !SANITIZER_NONGNU | ||
int cnt = 0; | ||
__res_state *statp = (__res_state*)state; | ||
for (int i = 0; i < MAXNS && cnt < nfd; i++) { | ||
-- | ||
2.16.2 | ||
|