From: Dmitry Vyukov Date: Mon, 17 Dec 2012 08:52:05 +0000 (+0000) Subject: tsan: add __has_feature(thread_sanitizer) X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=728e2127e858611750d560ee7692c322a8570faa;p=clang tsan: add __has_feature(thread_sanitizer) git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@170314 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/docs/ThreadSanitizer.rst b/docs/ThreadSanitizer.rst index e434062bed..4cf0e37f83 100644 --- a/docs/ThreadSanitizer.rst +++ b/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 ` 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/lib/Lex/PPMacroExpansion.cpp b/lib/Lex/PPMacroExpansion.cpp index 5582100918..941c2d47d0 100644 --- a/lib/Lex/PPMacroExpansion.cpp +++ b/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/test/Lexer/has_feature_thread_sanitizer.cpp b/test/Lexer/has_feature_thread_sanitizer.cpp new file mode 100644 index 0000000000..0a248100c8 --- /dev/null +++ b/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