[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)
llvm-svn: 223312

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

index d973326..35f9fd7 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 60d7f9f..34f5ae9 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 2d9a56a..aa3ba5c 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*{{.*}})