aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDarrick J. Wong <darrick.wong@oracle.com>2018-01-12 15:36:59 -0800
committerDarrick J. Wong <darrick.wong@oracle.com>2018-04-10 20:54:46 -0700
commit4579086a907318fddff80f8edf82c0f841f91cb0 (patch)
tree53dc8aa19a79dc52dfd7505b057f57d940def854
parenta74d14559652e40246ee396182b2f3d094932e31 (diff)
downloade2fsprogs-djwong-devel.tar.gz
misc: enable thread sanitizer if the builder wants itdjwong-wtfdjwong-experimentaldjwong-devel
Enable the gcc/clang thread data corruption sanitizer if the builder requests it and it's available. Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
-rw-r--r--MCONFIG.in4
-rwxr-xr-xconfigure56
-rw-r--r--configure.ac31
-rwxr-xr-xdebian/rules2
4 files changed, 90 insertions, 3 deletions
diff --git a/MCONFIG.in b/MCONFIG.in
index 1344511e6..c3b3740e5 100644
--- a/MCONFIG.in
+++ b/MCONFIG.in
@@ -81,8 +81,8 @@ SYSTEMD_SYSTEM_UNIT_DIR = @systemd_system_unit_dir@
@ifNotGNUmake@ CHECK_CMD=true
@ifNotGNUmake@ CPPCHECK_CMD=true
-SANITIZER_CFLAGS = @lto_cflags@ @ubsan_cflags@ @addrsan_cflags@
-SANITIZER_LDFLAGS = @lto_ldflags@ @ubsan_ldflags@ @addrsan_ldflags@
+SANITIZER_CFLAGS = @lto_cflags@ @ubsan_cflags@ @addrsan_cflags@ @threadsan_cflags@
+SANITIZER_LDFLAGS = @lto_ldflags@ @ubsan_ldflags@ @addrsan_ldflags@ @threadsan_ldflags@
CC = @CC@
BUILD_CC = @BUILD_CC@
diff --git a/configure b/configure
index 31fe8ca4a..c278ddb81 100755
--- a/configure
+++ b/configure
@@ -653,6 +653,9 @@ E2SCRUB_CMT
UNIX_CMT
CYGWIN_CMT
LINUX_CMT
+threadsan_ldflags
+threadsan_cflags
+have_threadsan
addrsan_ldflags
addrsan_cflags
have_addrsan
@@ -917,6 +920,7 @@ enable_fuse2fs
enable_lto
enable_ubsan
enable_addrsan
+enable_threadsan
with_multiarch
with_udev_rules_dir
with_crond_dir
@@ -1598,6 +1602,7 @@ Optional Features:
--enable-lto enable link time optimization
--enable-ubsan enable undefined behavior sanitizer
--enable-addrsan enable address sanitizer
+ --enable-threadsan enable thread sanitizer
Optional Packages:
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
@@ -13969,6 +13974,57 @@ fi
if test "$enable_addrsan" = "yes" && test "$have_addrsan" != "yes"; then
as_fn_error $? "ADDRSAN not supported by compiler." "$LINENO" 5
fi
+# Check whether --enable-threadsan was given.
+if test "${enable_threadsan+set}" = set; then :
+ enableval=$enable_threadsan;
+else
+ enable_threadsan=no
+fi
+
+if test "$enable_threadsan" = "yes" || test "$enable_threadsan" = "probe"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if C compiler supports THREADSAN" >&5
+$as_echo_n "checking if C compiler supports THREADSAN... " >&6; }
+ OLD_CFLAGS="$CFLAGS"
+ OLD_LDFLAGS="$LDFLAGS"
+ THREADSAN_FLAGS="-fsanitize=thread"
+ CFLAGS="$CFLAGS $THREADSAN_FLAGS"
+ LDFLAGS="$LDFLAGS $THREADSAN_FLAGS"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ threadsan_cflags=$THREADSAN_FLAGS
+ threadsan_ldflags=$THREADSAN_FLAGS
+ have_threadsan=yes
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ CFLAGS="${OLD_CFLAGS}"
+ LDFLAGS="${OLD_LDFLAGS}"
+
+
+
+fi
+if test "$enable_threadsan" = "yes" && test "$have_threadsan" != "yes"; then
+ as_fn_error $? "THREADSAN not supported by compiler." "$LINENO" 5
+fi
+if test "$have_threadsan" = "yes" && test "$have_addrsan" = "yes"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ADDRSAN and THREADSAN are not known to work together." >&5
+$as_echo "$as_me: WARNING: ADDRSAN and THREADSAN are not known to work together." >&2;}
+fi
LINUX_CMT="#"
CYGWIN_CMT="#"
UNIX_CMT=
diff --git a/configure.ac b/configure.ac
index e02bdea22..1cc742042 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1385,6 +1385,37 @@ if test "$enable_addrsan" = "yes" && test "$have_addrsan" != "yes"; then
AC_MSG_ERROR([ADDRSAN not supported by compiler.])
fi
dnl
+dnl Enable THREADSAN for all packages
+dnl
+AC_ARG_ENABLE([threadsan],
+[ --enable-threadsan enable thread sanitizer],,
+enable_threadsan=no)
+if test "$enable_threadsan" = "yes" || test "$enable_threadsan" = "probe"; then
+ AC_MSG_CHECKING([if C compiler supports THREADSAN])
+ OLD_CFLAGS="$CFLAGS"
+ OLD_LDFLAGS="$LDFLAGS"
+ THREADSAN_FLAGS="-fsanitize=thread"
+ CFLAGS="$CFLAGS $THREADSAN_FLAGS"
+ LDFLAGS="$LDFLAGS $THREADSAN_FLAGS"
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([])],
+ [AC_MSG_RESULT([yes])]
+ [threadsan_cflags=$THREADSAN_FLAGS]
+ [threadsan_ldflags=$THREADSAN_FLAGS]
+ [have_threadsan=yes],
+ [AC_MSG_RESULT([no])])
+ CFLAGS="${OLD_CFLAGS}"
+ LDFLAGS="${OLD_LDFLAGS}"
+ AC_SUBST(have_threadsan)
+ AC_SUBST(threadsan_cflags)
+ AC_SUBST(threadsan_ldflags)
+fi
+if test "$enable_threadsan" = "yes" && test "$have_threadsan" != "yes"; then
+ AC_MSG_ERROR([THREADSAN not supported by compiler.])
+fi
+if test "$have_threadsan" = "yes" && test "$have_addrsan" = "yes"; then
+ AC_MSG_WARN([ADDRSAN and THREADSAN are not known to work together.])
+fi
+dnl
dnl OS-specific uncomment control
dnl
LINUX_CMT="#"
diff --git a/debian/rules b/debian/rules
index f4135e81b..6f694ddaf 100755
--- a/debian/rules
+++ b/debian/rules
@@ -165,7 +165,7 @@ endif
BACKTRACE_CONF_FLAGS ?= $(shell if ${debdir}/scripts/test-backtrace ; then echo --disable-backtrace ; fi)
COMMON_CONF_FLAGS = --enable-lto --disable-ubsan --disable-addrsan \
- --disable-e2initrd-helper \
+ --disable-threadsan --disable-e2initrd-helper \
--infodir=/usr/share/info --enable-symlink-install \
--with-multiarch=$(DEB_HOST_MULTIARCH) \
$(BACKTRACE_CONF_FLAGS) $(UTIL_CONF_FLAGS)