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