[llvm] r281809 - [sanitizer-coverage] change trace-pc to use 8-byte guards
Kostya Serebryany via llvm-commits
llvm-commits at lists.llvm.org
Fri Sep 16 22:03:06 PDT 2016
Author: kcc
Date: Sat Sep 17 00:03:05 2016
New Revision: 281809
URL: http://llvm.org/viewvc/llvm-project?rev=281809&view=rev
Log:
[sanitizer-coverage] change trace-pc to use 8-byte guards
Modified:
llvm/trunk/lib/Transforms/Instrumentation/SanitizerCoverage.cpp
llvm/trunk/test/Instrumentation/SanitizerCoverage/tracing.ll
Modified: llvm/trunk/lib/Transforms/Instrumentation/SanitizerCoverage.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/SanitizerCoverage.cpp?rev=281809&r1=281808&r2=281809&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Instrumentation/SanitizerCoverage.cpp (original)
+++ llvm/trunk/lib/Transforms/Instrumentation/SanitizerCoverage.cpp Sat Sep 17 00:03:05 2016
@@ -293,7 +293,7 @@ bool SanitizerCoverageModule::runOnModul
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::runOnModul
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::InjectCove
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) {
Modified: llvm/trunk/test/Instrumentation/SanitizerCoverage/tracing.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Instrumentation/SanitizerCoverage/tracing.ll?rev=281809&r1=281808&r2=281809&view=diff
==============================================================================
--- llvm/trunk/test/Instrumentation/SanitizerCoverage/tracing.ll (original)
+++ llvm/trunk/test/Instrumentation/SanitizerCoverage/tracing.ll Sat Sep 17 00:03:05 2016
@@ -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*))
More information about the llvm-commits
mailing list