[llvm] r341987 - [SanitizerCoverage] Create comdat for global arrays.

Matt Morehouse via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 11 13:10:40 PDT 2018


Author: morehouse
Date: Tue Sep 11 13:10:40 2018
New Revision: 341987

URL: http://llvm.org/viewvc/llvm-project?rev=341987&view=rev
Log:
[SanitizerCoverage] Create comdat for global arrays.

Summary:
Place global arrays in comdat sections with their associated functions.
This makes sure they are stripped along with the functions they
reference, even on the BFD linker.

Reviewers: eugenis

Reviewed By: eugenis

Subscribers: eraman, hiraditya, llvm-commits

Differential Revision: https://reviews.llvm.org/D51902

Modified:
    llvm/trunk/lib/Transforms/Instrumentation/SanitizerCoverage.cpp
    llvm/trunk/test/Instrumentation/SanitizerCoverage/div-tracing.ll
    llvm/trunk/test/Instrumentation/SanitizerCoverage/gep-tracing.ll
    llvm/trunk/test/Instrumentation/SanitizerCoverage/inline-8bit-counters.ll
    llvm/trunk/test/Instrumentation/SanitizerCoverage/pc-table.ll
    llvm/trunk/test/Instrumentation/SanitizerCoverage/tracing.ll

Modified: llvm/trunk/lib/Transforms/Instrumentation/SanitizerCoverage.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/SanitizerCoverage.cpp?rev=341987&r1=341986&r2=341987&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Instrumentation/SanitizerCoverage.cpp (original)
+++ llvm/trunk/lib/Transforms/Instrumentation/SanitizerCoverage.cpp Tue Sep 11 13:10:40 2018
@@ -571,11 +571,34 @@ GlobalVariable *SanitizerCoverageModule:
   auto Array = new GlobalVariable(
       *CurModule, ArrayTy, false, GlobalVariable::PrivateLinkage,
       Constant::getNullValue(ArrayTy), "__sancov_gen_");
-  if (auto Comdat = F.getComdat())
+  if (auto Comdat = F.getComdat()) {
     Array->setComdat(Comdat);
+  } else if (TargetTriple.isOSBinFormatELF()) {
+    // TODO: Refactor into a helper function and use it in ASan.
+    assert(F.hasName());
+    std::string Name = F.getName();
+    if (F.hasLocalLinkage()) {
+      std::string ModuleId = getUniqueModuleId(CurModule);
+      Name += ModuleId.empty() ? CurModule->getModuleIdentifier() : ModuleId;
+    }
+    Comdat = CurModule->getOrInsertComdat(Name);
+    // Make this IMAGE_COMDAT_SELECT_NODUPLICATES on COFF. Also upgrade private
+    // linkage to internal linkage so that a symbol table entry is emitted. This
+    // is necessary in order to create the comdat group.
+    if (TargetTriple.isOSBinFormatCOFF()) {
+      Comdat->setSelectionKind(Comdat::NoDuplicates);
+      if (F.hasPrivateLinkage())
+        F.setLinkage(GlobalValue::InternalLinkage);
+    }
+    F.setComdat(Comdat);
+    Array->setComdat(Comdat);
+  }
   Array->setSection(getSectionName(Section));
   Array->setAlignment(Ty->isPointerTy() ? DL->getPointerSize()
                                         : Ty->getPrimitiveSizeInBits() / 8);
+  GlobalsToAppendToCompilerUsed.push_back(Array);
+  MDNode *MD = MDNode::get(F.getContext(), ValueAsMetadata::get(&F));
+  Array->addMetadata(LLVMContext::MD_associated, *MD);
   return Array;
 }
 
@@ -613,23 +636,12 @@ void SanitizerCoverageModule::CreateFunc
     FunctionGuardArray = CreateFunctionLocalArrayInSection(
         AllBlocks.size(), F, Int32Ty, SanCovGuardsSectionName);
     GlobalsToAppendToUsed.push_back(FunctionGuardArray);
-    GlobalsToAppendToCompilerUsed.push_back(FunctionGuardArray);
-    MDNode *MD = MDNode::get(F.getContext(), ValueAsMetadata::get(&F));
-    FunctionGuardArray->addMetadata(LLVMContext::MD_associated, *MD);
   }
-  if (Options.Inline8bitCounters) {
+  if (Options.Inline8bitCounters)
     Function8bitCounterArray = CreateFunctionLocalArrayInSection(
         AllBlocks.size(), F, Int8Ty, SanCovCountersSectionName);
-    GlobalsToAppendToCompilerUsed.push_back(Function8bitCounterArray);
-    MDNode *MD = MDNode::get(F.getContext(), ValueAsMetadata::get(&F));
-    Function8bitCounterArray->addMetadata(LLVMContext::MD_associated, *MD);
-  }
-  if (Options.PCTable) {
+  if (Options.PCTable)
     FunctionPCsArray = CreatePCArray(F, AllBlocks);
-    GlobalsToAppendToCompilerUsed.push_back(FunctionPCsArray);
-    MDNode *MD = MDNode::get(F.getContext(), ValueAsMetadata::get(&F));
-    FunctionPCsArray->addMetadata(LLVMContext::MD_associated, *MD);
-  }
 }
 
 bool SanitizerCoverageModule::InjectCoverage(Function &F,

Modified: llvm/trunk/test/Instrumentation/SanitizerCoverage/div-tracing.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Instrumentation/SanitizerCoverage/div-tracing.ll?rev=341987&r1=341986&r2=341987&view=diff
==============================================================================
--- llvm/trunk/test/Instrumentation/SanitizerCoverage/div-tracing.ll (original)
+++ llvm/trunk/test/Instrumentation/SanitizerCoverage/div-tracing.ll Tue Sep 11 13:10:40 2018
@@ -10,7 +10,7 @@ entry:
   ret i32 %div
 }
 
-; CHECK-LABEL: div_a_b
+; CHECK-LABEL: @div_a_b
 ; CHECK: call void @__sanitizer_cov_trace_div4(i32 %b)
 ; CHECK: ret
 
@@ -21,7 +21,7 @@ entry:
   ret i32 %div
 }
 
-; CHECK-LABEL: div_a_10
+; CHECK-LABEL: @div_a_10
 ; CHECK-NOT: __sanitizer_cov_trace_div
 ; CHECK: ret
 
@@ -31,7 +31,7 @@ entry:
   ret i64 %div
 }
 
-; CHECK-LABEL: div_a_b
+; CHECK-LABEL: @div_a_b_64
 ; CHECK: call void @__sanitizer_cov_trace_div8(i64 %b)
 ; CHECK: ret
 

Modified: llvm/trunk/test/Instrumentation/SanitizerCoverage/gep-tracing.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Instrumentation/SanitizerCoverage/gep-tracing.ll?rev=341987&r1=341986&r2=341987&view=diff
==============================================================================
--- llvm/trunk/test/Instrumentation/SanitizerCoverage/gep-tracing.ll (original)
+++ llvm/trunk/test/Instrumentation/SanitizerCoverage/gep-tracing.ll Tue Sep 11 13:10:40 2018
@@ -26,7 +26,7 @@ entry:
   ret void
 }
 
-; CHECK-LABEL: define void @gep_2([1000 x i32]* nocapture %a, i32 %i, i32 %j) {
+; CHECK-LABEL: define void @gep_2([1000 x i32]* nocapture %a, i32 %i, i32 %j)
 ; CHECK: call void @__sanitizer_cov_trace_gep(i64 %idxprom1)
 ; CHECK: call void @__sanitizer_cov_trace_gep(i64 %idxprom)
 ; CHECK: ret void

Modified: llvm/trunk/test/Instrumentation/SanitizerCoverage/inline-8bit-counters.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Instrumentation/SanitizerCoverage/inline-8bit-counters.ll?rev=341987&r1=341986&r2=341987&view=diff
==============================================================================
--- llvm/trunk/test/Instrumentation/SanitizerCoverage/inline-8bit-counters.ll (original)
+++ llvm/trunk/test/Instrumentation/SanitizerCoverage/inline-8bit-counters.ll Tue Sep 11 13:10:40 2018
@@ -5,7 +5,7 @@ target datalayout = "e-p:64:64:64-i1:8:8
 target triple = "x86_64-unknown-linux-gnu"
 define void @foo() {
 entry:
-; CHECK: section "__sancov_cntrs", align 1
+; CHECK: section "__sancov_cntrs", comdat($foo), align 1
 ; CHECK:  %0 = load i8, i8* getelementptr inbounds ([1 x i8], [1 x i8]* @__sancov_gen_, i64 0, i64 0), !nosanitize
 ; CHECK:  %1 = add i8 %0, 1
 ; CHECK:  store i8 %1, i8* getelementptr inbounds ([1 x i8], [1 x i8]* @__sancov_gen_, i64 0, i64 0), !nosanitize

Modified: llvm/trunk/test/Instrumentation/SanitizerCoverage/pc-table.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Instrumentation/SanitizerCoverage/pc-table.ll?rev=341987&r1=341986&r2=341987&view=diff
==============================================================================
--- llvm/trunk/test/Instrumentation/SanitizerCoverage/pc-table.ll (original)
+++ llvm/trunk/test/Instrumentation/SanitizerCoverage/pc-table.ll Tue Sep 11 13:10:40 2018
@@ -17,7 +17,7 @@ entry:
   ret void
 }
 
-; CHECK: private constant [6 x i64*] [{{.*}}@foo{{.*}}blockaddress{{.*}}blockaddress{{.*}}], section "__sancov_pcs", align 8
+; CHECK: private constant [6 x i64*] [{{.*}}@foo{{.*}}blockaddress{{.*}}blockaddress{{.*}}], section "__sancov_pcs", comdat($foo), align 8
 ; CHECK: define internal void @sancov.module_ctor
 ; CHECK: call void @__sanitizer_cov
 ; CHECK: call void @__sanitizer_cov_pcs_init

Modified: llvm/trunk/test/Instrumentation/SanitizerCoverage/tracing.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Instrumentation/SanitizerCoverage/tracing.ll?rev=341987&r1=341986&r2=341987&view=diff
==============================================================================
--- llvm/trunk/test/Instrumentation/SanitizerCoverage/tracing.ll (original)
+++ llvm/trunk/test/Instrumentation/SanitizerCoverage/tracing.ll Tue Sep 11 13:10:40 2018
@@ -32,7 +32,7 @@ entry:
 ; CHECK_PC: ret void
 ; CHECK_PC-NOT: call void @__sanitizer_cov_module_init
 
-; CHECK_PC_GUARD: section "__sancov_guards", align 4
+; CHECK_PC_GUARD: section "__sancov_guards", comdat($foo), align 4
 ; CHECK_PC_GUARD-LABEL: define void @foo
 ; CHECK_PC_GUARD: call void @__sanitizer_cov_trace_pc_guard
 ; CHECK_PC_GUARD: call void @__sanitizer_cov_trace_pc_guard




More information about the llvm-commits mailing list