forked from OSchip/llvm-project
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:
parent
54d736c416
commit
3a99c76e3d
|
@ -152,6 +152,15 @@ else()
|
|||
add_asm_sources(TSAN_ASM_SOURCES rtl/tsan_rtl_aarch64.S)
|
||||
elseif(arch MATCHES "powerpc64|powerpc64le")
|
||||
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")
|
||||
add_asm_sources(TSAN_ASM_SOURCES rtl/tsan_rtl_mips64.S)
|
||||
else()
|
||||
|
|
|
@ -39,8 +39,7 @@ SRCS="
|
|||
"
|
||||
|
||||
if [ "`uname -a | grep Linux`" != "" ]; then
|
||||
SUFFIX="linux_amd64"
|
||||
OSCFLAGS="-fPIC -ffreestanding -Wno-maybe-uninitialized -Wno-unused-const-variable -Werror -Wno-unknown-warning-option"
|
||||
OSCFLAGS="-fPIC -Wno-maybe-uninitialized"
|
||||
OSLDFLAGS="-lpthread -fPIC -fpie"
|
||||
SRCS="
|
||||
$SRCS
|
||||
|
@ -52,7 +51,13 @@ if [ "`uname -a | grep Linux`" != "" ]; then
|
|||
../../sanitizer_common/sanitizer_linux.cc
|
||||
../../sanitizer_common/sanitizer_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
|
||||
SUFFIX="freebsd_amd64"
|
||||
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"
|
||||
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
|
||||
FLAGS="$FLAGS -DSANITIZER_DEBUG=1 -g"
|
||||
fi
|
||||
|
|
|
@ -355,9 +355,9 @@ struct Mapping47 {
|
|||
#define TSAN_RUNTIME_VMA 1
|
||||
#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 1000 0000 - 00c0 0000 0000: -
|
||||
00c0 0000 0000 - 00e0 0000 0000: heap
|
||||
|
@ -406,6 +406,61 @@ struct Mapping {
|
|||
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
|
||||
# error "Unknown platform"
|
||||
#endif
|
||||
|
@ -478,7 +533,9 @@ uptr MappingArchImpl(void) {
|
|||
return 0;
|
||||
#elif defined(__powerpc64__)
|
||||
switch (vmaSize) {
|
||||
#if !SANITIZER_GO
|
||||
case 44: return MappingImpl<Mapping44, Type>();
|
||||
#endif
|
||||
case 46: return MappingImpl<Mapping46, Type>();
|
||||
case 47: return MappingImpl<Mapping47, Type>();
|
||||
}
|
||||
|
@ -633,7 +690,9 @@ bool IsAppMem(uptr mem) {
|
|||
return false;
|
||||
#elif defined(__powerpc64__)
|
||||
switch (vmaSize) {
|
||||
#if !SANITIZER_GO
|
||||
case 44: return IsAppMemImpl<Mapping44>(mem);
|
||||
#endif
|
||||
case 46: return IsAppMemImpl<Mapping46>(mem);
|
||||
case 47: return IsAppMemImpl<Mapping47>(mem);
|
||||
}
|
||||
|
@ -662,7 +721,9 @@ bool IsShadowMem(uptr mem) {
|
|||
return false;
|
||||
#elif defined(__powerpc64__)
|
||||
switch (vmaSize) {
|
||||
#if !SANITIZER_GO
|
||||
case 44: return IsShadowMemImpl<Mapping44>(mem);
|
||||
#endif
|
||||
case 46: return IsShadowMemImpl<Mapping46>(mem);
|
||||
case 47: return IsShadowMemImpl<Mapping47>(mem);
|
||||
}
|
||||
|
@ -691,7 +752,9 @@ bool IsMetaMem(uptr mem) {
|
|||
return false;
|
||||
#elif defined(__powerpc64__)
|
||||
switch (vmaSize) {
|
||||
#if !SANITIZER_GO
|
||||
case 44: return IsMetaMemImpl<Mapping44>(mem);
|
||||
#endif
|
||||
case 46: return IsMetaMemImpl<Mapping46>(mem);
|
||||
case 47: return IsMetaMemImpl<Mapping47>(mem);
|
||||
}
|
||||
|
@ -730,7 +793,9 @@ uptr MemToShadow(uptr x) {
|
|||
return 0;
|
||||
#elif defined(__powerpc64__)
|
||||
switch (vmaSize) {
|
||||
#if !SANITIZER_GO
|
||||
case 44: return MemToShadowImpl<Mapping44>(x);
|
||||
#endif
|
||||
case 46: return MemToShadowImpl<Mapping46>(x);
|
||||
case 47: return MemToShadowImpl<Mapping47>(x);
|
||||
}
|
||||
|
@ -771,7 +836,9 @@ u32 *MemToMeta(uptr x) {
|
|||
return 0;
|
||||
#elif defined(__powerpc64__)
|
||||
switch (vmaSize) {
|
||||
#if !SANITIZER_GO
|
||||
case 44: return MemToMetaImpl<Mapping44>(x);
|
||||
#endif
|
||||
case 46: return MemToMetaImpl<Mapping46>(x);
|
||||
case 47: return MemToMetaImpl<Mapping47>(x);
|
||||
}
|
||||
|
@ -825,7 +892,9 @@ uptr ShadowToMem(uptr s) {
|
|||
return 0;
|
||||
#elif defined(__powerpc64__)
|
||||
switch (vmaSize) {
|
||||
#if !SANITIZER_GO
|
||||
case 44: return ShadowToMemImpl<Mapping44>(s);
|
||||
#endif
|
||||
case 46: return ShadowToMemImpl<Mapping46>(s);
|
||||
case 47: return ShadowToMemImpl<Mapping47>(s);
|
||||
}
|
||||
|
@ -862,7 +931,9 @@ uptr GetThreadTrace(int tid) {
|
|||
return 0;
|
||||
#elif defined(__powerpc64__)
|
||||
switch (vmaSize) {
|
||||
#if !SANITIZER_GO
|
||||
case 44: return GetThreadTraceImpl<Mapping44>(tid);
|
||||
#endif
|
||||
case 46: return GetThreadTraceImpl<Mapping46>(tid);
|
||||
case 47: return GetThreadTraceImpl<Mapping47>(tid);
|
||||
}
|
||||
|
@ -894,7 +965,9 @@ uptr GetThreadTraceHeader(int tid) {
|
|||
return 0;
|
||||
#elif defined(__powerpc64__)
|
||||
switch (vmaSize) {
|
||||
#if !SANITIZER_GO
|
||||
case 44: return GetThreadTraceHeaderImpl<Mapping44>(tid);
|
||||
#endif
|
||||
case 46: return GetThreadTraceHeaderImpl<Mapping46>(tid);
|
||||
case 47: return GetThreadTraceHeaderImpl<Mapping47>(tid);
|
||||
}
|
||||
|
|
|
@ -217,11 +217,19 @@ void InitializePlatformEarly() {
|
|||
Die();
|
||||
}
|
||||
#elif defined(__powerpc64__)
|
||||
# if !SANITIZER_GO
|
||||
if (vmaSize != 44 && vmaSize != 46 && vmaSize != 47) {
|
||||
Printf("FATAL: ThreadSanitizer: unsupported VMA range\n");
|
||||
Printf("FATAL: Found %d - Supported 44, 46, and 47\n", vmaSize);
|
||||
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
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue