[compiler-rt] r255057 - [PPC64, TSAN] LLVM basic enablement of thread sanitizer for PPC64 (BE and LE)
Bill Schmidt via llvm-commits
llvm-commits at lists.llvm.org
Wed Dec 9 06:09:06 PST 2015
On Tue, 2015-12-08 at 15:40 -0800, Reid Kleckner wrote:
> Adding the XFAIL comments to race_on_mutex.cc broke the test by
> disturbing the line numbers. I updated them in r255076.
Thanks, Reid! Sorry for the churn.
Bill
>
> On Tue, Dec 8, 2015 at 1:54 PM, Bill Schmidt via llvm-commits
> <llvm-commits at lists.llvm.org> wrote:
> Author: wschmidt
> Date: Tue Dec 8 15:54:39 2015
> New Revision: 255057
>
> URL: http://llvm.org/viewvc/llvm-project?rev=255057&view=rev
> Log:
> [PPC64, TSAN] LLVM basic enablement of thread sanitizer for
> PPC64 (BE and LE)
>
> This patch is by Simone Atzeni with portions by Adhemerval
> Zanella.
>
> This contains the LLVM patches to enable the thread sanitizer
> for
> PPC64, both big- and little-endian. Two different virtual
> memory
> sizes are supported: Old kernels use a 44-bit address space,
> while
> newer kernels require a 46-bit address space.
>
> There are two companion patches that will be added shortly.
> There is
> a Clang patch to actually turn on the use of the thread
> sanitizer for
> PPC64. There is also a patch that I wrote to provide
> interceptor
> support for setjmp/longjmp on PPC64.
>
> Patch discussion at reviews.llvm.org/D12841.
>
>
> Modified:
> compiler-rt/trunk/cmake/config-ix.cmake
> compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc
> compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.h
>
> compiler-rt/trunk/lib/sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cc
> compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc
> compiler-rt/trunk/lib/tsan/rtl/tsan_platform.h
> compiler-rt/trunk/lib/tsan/rtl/tsan_platform_linux.cc
> compiler-rt/trunk/lib/tsan/rtl/tsan_platform_posix.cc
> compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.h
> compiler-rt/trunk/test/tsan/CMakeLists.txt
> compiler-rt/trunk/test/tsan/cond_cancel.c
> compiler-rt/trunk/test/tsan/java_race_pc.cc
> compiler-rt/trunk/test/tsan/map32bit.cc
> compiler-rt/trunk/test/tsan/mmap_large.cc
> compiler-rt/trunk/test/tsan/race_on_mutex.c
> compiler-rt/trunk/test/tsan/signal_errno.cc
> compiler-rt/trunk/test/tsan/signal_longjmp.cc
> compiler-rt/trunk/test/tsan/test.h
>
> Modified: compiler-rt/trunk/cmake/config-ix.cmake
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/cmake/config-ix.cmake?rev=255057&r1=255056&r2=255057&view=diff
> ==============================================================================
> --- compiler-rt/trunk/cmake/config-ix.cmake (original)
> +++ compiler-rt/trunk/cmake/config-ix.cmake Tue Dec 8
> 15:54:39 2015
> @@ -278,7 +278,7 @@ set(ALL_LSAN_SUPPORTED_ARCH ${X86_64} ${
> set(ALL_MSAN_SUPPORTED_ARCH ${X86_64} ${MIPS64} ${ARM64})
> set(ALL_PROFILE_SUPPORTED_ARCH ${X86} ${X86_64} ${ARM32}
> ${ARM64} ${PPC64}
> ${MIPS32} ${MIPS64})
> -set(ALL_TSAN_SUPPORTED_ARCH ${X86_64} ${MIPS64} ${ARM64})
> +set(ALL_TSAN_SUPPORTED_ARCH ${X86_64} ${MIPS64} ${ARM64}
> ${PPC64})
> set(ALL_UBSAN_SUPPORTED_ARCH ${X86} ${X86_64} ${ARM32}
> ${ARM64}
> ${MIPS32} ${MIPS64} ${PPC64})
> set(ALL_SAFESTACK_SUPPORTED_ARCH ${X86} ${X86_64})
>
> Modified:
> compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc?rev=255057&r1=255056&r2=255057&view=diff
> ==============================================================================
> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc
> (original)
> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc
> Tue Dec 8 15:54:39 2015
> @@ -89,7 +89,8 @@ const int FUTEX_WAKE = 1;
> // Are we using 32-bit or 64-bit Linux syscalls?
> // x32 (which defines __x86_64__) has SANITIZER_WORDSIZE ==
> 32
> // but it still needs to use 64-bit syscalls.
> -#if SANITIZER_LINUX && (defined(__x86_64__) ||
> SANITIZER_WORDSIZE == 64)
> +#if SANITIZER_LINUX && (defined(__x86_64__) ||
> defined(__powerpc64__) || \
> + SANITIZER_WORDSIZE == 64)
> # define SANITIZER_LINUX_USES_64BIT_SYSCALLS 1
> #else
> # define SANITIZER_LINUX_USES_64BIT_SYSCALLS 0
> @@ -983,6 +984,88 @@ uptr internal_clone(int (*fn)(void *), v
> : "x30", "memory");
> return res;
> }
> +#elif defined(__powerpc64__)
> +uptr internal_clone(int (*fn)(void *), void *child_stack, int
> flags, void *arg,
> + int *parent_tidptr, void *newtls, int
> *child_tidptr) {
> + long long res;
> +/* Stack frame offsets. */
> +#if _CALL_ELF != 2
> +#define FRAME_MIN_SIZE 112
> +#define FRAME_TOC_SAVE 40
> +#else
> +#define FRAME_MIN_SIZE 32
> +#define FRAME_TOC_SAVE 24
> +#endif
> + if (!fn || !child_stack)
> + return -EINVAL;
> + CHECK_EQ(0, (uptr)child_stack % 16);
> + child_stack = (char *)child_stack - 2 * sizeof(unsigned
> long long);
> + ((unsigned long long *)child_stack)[0] = (uptr)fn;
> + ((unsigned long long *)child_stack)[1] = (uptr)arg;
> +
> + register int (*__fn)(void *) __asm__("r3") = fn;
> + register void *__cstack __asm__("r4") = child_stack;
> + register int __flags __asm__("r5") = flags;
> + register void * __arg __asm__("r6") = arg;
> + register int * __ptidptr __asm__("r7") = parent_tidptr;
> + register void * __newtls __asm__("r8") = newtls;
> + register int * __ctidptr __asm__("r9") = child_tidptr;
> +
> + __asm__ __volatile__(
> + /* fn, arg, child_stack are saved acrVoss the
> syscall */
> + "mr 28, %5\n\t"
> + "mr 29, %6\n\t"
> + "mr 27, %8\n\t"
> +
> + /* syscall
> + r3 == flags
> + r4 == child_stack
> + r5 == parent_tidptr
> + r6 == newtls
> + r7 == child_tidptr */
> + "mr 3, %7\n\t"
> + "mr 5, %9\n\t"
> + "mr 6, %10\n\t"
> + "mr 7, %11\n\t"
> + "li 0, %3\n\t"
> + "sc\n\t"
> +
> + /* Test if syscall was successful */
> + "cmpdi cr1, 3, 0\n\t"
> + "crandc cr1*4+eq, cr1*4+eq, cr0*4+so\n\t"
> + "bne- cr1, 1f\n\t"
> +
> + /* Do the function call */
> + "std 2, %13(1)\n\t"
> +#if _CALL_ELF != 2
> + "ld 0, 0(28)\n\t"
> + "ld 2, 8(28)\n\t"
> + "mtctr 0\n\t"
> +#else
> + "mr 12, 28\n\t"
> + "mtctr 12\n\t"
> +#endif
> + "mr 3, 27\n\t"
> + "bctrl\n\t"
> + "ld 2, %13(1)\n\t"
> +
> + /* Call _exit(r3) */
> + "li 0, %4\n\t"
> + "sc\n\t"
> +
> + /* Return to parent */
> + "1:\n\t"
> + "mr %0, 3\n\t"
> + : "=r" (res)
> + : "0" (-1), "i" (EINVAL),
> + "i" (__NR_clone), "i" (__NR_exit),
> + "r" (__fn), "r" (__cstack), "r" (__flags),
> + "r" (__arg), "r" (__ptidptr), "r" (__newtls),
> + "r" (__ctidptr), "i" (FRAME_MIN_SIZE),
> "i" (FRAME_TOC_SAVE)
> + : "cr0", "cr1", "memory", "ctr",
> + "r0", "r29", "r27", "r28");
> + return res;
> +}
> #endif // defined(__x86_64__) && SANITIZER_LINUX
>
> #if SANITIZER_ANDROID
>
> Modified:
> compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.h
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.h?rev=255057&r1=255056&r2=255057&view=diff
> ==============================================================================
> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.h
> (original)
> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.h
> Tue Dec 8 15:54:39 2015
> @@ -44,7 +44,8 @@ uptr internal_prctl(int option, uptr arg
> // internal_sigaction instead.
> int internal_sigaction_norestorer(int signum, const void
> *act, void *oldact);
> void internal_sigdelset(__sanitizer_sigset_t *set, int
> signum);
> -#if defined(__x86_64__) || defined(__mips__) ||
> defined(__aarch64__)
> +#if defined(__x86_64__) || defined(__mips__) ||
> defined(__aarch64__) \
> + || defined(__powerpc64__)
> uptr internal_clone(int (*fn)(void *), void *child_stack, int
> flags, void *arg,
> int *parent_tidptr, void *newtls, int
> *child_tidptr);
> #endif
>
> Modified:
> compiler-rt/trunk/lib/sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cc?rev=255057&r1=255056&r2=255057&view=diff
> ==============================================================================
> ---
> compiler-rt/trunk/lib/sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cc (original)
> +++
> compiler-rt/trunk/lib/sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cc Tue Dec 8 15:54:39 2015
> @@ -15,7 +15,7 @@
> #include "sanitizer_platform.h"
>
> #if SANITIZER_LINUX && (defined(__x86_64__) ||
> defined(__mips__) || \
> - defined(__aarch64__))
> + defined(__aarch64__) ||
> defined(__powerpc64__))
>
> #include "sanitizer_stoptheworld.h"
>
> @@ -511,5 +511,5 @@ uptr SuspendedThreadsList::RegisterCount
> }
> } // namespace __sanitizer
>
> -#endif // SANITIZER_LINUX && (defined(__x86_64__) ||
> defined(__mips__)
> - // || defined(__aarch64__)
> +#endif // SANITIZER_LINUX && (defined(__x86_64__) ||
> defined(__mips__)
> + // || defined(__aarch64__) || defined(__powerpc64__)
>
> Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc?rev=255057&r1=255056&r2=255057&view=diff
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc
> (original)
> +++ compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc Tue
> Dec 8 15:54:39 2015
> @@ -79,9 +79,11 @@ struct ucontext_t {
> };
> #endif
>
> -#if defined(__x86_64__) || defined(__mips__)
> +#if defined(__x86_64__) || defined(__mips__) \
> + || (defined(__powerpc64__) && defined(__BIG_ENDIAN__))
> #define PTHREAD_ABI_BASE "GLIBC_2.3.2"
> -#elif defined(__aarch64__)
> +#elif defined(__aarch64__) || (defined(__powerpc64__) \
> + && defined(__LITTLE_ENDIAN__))
> #define PTHREAD_ABI_BASE "GLIBC_2.17"
> #endif
>
>
> Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_platform.h
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_platform.h?rev=255057&r1=255056&r2=255057&view=diff
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/rtl/tsan_platform.h (original)
> +++ compiler-rt/trunk/lib/tsan/rtl/tsan_platform.h Tue Dec 8
> 15:54:39 2015
> @@ -161,6 +161,79 @@ struct Mapping42 {
>
> // Indicates the runtime will define the memory regions at
> runtime.
> #define TSAN_RUNTIME_VMA 1
> +#elif defined(__powerpc64__)
> +// PPC64 supports multiple VMA which leads to multiple
> address transformation
> +// functions. To support these multiple VMAS transformations
> and mappings TSAN
> +// runtime for PPC64 uses an external memory read (vmaSize)
> to select which
> +// mapping to use. Although slower, it make a same
> instrumented binary run on
> +// multiple kernels.
> +
> +/*
> +C/C++ on linux/powerpc64 (44-bit VMA)
> +0000 0000 0100 - 0001 0000 0000: main binary
> +0001 0000 0000 - 0001 0000 0000: -
> +0001 0000 0000 - 0b00 0000 0000: shadow
> +0b00 0000 0000 - 0b00 0000 0000: -
> +0b00 0000 0000 - 0d00 0000 0000: metainfo (memory blocks and
> sync objects)
> +0d00 0000 0000 - 0d00 0000 0000: -
> +0d00 0000 0000 - 0f00 0000 0000: traces
> +0f00 0000 0000 - 0f00 0000 0000: -
> +0f00 0000 0000 - 0f50 0000 0000: heap
> +0f50 0000 0000 - 0f60 0000 0000: -
> +0f60 0000 0000 - 1000 0000 0000: modules and main thread
> stack
> +*/
> +struct Mapping44 {
> + static const uptr kMetaShadowBeg = 0x0b0000000000ull;
> + static const uptr kMetaShadowEnd = 0x0d0000000000ull;
> + static const uptr kTraceMemBeg = 0x0d0000000000ull;
> + static const uptr kTraceMemEnd = 0x0f0000000000ull;
> + static const uptr kShadowBeg = 0x000100000000ull;
> + static const uptr kShadowEnd = 0x0b0000000000ull;
> + static const uptr kLoAppMemBeg = 0x000000000100ull;
> + static const uptr kLoAppMemEnd = 0x000100000000ull;
> + static const uptr kHeapMemBeg = 0x0f0000000000ull;
> + static const uptr kHeapMemEnd = 0x0f5000000000ull;
> + static const uptr kHiAppMemBeg = 0x0f6000000000ull;
> + static const uptr kHiAppMemEnd = 0x100000000000ull; // 44
> bits
> + static const uptr kAppMemMsk = 0x0f0000000000ull;
> + static const uptr kAppMemXor = 0x002100000000ull;
> + static const uptr kVdsoBeg = 0x3c0000000000000ull;
> +};
> +
> +/*
> +C/C++ on linux/powerpc64 (46-bit VMA)
> +0000 0000 1000 - 0100 0000 0000: main binary
> +0100 0000 0000 - 0200 0000 0000: -
> +0100 0000 0000 - 1000 0000 0000: shadow
> +1000 0000 0000 - 1000 0000 0000: -
> +1000 0000 0000 - 2000 0000 0000: metainfo (memory blocks and
> sync objects)
> +2000 0000 0000 - 2000 0000 0000: -
> +2000 0000 0000 - 2200 0000 0000: traces
> +2200 0000 0000 - 3d00 0000 0000: -
> +3d00 0000 0000 - 3e00 0000 0000: heap
> +3e00 0000 0000 - 3e80 0000 0000: -
> +3e80 0000 0000 - 4000 0000 0000: modules and main thread
> stack
> +*/
> +struct Mapping46 {
> + static const uptr kMetaShadowBeg = 0x100000000000ull;
> + static const uptr kMetaShadowEnd = 0x200000000000ull;
> + static const uptr kTraceMemBeg = 0x200000000000ull;
> + static const uptr kTraceMemEnd = 0x220000000000ull;
> + static const uptr kShadowBeg = 0x010000000000ull;
> + static const uptr kShadowEnd = 0x100000000000ull;
> + static const uptr kHeapMemBeg = 0x3d0000000000ull;
> + static const uptr kHeapMemEnd = 0x3e0000000000ull;
> + static const uptr kLoAppMemBeg = 0x000000001000ull;
> + static const uptr kLoAppMemEnd = 0x010000000000ull;
> + static const uptr kHiAppMemBeg = 0x3e8000000000ull;
> + static const uptr kHiAppMemEnd = 0x400000000000ull; // 46
> bits
> + static const uptr kAppMemMsk = 0x3c0000000000ull;
> + static const uptr kAppMemXor = 0x020000000000ull;
> + static const uptr kVdsoBeg = 0x7800000000000000ull;
> +};
> +
> +// Indicates the runtime will define the memory regions at
> runtime.
> +#define TSAN_RUNTIME_VMA 1
> #endif
>
> #elif defined(SANITIZER_GO) && !SANITIZER_WINDOWS
> @@ -274,6 +347,12 @@ uptr MappingArchImpl(void) {
> else
> return MappingImpl<Mapping42, Type>();
> DCHECK(0);
> +#elif defined(__powerpc64__)
> + if (vmaSize == 44)
> + return MappingImpl<Mapping44, Type>();
> + else
> + return MappingImpl<Mapping46, Type>();
> + DCHECK(0);
> #else
> return MappingImpl<Mapping, Type>();
> #endif
> @@ -399,6 +478,12 @@ bool IsAppMem(uptr mem) {
> else
> return IsAppMemImpl<Mapping42>(mem);
> DCHECK(0);
> +#elif defined(__powerpc64__)
> + if (vmaSize == 44)
> + return IsAppMemImpl<Mapping44>(mem);
> + else
> + return IsAppMemImpl<Mapping46>(mem);
> + DCHECK(0);
> #else
> return IsAppMemImpl<Mapping>(mem);
> #endif
> @@ -418,6 +503,12 @@ bool IsShadowMem(uptr mem) {
> else
> return IsShadowMemImpl<Mapping42>(mem);
> DCHECK(0);
> +#elif defined(__powerpc64__)
> + if (vmaSize == 44)
> + return IsShadowMemImpl<Mapping44>(mem);
> + else
> + return IsShadowMemImpl<Mapping46>(mem);
> + DCHECK(0);
> #else
> return IsShadowMemImpl<Mapping>(mem);
> #endif
> @@ -437,6 +528,12 @@ bool IsMetaMem(uptr mem) {
> else
> return IsMetaMemImpl<Mapping42>(mem);
> DCHECK(0);
> +#elif defined(__powerpc64__)
> + if (vmaSize == 44)
> + return IsMetaMemImpl<Mapping44>(mem);
> + else
> + return IsMetaMemImpl<Mapping46>(mem);
> + DCHECK(0);
> #else
> return IsMetaMemImpl<Mapping>(mem);
> #endif
> @@ -462,6 +559,12 @@ uptr MemToShadow(uptr x) {
> else
> return MemToShadowImpl<Mapping42>(x);
> DCHECK(0);
> +#elif defined(__powerpc64__)
> + if (vmaSize == 44)
> + return MemToShadowImpl<Mapping44>(x);
> + else
> + return MemToShadowImpl<Mapping46>(x);
> + DCHECK(0);
> #else
> return MemToShadowImpl<Mapping>(x);
> #endif
> @@ -489,6 +592,12 @@ u32 *MemToMeta(uptr x) {
> else
> return MemToMetaImpl<Mapping42>(x);
> DCHECK(0);
> +#elif defined(__powerpc64__)
> + if (vmaSize == 44)
> + return MemToMetaImpl<Mapping44>(x);
> + else
> + return MemToMetaImpl<Mapping46>(x);
> + DCHECK(0);
> #else
> return MemToMetaImpl<Mapping>(x);
> #endif
> @@ -522,6 +631,12 @@ uptr ShadowToMem(uptr s) {
> else
> return ShadowToMemImpl<Mapping42>(s);
> DCHECK(0);
> +#elif defined(__powerpc64__)
> + if (vmaSize == 44)
> + return ShadowToMemImpl<Mapping44>(s);
> + else
> + return ShadowToMemImpl<Mapping46>(s);
> + DCHECK(0);
> #else
> return ShadowToMemImpl<Mapping>(s);
> #endif
> @@ -549,6 +664,12 @@ uptr GetThreadTrace(int tid) {
> else
> return GetThreadTraceImpl<Mapping42>(tid);
> DCHECK(0);
> +#elif defined(__powerpc64__)
> + if (vmaSize == 44)
> + return GetThreadTraceImpl<Mapping44>(tid);
> + else
> + return GetThreadTraceImpl<Mapping46>(tid);
> + DCHECK(0);
> #else
> return GetThreadTraceImpl<Mapping>(tid);
> #endif
> @@ -571,6 +692,12 @@ uptr GetThreadTraceHeader(int tid) {
> else
> return GetThreadTraceHeaderImpl<Mapping42>(tid);
> DCHECK(0);
> +#elif defined(__powerpc64__)
> + if (vmaSize == 44)
> + return GetThreadTraceHeaderImpl<Mapping44>(tid);
> + else
> + return GetThreadTraceHeaderImpl<Mapping46>(tid);
> + DCHECK(0);
> #else
> return GetThreadTraceHeaderImpl<Mapping>(tid);
> #endif
>
> Modified:
> compiler-rt/trunk/lib/tsan/rtl/tsan_platform_linux.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_platform_linux.cc?rev=255057&r1=255056&r2=255057&view=diff
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/rtl/tsan_platform_linux.cc
> (original)
> +++ compiler-rt/trunk/lib/tsan/rtl/tsan_platform_linux.cc Tue
> Dec 8 15:54:39 2015
> @@ -244,11 +244,19 @@ void InitializePlatformEarly() {
> #ifdef TSAN_RUNTIME_VMA
> vmaSize =
> (MostSignificantSetBitIndex(GET_CURRENT_FRAME()) + 1);
> +#if defined(__aarch64__)
> if (vmaSize != 39 && vmaSize != 42) {
> Printf("FATAL: ThreadSanitizer: unsupported VMA range
> \n");
> Printf("FATAL: Found %d - Supported 39 and 42\n",
> vmaSize);
> Die();
> }
> +#elif defined(__powerpc64__)
> + if (vmaSize != 44 && vmaSize != 46) {
> + Printf("FATAL: ThreadSanitizer: unsupported VMA range
> \n");
> + Printf("FATAL: Found %d - Supported 42 and 46\n",
> vmaSize);
> + Die();
> + }
> +#endif
> #endif
> }
>
>
> Modified:
> compiler-rt/trunk/lib/tsan/rtl/tsan_platform_posix.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_platform_posix.cc?rev=255057&r1=255056&r2=255057&view=diff
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/rtl/tsan_platform_posix.cc
> (original)
> +++ compiler-rt/trunk/lib/tsan/rtl/tsan_platform_posix.cc Tue
> Dec 8 15:54:39 2015
> @@ -58,6 +58,18 @@ void InitializeShadowMemory() {
> } else {
> DCHECK(0);
> }
> +#elif defined(__powerpc64__)
> + uptr kMadviseRangeBeg = 0;
> + uptr kMadviseRangeSize = 0;
> + if (vmaSize == 44) {
> + kMadviseRangeBeg = 0x0f60000000ull;
> + kMadviseRangeSize = 0x0010000000ull;
> + } else if (vmaSize == 46) {
> + kMadviseRangeBeg = 0x3f0000000000ull;
> + kMadviseRangeSize = 0x010000000000ull;
> + } else {
> + DCHECK(0);
> + }
> #endif
> NoHugePagesInRegion(MemToShadow(kMadviseRangeBeg),
> kMadviseRangeSize * kShadowMultiplier);
>
> Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.h
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.h?rev=255057&r1=255056&r2=255057&view=diff
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.h (original)
> +++ compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.h Tue Dec 8
> 15:54:39 2015
> @@ -54,7 +54,7 @@ namespace __tsan {
>
> #ifndef SANITIZER_GO
> struct MapUnmapCallback;
> -#if defined(__mips64) || defined(__aarch64__)
> +#if defined(__mips64) || defined(__aarch64__) ||
> defined(__powerpc__)
> static const uptr kAllocatorSpace = 0;
> static const uptr kAllocatorSize = SANITIZER_MMAP_RANGE_SIZE;
> static const uptr kAllocatorRegionSizeLog = 20;
>
> Modified: compiler-rt/trunk/test/tsan/CMakeLists.txt
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/tsan/CMakeLists.txt?rev=255057&r1=255056&r2=255057&view=diff
> ==============================================================================
> --- compiler-rt/trunk/test/tsan/CMakeLists.txt (original)
> +++ compiler-rt/trunk/test/tsan/CMakeLists.txt Tue Dec 8
> 15:54:39 2015
> @@ -1,5 +1,5 @@
> set(TSAN_TEST_DEPS ${SANITIZER_COMMON_LIT_TEST_DEPS})
> -if(NOT ${COMPILER_RT_DEFAULT_TARGET_ARCH} MATCHES "mips")
> +if(${COMPILER_RT_DEFAULT_TARGET_ARCH} MATCHES "x86_64")
> list(APPEND TSAN_TEST_DEPS GotsanRuntimeCheck)
> endif()
> if(NOT COMPILER_RT_STANDALONE_BUILD)
>
> Modified: compiler-rt/trunk/test/tsan/cond_cancel.c
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/tsan/cond_cancel.c?rev=255057&r1=255056&r2=255057&view=diff
> ==============================================================================
> --- compiler-rt/trunk/test/tsan/cond_cancel.c (original)
> +++ compiler-rt/trunk/test/tsan/cond_cancel.c Tue Dec 8
> 15:54:39 2015
> @@ -1,6 +1,14 @@
> // RUN: %clang_tsan -O1 %s -o %t && %run %t 2>&1 | FileCheck
> %s
> // CHECK-NOT: WARNING
> // CHECK: OK
> +// This test is failing on powerpc64 (VMA=44). After calling
> pthread_cancel,
> +// the Thread-specific data destructors are not called, so
> the destructor
> +// "thread_finalize" (defined in tsan_interceptors.cc) can
> not set the status
> +// of the thread to "ThreadStatusFinished" failing a check in
> "SetJoined"
> +// (defined in sanitizer_thread_registry.cc). It might seem a
> bug on glibc,
> +// however the same version GLIBC-2.17 will not make fail the
> test on
> +// powerpc64 (VMA=46)
> +// XFAIL: powerpc64
>
> #include "test.h"
>
>
> Modified: compiler-rt/trunk/test/tsan/java_race_pc.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/tsan/java_race_pc.cc?rev=255057&r1=255056&r2=255057&view=diff
> ==============================================================================
> --- compiler-rt/trunk/test/tsan/java_race_pc.cc (original)
> +++ compiler-rt/trunk/test/tsan/java_race_pc.cc Tue Dec 8
> 15:54:39 2015
> @@ -1,4 +1,8 @@
> // RUN: %clangxx_tsan -O1 %s -o %t && %deflake %run %t |
> FileCheck %s
> +// This test fails on powerpc64 on both VMA (44 and 46).
> +// The Tsan report is returning wrong information about
> +// the location of the race.
> +// XFAIL: powerpc64
> #include "java.h"
>
> void foobar() {
>
> Modified: compiler-rt/trunk/test/tsan/map32bit.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/tsan/map32bit.cc?rev=255057&r1=255056&r2=255057&view=diff
> ==============================================================================
> --- compiler-rt/trunk/test/tsan/map32bit.cc (original)
> +++ compiler-rt/trunk/test/tsan/map32bit.cc Tue Dec 8
> 15:54:39 2015
> @@ -10,6 +10,7 @@
> // MAP_32BIT flag for mmap is supported only for x86_64.
> // XFAIL: mips64
> // XFAIL: aarch64
> +// XFAIL: powerpc64
>
> // MAP_32BIT doesn't exist on OS X.
> // UNSUPPORTED: darwin
>
> Modified: compiler-rt/trunk/test/tsan/mmap_large.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/tsan/mmap_large.cc?rev=255057&r1=255056&r2=255057&view=diff
> ==============================================================================
> --- compiler-rt/trunk/test/tsan/mmap_large.cc (original)
> +++ compiler-rt/trunk/test/tsan/mmap_large.cc Tue Dec 8
> 15:54:39 2015
> @@ -16,6 +16,8 @@ int main() {
> const size_t kLog2Size = 39;
> #elif defined(__mips64) || defined(__aarch64__)
> const size_t kLog2Size = 32;
> +#elif defined(__powerpc64__)
> + const size_t kLog2Size = 39;
> #endif
> const uintptr_t kLocation = 0x40ULL << kLog2Size;
> void *p = mmap(
>
> Modified: compiler-rt/trunk/test/tsan/race_on_mutex.c
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/tsan/race_on_mutex.c?rev=255057&r1=255056&r2=255057&view=diff
> ==============================================================================
> --- compiler-rt/trunk/test/tsan/race_on_mutex.c (original)
> +++ compiler-rt/trunk/test/tsan/race_on_mutex.c Tue Dec 8
> 15:54:39 2015
> @@ -1,4 +1,7 @@
> // RUN: %clang_tsan -O1 %s -o %t && %deflake %run %t |
> FileCheck %s
> +// This test fails on powerpc64 (VMA=46).
> +// The size of the write reported by Tsan for T1 is 8 instead
> of 1.
> +// XFAIL: powerpc64
> #include "test.h"
>
> pthread_mutex_t Mtx;
>
> Modified: compiler-rt/trunk/test/tsan/signal_errno.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/tsan/signal_errno.cc?rev=255057&r1=255056&r2=255057&view=diff
> ==============================================================================
> --- compiler-rt/trunk/test/tsan/signal_errno.cc (original)
> +++ compiler-rt/trunk/test/tsan/signal_errno.cc Tue Dec 8
> 15:54:39 2015
> @@ -1,4 +1,8 @@
> // RUN: %clang_tsan -O1 %s -o %t && %deflake %run %t |
> FileCheck %s
> +// This test fails on powerpc64 (VMA=44), it does not appear
> to be
> +// a functional problem, but the Tsan report is missing some
> info.
> +// XFAIL: powerpc64
> +
> #include "test.h"
> #include <signal.h>
> #include <sys/types.h>
>
> Modified: compiler-rt/trunk/test/tsan/signal_longjmp.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/tsan/signal_longjmp.cc?rev=255057&r1=255056&r2=255057&view=diff
> ==============================================================================
> --- compiler-rt/trunk/test/tsan/signal_longjmp.cc (original)
> +++ compiler-rt/trunk/test/tsan/signal_longjmp.cc Tue Dec 8
> 15:54:39 2015
> @@ -5,6 +5,10 @@
>
> // Longjmp assembly has not been implemented for mips64 yet
> // XFAIL: mips64
> +// This test fails on powerpc64 (VMA=44), a segmentation
> fault
> +// error happens at the second assignment
> +// "((volatile int *volatile)mem)[1] = 1".
> +// XFAIL: powerpc64
>
> #include <setjmp.h>
> #include <signal.h>
>
> Modified: compiler-rt/trunk/test/tsan/test.h
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/tsan/test.h?rev=255057&r1=255056&r2=255057&view=diff
> ==============================================================================
> --- compiler-rt/trunk/test/tsan/test.h (original)
> +++ compiler-rt/trunk/test/tsan/test.h Tue Dec 8 15:54:39
> 2015
> @@ -43,7 +43,7 @@ void print_address(const char *str, int
> va_start(ap, n);
> while (n--) {
> void *p = va_arg(ap, void *);
> -#if defined(__x86_64__) || defined(__aarch64__)
> +#if defined(__x86_64__) || defined(__aarch64__) ||
> defined(__powerpc64__)
> // On FreeBSD, the %p conversion specifier works as 0x%x
> and thus does not
> // match to the format used in the diagnotic message.
> fprintf(stderr, "0x%012lx ", (unsigned long) p);
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
>
More information about the llvm-commits
mailing list