[PATCH] D25857: [tsan][clang] Introduce a function attribute to disable TSan checking at run time
Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Fri Nov 11 15:32:40 PST 2016
This revision was automatically updated to reflect the committed changes.
Closed by commit rL286672: [tsan][clang] Introduce a function attribute to disable TSan checking at run… (authored by zaks).
Changed prior to commit:
https://reviews.llvm.org/D25857?vs=77435&id=77686#toc
Repository:
rL LLVM
https://reviews.llvm.org/D25857
Files:
cfe/trunk/lib/CodeGen/CodeGenFunction.cpp
cfe/trunk/test/CodeGen/sanitize-thread-no-checking-at-run-time.m
Index: cfe/trunk/test/CodeGen/sanitize-thread-no-checking-at-run-time.m
===================================================================
--- cfe/trunk/test/CodeGen/sanitize-thread-no-checking-at-run-time.m
+++ cfe/trunk/test/CodeGen/sanitize-thread-no-checking-at-run-time.m
@@ -0,0 +1,34 @@
+// RUN: %clang_cc1 -triple x86_64-apple-darwin -x objective-c++ -emit-llvm -o - %s | FileCheck -check-prefix=WITHOUT %s
+// RUN: %clang_cc1 -triple x86_64-apple-darwin -x objective-c++ -emit-llvm -o - %s -fsanitize=thread | FileCheck -check-prefix=TSAN %s
+
+__attribute__((objc_root_class))
+ at interface NSObject
+- (void)dealloc;
+ at end
+
+class NeedCleanup {
+public:
+ ~NeedCleanup() __attribute__((no_sanitize("thread"))) {}
+};
+
+ at interface MyObject : NSObject {
+ NeedCleanup v;
+};
++ (void) initialize;
+- (void) dealloc;
+ at end
+
+ at implementation MyObject
++ (void)initialize {
+}
+- (void)dealloc {
+ [super dealloc];
+}
+ at end
+
+// WITHOUT-NOT: "sanitize_thread_no_checking_at_run_time"
+
+// TSAN: initialize{{.*}}) [[ATTR:#[0-9]+]]
+// TSAN: dealloc{{.*}}) [[ATTR:#[0-9]+]]
+// TSAN: cxx_destruct{{.*}}) [[ATTR:#[0-9]+]]
+// TSAN: attributes [[ATTR]] = { nounwind {{.*}} "sanitize_thread_no_checking_at_run_time" {{.*}} }
Index: cfe/trunk/lib/CodeGen/CodeGenFunction.cpp
===================================================================
--- cfe/trunk/lib/CodeGen/CodeGenFunction.cpp
+++ cfe/trunk/lib/CodeGen/CodeGenFunction.cpp
@@ -731,6 +731,20 @@
if (SanOpts.has(SanitizerKind::SafeStack))
Fn->addFnAttr(llvm::Attribute::SafeStack);
+ // Ignore TSan memory acesses from within ObjC/ObjC++ dealloc, initialize,
+ // .cxx_destruct and all of their calees at run time.
+ if (SanOpts.has(SanitizerKind::Thread)) {
+ if (const auto *OMD = dyn_cast_or_null<ObjCMethodDecl>(D)) {
+ IdentifierInfo *II = OMD->getSelector().getIdentifierInfoForSlot(0);
+ if (OMD->getMethodFamily() == OMF_dealloc ||
+ OMD->getMethodFamily() == OMF_initialize ||
+ (OMD->getSelector().isUnarySelector() && II->isStr(".cxx_destruct"))) {
+ Fn->addFnAttr("sanitize_thread_no_checking_at_run_time");
+ Fn->removeFnAttr(llvm::Attribute::SanitizeThread);
+ }
+ }
+ }
+
// Apply xray attributes to the function (as a string, for now)
if (D && ShouldXRayInstrumentFunction()) {
if (const auto *XRayAttr = D->getAttr<XRayInstrumentAttr>()) {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D25857.77686.patch
Type: text/x-patch
Size: 2402 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20161111/6614cfc7/attachment.bin>
More information about the cfe-commits
mailing list