From 327cfdf4fe77a2fc0e005b20bdc5980d476ef218 Mon Sep 17 00:00:00 2001 From: Alexey Samsonov Date: Tue, 30 Jun 2015 23:11:45 +0000 Subject: [PATCH] [SanitizerCoverage] Don't add instrumentation to unreachable blocks. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@241127 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Instrumentation/SanitizerCoverage.cpp | 7 +++++++ test/Instrumentation/SanitizerCoverage/coverage.ll | 9 +++++++++ 2 files changed, 16 insertions(+) diff --git a/lib/Transforms/Instrumentation/SanitizerCoverage.cpp b/lib/Transforms/Instrumentation/SanitizerCoverage.cpp index dff39efa5b9..7a5b4cb0178 100644 --- a/lib/Transforms/Instrumentation/SanitizerCoverage.cpp +++ b/lib/Transforms/Instrumentation/SanitizerCoverage.cpp @@ -375,6 +375,13 @@ void SanitizerCoverageModule::SetNoSanitizeMetadata(Instruction *I) { void SanitizerCoverageModule::InjectCoverageAtBlock(Function &F, BasicBlock &BB, bool UseCalls) { + // Don't insert coverage for unreachable blocks: we will never call + // __sanitizer_cov() for them, so counting them in + // NumberOfInstrumentedBlocks() might complicate calculation of code coverage + // percentage. Also, unreachable instructions frequently have no debug + // locations. + if (isa(BB.getTerminator())) + return; BasicBlock::iterator IP = BB.getFirstInsertionPt(), BE = BB.end(); // Skip static allocas at the top of the entry block so they don't become // dynamic when we split the block. If we used our optimized stack layout, diff --git a/test/Instrumentation/SanitizerCoverage/coverage.ll b/test/Instrumentation/SanitizerCoverage/coverage.ll index b2f0ab0680b..659c03040f2 100644 --- a/test/Instrumentation/SanitizerCoverage/coverage.ll +++ b/test/Instrumentation/SanitizerCoverage/coverage.ll @@ -119,3 +119,12 @@ entry: ; CHECK4: call void @__sanitizer_cov_indir_call16({{.*}},[[CACHE:.*]]) ; CHECK4-NOT: call void @__sanitizer_cov_indir_call16({{.*}},[[CACHE]]) ; CHECK4: ret void + +define void @call_unreachable() uwtable sanitize_address { +entry: + unreachable +} + +; CHECK4-LABEL: define void @call_unreachable +; CHECK4-NOT: __sanitizer_cov +; CHECK4: unreachable