From c2f4077b885a85a18882210d8cbee295a5eeed01 Mon Sep 17 00:00:00 2001 From: Kostya Serebryany Date: Thu, 5 Mar 2015 01:20:05 +0000 Subject: [PATCH] [sanitizer] add nosanitize metadata to more coverage instrumentation instructions git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@231333 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../Instrumentation/SanitizerCoverage.cpp | 16 ++++++++++++---- .../SanitizerCoverage/coverage.ll | 16 ++++++++-------- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/lib/Transforms/Instrumentation/SanitizerCoverage.cpp b/lib/Transforms/Instrumentation/SanitizerCoverage.cpp index e7a0934f4a2..6000fd057da 100644 --- a/lib/Transforms/Instrumentation/SanitizerCoverage.cpp +++ b/lib/Transforms/Instrumentation/SanitizerCoverage.cpp @@ -109,6 +109,7 @@ class SanitizerCoverageModule : public ModulePass { ArrayRef IndirCalls); bool InjectCoverage(Function &F, ArrayRef AllBlocks, ArrayRef IndirCalls); + void SetNoSanitizeMetada(Instruction *I); void InjectCoverageAtBlock(Function &F, BasicBlock &BB, bool UseCalls); Function *SanCovFunction; Function *SanCovWithCheckFunction; @@ -306,6 +307,12 @@ void SanitizerCoverageModule::InjectCoverageForIndirectCalls( } } +void SanitizerCoverageModule::SetNoSanitizeMetada(Instruction *I) { + I->setMetadata( + I->getParent()->getParent()->getParent()->getMDKindID("nosanitize"), + MDNode::get(*C, None)); +} + void SanitizerCoverageModule::InjectCoverageAtBlock(Function &F, BasicBlock &BB, bool UseCalls) { BasicBlock::iterator IP = BB.getFirstInsertionPt(), BE = BB.end(); @@ -335,8 +342,7 @@ void SanitizerCoverageModule::InjectCoverageAtBlock(Function &F, BasicBlock &BB, LoadInst *Load = IRB.CreateLoad(GuardP); Load->setAtomic(Monotonic); Load->setAlignment(4); - Load->setMetadata(F.getParent()->getMDKindID("nosanitize"), - MDNode::get(*C, None)); + SetNoSanitizeMetada(Load); Value *Cmp = IRB.CreateICmpSGE(Constant::getNullValue(Load->getType()), Load); Instruction *Ins = SplitBlockAndInsertIfThen( Cmp, IP, false, MDBuilder(*C).createBranchWeights(1, 100000)); @@ -353,9 +359,11 @@ void SanitizerCoverageModule::InjectCoverageAtBlock(Function &F, BasicBlock &BB, IRB.CreatePointerCast(EightBitCounterArray, IntptrTy), ConstantInt::get(IntptrTy, SanCovFunction->getNumUses() - 1)); P = IRB.CreateIntToPtr(P, IRB.getInt8PtrTy()); - Value *LI = IRB.CreateLoad(P); + LoadInst *LI = IRB.CreateLoad(P); Value *Inc = IRB.CreateAdd(LI, ConstantInt::get(IRB.getInt8Ty(), 1)); - IRB.CreateStore(Inc, P); + StoreInst *SI = IRB.CreateStore(Inc, P); + SetNoSanitizeMetada(LI); + SetNoSanitizeMetada(SI); } if (ClExperimentalTracing) { diff --git a/test/Instrumentation/SanitizerCoverage/coverage.ll b/test/Instrumentation/SanitizerCoverage/coverage.ll index 6c0f31e72e7..024a9dceff3 100644 --- a/test/Instrumentation/SanitizerCoverage/coverage.ll +++ b/test/Instrumentation/SanitizerCoverage/coverage.ll @@ -79,18 +79,18 @@ entry: ; test -sanitizer-coverage-8bit-counters=1 ; CHECK-8BIT-LABEL: define void @foo -; CHECK-8BIT: [[V11:%[0-9]*]] = load i8 +; CHECK-8BIT: [[V11:%[0-9]*]] = load i8{{.*}}!nosanitize ; CHECK-8BIT: [[V12:%[0-9]*]] = add i8 [[V11]], 1 -; CHECK-8BIT: store i8 [[V12]] -; CHECK-8BIT: [[V21:%[0-9]*]] = load i8 +; CHECK-8BIT: store i8 [[V12]]{{.*}}!nosanitize +; CHECK-8BIT: [[V21:%[0-9]*]] = load i8{{.*}}!nosanitize ; CHECK-8BIT: [[V22:%[0-9]*]] = add i8 [[V21]], 1 -; CHECK-8BIT: store i8 [[V22]] -; CHECK-8BIT: [[V31:%[0-9]*]] = load i8 +; CHECK-8BIT: store i8 [[V22]]{{.*}}!nosanitize +; CHECK-8BIT: [[V31:%[0-9]*]] = load i8{{.*}}!nosanitize ; CHECK-8BIT: [[V32:%[0-9]*]] = add i8 [[V31]], 1 -; CHECK-8BIT: store i8 [[V32]] -; CHECK-8BIT: [[V41:%[0-9]*]] = load i8 +; CHECK-8BIT: store i8 [[V32]]{{.*}}!nosanitize +; CHECK-8BIT: [[V41:%[0-9]*]] = load i8{{.*}}!nosanitize ; CHECK-8BIT: [[V42:%[0-9]*]] = add i8 [[V41]], 1 -; CHECK-8BIT: store i8 [[V42]] +; CHECK-8BIT: store i8 [[V42]]{{.*}}!nosanitize ; CHECK-8BIT: ret void