xref: /openbsd/gnu/llvm/compiler-rt/lib/tsan/go/buildgo.sh (revision a0747c9f)
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