tsan: add support for linux/powerpc64 in buildgo.sh

The current implementation of the Go sanitizer only works on x86_64.
Added some modifications to the buildgo.sh script and the Tsan code
to make it work on powerpc64/linux.

Author: cseo (Carlos Eduardo Seo)
Reviewed in: https://reviews.llvm.org/D43025

llvm-svn: 330122
This commit is contained in:
Dmitry Vyukov 2018-04-16 11:43:00 +00:00
parent 54d736c416
commit 3a99c76e3d
4 changed files with 106 additions and 6 deletions

View File

@ -152,6 +152,15 @@ else()
add_asm_sources(TSAN_ASM_SOURCES rtl/tsan_rtl_aarch64.S) add_asm_sources(TSAN_ASM_SOURCES rtl/tsan_rtl_aarch64.S)
elseif(arch MATCHES "powerpc64|powerpc64le") elseif(arch MATCHES "powerpc64|powerpc64le")
add_asm_sources(TSAN_ASM_SOURCES rtl/tsan_rtl_ppc64.S) add_asm_sources(TSAN_ASM_SOURCES rtl/tsan_rtl_ppc64.S)
# Sanity check for Go runtime.
set(BUILDGO_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/go/buildgo.sh)
add_custom_target(GotsanRuntimeCheck
COMMAND env "CC=${CMAKE_C_COMPILER} ${CMAKE_C_COMPILER_ARG1}"
IN_TMPDIR=1 SILENT=1 ${BUILDGO_SCRIPT}
DEPENDS clang_rt.tsan-${arch} ${BUILDGO_SCRIPT}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/go
COMMENT "Checking TSan Go runtime..."
VERBATIM)
elseif(arch MATCHES "mips64|mips64le") elseif(arch MATCHES "mips64|mips64le")
add_asm_sources(TSAN_ASM_SOURCES rtl/tsan_rtl_mips64.S) add_asm_sources(TSAN_ASM_SOURCES rtl/tsan_rtl_mips64.S)
else() else()

View File

@ -39,8 +39,7 @@ SRCS="
" "
if [ "`uname -a | grep Linux`" != "" ]; then if [ "`uname -a | grep Linux`" != "" ]; then
SUFFIX="linux_amd64" OSCFLAGS="-fPIC -Wno-maybe-uninitialized"
OSCFLAGS="-fPIC -ffreestanding -Wno-maybe-uninitialized -Wno-unused-const-variable -Werror -Wno-unknown-warning-option"
OSLDFLAGS="-lpthread -fPIC -fpie" OSLDFLAGS="-lpthread -fPIC -fpie"
SRCS=" SRCS="
$SRCS $SRCS
@ -52,7 +51,13 @@ if [ "`uname -a | grep Linux`" != "" ]; then
../../sanitizer_common/sanitizer_linux.cc ../../sanitizer_common/sanitizer_linux.cc
../../sanitizer_common/sanitizer_linux_libcdep.cc ../../sanitizer_common/sanitizer_linux_libcdep.cc
../../sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cc ../../sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cc
" "
if [ "`uname -a | grep ppc64le`" != "" ]; then
SUFFIX="linux_ppc64le"
elif [ "`uname -a | grep x86_64`" != "" ]; then
SUFFIX="linux_amd64"
OSCFLAGS="$OSCFLAGS -ffreestanding -Wno-unused-const-variable -Werror -Wno-unknown-warning-option"
fi
elif [ "`uname -a | grep FreeBSD`" != "" ]; then elif [ "`uname -a | grep FreeBSD`" != "" ]; then
SUFFIX="freebsd_amd64" SUFFIX="freebsd_amd64"
OSCFLAGS="-fno-strict-aliasing -fPIC -Werror" OSCFLAGS="-fno-strict-aliasing -fPIC -Werror"
@ -132,7 +137,12 @@ done
FLAGS=" -I../rtl -I../.. -I../../sanitizer_common -I../../../include -std=c++11 -m64 -Wall -fno-exceptions -fno-rtti -DSANITIZER_GO=1 -DSANITIZER_DEADLOCK_DETECTOR_VERSION=2 $OSCFLAGS" FLAGS=" -I../rtl -I../.. -I../../sanitizer_common -I../../../include -std=c++11 -m64 -Wall -fno-exceptions -fno-rtti -DSANITIZER_GO=1 -DSANITIZER_DEADLOCK_DETECTOR_VERSION=2 $OSCFLAGS"
if [ "$DEBUG" = "" ]; then if [ "$DEBUG" = "" ]; then
FLAGS="$FLAGS -DSANITIZER_DEBUG=0 -O3 -msse3 -fomit-frame-pointer" FLAGS="$FLAGS -DSANITIZER_DEBUG=0 -O3 -fomit-frame-pointer"
if [ "$SUFFIX" = "linux_ppc64le" ]; then
FLAGS="$FLAGS -mcpu=power8 -fno-function-sections"
elif [ "$SUFFIX" = "linux_amd64" ]; then
FLAGS="$FLAGS -msse3"
fi
else else
FLAGS="$FLAGS -DSANITIZER_DEBUG=1 -g" FLAGS="$FLAGS -DSANITIZER_DEBUG=1 -g"
fi fi

View File

@ -355,9 +355,9 @@ struct Mapping47 {
#define TSAN_RUNTIME_VMA 1 #define TSAN_RUNTIME_VMA 1
#endif #endif
#elif SANITIZER_GO && !SANITIZER_WINDOWS #elif SANITIZER_GO && !SANITIZER_WINDOWS && defined(__x86_64__)
/* Go on linux, darwin and freebsd /* Go on linux, darwin and freebsd on x86_64
0000 0000 1000 - 0000 1000 0000: executable 0000 0000 1000 - 0000 1000 0000: executable
0000 1000 0000 - 00c0 0000 0000: - 0000 1000 0000 - 00c0 0000 0000: -
00c0 0000 0000 - 00e0 0000 0000: heap 00c0 0000 0000 - 00e0 0000 0000: heap
@ -406,6 +406,61 @@ struct Mapping {
static const uptr kAppMemEnd = 0x00e000000000ull; static const uptr kAppMemEnd = 0x00e000000000ull;
}; };
#elif SANITIZER_GO && defined(__powerpc64__)
/* Only Mapping46 and Mapping47 are currently supported for powercp64 on Go. */
/* Go on linux/powerpc64 (46-bit VMA)
0000 0000 1000 - 0000 1000 0000: executable
0000 1000 0000 - 00c0 0000 0000: -
00c0 0000 0000 - 00e0 0000 0000: heap
00e0 0000 0000 - 2000 0000 0000: -
2000 0000 0000 - 2380 0000 0000: shadow
2380 0000 0000 - 2400 0000 0000: -
2400 0000 0000 - 3400 0000 0000: metainfo (memory blocks and sync objects)
3400 0000 0000 - 3600 0000 0000: -
3600 0000 0000 - 3800 0000 0000: traces
3800 0000 0000 - 4000 0000 0000: -
*/
struct Mapping46 {
static const uptr kMetaShadowBeg = 0x240000000000ull;
static const uptr kMetaShadowEnd = 0x340000000000ull;
static const uptr kTraceMemBeg = 0x360000000000ull;
static const uptr kTraceMemEnd = 0x380000000000ull;
static const uptr kShadowBeg = 0x200000000000ull;
static const uptr kShadowEnd = 0x238000000000ull;
static const uptr kAppMemBeg = 0x000000001000ull;
static const uptr kAppMemEnd = 0x00e000000000ull;
};
/* Go on linux/powerpc64 (47-bit VMA)
0000 0000 1000 - 0000 1000 0000: executable
0000 1000 0000 - 00c0 0000 0000: -
00c0 0000 0000 - 00e0 0000 0000: heap
00e0 0000 0000 - 2000 0000 0000: -
2000 0000 0000 - 3000 0000 0000: shadow
3000 0000 0000 - 3000 0000 0000: -
3000 0000 0000 - 4000 0000 0000: metainfo (memory blocks and sync objects)
4000 0000 0000 - 6000 0000 0000: -
6000 0000 0000 - 6200 0000 0000: traces
6200 0000 0000 - 8000 0000 0000: -
*/
struct Mapping47 {
static const uptr kMetaShadowBeg = 0x300000000000ull;
static const uptr kMetaShadowEnd = 0x400000000000ull;
static const uptr kTraceMemBeg = 0x600000000000ull;
static const uptr kTraceMemEnd = 0x620000000000ull;
static const uptr kShadowBeg = 0x200000000000ull;
static const uptr kShadowEnd = 0x300000000000ull;
static const uptr kAppMemBeg = 0x000000001000ull;
static const uptr kAppMemEnd = 0x00e000000000ull;
};
// Indicates the runtime will define the memory regions at runtime.
#define TSAN_RUNTIME_VMA 1
#else #else
# error "Unknown platform" # error "Unknown platform"
#endif #endif
@ -478,7 +533,9 @@ uptr MappingArchImpl(void) {
return 0; return 0;
#elif defined(__powerpc64__) #elif defined(__powerpc64__)
switch (vmaSize) { switch (vmaSize) {
#if !SANITIZER_GO
case 44: return MappingImpl<Mapping44, Type>(); case 44: return MappingImpl<Mapping44, Type>();
#endif
case 46: return MappingImpl<Mapping46, Type>(); case 46: return MappingImpl<Mapping46, Type>();
case 47: return MappingImpl<Mapping47, Type>(); case 47: return MappingImpl<Mapping47, Type>();
} }
@ -633,7 +690,9 @@ bool IsAppMem(uptr mem) {
return false; return false;
#elif defined(__powerpc64__) #elif defined(__powerpc64__)
switch (vmaSize) { switch (vmaSize) {
#if !SANITIZER_GO
case 44: return IsAppMemImpl<Mapping44>(mem); case 44: return IsAppMemImpl<Mapping44>(mem);
#endif
case 46: return IsAppMemImpl<Mapping46>(mem); case 46: return IsAppMemImpl<Mapping46>(mem);
case 47: return IsAppMemImpl<Mapping47>(mem); case 47: return IsAppMemImpl<Mapping47>(mem);
} }
@ -662,7 +721,9 @@ bool IsShadowMem(uptr mem) {
return false; return false;
#elif defined(__powerpc64__) #elif defined(__powerpc64__)
switch (vmaSize) { switch (vmaSize) {
#if !SANITIZER_GO
case 44: return IsShadowMemImpl<Mapping44>(mem); case 44: return IsShadowMemImpl<Mapping44>(mem);
#endif
case 46: return IsShadowMemImpl<Mapping46>(mem); case 46: return IsShadowMemImpl<Mapping46>(mem);
case 47: return IsShadowMemImpl<Mapping47>(mem); case 47: return IsShadowMemImpl<Mapping47>(mem);
} }
@ -691,7 +752,9 @@ bool IsMetaMem(uptr mem) {
return false; return false;
#elif defined(__powerpc64__) #elif defined(__powerpc64__)
switch (vmaSize) { switch (vmaSize) {
#if !SANITIZER_GO
case 44: return IsMetaMemImpl<Mapping44>(mem); case 44: return IsMetaMemImpl<Mapping44>(mem);
#endif
case 46: return IsMetaMemImpl<Mapping46>(mem); case 46: return IsMetaMemImpl<Mapping46>(mem);
case 47: return IsMetaMemImpl<Mapping47>(mem); case 47: return IsMetaMemImpl<Mapping47>(mem);
} }
@ -730,7 +793,9 @@ uptr MemToShadow(uptr x) {
return 0; return 0;
#elif defined(__powerpc64__) #elif defined(__powerpc64__)
switch (vmaSize) { switch (vmaSize) {
#if !SANITIZER_GO
case 44: return MemToShadowImpl<Mapping44>(x); case 44: return MemToShadowImpl<Mapping44>(x);
#endif
case 46: return MemToShadowImpl<Mapping46>(x); case 46: return MemToShadowImpl<Mapping46>(x);
case 47: return MemToShadowImpl<Mapping47>(x); case 47: return MemToShadowImpl<Mapping47>(x);
} }
@ -771,7 +836,9 @@ u32 *MemToMeta(uptr x) {
return 0; return 0;
#elif defined(__powerpc64__) #elif defined(__powerpc64__)
switch (vmaSize) { switch (vmaSize) {
#if !SANITIZER_GO
case 44: return MemToMetaImpl<Mapping44>(x); case 44: return MemToMetaImpl<Mapping44>(x);
#endif
case 46: return MemToMetaImpl<Mapping46>(x); case 46: return MemToMetaImpl<Mapping46>(x);
case 47: return MemToMetaImpl<Mapping47>(x); case 47: return MemToMetaImpl<Mapping47>(x);
} }
@ -825,7 +892,9 @@ uptr ShadowToMem(uptr s) {
return 0; return 0;
#elif defined(__powerpc64__) #elif defined(__powerpc64__)
switch (vmaSize) { switch (vmaSize) {
#if !SANITIZER_GO
case 44: return ShadowToMemImpl<Mapping44>(s); case 44: return ShadowToMemImpl<Mapping44>(s);
#endif
case 46: return ShadowToMemImpl<Mapping46>(s); case 46: return ShadowToMemImpl<Mapping46>(s);
case 47: return ShadowToMemImpl<Mapping47>(s); case 47: return ShadowToMemImpl<Mapping47>(s);
} }
@ -862,7 +931,9 @@ uptr GetThreadTrace(int tid) {
return 0; return 0;
#elif defined(__powerpc64__) #elif defined(__powerpc64__)
switch (vmaSize) { switch (vmaSize) {
#if !SANITIZER_GO
case 44: return GetThreadTraceImpl<Mapping44>(tid); case 44: return GetThreadTraceImpl<Mapping44>(tid);
#endif
case 46: return GetThreadTraceImpl<Mapping46>(tid); case 46: return GetThreadTraceImpl<Mapping46>(tid);
case 47: return GetThreadTraceImpl<Mapping47>(tid); case 47: return GetThreadTraceImpl<Mapping47>(tid);
} }
@ -894,7 +965,9 @@ uptr GetThreadTraceHeader(int tid) {
return 0; return 0;
#elif defined(__powerpc64__) #elif defined(__powerpc64__)
switch (vmaSize) { switch (vmaSize) {
#if !SANITIZER_GO
case 44: return GetThreadTraceHeaderImpl<Mapping44>(tid); case 44: return GetThreadTraceHeaderImpl<Mapping44>(tid);
#endif
case 46: return GetThreadTraceHeaderImpl<Mapping46>(tid); case 46: return GetThreadTraceHeaderImpl<Mapping46>(tid);
case 47: return GetThreadTraceHeaderImpl<Mapping47>(tid); case 47: return GetThreadTraceHeaderImpl<Mapping47>(tid);
} }

View File

@ -217,11 +217,19 @@ void InitializePlatformEarly() {
Die(); Die();
} }
#elif defined(__powerpc64__) #elif defined(__powerpc64__)
# if !SANITIZER_GO
if (vmaSize != 44 && vmaSize != 46 && vmaSize != 47) { if (vmaSize != 44 && vmaSize != 46 && vmaSize != 47) {
Printf("FATAL: ThreadSanitizer: unsupported VMA range\n"); Printf("FATAL: ThreadSanitizer: unsupported VMA range\n");
Printf("FATAL: Found %d - Supported 44, 46, and 47\n", vmaSize); Printf("FATAL: Found %d - Supported 44, 46, and 47\n", vmaSize);
Die(); Die();
} }
# else
if (vmaSize != 46 && vmaSize != 47) {
Printf("FATAL: ThreadSanitizer: unsupported VMA range\n");
Printf("FATAL: Found %d - Supported 46, and 47\n", vmaSize);
Die();
}
# endif
#endif #endif
#endif #endif
} }