diff options
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp | 39 | ||||
-rw-r--r-- | llvm/test/Instrumentation/SanitizerCoverage/coff-pc-table-inline-8bit-counters.ll | 12 |
2 files changed, 45 insertions, 6 deletions
diff --git a/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp b/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp index c0b219d1d1b..1f97e909851 100644 --- a/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp +++ b/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp @@ -273,9 +273,20 @@ Function *SanitizerCoverageModule::CreateInitCallsForSections( auto SecStart = SecStartEnd.first; auto SecEnd = SecStartEnd.second; Function *CtorFunc; + Value *SecStartPtr = nullptr; + // Account for the fact that on windows-msvc __start_* symbols actually + // point to a uint64_t before the start of the array. + if (TargetTriple.getObjectFormat() == Triple::COFF) { + auto SecStartI8Ptr = IRB.CreatePointerCast(SecStart, Int8PtrTy); + auto GEP = IRB.CreateGEP(SecStartI8Ptr, + ConstantInt::get(IntptrTy, sizeof(uint64_t))); + SecStartPtr = IRB.CreatePointerCast(GEP, Ty); + } else { + SecStartPtr = IRB.CreatePointerCast(SecStart, Ty); + } std::tie(CtorFunc, std::ignore) = createSanitizerCtorAndInitFunctions( M, SanCovModuleCtorName, InitFunctionName, {Ty, Ty}, - {IRB.CreatePointerCast(SecStart, Ty), IRB.CreatePointerCast(SecEnd, Ty)}); + {SecStartPtr, IRB.CreatePointerCast(SecEnd, Ty)}); if (TargetTriple.supportsCOMDAT()) { // Use comdat to dedup CtorFunc. @@ -397,9 +408,20 @@ bool SanitizerCoverageModule::runOnModule(Module &M) { Function *InitFunction = declareSanitizerInitFunction( M, SanCovPCsInitName, {IntptrPtrTy, IntptrPtrTy}); IRBuilder<> IRBCtor(Ctor->getEntryBlock().getTerminator()); - IRBCtor.CreateCall(InitFunction, - {IRB.CreatePointerCast(SecStartEnd.first, IntptrPtrTy), - IRB.CreatePointerCast(SecStartEnd.second, IntptrPtrTy)}); + Value *SecStartPtr = nullptr; + // Account for the fact that on windows-msvc __start_pc_table actually + // points to a uint64_t before the start of the PC table. + if (TargetTriple.getObjectFormat() == Triple::COFF) { + auto SecStartI8Ptr = IRB.CreatePointerCast(SecStartEnd.first, Int8PtrTy); + auto GEP = IRB.CreateGEP(SecStartI8Ptr, + ConstantInt::get(IntptrTy, sizeof(uint64_t))); + SecStartPtr = IRB.CreatePointerCast(GEP, IntptrPtrTy); + } else { + SecStartPtr = IRB.CreatePointerCast(SecStartEnd.first, IntptrPtrTy); + } + IRBCtor.CreateCall( + InitFunction, + {SecStartPtr, IRB.CreatePointerCast(SecStartEnd.second, IntptrPtrTy)}); } // We don't reference these arrays directly in any of our runtime functions, // so we need to prevent them from being dead stripped. @@ -809,8 +831,13 @@ void SanitizerCoverageModule::InjectCoverageAtBlock(Function &F, BasicBlock &BB, std::string SanitizerCoverageModule::getSectionName(const std::string &Section) const { - if (TargetTriple.getObjectFormat() == Triple::COFF) - return ".SCOV$M"; + if (TargetTriple.getObjectFormat() == Triple::COFF) { + if (Section == SanCovCountersSectionName) + return ".SCOV$CM"; + if (Section == SanCovPCsSectionName) + return ".SCOVP$M"; + return ".SCOV$GM"; // For SanCovGuardsSectionName. + } if (TargetTriple.isOSBinFormatMachO()) return "__DATA,__" + Section; return "__" + Section; diff --git a/llvm/test/Instrumentation/SanitizerCoverage/coff-pc-table-inline-8bit-counters.ll b/llvm/test/Instrumentation/SanitizerCoverage/coff-pc-table-inline-8bit-counters.ll new file mode 100644 index 00000000000..d81d480009b --- /dev/null +++ b/llvm/test/Instrumentation/SanitizerCoverage/coff-pc-table-inline-8bit-counters.ll @@ -0,0 +1,12 @@ +; 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-DAG: section ".SCOV{{\$}}CM", +; CHECK-DAG: section ".SCOVP{{\$}}M", |