diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2012-12-17 08:52:05 +0000 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2012-12-17 08:52:05 +0000 |
| commit | a53767ea228792321b1549620e747b8c0df0d0c9 (patch) | |
| tree | 9adacbc942007f75074e2ce1f86653824299158c | |
| parent | 41ffe3db59d8198b501ed75e6aaa09c1ff8c58be (diff) | |
| download | bcm5719-llvm-a53767ea228792321b1549620e747b8c0df0d0c9.tar.gz bcm5719-llvm-a53767ea228792321b1549620e747b8c0df0d0c9.zip | |
tsan: add __has_feature(thread_sanitizer)
llvm-svn: 170314
| -rw-r--r-- | clang/docs/ThreadSanitizer.rst | 14 | ||||
| -rw-r--r-- | clang/lib/Lex/PPMacroExpansion.cpp | 1 | ||||
| -rw-r--r-- | clang/test/Lexer/has_feature_thread_sanitizer.cpp | 11 |
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 |

