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