Skip to content

Commit

Permalink
[asan] Fix coverage instrumentation with -asan-globals=0.
Browse files Browse the repository at this point in the history
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@210103 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
eugenis committed Jun 3, 2014
1 parent 1410a2c commit 58a20d7
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 25 deletions.
57 changes: 32 additions & 25 deletions lib/Transforms/Instrumentation/AddressSanitizer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -384,6 +384,7 @@ class AddressSanitizerModule : public ModulePass {
private:
void initializeCallbacks(Module &M);

bool InstrumentGlobals(IRBuilder<> &IRB, Module &M);
bool ShouldInstrumentGlobal(GlobalVariable *G);
void poisonOneInitializer(Function &GlobalInit, GlobalValue *ModuleName);
void createInitializerPoisonCalls(Module &M, GlobalValue *ModuleName);
Expand Down Expand Up @@ -983,21 +984,7 @@ void AddressSanitizerModule::initializeCallbacks(Module &M) {
// This function replaces all global variables with new variables that have
// trailing redzones. It also creates a function that poisons
// redzones and inserts this function into llvm.global_ctors.
bool AddressSanitizerModule::runOnModule(Module &M) {
if (!ClGlobals) return false;

DataLayoutPass *DLP = getAnalysisIfAvailable<DataLayoutPass>();
if (!DLP)
return false;
DL = &DLP->getDataLayout();

BL.reset(SpecialCaseList::createOrDie(BlacklistFile));
if (BL->isIn(M)) return false;
C = &(M.getContext());
int LongSize = DL->getPointerSizeInBits();
IntptrTy = Type::getIntNTy(*C, LongSize);
Mapping = getShadowMapping(M, LongSize);
initializeCallbacks(M);
bool AddressSanitizerModule::InstrumentGlobals(IRBuilder<> &IRB, Module &M) {
DynamicallyInitializedGlobals.Init(M);

SmallVector<GlobalVariable *, 16> GlobalsToChange;
Expand All @@ -1007,16 +994,6 @@ bool AddressSanitizerModule::runOnModule(Module &M) {
GlobalsToChange.push_back(&G);
}

Function *CtorFunc = M.getFunction(kAsanModuleCtorName);
assert(CtorFunc);
IRBuilder<> IRB(CtorFunc->getEntryBlock().getTerminator());

if (ClCoverage > 0) {
Function *CovFunc = M.getFunction(kAsanCovName);
int nCov = CovFunc ? CovFunc->getNumUses() : 0;
IRB.CreateCall(AsanCovModuleInit, ConstantInt::get(IntptrTy, nCov));
}

size_t n = GlobalsToChange.size();
if (n == 0) return false;

Expand Down Expand Up @@ -1134,6 +1111,36 @@ bool AddressSanitizerModule::runOnModule(Module &M) {
return true;
}

bool AddressSanitizerModule::runOnModule(Module &M) {
DataLayoutPass *DLP = getAnalysisIfAvailable<DataLayoutPass>();
if (!DLP)
return false;
DL = &DLP->getDataLayout();
BL.reset(SpecialCaseList::createOrDie(BlacklistFile));
C = &(M.getContext());
int LongSize = DL->getPointerSizeInBits();
IntptrTy = Type::getIntNTy(*C, LongSize);
Mapping = getShadowMapping(M, LongSize);
initializeCallbacks(M);

bool Changed = false;

Function *CtorFunc = M.getFunction(kAsanModuleCtorName);
assert(CtorFunc);
IRBuilder<> IRB(CtorFunc->getEntryBlock().getTerminator());

if (ClCoverage > 0) {
Function *CovFunc = M.getFunction(kAsanCovName);
int nCov = CovFunc ? CovFunc->getNumUses() : 0;
IRB.CreateCall(AsanCovModuleInit, ConstantInt::get(IntptrTy, nCov));
Changed = true;
}

if (ClGlobals && !BL->isIn(M)) Changed |= InstrumentGlobals(IRB, M);

return Changed;
}

void AddressSanitizer::initializeCallbacks(Module &M) {
IRBuilder<> IRB(*C);
// Create __asan_report* callbacks.
Expand Down
12 changes: 12 additions & 0 deletions test/Instrumentation/AddressSanitizer/coverage.ll
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,18 @@
; 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=0 -asan-globals=0 -S | \
; RUN: FileCheck %s --check-prefix=CHECK0
; RUN: opt < %s -asan -asan-module -asan-coverage=1 -asan-globals=0 -S | \
; RUN: FileCheck %s --check-prefix=CHECK1
; RUN: opt < %s -asan -asan-module -asan-coverage=2 -asan-globals=0 -S | \
; RUN: FileCheck %s --check-prefix=CHECK2
; RUN: opt < %s -asan -asan-module -asan-coverage=2 -asan-coverage-block-threshold=10 \
; RUN: -asan-globals=0 -S | FileCheck %s --check-prefix=CHECK2
; RUN: opt < %s -asan -asan-module -asan-coverage=2 -asan-coverage-block-threshold=1 \
; RUN: -asan-globals=0 -S | FileCheck %s --check-prefix=CHECK1

target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
target triple = "x86_64-unknown-linux-gnu"
define void @foo(i32* %a) sanitize_address {
Expand Down

0 comments on commit 58a20d7

Please sign in to comment.