mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-15 23:31:37 +00:00
[asan] Fix coverage instrumentation with -asan-globals=0.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@210103 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
1410a2c906
commit
58a20d70fa
@ -384,6 +384,7 @@ class AddressSanitizerModule : public ModulePass {
|
|||||||
private:
|
private:
|
||||||
void initializeCallbacks(Module &M);
|
void initializeCallbacks(Module &M);
|
||||||
|
|
||||||
|
bool InstrumentGlobals(IRBuilder<> &IRB, Module &M);
|
||||||
bool ShouldInstrumentGlobal(GlobalVariable *G);
|
bool ShouldInstrumentGlobal(GlobalVariable *G);
|
||||||
void poisonOneInitializer(Function &GlobalInit, GlobalValue *ModuleName);
|
void poisonOneInitializer(Function &GlobalInit, GlobalValue *ModuleName);
|
||||||
void createInitializerPoisonCalls(Module &M, GlobalValue *ModuleName);
|
void createInitializerPoisonCalls(Module &M, GlobalValue *ModuleName);
|
||||||
@ -983,21 +984,7 @@ void AddressSanitizerModule::initializeCallbacks(Module &M) {
|
|||||||
// This function replaces all global variables with new variables that have
|
// This function replaces all global variables with new variables that have
|
||||||
// trailing redzones. It also creates a function that poisons
|
// trailing redzones. It also creates a function that poisons
|
||||||
// redzones and inserts this function into llvm.global_ctors.
|
// redzones and inserts this function into llvm.global_ctors.
|
||||||
bool AddressSanitizerModule::runOnModule(Module &M) {
|
bool AddressSanitizerModule::InstrumentGlobals(IRBuilder<> &IRB, 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);
|
|
||||||
DynamicallyInitializedGlobals.Init(M);
|
DynamicallyInitializedGlobals.Init(M);
|
||||||
|
|
||||||
SmallVector<GlobalVariable *, 16> GlobalsToChange;
|
SmallVector<GlobalVariable *, 16> GlobalsToChange;
|
||||||
@ -1007,16 +994,6 @@ bool AddressSanitizerModule::runOnModule(Module &M) {
|
|||||||
GlobalsToChange.push_back(&G);
|
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();
|
size_t n = GlobalsToChange.size();
|
||||||
if (n == 0) return false;
|
if (n == 0) return false;
|
||||||
|
|
||||||
@ -1134,6 +1111,36 @@ bool AddressSanitizerModule::runOnModule(Module &M) {
|
|||||||
return true;
|
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) {
|
void AddressSanitizer::initializeCallbacks(Module &M) {
|
||||||
IRBuilder<> IRB(*C);
|
IRBuilder<> IRB(*C);
|
||||||
// Create __asan_report* callbacks.
|
// Create __asan_report* callbacks.
|
||||||
|
@ -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 -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=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=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 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"
|
target triple = "x86_64-unknown-linux-gnu"
|
||||||
define void @foo(i32* %a) sanitize_address {
|
define void @foo(i32* %a) sanitize_address {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user