[sanitizer-coverage] don't emit the CTOR function if nothing has been instrumented

llvm-svn: 282465
This commit is contained in:
Kostya Serebryany
2016-09-27 01:08:33 +00:00
parent 4088571c51
commit 186d61801c
2 changed files with 30 additions and 17 deletions

View File

@@ -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);
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);
}
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);

View File

@@ -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