mirror of
https://github.com/intel/llvm.git
synced 2026-02-02 10:08:59 +08:00
[sanitizer-coverage] don't emit the CTOR function if nothing has been instrumented
llvm-svn: 282465
This commit is contained in:
@@ -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);
|
||||
|
||||
9
llvm/test/Instrumentation/SanitizerCoverage/no-func.ll
Normal file
9
llvm/test/Instrumentation/SanitizerCoverage/no-func.ll
Normal 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
|
||||
Reference in New Issue
Block a user