OSDN Git Service

[sanitizer-coverage] don't emit the CTOR function if nothing has been instrumented
authorKostya Serebryany <kcc@google.com>
Tue, 27 Sep 2016 01:08:33 +0000 (01:08 +0000)
committerKostya Serebryany <kcc@google.com>
Tue, 27 Sep 2016 01:08:33 +0000 (01:08 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@282465 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Instrumentation/SanitizerCoverage.cpp
test/Instrumentation/SanitizerCoverage/no-func.ll [new file with mode: 0644]

index 9e1ff1c..4a1a755 100644 (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);
-    }
-    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 (file)
index 0000000..ec9e121
--- /dev/null
@@ -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