From: Kostya Serebryany Date: Tue, 27 Sep 2016 01:08:33 +0000 (+0000) Subject: [sanitizer-coverage] don't emit the CTOR function if nothing has been instrumented X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=dbadbd797db6279ecc23de3f62391b8daebefa21;p=llvm [sanitizer-coverage] don't emit the CTOR function if nothing has been instrumented git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@282465 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/Instrumentation/SanitizerCoverage.cpp b/lib/Transforms/Instrumentation/SanitizerCoverage.cpp index 9e1ff1cd6d2..4a1a75518b0 100644 --- a/lib/Transforms/Instrumentation/SanitizerCoverage.cpp +++ b/lib/Transforms/Instrumentation/SanitizerCoverage.cpp @@ -230,6 +230,7 @@ private: GlobalVariable *GuardArray; GlobalVariable *EightBitCounterArray; + bool HasSancovGuardsSection; SanitizerCoverageOptions Options; }; @@ -242,6 +243,7 @@ bool SanitizerCoverageModule::runOnModule(Module &M) { C = &(M.getContext()); DL = &M.getDataLayout(); CurModule = &M; + HasSancovGuardsSection = false; IntptrTy = Type::getIntNTy(*C, DL->getPointerSizeInBits()); IntptrPtrTy = PointerType::getUnqual(IntptrTy); Type *VoidTy = Type::getVoidTy(*C); @@ -351,24 +353,25 @@ bool SanitizerCoverageModule::runOnModule(Module &M) { new GlobalVariable(M, ModNameStrConst->getType(), true, GlobalValue::PrivateLinkage, ModNameStrConst); if (Options.TracePCGuard) { - Function *CtorFunc; - std::string SectionName(SanCovTracePCGuardSection); - GlobalVariable *Bounds[2]; - const char *Prefix[2] = {"__start_", "__stop_"}; - for (int i = 0; i < 2; i++) { - Bounds[i] = new GlobalVariable(M, IntptrPtrTy, false, - GlobalVariable::ExternalLinkage, nullptr, - Prefix[i] + SectionName); - Bounds[i]->setVisibility(GlobalValue::HiddenVisibility); - } - std::tie(CtorFunc, std::ignore) = createSanitizerCtorAndInitFunctions( - M, SanCovModuleCtorName, SanCovTracePCGuardInitName, - {IntptrPtrTy, IntptrPtrTy}, - {IRB.CreatePointerCast(Bounds[0], IntptrPtrTy), - IRB.CreatePointerCast(Bounds[1], IntptrPtrTy)}); - - appendToGlobalCtors(M, CtorFunc, SanCtorAndDtorPriority); + if (HasSancovGuardsSection) { + Function *CtorFunc; + std::string SectionName(SanCovTracePCGuardSection); + GlobalVariable *Bounds[2]; + const char *Prefix[2] = {"__start_", "__stop_"}; + for (int i = 0; i < 2; i++) { + Bounds[i] = new GlobalVariable(M, IntptrPtrTy, false, + GlobalVariable::ExternalLinkage, nullptr, + Prefix[i] + SectionName); + Bounds[i]->setVisibility(GlobalValue::HiddenVisibility); + } + std::tie(CtorFunc, std::ignore) = createSanitizerCtorAndInitFunctions( + M, SanCovModuleCtorName, SanCovTracePCGuardInitName, + {IntptrPtrTy, IntptrPtrTy}, + {IRB.CreatePointerCast(Bounds[0], IntptrPtrTy), + IRB.CreatePointerCast(Bounds[1], IntptrPtrTy)}); + appendToGlobalCtors(M, CtorFunc, SanCtorAndDtorPriority); + } } else if (!Options.TracePC) { Function *CtorFunc; std::tie(CtorFunc, std::ignore) = createSanitizerCtorAndInitFunctions( @@ -673,6 +676,7 @@ void SanitizerCoverageModule::InjectCoverageAtBlock(Function &F, BasicBlock &BB, GuardVar->setComdat(Comdat); // TODO: add debug into to GuardVar. GuardVar->setSection(SanCovTracePCGuardSection); + HasSancovGuardsSection = true; auto GuardPtr = IRB.CreatePointerCast(GuardVar, IntptrPtrTy); if (!UseCalls) { auto GuardLoad = IRB.CreateLoad(GuardPtr); diff --git a/test/Instrumentation/SanitizerCoverage/no-func.ll b/test/Instrumentation/SanitizerCoverage/no-func.ll new file mode 100644 index 00000000000..ec9e1214391 --- /dev/null +++ b/test/Instrumentation/SanitizerCoverage/no-func.ll @@ -0,0 +1,9 @@ +; Tests that we don't insert __sanitizer_cov_trace_pc_guard_init or some such +; when there is no instrumentation. +; RUN: opt < %s -sancov -sanitizer-coverage-level=3 -sanitizer-coverage-trace-pc-guard -S | FileCheck %s +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +@a = global i32 0, align 4 + +; CHECK-NOT: call void