@@ -25,14 +25,18 @@ if $CC -fsanitize=memory -c ${TMPDIR}/testsanitizers$$.c -o ${TMPDIR}/testsaniti
25
25
fi
26
26
rm -f ${TMPDIR} /testsanitizers$$ .*
27
27
28
- # The memory sanitizer in versions of clang before 3.6 don't work with Go.
28
+ tsan=yes
29
+
30
+ # The memory and thread sanitizers in versions of clang before 3.6
31
+ # don't work with Go.
29
32
if test " $msan " = " yes" && $CC --version | grep clang >& /dev/null; then
30
33
ver=$( $CC --version | sed -e ' s/.* version \([0-9.-]*\).*/\1/' )
31
34
major=$( echo $ver | sed -e ' s/\([0-9]*\).*/\1/' )
32
35
minor=$( echo $ver | sed -e ' s/[0-9]*\.\([0-9]*\).*/\1/' )
33
36
if test " $major " -lt 3 || test " $major " -eq 3 -a " $minor " -lt 6; then
34
- echo " skipping msan tests: clang version $major .$minor (older than 3.6)"
37
+ echo " skipping msan/tsan tests: clang version $major .$minor (older than 3.6)"
35
38
msan=no
39
+ tsan=no
36
40
fi
37
41
38
42
# Clang before 3.8 does not work with Linux at or after 4.1.
@@ -43,8 +47,9 @@ if test "$msan" = "yes" && $CC --version | grep clang >& /dev/null; then
43
47
linuxmajor=$( echo $linuxver | sed -e ' s/\([0-9]*\).*/\1/' )
44
48
linuxminor=$( echo $linuxver | sed -e ' s/[0-9]*\.\([0-9]*\).*/\1/' )
45
49
if test " $linuxmajor " -gt 4 || test " $linuxmajor " -eq 4 -a " $linuxminor " -ge 1; then
46
- echo " skipping msan tests: clang version $major .$minor (older than 3.8) incompatible with linux version $linuxmajor .$linuxminor (4.1 or newer)"
50
+ echo " skipping msan/tsan tests: clang version $major .$minor (older than 3.8) incompatible with linux version $linuxmajor .$linuxminor (4.1 or newer)"
47
51
msan=no
52
+ tsan=no
48
53
fi
49
54
fi
50
55
fi
@@ -89,15 +94,22 @@ if test "$msan" = "yes"; then
89
94
fi
90
95
fi
91
96
92
- tsan=yes
93
-
94
- TMPDIR=${TMPDIR:-/ tmp}
95
- echo > ${TMPDIR} /testsanitizers$$ .c
96
- if $CC -fsanitize=thread ${TMPDIR} /testsanitizers$$ .c -o ${TMPDIR} /testsanitizers$$ 2>&1 | grep " unrecognized" >& /dev/null; then
97
- echo " skipping tsan tests: -fsanitize=thread not supported"
98
- tsan=no
97
+ if test " $tsan " = " yes" ; then
98
+ echo ' int main() { return 0; }' > ${TMPDIR} /testsanitizers$$ .c
99
+ ok=yes
100
+ if ! $CC -fsanitize=thread ${TMPDIR} /testsanitizers$$ .c -o ${TMPDIR} /testsanitizers$$ & > ${TMPDIR} /testsanitizers$$ .err; then
101
+ ok=no
102
+ fi
103
+ if grep " unrecognized" ${TMPDIR} /testsanitizers$$ .err >& /dev/null; then
104
+ echo " skipping tsan tests: -fsanitize=thread not supported"
105
+ tsan=no
106
+ elif test " $ok " ! = " yes" ; then
107
+ cat ${TMPDIR} /testsanitizers$$ .err
108
+ echo " skipping tsan tests: -fsanitizer=thread build failed"
109
+ tsan=no
110
+ fi
111
+ rm -f ${TMPDIR} /testsanitizers$$ *
99
112
fi
100
- rm -f ${TMPDIR} /testsanitizers$$ .*
101
113
102
114
if test " $tsan " = " yes" ; then
103
115
err=${TMPDIR} /tsanerr$$ .out
0 commit comments