257 lines · bash
1#!/bin/sh2 3set -e4 5if [ "`uname -a | grep Linux`" != "" ]; then6 HOST_GOOS="linux"7 if [ "`uname -a | grep ppc64le`" != "" ]; then8 HOST_GOARCH="ppc64le"9 elif [ "`uname -a | grep x86_64`" != "" ]; then10 HOST_GOARCH="amd64"11 elif [ "`uname -a | grep aarch64`" != "" ]; then12 HOST_GOARCH="arm64"13 elif [ "`uname -a | grep loongarch64`" != "" ]; then14 HOST_GOARCH="loong64"15 elif [ "`uname -a | grep -i mips64`" != "" ]; then16 if [ "`lscpu | grep -i Little`" != "" ]; then17 HOST_GOARCH="mips64le"18 else19 HOST_GOARCH="mips64"20 fi21 elif [ "`uname -a | grep riscv64`" != "" ]; then22 HOST_GOARCH="riscv64"23 elif [ "`uname -a | grep s390x`" != "" ]; then24 HOST_GOARCH="s390x"25 fi26elif [ "`uname -a | grep FreeBSD`" != "" ]; then27 HOST_GOOS="freebsd"28 HOST_GOARCH="amd64"29elif [ "`uname -a | grep NetBSD`" != "" ]; then30 HOST_GOOS="netbsd"31 HOST_GOARCH="amd64"32elif [ "`uname -a | grep Darwin`" != "" ]; then33 HOST_GOOS="darwin"34 if [ "`uname -a | grep x86_64`" != "" ]; then35 HOST_GOARCH="amd64"36 elif [ "`uname -a | grep arm64`" != "" ]; then37 HOST_GOARCH="arm64"38 fi39elif [ "`uname -a | grep MINGW`" != "" ]; then40 HOST_GOOS="windows"41 HOST_GOARCH="amd64"42fi43 44GOOS=${GOOS:-$HOST_GOOS}45GOARCH=${GOARCH:-$HOST_GOARCH}46SUFFIX="${GOOS}_${GOARCH}"47 48SRCS="49 tsan_go.cpp50 ../rtl/tsan_external.cpp51 ../rtl/tsan_flags.cpp52 ../rtl/tsan_interface_atomic.cpp53 ../rtl/tsan_md5.cpp54 ../rtl/tsan_report.cpp55 ../rtl/tsan_rtl.cpp56 ../rtl/tsan_rtl_access.cpp57 ../rtl/tsan_rtl_mutex.cpp58 ../rtl/tsan_rtl_report.cpp59 ../rtl/tsan_rtl_thread.cpp60 ../rtl/tsan_rtl_proc.cpp61 ../rtl/tsan_stack_trace.cpp62 ../rtl/tsan_suppressions.cpp63 ../rtl/tsan_sync.cpp64 ../rtl/tsan_vector_clock.cpp65 ../../sanitizer_common/sanitizer_allocator.cpp66 ../../sanitizer_common/sanitizer_common.cpp67 ../../sanitizer_common/sanitizer_common_libcdep.cpp68 ../../sanitizer_common/sanitizer_deadlock_detector2.cpp69 ../../sanitizer_common/sanitizer_file.cpp70 ../../sanitizer_common/sanitizer_flag_parser.cpp71 ../../sanitizer_common/sanitizer_flags.cpp72 ../../sanitizer_common/sanitizer_libc.cpp73 ../../sanitizer_common/sanitizer_mutex.cpp74 ../../sanitizer_common/sanitizer_printf.cpp75 ../../sanitizer_common/sanitizer_suppressions.cpp76 ../../sanitizer_common/sanitizer_thread_registry.cpp77 ../../sanitizer_common/sanitizer_stack_store.cpp78 ../../sanitizer_common/sanitizer_stackdepot.cpp79 ../../sanitizer_common/sanitizer_stacktrace.cpp80 ../../sanitizer_common/sanitizer_symbolizer.cpp81 ../../sanitizer_common/sanitizer_symbolizer_report.cpp82 ../../sanitizer_common/sanitizer_termination.cpp83"84 85if [ "$GOOS" = "linux" ]; then86 OSCFLAGS="-fPIC -Wno-maybe-uninitialized"87 OSLDFLAGS="-lpthread -fPIC -fpie"88 SRCS="89 $SRCS90 ../rtl/tsan_platform_linux.cpp91 ../../sanitizer_common/sanitizer_posix.cpp92 ../../sanitizer_common/sanitizer_posix_libcdep.cpp93 ../../sanitizer_common/sanitizer_procmaps_common.cpp94 ../../sanitizer_common/sanitizer_procmaps_linux.cpp95 ../../sanitizer_common/sanitizer_linux.cpp96 ../../sanitizer_common/sanitizer_linux_libcdep.cpp97 ../../sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cpp98 ../../sanitizer_common/sanitizer_stoptheworld_netbsd_libcdep.cpp99 "100 if [ "$GOARCH" = "ppc64le" ]; then101 ARCHCFLAGS="-m64 -mcpu=power8 -fno-function-sections"102 elif [ "$GOARCH" = "amd64" ]; then103 if [ "$GOAMD64" = "v3" ]; then104 ARCHCFLAGS="-m64 -msse4.2"105 else106 ARCHCFLAGS="-m64 -msse3"107 fi108 OSCFLAGS="$OSCFLAGS -ffreestanding -Wno-unused-const-variable -Wno-unknown-warning-option"109 elif [ "$GOARCH" = "arm64" ]; then110 ARCHCFLAGS=""111 elif [ "$GOARCH" = "mips64le" ]; then112 ARCHCFLAGS="-mips64 -EL"113 elif [ "$GOARCH" = "mips64" ]; then114 ARCHCFLAGS="-mips64 -EB"115 elif [ "$GOARCH" = "riscv64" ]; then116 if [ "$GORISCV64" = "rva23u64" ]; then117 ARCHCFLAGS="-march=rv64gcv"118 else119 ARCHCFLAGS="-march=rv64gc"120 fi121 elif [ "$GOARCH" = "s390x" ]; then122 SRCS="$SRCS ../../sanitizer_common/sanitizer_linux_s390.cpp"123 ARCHCFLAGS=""124 fi125elif [ "$GOOS" = "freebsd" ]; then126 # The resulting object still depends on libc.127 # We removed this dependency for Go runtime for other OSes,128 # and we should remove it for FreeBSD as well, but there is no pressing need.129 DEPENDS_ON_LIBC=1130 OSCFLAGS="-fno-strict-aliasing -fPIC -Werror"131 ARCHCFLAGS="-m64"132 OSLDFLAGS="-lpthread -fPIC -fpie"133 SRCS="134 $SRCS135 ../rtl/tsan_platform_linux.cpp136 ../../sanitizer_common/sanitizer_posix.cpp137 ../../sanitizer_common/sanitizer_posix_libcdep.cpp138 ../../sanitizer_common/sanitizer_procmaps_bsd.cpp139 ../../sanitizer_common/sanitizer_procmaps_common.cpp140 ../../sanitizer_common/sanitizer_linux.cpp141 ../../sanitizer_common/sanitizer_linux_libcdep.cpp142 ../../sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cpp143 ../../sanitizer_common/sanitizer_stoptheworld_netbsd_libcdep.cpp144 "145elif [ "$GOOS" = "netbsd" ]; then146 # The resulting object still depends on libc.147 # We removed this dependency for Go runtime for other OSes,148 # and we should remove it for NetBSD as well, but there is no pressing need.149 DEPENDS_ON_LIBC=1150 OSCFLAGS="-fno-strict-aliasing -fPIC -Werror"151 ARCHCFLAGS="-m64"152 OSLDFLAGS="-lpthread -fPIC -fpie"153 SRCS="154 $SRCS155 ../rtl/tsan_platform_linux.cpp156 ../../sanitizer_common/sanitizer_posix.cpp157 ../../sanitizer_common/sanitizer_posix_libcdep.cpp158 ../../sanitizer_common/sanitizer_procmaps_bsd.cpp159 ../../sanitizer_common/sanitizer_procmaps_common.cpp160 ../../sanitizer_common/sanitizer_linux.cpp161 ../../sanitizer_common/sanitizer_linux_libcdep.cpp162 ../../sanitizer_common/sanitizer_netbsd.cpp163 ../../sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cpp164 ../../sanitizer_common/sanitizer_stoptheworld_netbsd_libcdep.cpp165 "166elif [ "$GOOS" = "darwin" ]; then167 OSCFLAGS="-fPIC -Wno-unused-const-variable -Wno-unknown-warning-option -mmacosx-version-min=10.7"168 OSLDFLAGS="-lpthread -fPIC -fpie -mmacosx-version-min=10.7"169 SRCS="170 $SRCS171 ../rtl/tsan_platform_mac.cpp172 ../../sanitizer_common/sanitizer_mac.cpp173 ../../sanitizer_common/sanitizer_mac_libcdep.cpp174 ../../sanitizer_common/sanitizer_posix.cpp175 ../../sanitizer_common/sanitizer_posix_libcdep.cpp176 ../../sanitizer_common/sanitizer_procmaps_mac.cpp177 "178 if [ "$GOARCH" = "amd64" ]; then179 ARCHCFLAGS="-m64"180 elif [ "$GOARCH" = "arm64" ]; then181 ARCHCFLAGS=""182 fi183elif [ "$GOOS" = "windows" ]; then184 OSCFLAGS="-Wno-error=attributes -Wno-attributes -Wno-unused-const-variable -Wno-unknown-warning-option"185 ARCHCFLAGS="-m64"186 OSLDFLAGS=""187 SRCS="188 $SRCS189 ../rtl/tsan_platform_windows.cpp190 ../../sanitizer_common/sanitizer_win.cpp191 "192else193 echo Unknown platform194 exit 1195fi196 197CC=${CC:-gcc}198IN_TMPDIR=${IN_TMPDIR:-0}199SILENT=${SILENT:-0}200 201if [ $IN_TMPDIR != "0" ]; then202 DIR=$(mktemp -qd /tmp/gotsan.XXXXXXXXXX)203 cleanup() {204 rm -rf $DIR205 }206 trap cleanup EXIT207else208 DIR=.209fi210 211SRCS="$SRCS $ADD_SRCS"212for F in $SRCS; do213 echo "#line 1 \"$F\""214 cat $F215done > $DIR/gotsan.cpp216 217FLAGS=" -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"218DEBUG_FLAGS="$FLAGS -DSANITIZER_DEBUG=1 -g"219FLAGS="$FLAGS -DSANITIZER_DEBUG=0 -O3 -fomit-frame-pointer"220 221if [ "$DEBUG" = "" ]; then222 # Do a build test with debug flags.223 $CC $DIR/gotsan.cpp -c -o $DIR/race_debug_$SUFFIX.syso $DEBUG_FLAGS $CFLAGS224else225 FLAGS="$DEBUG_FLAGS"226fi227 228if [ "$SILENT" != "1" ]; then229 echo $CC gotsan.cpp -c -o $DIR/race_$SUFFIX.syso $FLAGS $CFLAGS230fi231$CC $DIR/gotsan.cpp -c -o $DIR/race_$SUFFIX.syso $FLAGS $CFLAGS232 233$CC $OSCFLAGS $ARCHCFLAGS test.c $DIR/race_$SUFFIX.syso -g -o $DIR/test $OSLDFLAGS $LDFLAGS234 235# Verify that no libc specific code is present.236if [ "$DEPENDS_ON_LIBC" != "1" ]; then237 if nm $DIR/race_$SUFFIX.syso | grep -q __libc_; then238 printf -- '%s seems to link to libc\n' "race_$SUFFIX.syso"239 exit 1240 fi241fi242 243if [ "$SKIP_TEST" = "1" ]; then244 exit 0245fi246 247if [ "`uname -a | grep NetBSD`" != "" ]; then248 # Turn off ASLR in the test binary.249 /usr/sbin/paxctl +a $DIR/test250fi251export GORACE="exitcode=0 atexit_sleep_ms=0"252if [ "$SILENT" != "1" ]; then253 $DIR/test254else255 $DIR/test 2>/dev/null256fi257