From: Kostya Serebryany Date: Sat, 17 Sep 2016 05:03:05 +0000 (+0000) Subject: [sanitizer-coverage] change trace-pc to use 8-byte guards X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=16197d80b6077d1dd084d63c58219b2e4a3122a8;p=llvm [sanitizer-coverage] change trace-pc to use 8-byte guards git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@281809 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/Instrumentation/SanitizerCoverage.cpp b/lib/Transforms/Instrumentation/SanitizerCoverage.cpp index f8844bdcf38..3c137c97679 100644 --- a/lib/Transforms/Instrumentation/SanitizerCoverage.cpp +++ b/lib/Transforms/Instrumentation/SanitizerCoverage.cpp @@ -293,7 +293,7 @@ bool SanitizerCoverageModule::runOnModule(Module &M) { SanCovTracePC = checkSanitizerInterfaceFunction( M.getOrInsertFunction(SanCovTracePCName, VoidTy, nullptr)); SanCovTracePCGuard = checkSanitizerInterfaceFunction(M.getOrInsertFunction( - SanCovTracePCGuardName, VoidTy, IRB.getInt8PtrTy(), nullptr)); + SanCovTracePCGuardName, VoidTy, Int64PtrTy, nullptr)); SanCovTraceEnter = checkSanitizerInterfaceFunction( M.getOrInsertFunction(SanCovTraceEnterName, VoidTy, Int32PtrTy, nullptr)); SanCovTraceBB = checkSanitizerInterfaceFunction( @@ -352,16 +352,18 @@ bool SanitizerCoverageModule::runOnModule(Module &M) { if (Options.TracePCGuard) { Function *CtorFunc; std::string SectionName(SanCovTracePCGuardSection); - auto Start = - new GlobalVariable(M, Int8PtrTy, false, GlobalVariable::ExternalLinkage, - nullptr, "__start_" + SectionName); - auto Stop = - new GlobalVariable(M, Int8PtrTy, false, GlobalVariable::ExternalLinkage, - nullptr, "__stop_" + SectionName); + GlobalVariable *Bounds[2]; + const char *Prefix[2] = {"__start_", "__stop_"}; + for (int i = 0; i < 2; i++) { + Bounds[i] = new GlobalVariable(M, Int64PtrTy, false, + GlobalVariable::ExternalLinkage, nullptr, + Prefix[i] + SectionName); + Bounds[i]->setVisibility(GlobalValue::HiddenVisibility); + } std::tie(CtorFunc, std::ignore) = createSanitizerCtorAndInitFunctions( M, SanCovModuleCtorName, SanCovTracePCGuardInitName, - {Int8PtrTy, Int8PtrTy}, {IRB.CreatePointerCast(Start, Int8PtrTy), - IRB.CreatePointerCast(Stop, Int8PtrTy)}); + {Int64PtrTy, Int64PtrTy}, {IRB.CreatePointerCast(Bounds[0], Int64PtrTy), + IRB.CreatePointerCast(Bounds[1], Int64PtrTy)}); appendToGlobalCtors(M, CtorFunc, SanCtorAndDtorPriority); @@ -662,23 +664,24 @@ void SanitizerCoverageModule::InjectCoverageAtBlock(Function &F, BasicBlock &BB, IRB.CreateCall(SanCovTracePC); // gets the PC using GET_CALLER_PC. IRB.CreateCall(EmptyAsm, {}); // Avoids callback merge. } else if (Options.TracePCGuard) { - auto GuardVar = new GlobalVariable(*F.getParent(), IRB.getInt8Ty(), false, - GlobalVariable::LinkOnceODRLinkage, - Constant::getNullValue(IRB.getInt8Ty()), - "__sancov_guard." + F.getName()); + auto GuardVar = new GlobalVariable( + *F.getParent(), Int64Ty, false, GlobalVariable::LinkOnceODRLinkage, + Constant::getNullValue(Int64Ty), "__sancov_guard." + F.getName()); // TODO: add debug into to GuardVar. GuardVar->setSection(SanCovTracePCGuardSection); - auto GuardPtr = IRB.CreatePointerCast(GuardVar, IRB.getInt8PtrTy()); - auto GuardLoad = IRB.CreateLoad(GuardPtr); - GuardLoad->setAtomic(AtomicOrdering::Monotonic); - GuardLoad->setAlignment(1); - SetNoSanitizeMetadata(GuardLoad); // Don't instrument with e.g. asan. - auto Cmp = IRB.CreateICmpNE( - Constant::getAllOnesValue(GuardLoad->getType()), GuardLoad); - auto Ins = SplitBlockAndInsertIfThen( - Cmp, &*IP, false, MDBuilder(*C).createBranchWeights(1, 100000)); - IRB.SetCurrentDebugLocation(EntryLoc); - IRB.SetInsertPoint(Ins); + auto GuardPtr = IRB.CreatePointerCast(GuardVar, Int64PtrTy); + if (!UseCalls) { + auto GuardLoad = IRB.CreateLoad(GuardPtr); + GuardLoad->setAtomic(AtomicOrdering::Monotonic); + GuardLoad->setAlignment(8); + SetNoSanitizeMetadata(GuardLoad); // Don't instrument with e.g. asan. + auto Cmp = IRB.CreateICmpSGE( + GuardLoad, Constant::getNullValue(GuardLoad->getType())); + auto Ins = SplitBlockAndInsertIfThen( + Cmp, &*IP, false, MDBuilder(*C).createBranchWeights(1, 100000)); + IRB.SetCurrentDebugLocation(EntryLoc); + IRB.SetInsertPoint(Ins); + } IRB.CreateCall(SanCovTracePCGuard, GuardPtr); IRB.CreateCall(EmptyAsm, {}); // Avoids callback merge. } else if (Options.TraceBB) { diff --git a/test/Instrumentation/SanitizerCoverage/tracing.ll b/test/Instrumentation/SanitizerCoverage/tracing.ll index 5b6a17bd9e7..df804f6f7e1 100644 --- a/test/Instrumentation/SanitizerCoverage/tracing.ll +++ b/test/Instrumentation/SanitizerCoverage/tracing.ll @@ -46,4 +46,4 @@ entry: ; CHECK_PC_GUARD: call void @__sanitizer_cov_trace_pc_guard ; CHECK_PC_GUARD-NOT: call void @__sanitizer_cov_trace_pc ; CHECK_PC_GUARD: ret void -; CHECK_PC_GUARD: call void @__sanitizer_cov_trace_pc_guard_init(i8* bitcast (i8** @__start___sancov_guards to i8*), i8* bitcast (i8** @__stop___sancov_guards to i8*)) +; CHECK_PC_GUARD: call void @__sanitizer_cov_trace_pc_guard_init(i64* bitcast (i64** @__start___sancov_guards to i64*), i64* bitcast (i64** @__stop___sancov_guards to i64*))