xref: /llvm-project/compiler-rt/lib/tsan/go/buildgo.sh (revision 4e812756745e59e02dca12abaed50638b5eb273f)
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