[msan] allow -fsanitize-coverage=N together with -fsanitize=memory, llvm part
authorKostya Serebryany <kcc@google.com>
Wed, 3 Dec 2014 23:28:26 +0000 (23:28 +0000)
committerKostya Serebryany <kcc@google.com>
Wed, 3 Dec 2014 23:28:26 +0000 (23:28 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@223312 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Instrumentation/MemorySanitizer.cpp
lib/Transforms/Instrumentation/SanitizerCoverage.cpp
test/Instrumentation/SanitizerCoverage/coverage.ll

index d97332621e6ed03bfa3ae17d0af48c99a44eecae..35f9fd7cce3ab8c28acad532fe46d1b7abf2d884 100644 (file)
@@ -1036,7 +1036,7 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
     IRBuilder<> IRB(I.getNextNode());
     Type *ShadowTy = getShadowTy(&I);
     Value *Addr = I.getPointerOperand();
-    if (PropagateShadow) {
+    if (PropagateShadow && !I.getMetadata("nosanitize")) {
       Value *ShadowPtr = getShadowPtr(Addr, ShadowTy, IRB);
       setShadow(&I,
                 IRB.CreateAlignedLoad(ShadowPtr, I.getAlignment(), "_msld"));
index 60d7f9f69d7567f75757cf5213a54a0e5686bfbb..34f5ae96b139c495d0a8543bab2d60f9fa0f302d 100644 (file)
@@ -166,7 +166,8 @@ bool SanitizerCoverageModule::runOnModule(Module &M) {
 bool SanitizerCoverageModule::runOnFunction(Function &F) {
   if (F.empty()) return false;
   // For now instrument only functions that will also be asan-instrumented.
-  if (!F.hasFnAttribute(Attribute::SanitizeAddress))
+  if (!F.hasFnAttribute(Attribute::SanitizeAddress) &&
+      !F.hasFnAttribute(Attribute::SanitizeMemory))
     return false;
   if (CoverageLevel >= 3)
     SplitAllCriticalEdges(F, this);
@@ -273,6 +274,8 @@ void SanitizerCoverageModule::InjectCoverageAtBlock(Function &F,
   LoadInst *Load = IRB.CreateLoad(Guard);
   Load->setAtomic(Monotonic);
   Load->setAlignment(1);
+  Load->setMetadata(F.getParent()->getMDKindID("nosanitize"),
+                    MDNode::get(*C, ArrayRef<llvm::Value *>()));
   Value *Cmp = IRB.CreateICmpEQ(Constant::getNullValue(Int8Ty), Load);
   Instruction *Ins = SplitBlockAndInsertIfThen(
       Cmp, IP, false, MDBuilder(*C).createBranchWeights(1, 100000));
index 2d9a56ac1fe0acab9324b009ebc53c7bc0a34b48..aa3ba5c7202838be7478e8dc3bf863816c5e4710 100644 (file)
@@ -33,7 +33,7 @@ entry:
 ; CHECK0-NOT: call void @__sanitizer_cov_module_init(
 
 ; CHECK1-LABEL: define void @foo
-; CHECK1: %0 = load atomic i8* @__sancov_gen_cov_foo monotonic, align 1
+; CHECK1: %0 = load atomic i8* @__sancov_gen_cov_foo monotonic, align 1, !nosanitize
 ; CHECK1: %1 = icmp eq i8 0, %0
 ; CHECK1: br i1 %1, label %2, label %3
 ; CHECK1: call void @__sanitizer_cov(i8*{{.*}})