Index: llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp =================================================================== --- llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp +++ llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp @@ -264,7 +264,7 @@ SecEnd->setVisibility(GlobalValue::HiddenVisibility); IRBuilder<> IRB(M.getContext()); Value *SecEndPtr = IRB.CreatePointerCast(SecEnd, Ty); - if (TargetTriple.getObjectFormat() != Triple::COFF) + if (!TargetTriple.isOSBinFormatCOFF()) return std::make_pair(IRB.CreatePointerCast(SecStart, Ty), SecEndPtr); // Account for the fact that on windows-msvc __start_* symbols actually @@ -293,24 +293,15 @@ appendToGlobalCtors(M, CtorFunc, SanCtorAndDtorPriority); } - if (TargetTriple.getObjectFormat() == Triple::COFF) { + if (TargetTriple.isOSBinFormatCOFF()) { // In COFF files, if the contructors are set as COMDAT (they are because // COFF supports COMDAT) and the linker flag /OPT:REF (strip unreferenced // functions and data) is used, the constructors get stripped. To prevent - // this, give the constructors weak ODR linkage and tell the linker to - // always include the sancov constructor. This way the linker can - // deduplicate the constructors but always leave one copy. + // this, give the constructors weak ODR linkage and ensure the linker knows + // to include the sancov constructor. This way the linker can deduplicate + // the constructors but always leave one copy. CtorFunc->setLinkage(GlobalValue::WeakODRLinkage); - SmallString<20> PartialIncDirective("/include:"); - // Get constructor's mangled name in order to support i386. - SmallString<40> MangledName; - Mangler().getNameWithPrefix(MangledName, CtorFunc, true); - Twine IncDirective = PartialIncDirective + MangledName; - Metadata *Args[1] = {MDString::get(*C, IncDirective.str())}; - MDNode *MetadataNode = MDNode::get(*C, Args); - NamedMDNode *NamedMetadata = - M.getOrInsertNamedMetadata("llvm.linker.options"); - NamedMetadata->addOperand(MetadataNode); + appendToUsed(M, CtorFunc); } return CtorFunc; } @@ -833,7 +824,7 @@ std::string SanitizerCoverageModule::getSectionName(const std::string &Section) const { - if (TargetTriple.getObjectFormat() == Triple::COFF) { + if (TargetTriple.isOSBinFormatCOFF()) { if (Section == SanCovCountersSectionName) return ".SCOV$CM"; if (Section == SanCovPCsSectionName) Index: llvm/test/Instrumentation/SanitizerCoverage/coff-used-ctor.ll =================================================================== --- /dev/null +++ llvm/test/Instrumentation/SanitizerCoverage/coff-used-ctor.ll @@ -0,0 +1,11 @@ +; Checks that the PC and 8-bit Counter Arrays are placed in their own sections in COFF binaries. +; RUN: opt < %s -sancov -sanitizer-coverage-level=1 -sanitizer-coverage-inline-8bit-counters=1 -sanitizer-coverage-pc-table=1 -S | FileCheck %s +target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-pc-windows-msvc19.14.26433" + +define void @foo() { +entry: + ret void +} + +; CHECK: @llvm.used = appending global {{.*}} @sancov.module_ctor \ No newline at end of file