]> granicus.if.org Git - clang/commitdiff
Don't emit lifetime markers when msan is enabled
authorReid Kleckner <reid@kleckner.net>
Thu, 23 Apr 2015 18:07:13 +0000 (18:07 +0000)
committerReid Kleckner <reid@kleckner.net>
Thu, 23 Apr 2015 18:07:13 +0000 (18:07 +0000)
In r235553, Clang started emitting lifetime markers more often. This
caused false negative in MSan, because MSan only poisons all allocas
once at function entry. Eventually, MSan should poison allocas at
lifetime start and probably also lifetime end, but until then, let's not
emit markers that aren't going to be useful.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@235613 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGDecl.cpp
test/CodeGen/cleanup-destslot-simple.c

index 29c6315146616906af22efda9f1d8a56627d9b58..874cf6938090f130eb470acbf67f479187d440b6 100644 (file)
@@ -856,6 +856,11 @@ llvm::Value *CodeGenFunction::EmitLifetimeStart(uint64_t Size,
   if (CGM.getCodeGenOpts().OptimizationLevel == 0)
     return nullptr;
 
+  // Disable lifetime markers in msan builds.
+  // FIXME: Remove this when msan works with lifetime markers.
+  if (getLangOpts().Sanitize.has(SanitizerKind::Memory))
+    return nullptr;
+
   llvm::Value *SizeV = llvm::ConstantInt::get(Int64Ty, Size);
   llvm::Value *Args[] = {
       SizeV,
index 0ee52e1d9fa95a2fc538dc4727605dcb1b8edbbe..bae97c81cbbaaf81bcad767af36d50e4d5050f48 100644 (file)
@@ -1,4 +1,8 @@
-// RUN: %clang_cc1 -O1 -triple x86_64-none-linux-gnu -emit-llvm -gline-tables-only %s -o - | FileCheck %s
+// RUN: %clang_cc1 -O1 -triple x86_64-none-linux-gnu -emit-llvm -gline-tables-only %s -o - | FileCheck %s --check-prefix=CHECK --check-prefix=LIFETIME
+
+// We shouldn't have markers at -O0 or with msan.
+// RUN: %clang_cc1 -O0 -triple x86_64-none-linux-gnu -emit-llvm -gline-tables-only %s -o - | FileCheck %s --check-prefix=CHECK
+// RUN: %clang_cc1 -O1 -triple x86_64-none-linux-gnu -emit-llvm -gline-tables-only %s -o - -fsanitize=memory | FileCheck %s --check-prefix=CHECK
 
 // There is no exception to handle here, lifetime.end is not a destructor,
 // so there is no need have cleanup dest slot related code
@@ -9,7 +13,7 @@ int test() {
   return *p;
 // CHECK: [[X:%.*]] = alloca i32
 // CHECK: [[P:%.*]] = alloca i32*
-// CHECK: call void @llvm.lifetime.start(i64 4, i8* %{{.*}})
-// CHECK: call void @llvm.lifetime.start(i64 8, i8* %{{.*}})
+// LIFETIME: call void @llvm.lifetime.start(i64 4, i8* %{{.*}})
+// LIFETIME: call void @llvm.lifetime.start(i64 8, i8* %{{.*}})
 // CHECK-NOT: store i32 %{{.*}}, i32* %cleanup.dest.slot
 }