[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