]> granicus.if.org Git - clang/commitdiff
tsan: add __has_feature(thread_sanitizer)
authorDmitry Vyukov <dvyukov@google.com>
Mon, 17 Dec 2012 08:52:05 +0000 (08:52 +0000)
committerDmitry Vyukov <dvyukov@google.com>
Mon, 17 Dec 2012 08:52:05 +0000 (08:52 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@170314 91177308-0d34-0410-b5e6-96231b3b80d8

docs/ThreadSanitizer.rst
lib/Lex/PPMacroExpansion.cpp
test/Lexer/has_feature_thread_sanitizer.cpp [new file with mode: 0644]

index e434062bed34be5fa661a2e6f75cbcf148514e7b..4cf0e37f83b3893ed9424aae92b59eb939725ead 100644 (file)
@@ -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
 -----------
 
index 5582100918de419f7f11e621e4fdf1a2faa7b9aa..941c2d47d09b63c53a863d1a9874b72fcae619bc 100644 (file)
@@ -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/test/Lexer/has_feature_thread_sanitizer.cpp b/test/Lexer/has_feature_thread_sanitizer.cpp
new file mode 100644 (file)
index 0000000..0a24810
--- /dev/null
@@ -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