1#!/bin/sh 2 3set -e 4 5SRCS=" 6 tsan_go.cpp 7 ../rtl/tsan_clock.cpp 8 ../rtl/tsan_external.cpp 9 ../rtl/tsan_flags.cpp 10 ../rtl/tsan_interface_atomic.cpp 11 ../rtl/tsan_md5.cpp 12 ../rtl/tsan_report.cpp 13 ../rtl/tsan_rtl.cpp 14 ../rtl/tsan_rtl_mutex.cpp 15 ../rtl/tsan_rtl_report.cpp 16 ../rtl/tsan_rtl_thread.cpp 17 ../rtl/tsan_rtl_proc.cpp 18 ../rtl/tsan_stack_trace.cpp 19 ../rtl/tsan_suppressions.cpp 20 ../rtl/tsan_sync.cpp 21 ../../sanitizer_common/sanitizer_allocator.cpp 22 ../../sanitizer_common/sanitizer_common.cpp 23 ../../sanitizer_common/sanitizer_common_libcdep.cpp 24 ../../sanitizer_common/sanitizer_deadlock_detector2.cpp 25 ../../sanitizer_common/sanitizer_file.cpp 26 ../../sanitizer_common/sanitizer_flag_parser.cpp 27 ../../sanitizer_common/sanitizer_flags.cpp 28 ../../sanitizer_common/sanitizer_libc.cpp 29 ../../sanitizer_common/sanitizer_mutex.cpp 30 ../../sanitizer_common/sanitizer_persistent_allocator.cpp 31 ../../sanitizer_common/sanitizer_printf.cpp 32 ../../sanitizer_common/sanitizer_suppressions.cpp 33 ../../sanitizer_common/sanitizer_thread_registry.cpp 34 ../../sanitizer_common/sanitizer_stackdepot.cpp 35 ../../sanitizer_common/sanitizer_stacktrace.cpp 36 ../../sanitizer_common/sanitizer_symbolizer.cpp 37 ../../sanitizer_common/sanitizer_symbolizer_report.cpp 38 ../../sanitizer_common/sanitizer_termination.cpp 39" 40 41if [ "`uname -a | grep Linux`" != "" ]; then 42 OSCFLAGS="-fPIC -Wno-maybe-uninitialized" 43 OSLDFLAGS="-lpthread -fPIC -fpie" 44 SRCS=" 45 $SRCS 46 ../rtl/tsan_platform_linux.cpp 47 ../../sanitizer_common/sanitizer_posix.cpp 48 ../../sanitizer_common/sanitizer_posix_libcdep.cpp 49 ../../sanitizer_common/sanitizer_procmaps_common.cpp 50 ../../sanitizer_common/sanitizer_procmaps_linux.cpp 51 ../../sanitizer_common/sanitizer_linux.cpp 52 ../../sanitizer_common/sanitizer_linux_libcdep.cpp 53 ../../sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cpp 54 ../../sanitizer_common/sanitizer_stoptheworld_netbsd_libcdep.cpp 55 " 56 if [ "`uname -a | grep ppc64le`" != "" ]; then 57 SUFFIX="linux_ppc64le" 58 ARCHCFLAGS="-m64 -mcpu=power8 -fno-function-sections" 59 elif [ "`uname -a | grep x86_64`" != "" ]; then 60 SUFFIX="linux_amd64" 61 ARCHCFLAGS="-m64 -msse3" 62 OSCFLAGS="$OSCFLAGS -ffreestanding -Wno-unused-const-variable -Werror -Wno-unknown-warning-option" 63 elif [ "`uname -a | grep aarch64`" != "" ]; then 64 SUFFIX="linux_arm64" 65 ARCHCFLAGS="" 66 elif [ "`uname -a | grep -i mips64`" != "" ]; then 67 if [ "`lscpu | grep -i Little`" != "" ]; then 68 SUFFIX="linux_mips64le" 69 ARCHCFLAGS="-mips64 -EL" 70 else 71 SUFFIX="linux_mips64" 72 ARCHCFLAGS="-mips64 -EB" 73 fi 74 elif [ "`uname -a | grep s390x`" != "" ]; then 75 SRCS="$SRCS ../../sanitizer_common/sanitizer_linux_s390.cpp" 76 SUFFIX="linux_s390x" 77 ARCHCFLAGS="" 78 fi 79elif [ "`uname -a | grep FreeBSD`" != "" ]; then 80 # The resulting object still depends on libc. 81 # We removed this dependency for Go runtime for other OSes, 82 # and we should remove it for FreeBSD as well, but there is no pressing need. 83 DEPENDS_ON_LIBC=1 84 SUFFIX="freebsd_amd64" 85 OSCFLAGS="-fno-strict-aliasing -fPIC -Werror" 86 ARCHCFLAGS="-m64" 87 OSLDFLAGS="-lpthread -fPIC -fpie" 88 SRCS=" 89 $SRCS 90 ../rtl/tsan_platform_linux.cpp 91 ../../sanitizer_common/sanitizer_posix.cpp 92 ../../sanitizer_common/sanitizer_posix_libcdep.cpp 93 ../../sanitizer_common/sanitizer_procmaps_bsd.cpp 94 ../../sanitizer_common/sanitizer_procmaps_common.cpp 95 ../../sanitizer_common/sanitizer_linux.cpp 96 ../../sanitizer_common/sanitizer_linux_libcdep.cpp 97 ../../sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cpp 98 ../../sanitizer_common/sanitizer_stoptheworld_netbsd_libcdep.cpp 99 " 100elif [ "`uname -a | grep NetBSD`" != "" ]; then 101 # The resulting object still depends on libc. 102 # We removed this dependency for Go runtime for other OSes, 103 # and we should remove it for NetBSD as well, but there is no pressing need. 104 DEPENDS_ON_LIBC=1 105 SUFFIX="netbsd_amd64" 106 OSCFLAGS="-fno-strict-aliasing -fPIC -Werror" 107 ARCHCFLAGS="-m64" 108 OSLDFLAGS="-lpthread -fPIC -fpie" 109 SRCS=" 110 $SRCS 111 ../rtl/tsan_platform_linux.cpp 112 ../../sanitizer_common/sanitizer_posix.cpp 113 ../../sanitizer_common/sanitizer_posix_libcdep.cpp 114 ../../sanitizer_common/sanitizer_procmaps_bsd.cpp 115 ../../sanitizer_common/sanitizer_procmaps_common.cpp 116 ../../sanitizer_common/sanitizer_linux.cpp 117 ../../sanitizer_common/sanitizer_linux_libcdep.cpp 118 ../../sanitizer_common/sanitizer_netbsd.cpp 119 ../../sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cpp 120 ../../sanitizer_common/sanitizer_stoptheworld_netbsd_libcdep.cpp 121 " 122elif [ "`uname -a | grep Darwin`" != "" ]; then 123 OSCFLAGS="-fPIC -Wno-unused-const-variable -Wno-unknown-warning-option -mmacosx-version-min=10.7" 124 OSLDFLAGS="-lpthread -fPIC -fpie -mmacosx-version-min=10.7" 125 SRCS=" 126 $SRCS 127 ../rtl/tsan_platform_mac.cpp 128 ../../sanitizer_common/sanitizer_mac.cpp 129 ../../sanitizer_common/sanitizer_mac_libcdep.cpp 130 ../../sanitizer_common/sanitizer_posix.cpp 131 ../../sanitizer_common/sanitizer_posix_libcdep.cpp 132 ../../sanitizer_common/sanitizer_procmaps_mac.cpp 133 " 134 if [ "`uname -a | grep x86_64`" != "" ]; then 135 SUFFIX="darwin_amd64" 136 ARCHCFLAGS="-m64" 137 elif [ "`uname -a | grep arm64`" != "" ]; then 138 SUFFIX="darwin_arm64" 139 ARCHCFLAGS="" 140 fi 141elif [ "`uname -a | grep MINGW`" != "" ]; then 142 SUFFIX="windows_amd64" 143 OSCFLAGS="-Wno-error=attributes -Wno-attributes -Wno-unused-const-variable -Wno-unknown-warning-option" 144 ARCHCFLAGS="-m64" 145 OSLDFLAGS="" 146 SRCS=" 147 $SRCS 148 ../rtl/tsan_platform_windows.cpp 149 ../../sanitizer_common/sanitizer_win.cpp 150 " 151else 152 echo Unknown platform 153 exit 1 154fi 155 156CC=${CC:-gcc} 157IN_TMPDIR=${IN_TMPDIR:-0} 158SILENT=${SILENT:-0} 159 160if [ $IN_TMPDIR != "0" ]; then 161 DIR=$(mktemp -qd /tmp/gotsan.XXXXXXXXXX) 162 cleanup() { 163 rm -rf $DIR 164 } 165 trap cleanup EXIT 166else 167 DIR=. 168fi 169 170SRCS="$SRCS $ADD_SRCS" 171for F in $SRCS; do 172 echo "#line 1 \"$F\"" 173 cat $F 174done > $DIR/gotsan.cpp 175 176FLAGS=" -I../rtl -I../.. -I../../sanitizer_common -I../../../include -std=c++14 -Wall -fno-exceptions -fno-rtti -DSANITIZER_GO=1 -DSANITIZER_DEADLOCK_DETECTOR_VERSION=2 $OSCFLAGS $ARCHCFLAGS $EXTRA_CFLAGS" 177DEBUG_FLAGS="$FLAGS -DSANITIZER_DEBUG=1 -g" 178FLAGS="$FLAGS -DSANITIZER_DEBUG=0 -O3 -fomit-frame-pointer" 179 180if [ "$DEBUG" = "" ]; then 181 # Do a build test with debug flags. 182 $CC $DIR/gotsan.cpp -c -o $DIR/race_debug_$SUFFIX.syso $DEBUG_FLAGS $CFLAGS 183else 184 FLAGS="$DEBUG_FLAGS" 185fi 186 187if [ "$SILENT" != "1" ]; then 188 echo $CC gotsan.cpp -c -o $DIR/race_$SUFFIX.syso $FLAGS $CFLAGS 189fi 190$CC $DIR/gotsan.cpp -c -o $DIR/race_$SUFFIX.syso $FLAGS $CFLAGS 191 192$CC $OSCFLAGS $ARCHCFLAGS test.c $DIR/race_$SUFFIX.syso -g -o $DIR/test $OSLDFLAGS $LDFLAGS 193 194# Verify that no libc specific code is present. 195if [ "$DEPENDS_ON_LIBC" != "1" ]; then 196 if nm $DIR/race_$SUFFIX.syso | grep -q __libc_; then 197 printf -- '%s seems to link to libc\n' "race_$SUFFIX.syso" 198 exit 1 199 fi 200fi 201 202if [ "`uname -a | grep NetBSD`" != "" ]; then 203 # Turn off ASLR in the test binary. 204 /usr/sbin/paxctl +a $DIR/test 205fi 206export GORACE="exitcode=0 atexit_sleep_ms=0" 207if [ "$SILENT" != "1" ]; then 208 $DIR/test 209else 210 $DIR/test 2>/dev/null 211fi 212