From: Kostya Serebryany Date: Wed, 3 Sep 2014 22:37:37 +0000 (+0000) Subject: [asan] add -asan-coverage=3: instrument all blocks and critical edges. X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=commitdiff_plain;h=f12b1d8c7ba3fd463955142ccba13c59e012a0b9 [asan] add -asan-coverage=3: instrument all blocks and critical edges. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@217098 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/Instrumentation/AddressSanitizer.cpp b/lib/Transforms/Instrumentation/AddressSanitizer.cpp index 3ff0a616f4a..b7fdec63471 100644 --- a/lib/Transforms/Instrumentation/AddressSanitizer.cpp +++ b/lib/Transforms/Instrumentation/AddressSanitizer.cpp @@ -40,6 +40,7 @@ #include "llvm/Support/DataTypes.h" #include "llvm/Support/Debug.h" #include "llvm/Support/Endian.h" +#include "llvm/Transforms/Scalar.h" #include "llvm/Transforms/Utils/ASanStackFrameLayout.h" #include "llvm/Transforms/Utils/BasicBlockUtils.h" #include "llvm/Transforms/Utils/Cloning.h" @@ -134,7 +135,8 @@ static cl::opt ClUseAfterReturn("asan-use-after-return", static cl::opt ClGlobals("asan-globals", cl::desc("Handle global objects"), cl::Hidden, cl::init(true)); static cl::opt ClCoverage("asan-coverage", - cl::desc("ASan coverage. 0: none, 1: entry block, 2: all blocks"), + cl::desc("ASan coverage. 0: none, 1: entry block, 2: all blocks, " + "3: all blocks and critical edges"), cl::Hidden, cl::init(false)); static cl::opt ClCoverageBlockThreshold("asan-coverage-block-threshold", cl::desc("Add coverage instrumentation only to the entry block if there " @@ -352,7 +354,9 @@ static size_t RedzoneSizeForScale(int MappingScale) { /// AddressSanitizer: instrument the code in module to find memory bugs. struct AddressSanitizer : public FunctionPass { - AddressSanitizer() : FunctionPass(ID) {} + AddressSanitizer() : FunctionPass(ID) { + initializeBreakCriticalEdgesPass(*PassRegistry::getPassRegistry()); + } const char *getPassName() const override { return "AddressSanitizerFunctionPass"; } @@ -373,6 +377,11 @@ struct AddressSanitizer : public FunctionPass { bool doInitialization(Module &M) override; static char ID; // Pass identification, replacement for typeid + void getAnalysisUsage(AnalysisUsage &AU) const override { + if (ClCoverage >= 3) + AU.addRequiredID(BreakCriticalEdgesID); + } + private: void initializeCallbacks(Module &M); diff --git a/test/Instrumentation/AddressSanitizer/coverage.ll b/test/Instrumentation/AddressSanitizer/coverage.ll index 79bb5c13533..6be4f9ae86e 100644 --- a/test/Instrumentation/AddressSanitizer/coverage.ll +++ b/test/Instrumentation/AddressSanitizer/coverage.ll @@ -3,6 +3,7 @@ ; RUN: opt < %s -asan -asan-module -asan-coverage=2 -S | FileCheck %s --check-prefix=CHECK2 ; RUN: opt < %s -asan -asan-module -asan-coverage=2 -asan-coverage-block-threshold=10 -S | FileCheck %s --check-prefix=CHECK2 ; RUN: opt < %s -asan -asan-module -asan-coverage=2 -asan-coverage-block-threshold=1 -S | FileCheck %s --check-prefix=CHECK1 +; RUN: opt < %s -asan -asan-module -asan-coverage=3 -asan-coverage-block-threshold=10 -S | FileCheck %s --check-prefix=CHECK3 ; RUN: opt < %s -asan -asan-module -asan-coverage=0 -asan-globals=0 -S | \ ; RUN: FileCheck %s --check-prefix=CHECK0 @@ -58,3 +59,12 @@ entry: ; CHECK2-NOT: ret ; CHECK2: call void @__sanitizer_cov_module_init(i64 3) ; CHECK2: ret + +; CHECK3-LABEL: define void @foo +; CHECK3: call void @__sanitizer_cov +; CHECK3: call void @__sanitizer_cov +; CHECK3: call void @__sanitizer_cov +; CHECK3: call void @__sanitizer_cov +; CHECK3-NOT: call void @__sanitizer_cov +; CHECK3: ret void +