[asan/coverage] change the way asan coverage instrumentation is done: instead of setting the guard to 1 in the generated code, pass the pointer to guard to __sanitizer_cov and set it there. No user-visible functionality change expected

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@222675 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Kostya Serebryany 2014-11-24 18:49:53 +00:00
parent edc6a13992
commit 678af17920
4 changed files with 13 additions and 16 deletions

View File

@ -13,9 +13,8 @@
// We create a Guard boolean variable with the same linkage // We create a Guard boolean variable with the same linkage
// as the function and inject this code into the entry block (CoverageLevel=1) // as the function and inject this code into the entry block (CoverageLevel=1)
// or all blocks (CoverageLevel>=2): // or all blocks (CoverageLevel>=2):
// if (*Guard) { // if (Guard) {
// __sanitizer_cov(); // __sanitizer_cov(&Guard);
// *Guard = 1;
// } // }
// The accesses to Guard are atomic. The rest of the logic is // The accesses to Guard are atomic. The rest of the logic is
// in __sanitizer_cov (it's fine to call it more than once). // in __sanitizer_cov (it's fine to call it more than once).
@ -132,6 +131,7 @@ bool SanitizerCoverageModule::runOnModule(Module &M) {
DataLayoutPass *DLP = &getAnalysis<DataLayoutPass>(); DataLayoutPass *DLP = &getAnalysis<DataLayoutPass>();
IntptrTy = Type::getIntNTy(*C, DLP->getDataLayout().getPointerSizeInBits()); IntptrTy = Type::getIntNTy(*C, DLP->getDataLayout().getPointerSizeInBits());
Type *VoidTy = Type::getVoidTy(*C); Type *VoidTy = Type::getVoidTy(*C);
IRBuilder<> IRB(*C);
Function *CtorFunc = Function *CtorFunc =
Function::Create(FunctionType::get(VoidTy, false), Function::Create(FunctionType::get(VoidTy, false),
@ -139,8 +139,8 @@ bool SanitizerCoverageModule::runOnModule(Module &M) {
ReturnInst::Create(*C, BasicBlock::Create(*C, "", CtorFunc)); ReturnInst::Create(*C, BasicBlock::Create(*C, "", CtorFunc));
appendToGlobalCtors(M, CtorFunc, kSanCtorAndDtorPriority); appendToGlobalCtors(M, CtorFunc, kSanCtorAndDtorPriority);
SanCovFunction = SanCovFunction = checkInterfaceFunction(
checkInterfaceFunction(M.getOrInsertFunction(kSanCovName, VoidTy, nullptr)); M.getOrInsertFunction(kSanCovName, VoidTy, IRB.getInt8PtrTy(), nullptr));
SanCovIndirCallFunction = checkInterfaceFunction(M.getOrInsertFunction( SanCovIndirCallFunction = checkInterfaceFunction(M.getOrInsertFunction(
kSanCovIndirCallName, VoidTy, IntptrTy, IntptrTy, nullptr)); kSanCovIndirCallName, VoidTy, IntptrTy, IntptrTy, nullptr));
SanCovModuleInit = checkInterfaceFunction(M.getOrInsertFunction( SanCovModuleInit = checkInterfaceFunction(M.getOrInsertFunction(
@ -157,7 +157,7 @@ bool SanitizerCoverageModule::runOnModule(Module &M) {
for (auto &F : M) for (auto &F : M)
runOnFunction(F); runOnFunction(F);
IRBuilder<> IRB(CtorFunc->getEntryBlock().getTerminator()); IRB.SetInsertPoint(CtorFunc->getEntryBlock().getTerminator());
IRB.CreateCall(SanCovModuleInit, IRB.CreateCall(SanCovModuleInit,
ConstantInt::get(IntptrTy, SanCovFunction->getNumUses())); ConstantInt::get(IntptrTy, SanCovFunction->getNumUses()));
return true; return true;
@ -279,10 +279,7 @@ void SanitizerCoverageModule::InjectCoverageAtBlock(Function &F,
IRB.SetInsertPoint(Ins); IRB.SetInsertPoint(Ins);
IRB.SetCurrentDebugLocation(EntryLoc); IRB.SetCurrentDebugLocation(EntryLoc);
// __sanitizer_cov gets the PC of the instruction using GET_CALLER_PC. // __sanitizer_cov gets the PC of the instruction using GET_CALLER_PC.
IRB.CreateCall(SanCovFunction); IRB.CreateCall(SanCovFunction, Guard);
StoreInst *Store = IRB.CreateStore(ConstantInt::get(Int8Ty, 1), Guard);
Store->setAtomic(Monotonic);
Store->setAlignment(1);
} }
char SanitizerCoverageModule::ID = 0; char SanitizerCoverageModule::ID = 0;

View File

@ -15,7 +15,7 @@
; and add sanitize_address to @_ZN1A1fEv ; and add sanitize_address to @_ZN1A1fEv
; Test that __sanitizer_cov call has !dbg pointing to the opening { of A::f(). ; Test that __sanitizer_cov call has !dbg pointing to the opening { of A::f().
; CHECK: call void @__sanitizer_cov(), !dbg [[A:!.*]] ; CHECK: call void @__sanitizer_cov(i8*{{.*}}), !dbg [[A:!.*]]
; CHECK: [[A]] = metadata !{i32 6, i32 0, metadata !{{.*}}, null} ; CHECK: [[A]] = metadata !{i32 6, i32 0, metadata !{{.*}}, null}

View File

@ -36,9 +36,9 @@ entry:
; CHECK1: %0 = load atomic i8* @__sancov_gen_cov_foo monotonic, align 1 ; CHECK1: %0 = load atomic i8* @__sancov_gen_cov_foo monotonic, align 1
; CHECK1: %1 = icmp eq i8 0, %0 ; CHECK1: %1 = icmp eq i8 0, %0
; CHECK1: br i1 %1, label %2, label %3 ; CHECK1: br i1 %1, label %2, label %3
; CHECK1: call void @__sanitizer_cov ; CHECK1: call void @__sanitizer_cov(i8*{{.*}})
; CHECK1-NOT: call void @__sanitizer_cov ; CHECK1-NOT: call void @__sanitizer_cov
; CHECK1: store atomic i8 1, i8* @__sancov_gen_cov_foo monotonic, align 1 ; CHECK1: ret void
; CHECK1-LABEL: define internal void @sancov.module_ctor ; CHECK1-LABEL: define internal void @sancov.module_ctor
; CHECK1-NOT: ret ; CHECK1-NOT: ret

View File

@ -17,9 +17,9 @@ target triple = "x86_64-unknown-linux-gnu"
; Check that __sanitizer_cov call has !dgb pointing to the beginning ; Check that __sanitizer_cov call has !dgb pointing to the beginning
; of appropriate basic blocks. ; of appropriate basic blocks.
; CHECK-LABEL:_Z3fooPi ; CHECK-LABEL:_Z3fooPi
; CHECK: call void @__sanitizer_cov(), !dbg [[A:!.*]] ; CHECK: call void @__sanitizer_cov(i8*{{.*}}), !dbg [[A:!.*]]
; CHECK: call void @__sanitizer_cov(), !dbg [[B:!.*]] ; CHECK: call void @__sanitizer_cov(i8*{{.*}}), !dbg [[B:!.*]]
; CHECK: call void @__sanitizer_cov(), !dbg [[C:!.*]] ; CHECK: call void @__sanitizer_cov(i8*{{.*}}), !dbg [[C:!.*]]
; CHECK: ret void ; CHECK: ret void
; CHECK: [[A]] = metadata !{i32 1, i32 0, metadata !{{.*}}, null} ; CHECK: [[A]] = metadata !{i32 1, i32 0, metadata !{{.*}}, null}
; CHECK: [[B]] = metadata !{i32 3, i32 5, metadata !{{.*}}, null} ; CHECK: [[B]] = metadata !{i32 3, i32 5, metadata !{{.*}}, null}