summaryrefslogtreecommitdiffstats
path: root/scripts/Makefile.kcsan
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/Makefile.kcsan')
-rw-r--r--scripts/Makefile.kcsan15
1 files changed, 15 insertions, 0 deletions
diff --git a/scripts/Makefile.kcsan b/scripts/Makefile.kcsan
new file mode 100644
index 000000000..37cb504c7
--- /dev/null
+++ b/scripts/Makefile.kcsan
@@ -0,0 +1,15 @@
+# SPDX-License-Identifier: GPL-2.0
+# GCC and Clang accept backend options differently. Do not wrap in cc-option,
+# because Clang accepts "--param" even if it is unused.
+ifdef CONFIG_CC_IS_CLANG
+cc-param = -mllvm -$(1)
+else
+cc-param = --param $(1)
+endif
+
+# Keep most options here optional, to allow enabling more compilers if absence
+# of some options does not break KCSAN nor causes false positive reports.
+export CFLAGS_KCSAN := -fsanitize=thread \
+ $(call cc-option,$(call cc-param,tsan-instrument-func-entry-exit=0) -fno-optimize-sibling-calls) \
+ $(call cc-option,$(call cc-param,tsan-compound-read-before-write=1),$(call cc-option,$(call cc-param,tsan-instrument-read-before-write=1))) \
+ $(call cc-param,tsan-distinguish-volatile=1)