From 1e506ce96c738578e3477200d1cb950c6f56fa59 Mon Sep 17 00:00:00 2001 From: Matt Morehouse Date: Tue, 22 Aug 2017 21:28:29 +0000 Subject: [PATCH] [SanitizerCoverage] Optimize stack-depth instrumentation. Summary: Use the initialexec TLS type and eliminate calls to the TLS wrapper. Fixes the sanitizer-x86_64-linux-fuzzer bot failure. Reviewers: vitalybuka, kcc Reviewed By: kcc Subscribers: hiraditya, llvm-commits Differential Revision: https://reviews.llvm.org/D37026 llvm-svn: 311490 --- .../Instrumentation/SanitizerCoverage.cpp | 30 +++++-------------- .../SanitizerCoverage/stack-depth.ll | 16 +++++----- 2 files changed, 14 insertions(+), 32 deletions(-) diff --git a/lib/Transforms/Instrumentation/SanitizerCoverage.cpp b/lib/Transforms/Instrumentation/SanitizerCoverage.cpp index 8a12c0fb387..c6f0d17f8fe 100644 --- a/lib/Transforms/Instrumentation/SanitizerCoverage.cpp +++ b/lib/Transforms/Instrumentation/SanitizerCoverage.cpp @@ -77,8 +77,6 @@ static const char *const SanCovCountersSectionName = "sancov_cntrs"; static const char *const SanCovPCsSectionName = "sancov_pcs"; static const char *const SanCovLowestStackName = "__sancov_lowest_stack"; -static const char *const SanCovLowestStackTLSWrapperName = - "_ZTW21__sancov_lowest_stack"; static cl::opt ClCoverageLevel( "sanitizer-coverage-level", @@ -229,7 +227,6 @@ private: Function *SanCovTraceDivFunction[2]; Function *SanCovTraceGepFunction; Function *SanCovTraceSwitchFunction; - Function *SanCovLowestStackTLSWrapper; GlobalVariable *SanCovLowestStack; InlineAsm *EmptyAsm; Type *IntptrTy, *IntptrPtrTy, *Int64Ty, *Int64PtrTy, *Int32Ty, *Int32PtrTy, @@ -351,20 +348,11 @@ bool SanitizerCoverageModule::runOnModule(Module &M) { Constant *SanCovLowestStackConstant = M.getOrInsertGlobal(SanCovLowestStackName, IntptrTy); - SanCovLowestStackTLSWrapper = - checkSanitizerInterfaceFunction(M.getOrInsertFunction( - SanCovLowestStackTLSWrapperName, IntptrTy->getPointerTo())); - if (Options.StackDepth) { - assert(isa(SanCovLowestStackConstant)); - SanCovLowestStack = cast(SanCovLowestStackConstant); - if (!SanCovLowestStack->isDeclaration()) { - // Check that the user has correctly defined: - // thread_local uintptr_t __sancov_lowest_stack - // and initialize it. - assert(SanCovLowestStack->isThreadLocal()); - SanCovLowestStack->setInitializer(Constant::getAllOnesValue(IntptrTy)); - } - } + SanCovLowestStack = cast(SanCovLowestStackConstant); + SanCovLowestStack->setThreadLocalMode( + GlobalValue::ThreadLocalMode::InitialExecTLSModel); + if (Options.StackDepth && !SanCovLowestStack->isDeclaration()) + SanCovLowestStack->setInitializer(Constant::getAllOnesValue(IntptrTy)); // Make sure smaller parameters are zero-extended to i64 as required by the // x86_64 ABI. @@ -484,9 +472,6 @@ bool SanitizerCoverageModule::runOnFunction(Function &F) { if (F.getName() == "__local_stdio_printf_options" || F.getName() == "__local_stdio_scanf_options") return false; - // Avoid infinite recursion by not instrumenting stack depth TLS wrapper - if (F.getName() == SanCovLowestStackTLSWrapperName) - return false; // Don't instrument functions using SEH for now. Splitting basic blocks like // we do for coverage breaks WinEHPrepare. // FIXME: Remove this when SEH no longer uses landingpad pattern matching. @@ -771,12 +756,11 @@ void SanitizerCoverageModule::InjectCoverageAtBlock(Function &F, BasicBlock &BB, auto FrameAddrPtr = IRB.CreateCall(GetFrameAddr, {Constant::getNullValue(Int32Ty)}); auto FrameAddrInt = IRB.CreatePtrToInt(FrameAddrPtr, IntptrTy); - auto LowestStackPtr = IRB.CreateCall(SanCovLowestStackTLSWrapper); - auto LowestStack = IRB.CreateLoad(LowestStackPtr); + auto LowestStack = IRB.CreateLoad(SanCovLowestStack); auto IsStackLower = IRB.CreateICmpULT(FrameAddrInt, LowestStack); auto ThenTerm = SplitBlockAndInsertIfThen(IsStackLower, &*IP, false); IRBuilder<> ThenIRB(ThenTerm); - ThenIRB.CreateStore(FrameAddrInt, LowestStackPtr); + ThenIRB.CreateStore(FrameAddrInt, SanCovLowestStack); } } diff --git a/test/Instrumentation/SanitizerCoverage/stack-depth.ll b/test/Instrumentation/SanitizerCoverage/stack-depth.ll index 015f5676bc8..e88741553d5 100644 --- a/test/Instrumentation/SanitizerCoverage/stack-depth.ll +++ b/test/Instrumentation/SanitizerCoverage/stack-depth.ll @@ -8,7 +8,7 @@ target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" -; CHECK: @__sancov_lowest_stack = thread_local global i64 -1 +; CHECK: @__sancov_lowest_stack = thread_local(initialexec) global i64 -1 @__sancov_lowest_stack = thread_local global i64 0, align 8 define i32 @foo() { @@ -16,12 +16,11 @@ entry: ; CHECK-LABEL: define i32 @foo ; CHECK: [[framePtr:%[^ \t]+]] = call i8* @llvm.frameaddress(i32 0) ; CHECK: [[frameInt:%[^ \t]+]] = ptrtoint i8* [[framePtr]] to [[$intType:i[0-9]+]] -; CHECK: [[lowestPtr:%[^ \t]+]] = call [[$intType]]* @_ZTW21__sancov_lowest_stack -; CHECK: [[lowestInt:%[^ \t]+]] = load [[$intType]], [[$intType]]* [[lowestPtr]] -; CHECK: [[cmp:%[^ \t]+]] = icmp ult [[$intType]] [[frameInt]], [[lowestInt]] +; CHECK: [[lowest:%[^ \t]+]] = load [[$intType]], [[$intType]]* @__sancov_lowest_stack +; CHECK: [[cmp:%[^ \t]+]] = icmp ult [[$intType]] [[frameInt]], [[lowest]] ; CHECK: br i1 [[cmp]], label %[[ifLabel:[^ \t]+]], label ; CHECK: