summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2012-12-17 08:52:05 +0000
committerDmitry Vyukov <dvyukov@google.com>2012-12-17 08:52:05 +0000
commita53767ea228792321b1549620e747b8c0df0d0c9 (patch)
tree9adacbc942007f75074e2ce1f86653824299158c
parent41ffe3db59d8198b501ed75e6aaa09c1ff8c58be (diff)
downloadbcm5719-llvm-a53767ea228792321b1549620e747b8c0df0d0c9.tar.gz
bcm5719-llvm-a53767ea228792321b1549620e747b8c0df0d0c9.zip
tsan: add __has_feature(thread_sanitizer)
llvm-svn: 170314
-rw-r--r--clang/docs/ThreadSanitizer.rst14
-rw-r--r--clang/lib/Lex/PPMacroExpansion.cpp1
-rw-r--r--clang/test/Lexer/has_feature_thread_sanitizer.cpp11
3 files changed, 26 insertions, 0 deletions
diff --git a/clang/docs/ThreadSanitizer.rst b/clang/docs/ThreadSanitizer.rst
index e434062bed3..4cf0e37f83b 100644
--- a/clang/docs/ThreadSanitizer.rst
+++ b/clang/docs/ThreadSanitizer.rst
@@ -68,6 +68,20 @@ Currently, ThreadSanitizer symbolizes its output using an external
#0 pthread_create tsan_interceptors.cc:705 (exe+0x00000000c790)
#1 main tiny_race.c:9 (exe+0x00000000a3a4)
+``__has_feature(thread_sanitizer)``
+------------------------------------
+
+In some cases one may need to execute different code depending on whether
+ThreadSanitizer is enabled.
+:ref:`\_\_has\_feature <langext-__has_feature-__has_extension>` can be used for
+this purpose.
+
+.. code-block:: c
+
+ #if defined(__has_feature) && __has_feature(thread_sanitizer)
+ // code that builds only under ThreadSanitizer
+ #endif
+
Limitations
-----------
diff --git a/clang/lib/Lex/PPMacroExpansion.cpp b/clang/lib/Lex/PPMacroExpansion.cpp
index 5582100918d..941c2d47d09 100644
--- a/clang/lib/Lex/PPMacroExpansion.cpp
+++ b/clang/lib/Lex/PPMacroExpansion.cpp
@@ -780,6 +780,7 @@ static bool HasFeature(const Preprocessor &PP, const IdentifierInfo *II) {
.Case("cxx_exceptions", LangOpts.Exceptions)
.Case("cxx_rtti", LangOpts.RTTI)
.Case("enumerator_attributes", true)
+ .Case("thread_sanitizer", LangOpts.SanitizeThread)
// Objective-C features
.Case("objc_arr", LangOpts.ObjCAutoRefCount) // FIXME: REMOVE?
.Case("objc_arc", LangOpts.ObjCAutoRefCount)
diff --git a/clang/test/Lexer/has_feature_thread_sanitizer.cpp b/clang/test/Lexer/has_feature_thread_sanitizer.cpp
new file mode 100644
index 00000000000..0a248100c87
--- /dev/null
+++ b/clang/test/Lexer/has_feature_thread_sanitizer.cpp
@@ -0,0 +1,11 @@
+// RUN: %clang_cc1 -E -fsanitize=thread %s -o - | FileCheck --check-prefix=CHECK-TSAN %s
+// RUN: %clang_cc1 -E %s -o - | FileCheck --check-prefix=CHECK-NO-TSAN %s
+
+#if __has_feature(thread_sanitizer)
+int ThreadSanitizerEnabled();
+#else
+int ThreadSanitizerDisabled();
+#endif
+
+// CHECK-TSAN: ThreadSanitizerEnabled
+// CHECK-NO-TSAN: ThreadSanitizerDisabled
OpenPOWER on IntegriCloud