mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-01 13:11:39 +01:00
[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
llvm-svn: 222675
This commit is contained in:
parent
24b899d017
commit
cb8f8175c9
@ -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;
|
||||||
|
@ -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}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user